glsl: use a non-malloc'd storage for short ir_variable names

Tested-by: Edmondo Tommasina <edmondo.tommasina@gmail.com>
Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com>
This commit is contained in:
Marek Olšák
2016-10-07 22:26:58 +02:00
parent 21e11b5282
commit 7a2387c3e0
3 changed files with 22 additions and 3 deletions

View File

@@ -1523,6 +1523,10 @@ ir_variable::ir_variable(const struct glsl_type *type, const char *name,
if (mode == ir_var_temporary if (mode == ir_var_temporary
&& (name == NULL || name == ir_variable::tmp_name)) { && (name == NULL || name == ir_variable::tmp_name)) {
this->name = ir_variable::tmp_name; this->name = ir_variable::tmp_name;
} else if (name == NULL ||
strlen(name) < ARRAY_SIZE(this->name_storage)) {
strcpy(this->name_storage, name ? name : "");
this->name = this->name_storage;
} else { } else {
this->name = ralloc_strdup(this, name); this->name = ralloc_strdup(this, name);
} }

View File

@@ -599,7 +599,8 @@ public:
inline bool is_name_ralloced() const inline bool is_name_ralloced() const
{ {
return this->name != ir_variable::tmp_name; return this->name != ir_variable::tmp_name &&
this->name != this->name_storage;
} }
/** /**
@@ -624,6 +625,16 @@ public:
*/ */
const char *name; const char *name;
private:
/**
* If the name length fits into name_storage, it's used, otherwise
* the name is ralloc'd. shader-db mining showed that 70% of variables
* fit here. This is a win over ralloc where only ralloc_header has
* 20 bytes on 64-bit (28 bytes with DEBUG), and we can also skip malloc.
*/
char name_storage[16];
public:
struct ir_variable_data { struct ir_variable_data {
/** /**

View File

@@ -639,8 +639,12 @@ lower_packed_varyings_visitor::get_packed_varying_deref(
* first time we visit each component. * first time we visit each component.
*/ */
if (this->gs_input_vertices == 0 || vertex_index == 0) { if (this->gs_input_vertices == 0 || vertex_index == 0) {
ralloc_asprintf_append((char **) &this->packed_varyings[slot]->name, ir_variable *var = this->packed_varyings[slot];
",%s", name);
if (var->is_name_ralloced())
ralloc_asprintf_append((char **) &var->name, ",%s", name);
else
var->name = ralloc_asprintf(var, "%s,%s", var->name, name);
} }
} }