[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