[Mesa-dev] [PATCH 08/26] glsl: Replace ir_variable::warn_extension pointer with an 8-bit index

Ian Romanick idr at freedesktop.org
Mon Jul 14 15:48:40 PDT 2014


From: Ian Romanick <ian.d.romanick at 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.romanick at 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



More information about the mesa-dev mailing list