From: Ian Romanick <ian.d.roman...@intel.com> Also move the new warn_extension_index into ir_variable::data. This enables slightly better packing.
Valgrind massif results for a trimmed apitrace of dota2: n time(i) total(B) useful-heap(B) extra-heap(B) stacks(B) Before (32-bit): 82 40,580,040,531 68,488,992 62,973,695 5,515,297 0 After (32-bit): 73 40,580,476,304 68,488,400 62,796,151 5,692,249 0 Before (64-bit): 65 37,124,013,542 95,892,768 88,466,712 7,426,056 0 After (64-bit): 71 37,124,890,613 95,889,584 88,089,008 7,800,576 0 A real savings of 173KiB on 32-bit and 368KiB on 64-bit. Signed-off-by: Ian Romanick <ian.d.roman...@intel.com> --- src/glsl/ir.cpp | 21 ++++++++++++++++++--- src/glsl/ir.h | 18 +++++++++++++----- src/glsl/ir_clone.cpp | 2 -- 3 files changed, 31 insertions(+), 10 deletions(-) diff --git a/src/glsl/ir.cpp b/src/glsl/ir.cpp index 8575ac3..cfdc7f0 100644 --- a/src/glsl/ir.cpp +++ b/src/glsl/ir.cpp @@ -1544,7 +1544,7 @@ ir_variable::ir_variable(const struct glsl_type *type, const char *name, this->data.location = -1; this->data.location_frac = 0; this->data.binding = 0; - this->warn_extension = NULL; + this->data.warn_extension_index = 0; this->constant_value = NULL; this->constant_initializer = NULL; this->data.origin_upper_left = false; @@ -1607,16 +1607,31 @@ ir_variable::determine_interpolation_mode(bool flat_shade) return INTERP_QUALIFIER_SMOOTH; } +const char *const ir_variable::warn_extension_table[] = { + "", + "GL_ARB_shader_stencil_export", + "GL_AMD_shader_stencil_export", +}; + void ir_variable::enable_extension_warning(const char *extension) { - this->warn_extension = extension; + for (unsigned i = 0; i < Elements(warn_extension_table); i++) { + if (strcmp(warn_extension_table[i], extension) == 0) { + this->data.warn_extension_index = i; + return; + } + } + + assert(!"Should not get here."); + this->data.warn_extension_index = 0; } const char * ir_variable::get_extension_warning() const { - return this->warn_extension; + return this->data.warn_extension_index == 0 + ? NULL : warn_extension_table[this->data.warn_extension_index]; } ir_function_signature::ir_function_signature(const glsl_type *return_type, diff --git a/src/glsl/ir.h b/src/glsl/ir.h index bdd9a3c..d4010fa 100644 --- a/src/glsl/ir.h +++ b/src/glsl/ir.h @@ -718,6 +718,13 @@ public: uint16_t image_format; /** + * Emit a warning if this variable is accessed. + */ + private: + uint8_t warn_extension_index; + + public: + /** * \brief Layout qualifier for gl_FragDepth. * * This is not equal to \c ir_depth_layout_none if and only if this @@ -771,6 +778,10 @@ public: */ unsigned max_array_access; + /** + * Allow (only) ir_variable direct access private members. + */ + friend class ir_variable; } data; /** @@ -805,6 +816,8 @@ public: ir_constant *constant_initializer; private: + static const char *const warn_extension_table[]; + /** * For variables that are in an interface block or are an instance of an * interface block, this is the \c GLSL_TYPE_INTERFACE type for that block. @@ -812,11 +825,6 @@ private: * \sa ir_variable::location */ const glsl_type *interface_type; - - /** - * Emit a warning if this variable is accessed. - */ - const char *warn_extension; }; /** diff --git a/src/glsl/ir_clone.cpp b/src/glsl/ir_clone.cpp index 4b444d4..86c0e31 100644 --- a/src/glsl/ir_clone.cpp +++ b/src/glsl/ir_clone.cpp @@ -53,8 +53,6 @@ ir_variable::clone(void *mem_ctx, struct hash_table *ht) const memcpy(&var->data, &this->data, sizeof(var->data)); - var->warn_extension = this->warn_extension; - var->num_state_slots = this->num_state_slots; if (this->state_slots) { /* FINISHME: This really wants to use something like talloc_reference, but -- 1.8.1.4 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev