[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