diff options
author | Clément Foucault <foucault.clem@gmail.com> | 2017-06-05 23:05:21 +0300 |
---|---|---|
committer | Clément Foucault <foucault.clem@gmail.com> | 2017-06-05 23:05:37 +0300 |
commit | 2ebde4c82bd478d19a9b3116ac600e715ffc0165 (patch) | |
tree | 46fbf5de4ed3694924aa4b2b4a36c4f9a3f79479 /source/blender/draw/engines/eevee/eevee_materials.c | |
parent | 6d4f08467715030e7ef8833758b8da986280f236 (diff) |
Eevee: Optimize scene with a large number of objects.
Using a GHash to store the shgroup of every Material. This way we do not duplicates the DRWShadingGroups allocations on every object.
Diffstat (limited to 'source/blender/draw/engines/eevee/eevee_materials.c')
-rw-r--r-- | source/blender/draw/engines/eevee/eevee_materials.c | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/source/blender/draw/engines/eevee/eevee_materials.c b/source/blender/draw/engines/eevee/eevee_materials.c index 3f01267fba0..a5f29872e58 100644 --- a/source/blender/draw/engines/eevee/eevee_materials.c +++ b/source/blender/draw/engines/eevee/eevee_materials.c @@ -28,6 +28,7 @@ #include "DNA_world_types.h" #include "BLI_dynstr.h" +#include "BLI_ghash.h" #include "GPU_material.h" @@ -276,6 +277,11 @@ void EEVEE_materials_cache_init(EEVEE_Data *vedata) EEVEE_StorageList *stl = ((EEVEE_Data *)vedata)->stl; EEVEE_SceneLayerData *sldata = EEVEE_scene_layer_data_get(); + /* Create Material Ghash */ + { + stl->g_data->material_hash = BLI_ghash_ptr_new("Eevee_material ghash"); + } + { psl->background_pass = DRW_pass_create("Background Pass", DRW_STATE_WRITE_DEPTH | DRW_STATE_WRITE_COLOR); @@ -356,6 +362,7 @@ void EEVEE_materials_cache_populate(EEVEE_Data *vedata, EEVEE_SceneLayerData *sl EEVEE_PassList *psl = ((EEVEE_Data *)vedata)->psl; EEVEE_StorageList *stl = ((EEVEE_Data *)vedata)->stl; const DRWContextState *draw_ctx = DRW_context_state_get(); + GHash *material_hash = stl->g_data->material_hash; IDProperty *ces_mode_ob = BKE_layer_collection_engine_evaluated_get(ob, COLLECTION_MODE_OBJECT, ""); const bool do_cull = BKE_collection_engine_property_value_get_bool(ces_mode_ob, "show_backface_culling"); @@ -392,6 +399,12 @@ void EEVEE_materials_cache_populate(EEVEE_Data *vedata, EEVEE_SceneLayerData *sl float *spec_p = &ma->spec; float *rough_p = &ma->gloss_mir; + shgrp = BLI_ghash_lookup(material_hash, (const void *)ma); + if (shgrp) { + ADD_SHGROUP_CALL(shgrp, ob, mat_geom[i]); + continue; + } + if (ma->use_nodes && ma->nodetree) { Scene *scene = draw_ctx->scene; struct GPUMaterial *gpumat = EEVEE_material_mesh_get(scene, ma); @@ -400,6 +413,8 @@ void EEVEE_materials_cache_populate(EEVEE_Data *vedata, EEVEE_SceneLayerData *sl if (shgrp) { add_standard_uniforms(shgrp, sldata); + BLI_ghash_insert(material_hash, ma, shgrp); + ADD_SHGROUP_CALL(shgrp, ob, mat_geom[i]); } else { @@ -420,12 +435,21 @@ void EEVEE_materials_cache_populate(EEVEE_Data *vedata, EEVEE_SceneLayerData *sl DRW_shgroup_uniform_float(shgrp, "specular", spec_p, 1); DRW_shgroup_uniform_float(shgrp, "roughness", rough_p, 1); + BLI_ghash_insert(material_hash, ma, shgrp); + ADD_SHGROUP_CALL(shgrp, ob, mat_geom[i]); } } } } +void EEVEE_materials_cache_finish(EEVEE_Data *vedata) +{ + EEVEE_StorageList *stl = ((EEVEE_Data *)vedata)->stl; + + BLI_ghash_free(stl->g_data->material_hash, NULL, NULL); +} + void EEVEE_materials_free(void) { MEM_SAFE_FREE(e_data.frag_shader_lib); |