[Bf-blender-cvs] [82c135816f7] greasepencil-refactor: Draw Manager: Add new DRW_shgroup_call_instance_range

Clément Foucault noreply at git.blender.org
Sun Dec 8 01:39:04 CET 2019


Commit: 82c135816f7b81e0d5eb084f37159de8d195c078
Author: Clément Foucault
Date:   Sun Dec 8 01:15:27 2019 +0100
Branches: greasepencil-refactor
https://developer.blender.org/rB82c135816f7b81e0d5eb084f37159de8d195c078

Draw Manager: Add new DRW_shgroup_call_instance_range

This is to be able to create drawcalls that only render a range of the
instance buffer.

Very needed for the new GPencil stroke rendering.

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

M	source/blender/draw/intern/DRW_render.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/DRW_render.h b/source/blender/draw/intern/DRW_render.h
index 8037bd03383..f00bf61cbb7 100644
--- a/source/blender/draw/intern/DRW_render.h
+++ b/source/blender/draw/intern/DRW_render.h
@@ -391,6 +391,10 @@ void DRW_shgroup_call_range(DRWShadingGroup *shgroup,
                             struct GPUBatch *geom,
                             uint v_sta,
                             uint v_ct);
+void DRW_shgroup_call_instance_range(DRWShadingGroup *shgroup,
+                                     struct GPUBatch *geom,
+                                     uint v_sta,
+                                     uint v_ct);
 
 void DRW_shgroup_call_procedural_points(DRWShadingGroup *sh, Object *ob, uint point_ct);
 void DRW_shgroup_call_procedural_lines(DRWShadingGroup *sh, Object *ob, uint line_ct);
