From 64aafef5ba6c265aecdf1c92b487418da5580944 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Foucault?= Date: Sun, 23 Jun 2019 11:01:03 +0200 Subject: DRW: Move DRWUniformChunk length and used counter to the struct itself. This is better for code simplicity. Memory usage is not that much of a concern for uniforms. --- source/blender/draw/intern/draw_manager.h | 5 +++-- source/blender/draw/intern/draw_manager_data.c | 12 ++++++------ source/blender/draw/intern/draw_manager_exec.c | 6 +----- 3 files changed, 10 insertions(+), 13 deletions(-) diff --git a/source/blender/draw/intern/draw_manager.h b/source/blender/draw/intern/draw_manager.h index 646eb27a76e..ee8b29ae401 100644 --- a/source/blender/draw/intern/draw_manager.h +++ b/source/blender/draw/intern/draw_manager.h @@ -258,7 +258,6 @@ struct DRWShadingGroup { GPUShader *shader; /* Shader to bind */ struct DRWUniformChunk *uniforms; /* Uniforms pointers */ - uint32_t uniform_count; /* Index of next uniform inside DRWUniformChunk. */ int objectinfo; @@ -338,7 +337,9 @@ struct DRWView { typedef struct DRWUniformChunk { struct DRWUniformChunk *next; /* single-linked list */ - DRWUniform uniforms[5]; + uint32_t uniform_len; + uint32_t uniform_used; + DRWUniform uniforms[10]; } DRWUniformChunk; typedef struct DRWCommandChunk { diff --git a/source/blender/draw/intern/draw_manager_data.c b/source/blender/draw/intern/draw_manager_data.c index f6751ff8d88..4f1fe6a27c6 100644 --- a/source/blender/draw/intern/draw_manager_data.c +++ b/source/blender/draw/intern/draw_manager_data.c @@ -171,15 +171,16 @@ static DRWUniform *drw_shgroup_uniform_create_ex(DRWShadingGroup *shgroup, int length, int arraysize) { + DRWUniformChunk *unichunk = shgroup->uniforms; /* Happens on first uniform or if chunk is full. */ - if (shgroup->uniform_count == 0) { - DRWUniformChunk *unichunk = BLI_memblock_alloc(DST.vmempool->uniforms); + if (!unichunk || unichunk->uniform_used == unichunk->uniform_len) { + unichunk = BLI_memblock_alloc(DST.vmempool->uniforms); + unichunk->uniform_len = ARRAY_SIZE(shgroup->uniforms->uniforms); + unichunk->uniform_used = 0; BLI_LINKS_PREPEND(shgroup->uniforms, unichunk); } - DRWUniform *uni = &shgroup->uniforms->uniforms[shgroup->uniform_count]; - - shgroup->uniform_count = (shgroup->uniform_count + 1) % ARRAY_SIZE(shgroup->uniforms->uniforms); + DRWUniform *uni = unichunk->uniforms + unichunk->uniform_used++; uni->location = loc; uni->type = type; @@ -1008,7 +1009,6 @@ void DRW_buffer_add_entry_array(DRWCallBuffer *callbuf, const void *attr[], uint static void drw_shgroup_init(DRWShadingGroup *shgroup, GPUShader *shader) { shgroup->uniforms = NULL; - shgroup->uniform_count = 0; /* TODO(fclem) make them builtin. */ int view_ubo_location = GPU_shader_get_uniform_block(shader, "viewBlock"); diff --git a/source/blender/draw/intern/draw_manager_exec.c b/source/blender/draw/intern/draw_manager_exec.c index e4b482764fe..d2801b1d994 100644 --- a/source/blender/draw/intern/draw_manager_exec.c +++ b/source/blender/draw/intern/draw_manager_exec.c @@ -868,11 +868,7 @@ static void draw_update_uniforms(DRWShadingGroup *shgroup, { for (DRWUniformChunk *unichunk = shgroup->uniforms; unichunk; unichunk = unichunk->next) { DRWUniform *uni = unichunk->uniforms; - /* shgroup->uniform_count is 0 if the first chunk is full. */ - int uniform_count = ((unichunk == shgroup->uniforms) && shgroup->uniform_count > 0) ? - shgroup->uniform_count : - ARRAY_SIZE(shgroup->uniforms->uniforms); - for (int i = 0; i < uniform_count; i++, uni++) { + for (int i = 0; i < unichunk->uniform_used; i++, uni++) { GPUTexture *tex; GPUUniformBuffer *ubo; if (uni->location == -2) { -- cgit v1.2.3