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:
@@ -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);
|
||||||
}
|
}
|
||||||
|
@@ -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 {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user