diff --git a/source/blender/draw/intern/draw_manager.h b/source/blender/draw/intern/draw_manager.h
index f040afc794c..f3683bdaf51 100644
--- a/source/blender/draw/intern/draw_manager.h
+++ b/source/blender/draw/intern/draw_manager.h
@@ -181,7 +181,8 @@ typedef enum {
   DRW_CMD_DRAW = 0, /* Only sortable type. Must be 0. */
   DRW_CMD_DRAW_RANGE = 1,
   DRW_CMD_DRAW_INSTANCE = 2,
-  DRW_CMD_DRAW_PROCEDURAL = 3,
+  DRW_CMD_DRAW_INSTANCE_RANGE = 3,
+  DRW_CMD_DRAW_PROCEDURAL = 4,
   /* Other Commands */
   DRW_CMD_CLEAR = 12,
   DRW_CMD_DRWSTATE = 13,
@@ -211,6 +212,12 @@ typedef struct DRWCommandDrawInstance {
   uint use_attribs; /* bool */
 } DRWCommandDrawInstance;
 
+typedef struct DRWCommandDrawInstanceRange {
+  GPUBatch *batch;
+  uint inst_first;
+  uint inst_count;
+} DRWCommandDrawInstanceRange;
+
 typedef struct DRWCommandDrawProcedural {
   GPUBatch *batch;
   DRWResourceHandle handle;
@@ -243,6 +250,7 @@ typedef union DRWCommand {
   DRWCommandDraw draw;
   DRWCommandDrawRange range;
   DRWCommandDrawInstance instance;
+  DRWCommandDrawInstanceRange instance_range;
   DRWCommandDrawProcedural procedural;
   DRWCommandSetMutableState state;
   DRWCommandSetStencil stencil;
diff --git a/source/blender/draw/intern/draw_manager_data.c b/source/blender/draw/intern/draw_manager_data.c
index 4b3be3ab924..90e8d6634be 100644
--- a/source/blender/draw/intern/draw_manager_data.c
+++ b/source/blender/draw/intern/draw_manager_data.c
@@ -659,6 +659,17 @@ static void drw_command_draw_instance(DRWShadingGroup *shgroup,
   cmd->use_attribs = use_attrib;
 }
 
+static void drw_command_draw_intance_range(DRWShadingGroup *shgroup,
+                                           GPUBatch *batch,
+                                           uint start,
+                                           uint count)
+{
+  DRWCommandDrawInstanceRange *cmd = drw_command_create(shgroup, DRW_CMD_DRAW_INSTANCE_RANGE);
+  cmd->batch = batch;
+  cmd->inst_first = start;
+  cmd->inst_count = count;
+}
+
 static void drw_command_draw_procedural(DRWShadingGroup *shgroup,
                                         GPUBatch *batch,
                                         DRWResourceHandle handle,
@@ -753,6 +764,18 @@ void DRW_shgroup_call_range(DRWShadingGroup *shgroup, struct GPUBatch *geom, uin
   drw_command_draw_range(shgroup, geom, v_sta, v_ct);
 }
 
+void DRW_shgroup_call_instance_range(DRWShadingGroup *shgroup,
+                                     struct GPUBatch *geom,
+                                     uint i_sta,
+                                     uint i_ct)
+{
+  BLI_assert(geom != NULL);
+  if (G.f & G_FLAG_PICKSEL) {
+    drw_command_set_select_id(shgroup, NULL, DST.select_id);
+  }
+  drw_command_draw_intance_range(shgroup, geom, i_sta, i_ct);
+}
+
 static void drw_shgroup_call_procedural_add_ex(DRWShadingGroup *shgroup,
                                                GPUBatch *geom,
                                                Object *ob,
diff --git a/source/blender/draw/intern/draw_manager_exec.c b/source/blender/draw/intern/draw_manager_exec.c
index 9d14b77119f..977bec92cba 100644
--- a/source/blender/draw/intern/draw_manager_exec.c
+++ b/source/blender/draw/intern/draw_manager_exec.c
@@ -1112,6 +1112,7 @@ static void draw_call_single_do(DRWShadingGroup *shgroup,
                                 DRWResourceHandle handle,
                                 int vert_first,
                                 int vert_count,
+                                int inst_first,
                                 int inst_count,
                                 bool do_base_instance)
 {
@@ -1140,7 +1141,7 @@ static void draw_call_single_do(DRWShadingGroup *shgroup,
                         batch,
                         vert_first,
                         vert_count,
-                        do_base_instance ? DRW_handle_id_get(&handle) : 0,
+                        do_base_instance ? DRW_handle_id_get(&handle) : inst_first,
                         inst_count,
                         state->baseinst_loc);
 }
@@ -1314,7 +1315,8 @@ static void draw_shgroup(DRWShadingGroup *shgroup, DRWState pass_state)
         case DRW_CMD_DRAW:
           if (!USE_BATCHING || state.obmats_loc == -1 || (G.f & G_FLAG_PICKSEL) ||
               cmd->draw.batch->inst) {
-            draw_call_single_do(shgroup, &state, cmd->draw.batch, cmd->draw.handle, 0, 0, 0, true);
+            draw_call_single_do(
+                shgroup, &state, cmd->draw.batch, cmd->draw.handle, 0, 0, 0, 0, true);
           }
           else {
             draw_call_batching_do(shgroup, &state, &cmd->draw);
@@ -1327,6 +1329,7 @@ static void draw_shgroup(DRWShadingGroup *shgroup, DRWState pass_state)
                               cmd->procedural.handle,
                               0,
                               cmd->procedural.vert_count,
+                              0,
                               1,
                               true);
           break;
@@ -1337,6 +1340,7 @@ static void draw_shgroup(DRWShadingGroup *shgroup, DRWState pass_state)
                               cmd->instance.handle,
                               0,
                               0,
+                              0,
                               cmd->instance.inst_count,
                               cmd->instance.use_attribs == 0);
           break;
@@ -1347,9 +1351,21 @@ static void draw_shgroup(DRWShadingGroup *shgroup, DRWState pass_state)
                               (DRWResourceHandle)0,
                               cmd->range.vert_first,
                               cmd->range.vert_count,
+                              0,
                               1,
                               true);
           break;
+        case DRW_CMD_DRAW_INSTANCE_RANGE:
+          draw_call_single_do(shgroup,
+                              &state,
+                              cmd->instance_range.batch,
+                              (DRWResourceHandle)0,
+                              0,
+                              0,
+                              cmd->instance_range.inst_first,
+                              cmd->instance_range.inst_count,
+                              false);
+          break;
       }
     }



More information about the Bf-blender-cvs mailing list