[Mesa-dev] [PATCH 13/21] glsl: Store short variable names inside ir_variable
Ian Romanick
idr at freedesktop.org
Tue May 27 19:49:08 PDT 2014
From: Ian Romanick <ian.d.romanick at intel.com>
Most of the overhead of the name allocation is the ralloc tracking,
especially on 64-bit. The allocation of the variable name "i" is 2
bytes for the name and 40 bytes for the ralloc tracking.
Reduces the peak ir_variable memory usage in a trimmed apitrace of dota2
by 225KiB on 64-bit.
Before: IR MEM: variable usage / name / total: 5746368 1439077 7185445
After: IR MEM: variable usage / name / total: 5746368 1208630 6954998
Reduces the peak ir_variable memory usage in a trimmed apitrace of dota2
by 70KiB on 32-bit.
Before: IR MEM: variable usage / name / total: 4327584 915817 5243401
After: IR MEM: variable usage / name / total: 4327584 844096 5171680
Signed-off-by: Ian Romanick <ian.d.romanick at intel.com>
---
src/glsl/ir.cpp | 11 ++++++++++-
src/glsl/ir_memory_usage.cpp | 3 ++-
src/glsl/ir_validate.cpp | 2 +-
3 files changed, 13 insertions(+), 3 deletions(-)
diff --git a/src/glsl/ir.cpp b/src/glsl/ir.cpp
index 4907b34..69a0345 100644
--- a/src/glsl/ir.cpp
+++ b/src/glsl/ir.cpp
@@ -1536,7 +1536,16 @@ ir_variable::ir_variable(const struct glsl_type *type, const char *name,
: ir_instruction(ir_type_variable), max_ifc_array_access(NULL)
{
this->type = type;
- this->name = ralloc_strdup(this, name);
+
+ if (name == NULL) {
+ this->padding[0] = 0;
+ this->name = (char *) this->padding;
+ } else if (strlen(name) < sizeof(this->padding)) {
+ this->name = strcpy((char *) this->padding, name);
+ } else {
+ this->name = ralloc_strdup(this, name);
+ }
+
this->data.explicit_location = false;
this->data.has_initializer = false;
this->data.location = -1;
diff --git a/src/glsl/ir_memory_usage.cpp b/src/glsl/ir_memory_usage.cpp
index 68c0b5c..4918824 100644
--- a/src/glsl/ir_memory_usage.cpp
+++ b/src/glsl/ir_memory_usage.cpp
@@ -63,7 +63,8 @@ ir_memory_usage::visit(ir_variable *ir)
this->s.variable_usage += (sizeof(ir_state_slot) * ir->num_state_slots)
+ ralloc_header_size;
- this->s.variable_name_usage += strlen(ir->name) + 1 + ralloc_header_size;
+ if (ir->name != (char *) ir->padding)
+ this->s.variable_name_usage += strlen(ir->name) + 1 + ralloc_header_size;
return visit_continue;
}
diff --git a/src/glsl/ir_validate.cpp b/src/glsl/ir_validate.cpp
index 1cfd0d5..08dd250 100644
--- a/src/glsl/ir_validate.cpp
+++ b/src/glsl/ir_validate.cpp
@@ -634,7 +634,7 @@ ir_validate::visit(ir_variable *ir)
* in the ir_dereference_variable handler to ensure that a variable is
* declared before it is dereferenced.
*/
- if (ir->name)
+ if (ir->name && ir->name != (char *) ir->padding)
assert(ralloc_parent(ir->name) == ir);
hash_table_insert(ht, ir, ir);
--
1.8.1.4
More information about the mesa-dev
mailing list