[Bf-blender-cvs] [405460c8cab] tmp-drw-callbatching: DRW: Use int instead of uint for DRWCall

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


Commit: 405460c8caba4c3bcb6e9da8c082a620e8528b5b
Author: Clément Foucault
Date:   Thu Jun 6 16:37:44 2019 +0200
Branches: tmp-drw-callbatching
https://developer.blender.org/rB405460c8caba4c3bcb6e9da8c082a620e8528b5b

DRW: Use int instead of uint for DRWCall

This let us tag non-instancing calls by tagging them with -1

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

M	source/blender/draw/intern/draw_instance_data.c
M	source/blender/draw/intern/draw_instance_data.h
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_instance_data.c b/source/blender/draw/intern/draw_instance_data.c
index 802f49d6549..8940a95b2e0 100644
--- a/source/blender/draw/intern/draw_instance_data.c
+++ b/source/blender/draw/intern/draw_instance_data.c
@@ -64,7 +64,7 @@ typedef struct DRWTempBufferHandle {
   /** Format pointer for reuse. */
   GPUVertFormat *format;
   /** Touched vertex length for resize. */
-  uint *vert_len;
+  int *vert_len;
 } DRWTempBufferHandle;
 
 static ListBase g_idatalists = {NULL, NULL};
@@ -112,7 +112,7 @@ static void instance_batch_free(GPUBatch *geom, void *UNUSED(user_data))
  */
 GPUVertBuf *DRW_temp_buffer_request(DRWInstanceDataList *idatalist,
                                     GPUVertFormat *format,
-                                    uint *vert_len)
+                                    int *vert_len)
 {
   BLI_assert(format != NULL);
   BLI_assert(vert_len != NULL);
diff --git a/source/blender/draw/intern/draw_instance_data.h b/source/blender/draw/intern/draw_instance_data.h
index d88de1a58e2..56133a3aa71 100644
--- a/source/blender/draw/intern/draw_instance_data.h
+++ b/source/blender/draw/intern/draw_instance_data.h
@@ -42,7 +42,7 @@ DRWInstanceData *DRW_instance_data_request(DRWInstanceDataList *idatalist, uint
 
 GPUVertBuf *DRW_temp_buffer_request(DRWInstanceDataList *idatalist,
                                     GPUVertFormat *format,
-                                    uint *vert_len);
+                                    int *vert_len);
 GPUBatch *DRW_temp_batch_instance_request(DRWInstanceDataList *idatalist,
                                           GPUVertBuf *buf,
                                           GPUBatch *geom);
diff --git a/source/blender/draw/intern/draw_manager.h b/source/blender/draw/intern/draw_manager.h
index 289b583b9e9..9ccc6832127 100644
--- a/source/blender/draw/intern/draw_manager.h
+++ b/source/blender/draw/intern/draw_manager.h
@@ -156,9 +156,9 @@ BLI_STATIC_ASSERT_ALIGN(DRWObjectInfos, 16)
 
 typedef struct DRWCall {
   GPUBatch *batch;
-  uint vert_first;
-  uint vert_count;
-  uint inst_count;
+  int vert_first;
+  int vert_count;
+  int inst_count;
 
   DRWResourceHandle handle;
 
diff --git a/source/blender/draw/intern/draw_manager_data.c b/source/blender/draw/intern/draw_manager_data.c
index 6875628e74e..34c67f5c727 100644
--- a/source/blender/draw/intern/draw_manager_data.c
+++ b/source/blender/draw/intern/draw_manager_data.c
@@ -571,7 +571,7 @@ void DRW_shgroup_call_ex(DRWShadingGroup *shgroup,
   call->batch = geom;
   call->vert_first = v_sta;
   call->vert_count = v_ct; /* 0 means auto from batch. */
-  call->inst_count = 0;
+  call->inst_count = -1;   /* -1 means no instances. */
 #ifdef USE_GPU_SELECT
   call->select_id = DST.select_id;
   call->inst_selectid = NULL;
@@ -602,7 +602,7 @@ static void drw_shgroup_call_procedural_add_ex(DRWShadingGroup *shgroup,
   call->batch = geom;
   call->vert_first = 0;
   call->vert_count = vert_count;
-  call->inst_count = 0;
+  call->inst_count = -1; /* -1 means no instances. */
 #ifdef USE_GPU_SELECT
   call->select_id = DST.select_id;
   call->inst_selectid = NULL;
@@ -824,7 +824,7 @@ DRWCallBuffer *DRW_shgroup_call_buffer(DRWShadingGroup *shgroup,
   call->batch = DRW_temp_batch_request(DST.idatalist, buf, prim_type);
   call->vert_first = 0;
   call->vert_count = 0;
-  call->inst_count = 0;
+  call->inst_count = -1; /* -1 means no instances. */
 
 #ifdef USE_GPU_SELECT
   if (G.f & G_FLAG_PICKSEL) {
diff --git a/source/blender/draw/intern/draw_manager_exec.c b/source/blender/draw/intern/draw_manager_exec.c
index a78a0033ffe..107c80d7619 100644
--- a/source/blender/draw/intern/draw_manager_exec.c
+++ b/source/blender/draw/intern/draw_manager_exec.c
@@ -599,12 +599,15 @@ BLI_INLINE void draw_legacy_matrix_update(DRWShadingGroup *shgroup,
 
 BLI_INLINE void draw_geometry_execute(DRWShadingGroup *shgroup,
                                       GPUBatch *geom,
-                                      uint vert_first,
-                                      uint vert_count,
-                                      uint inst_first,
-                                      uint inst_count,
+                                      int vert_first,
+                                      int vert_count,
+                                      int inst_first,
+                                      int inst_count,
                                       int baseinst_loc)
 {
+  /* inst_count can be -1. */
+  inst_count = max_ii(0, inst_count);
+
   if (baseinst_loc != -1) {
     /* Fallback when ARB_shader_draw_parameters is not supported. */
     GPU_shader_uniform_vector_int(shgroup->shader, baseinst_loc, 1, 1, (int *)&inst_first);
@@ -915,10 +918,10 @@ BLI_INLINE bool draw_select_do_call(DRWShadingGroup *shgroup, DRWCall *call, int
     return false;
   }
   if (call->inst_selectid != NULL) {
-    const bool is_instancing = (call->inst_count != 0);
-    uint start = 0;
-    uint count = 1;
-    uint tot = is_instancing ? call->inst_count : call->vert_count;
+    const bool is_instancing = (call->inst_count != -1);
+    int start = 0;
+    int count = 1;
+    int tot = is_instancing ? max_ii(0, call->inst_count) : call->vert_count;
     /* Hack : get vbo data without actually drawing. */
     GPUVertBufRaw raw;
     GPU_vertbuf_attr_get_raw_data(call->inst_selectid, 0, &raw);
@@ -986,9 +989,9 @@ static DRWCall *draw_call_iter_step(DRWCallIterator *iter)
 
 typedef struct DRWCommandsState {
   int callid;
-  uint resource_chunk;
-  uint base_inst;
-  uint inst_count;
+  int resource_chunk;
+  int base_inst;
+  int inst_count;
   GPUBatch *batch;
   bool neg_scale;
 } DRWCommandsState;
@@ -1031,7 +1034,7 @@ static bool draw_call_do_batching(DRWShadingGroup *shgroup,
                                   int baseinst_loc,
                                   int chunkid_loc)
 {
-  if (call->inst_count > 0 || call->vert_first > 0 || call->vert_count > 0 || obmats_loc == -1 ||
+  if (call->inst_count != -1 || call->vert_first > 0 || call->vert_count > 0 || obmats_loc == -1 ||
       G.f & G_FLAG_PICKSEL) {
     /* Safety guard. Batching should not happen in a shgroup
      * where any if the above condition are true. */
@@ -1174,8 +1177,9 @@ static void draw_shgroup(DRWShadingGroup *shgroup, DRWState pass_state)
 #endif
 
     /* Reset state */
-    glFrontFace(GL_CCW);
-
+    if (state.neg_scale) {
+      glFrontFace(GL_CCW);
+    }
     if (obmats_loc != -1) {
       GPU_uniformbuffer_unbind(DST.vmempool->matrices_ubo[state.resource_chunk]);
     }



More information about the Bf-blender-cvs mailing list