[Bf-blender-cvs] [2b2e120126b] tmp-drw-callbatching: DRW: Put Transform Feedback buffer into DRWUniform

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


Commit: 2b2e120126b64e9dfec914074edf29bd4752b50a
Author: Clément Foucault
Date:   Sat Jun 22 01:01:02 2019 +0200
Branches: tmp-drw-callbatching
https://developer.blender.org/rB2b2e120126b64e9dfec914074edf29bd4752b50a

DRW: Put Transform Feedback buffer into DRWUniform

Since the transform feedback must be the same for the whole SHgroup, and
since it is optional, put it in DRWUniform to make things cleaner.

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

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 9ab8daa1b09..60d9ad3c064 100644
--- a/source/blender/draw/intern/draw_manager.h
+++ b/source/blender/draw/intern/draw_manager.h
@@ -180,6 +180,7 @@ typedef enum {
   DRW_UNIFORM_TEXTURE_REF,
   DRW_UNIFORM_BLOCK,
   DRW_UNIFORM_BLOCK_PERSIST,
+  DRW_UNIFORM_TFEEDBACK_TARGET,
   /** Per drawcall uniforms/UBO */
   DRW_UNIFORM_BLOCK_OBMATS,
   DRW_UNIFORM_BLOCK_OBINFOS,
@@ -202,10 +203,10 @@ struct DRWUniform {
     int ivalue[4];
   };
   int location;
-  uint32_t type : 4;      /* DRWUniformType */
+  uint32_t type : 5;      /* DRWUniformType */
   uint32_t length : 5;    /* cannot be more than 16 */
   uint32_t arraysize : 5; /* cannot be more than 16 too */
-  uint32_t name_ofs : 18; /* name offset in name buffer. */
+  uint32_t name_ofs : 17; /* name offset in name buffer. */
 };
 
 struct DRWShadingGroup {
@@ -220,9 +221,6 @@ struct DRWShadingGroup {
     struct DRWCallChunk *first, *last;
   } calls;
 
-  /** TODO Maybe remove from here */
-  struct GPUVertBuf *tfeedback_target;
-
   /** State changes for this batch only (or'd with the pass's state) */
   DRWState state_extra;
   /** State changes for this batch only (and'd with the pass's state) */
diff --git a/source/blender/draw/intern/draw_manager_data.c b/source/blender/draw/intern/draw_manager_data.c
index 92588e4dd5c..df89ed00c55 100644
--- a/source/blender/draw/intern/draw_manager_data.c
+++ b/source/blender/draw/intern/draw_manager_data.c
@@ -1031,7 +1031,6 @@ static DRWShadingGroup *drw_shgroup_create_ex(struct GPUShader *shader, DRWPass
   shgroup->stencil_mask = 0;
   shgroup->calls.first = NULL;
   shgroup->calls.last = NULL;
-  shgroup->tfeedback_target = NULL;
   shgroup->pass_parent = pass;
 
   return shgroup;
@@ -1133,7 +1132,7 @@ DRWShadingGroup *DRW_shgroup_transform_feedback_create(struct GPUShader *shader,
   BLI_assert(tf_target != NULL);
   DRWShadingGroup *shgroup = drw_shgroup_create_ex(shader, pass);
   drw_shgroup_init(shgroup, shader);
-  shgroup->tfeedback_target = tf_target;
+  drw_shgroup_uniform_create_ex(shgroup, 0, DRW_UNIFORM_TFEEDBACK_TARGET, tf_target, 0, 1);
   return shgroup;
 }
 
diff --git a/source/blender/draw/intern/draw_manager_exec.c b/source/blender/draw/intern/draw_manager_exec.c
index d61eef3e728..fde1a0e601b 100644
--- a/source/blender/draw/intern/draw_manager_exec.c
+++ b/source/blender/draw/intern/draw_manager_exec.c
@@ -847,7 +847,8 @@ static void draw_update_uniforms(DRWShadingGroup *shgroup,
                                  int *chunkid_loc,
                                  int *obmat_loc,
                                  int *obinv_loc,
-                                 int *mvp_loc)
+                                 int *mvp_loc,
+                                 bool *use_tfeedback)
 {
   for (DRWUniformChunk *unichunk = shgroup->uniforms; unichunk; unichunk = unichunk->next) {
     DRWUniform *uni = unichunk->uniforms;
@@ -924,6 +925,11 @@ static void draw_update_uniforms(DRWShadingGroup *shgroup,
           *chunkid_loc = uni->location;
           GPU_shader_uniform_int(shgroup->shader, uni->location, 0);
           break;
+        case DRW_UNIFORM_TFEEDBACK_TARGET:
+          BLI_assert(data && (*use_tfeedback == false));
+          *use_tfeedback = GPU_shader_transform_feedback_enable(shgroup->shader,
+                                                                ((GPUVertBuf *)data)->vbo_id);
+          break;
           /* Legacy/Fallback support. */
         case DRW_UNIFORM_BASE_INSTANCE:
           *baseinst_loc = uni->location;
@@ -1226,11 +1232,6 @@ static void draw_shgroup(DRWShadingGroup *shgroup, DRWState pass_state)
     DST.batch = NULL;
   }
 
-  if (shgroup->tfeedback_target != NULL) {
-    use_tfeedback = GPU_shader_transform_feedback_enable(shgroup->shader,
-                                                         shgroup->tfeedback_target->vbo_id);
-  }
-
   release_ubo_slots(shader_changed);
   release_texture_slots(shader_changed);
 
@@ -1244,7 +1245,8 @@ static void draw_shgroup(DRWShadingGroup *shgroup, DRWState pass_state)
                        &chunkid_loc,
                        &obmat_loc,
                        &obinv_loc,
-                       &mvp_loc);
+                       &mvp_loc,
+                       &use_tfeedback);
 
   /* Rendering Calls */
   {



More information about the Bf-blender-cvs mailing list