[Bf-blender-cvs] [64aafef5ba6] tmp-drw-callbatching: DRW: Move DRWUniformChunk length and used counter to the struct itself.

Clément Foucault noreply at git.blender.org
Sat Aug 17 14:50:55 CEST 2019


Commit: 64aafef5ba6c265aecdf1c92b487418da5580944
Author: Clément Foucault
Date:   Sun Jun 23 11:01:03 2019 +0200
Branches: tmp-drw-callbatching
https://developer.blender.org/rB64aafef5ba6c265aecdf1c92b487418da5580944

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.

===================================================================

M	source/blender/draw/intern/draw_manager.h
M	source/blender/draw/intern/draw_manager_data.c
M	source/blender/draw/intern/draw_manager_exec.c

===================================================================

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) {



More information about the Bf-blender-cvs mailing list