diff options
author | Clément Foucault <foucault.clem@gmail.com> | 2022-09-01 14:35:04 +0300 |
---|---|---|
committer | Clément Foucault <foucault.clem@gmail.com> | 2022-09-01 15:41:00 +0300 |
commit | ba1bf87bd8f13fa2c67c435eb4a31a0c898d65ac (patch) | |
tree | 09281e081767384b2b3f6ad0d3f72c38f8a96daa | |
parent | 06005b0870be9a0a3b73b4c388c26988f1f991d2 (diff) |
GPUMaterial: Make uniform attrib precompute hash and attribute safe name
This avoids redundant operation at draw time.
The per attrib hash is to be used with the future implementation.
-rw-r--r-- | source/blender/draw/intern/draw_instance_data.c | 15 | ||||
-rw-r--r-- | source/blender/gpu/GPU_material.h | 6 | ||||
-rw-r--r-- | source/blender/gpu/intern/gpu_material.c | 2 | ||||
-rw-r--r-- | source/blender/gpu/intern/gpu_node_graph.c | 12 |
4 files changed, 20 insertions, 15 deletions
diff --git a/source/blender/draw/intern/draw_instance_data.c b/source/blender/draw/intern/draw_instance_data.c index 88cc71fa0dd..8754a75d346 100644 --- a/source/blender/draw/intern/draw_instance_data.c +++ b/source/blender/draw/intern/draw_instance_data.c @@ -642,23 +642,16 @@ static void drw_uniform_attribute_lookup(GPUUniformAttr *attr, { copy_v4_fl(r_data, 0); - char idprop_name[(sizeof(attr->name) * 2) + 4]; - { - char attr_name_esc[sizeof(attr->name) * 2]; - BLI_str_escape(attr_name_esc, attr->name, sizeof(attr_name_esc)); - SNPRINTF(idprop_name, "[\"%s\"]", attr_name_esc); - } - /* If requesting instance data, check the parent particle system and object. */ if (attr->use_dupli) { if (dupli_source && dupli_source->particle_system) { ParticleSettings *settings = dupli_source->particle_system->part; - if (drw_uniform_property_lookup((ID *)settings, idprop_name, r_data) || + if (drw_uniform_property_lookup((ID *)settings, attr->name_id_prop, r_data) || drw_uniform_property_lookup((ID *)settings, attr->name, r_data)) { return; } } - if (drw_uniform_property_lookup((ID *)dupli_parent, idprop_name, r_data) || + if (drw_uniform_property_lookup((ID *)dupli_parent, attr->name_id_prop, r_data) || drw_uniform_property_lookup((ID *)dupli_parent, attr->name, r_data)) { return; } @@ -666,9 +659,9 @@ static void drw_uniform_attribute_lookup(GPUUniformAttr *attr, /* Check the object and mesh. */ if (ob) { - if (drw_uniform_property_lookup((ID *)ob, idprop_name, r_data) || + if (drw_uniform_property_lookup((ID *)ob, attr->name_id_prop, r_data) || drw_uniform_property_lookup((ID *)ob, attr->name, r_data) || - drw_uniform_property_lookup((ID *)ob->data, idprop_name, r_data) || + drw_uniform_property_lookup((ID *)ob->data, attr->name_id_prop, r_data) || drw_uniform_property_lookup((ID *)ob->data, attr->name, r_data)) { return; } diff --git a/source/blender/gpu/GPU_material.h b/source/blender/gpu/GPU_material.h index b203a21e6c2..8c1cb425f0d 100644 --- a/source/blender/gpu/GPU_material.h +++ b/source/blender/gpu/GPU_material.h @@ -300,6 +300,10 @@ typedef struct GPUUniformAttr { /* Meaningful part of the attribute set key. */ char name[64]; /* MAX_CUSTOMDATA_LAYER_NAME */ + /** Escaped name with [""]. */ + char name_id_prop[64 * 2 + 4]; + /** Hash of name[64] + use_dupli. */ + uint32_t hash_code; bool use_dupli; /* Helper fields used by code generation. */ @@ -314,7 +318,7 @@ typedef struct GPUUniformAttrList { unsigned int count, hash_code; } GPUUniformAttrList; -GPUUniformAttrList *GPU_material_uniform_attributes(GPUMaterial *material); +GPUUniformAttrList *GPU_material_uniform_attributes(const GPUMaterial *material); struct GHash *GPU_uniform_attr_list_hash_new(const char *info); void GPU_uniform_attr_list_copy(GPUUniformAttrList *dest, GPUUniformAttrList *src); diff --git a/source/blender/gpu/intern/gpu_material.c b/source/blender/gpu/intern/gpu_material.c index d9045a041b6..d0297127ffc 100644 --- a/source/blender/gpu/intern/gpu_material.c +++ b/source/blender/gpu/intern/gpu_material.c @@ -225,7 +225,7 @@ ListBase GPU_material_textures(GPUMaterial *material) return material->graph.textures; } -GPUUniformAttrList *GPU_material_uniform_attributes(GPUMaterial *material) +GPUUniformAttrList *GPU_material_uniform_attributes(const GPUMaterial *material) { GPUUniformAttrList *attrs = &material->graph.uniform_attrs; return attrs->count > 0 ? attrs : NULL; diff --git a/source/blender/gpu/intern/gpu_node_graph.c b/source/blender/gpu/intern/gpu_node_graph.c index db8d55ec196..6d6fad4e80f 100644 --- a/source/blender/gpu/intern/gpu_node_graph.c +++ b/source/blender/gpu/intern/gpu_node_graph.c @@ -321,10 +321,18 @@ void gpu_node_graph_finalize_uniform_attrs(GPUNodeGraph *graph) LISTBASE_FOREACH (GPUUniformAttr *, attr, &attrs->list) { attr->id = next_id++; - attrs->hash_code ^= BLI_ghashutil_strhash_p(attr->name); + attr->hash_code = BLI_ghashutil_strhash_p(attr->name); if (attr->use_dupli) { - attrs->hash_code ^= BLI_ghashutil_uinthash(attr->id); + attr->hash_code ^= BLI_ghashutil_uinthash(attr->id); + } + + attrs->hash_code ^= attr->hash_code; + + { + char attr_name_esc[sizeof(attr->name) * 2]; + BLI_str_escape(attr_name_esc, attr->name, sizeof(attr_name_esc)); + SNPRINTF(attr->name_id_prop, "[\"%s\"]", attr_name_esc); } } } |