Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorClément Foucault <foucault.clem@gmail.com>2022-03-16 11:06:06 +0300
committerClément Foucault <foucault.clem@gmail.com>2022-03-18 22:59:33 +0300
commite5c2bfb341020e65021a63d30be754eff7d69087 (patch)
tree4225811c9285c44352853c66de7d83190f788680
parentd7df0dcccb50bbbc1e14cbe49bb128fa108b8a3e (diff)
DRW: Add support for compute indirect command.
This just expose the GPU API through DRW.
-rw-r--r--source/blender/draw/intern/DRW_render.h4
-rw-r--r--source/blender/draw/intern/draw_manager.h6
-rw-r--r--source/blender/draw/intern/draw_manager_data.c12
-rw-r--r--source/blender/draw/intern/draw_manager_exec.c3
4 files changed, 25 insertions, 0 deletions
diff --git a/source/blender/draw/intern/DRW_render.h b/source/blender/draw/intern/DRW_render.h
index 528e8664fbb..8dbf5483d47 100644
--- a/source/blender/draw/intern/DRW_render.h
+++ b/source/blender/draw/intern/DRW_render.h
@@ -467,6 +467,10 @@ void DRW_shgroup_call_compute(DRWShadingGroup *shgroup,
* \warning this keeps the ref to groups_ref until it actually dispatch.
*/
void DRW_shgroup_call_compute_ref(DRWShadingGroup *shgroup, int groups_ref[3]);
+/**
+ * \note No need for a barrier. \a indirect_buf is internally synchronized.
+ */
+void DRW_shgroup_call_compute_indirect(DRWShadingGroup *shgroup, GPUStorageBuf *indirect_buf);
void DRW_shgroup_call_procedural_points(DRWShadingGroup *sh, Object *ob, uint point_count);
void DRW_shgroup_call_procedural_lines(DRWShadingGroup *sh, Object *ob, uint line_count);
void DRW_shgroup_call_procedural_triangles(DRWShadingGroup *sh, Object *ob, uint tri_count);
diff --git a/source/blender/draw/intern/draw_manager.h b/source/blender/draw/intern/draw_manager.h
index b5aaaf36368..6a50348533f 100644
--- a/source/blender/draw/intern/draw_manager.h
+++ b/source/blender/draw/intern/draw_manager.h
@@ -191,6 +191,7 @@ typedef enum {
/* Compute Commands. */
DRW_CMD_COMPUTE = 8,
DRW_CMD_COMPUTE_REF = 9,
+ DRW_CMD_COMPUTE_INDIRECT = 10,
/* Other Commands */
DRW_CMD_BARRIER = 11,
@@ -240,6 +241,10 @@ typedef struct DRWCommandComputeRef {
int *groups_ref;
} DRWCommandComputeRef;
+typedef struct DRWCommandComputeIndirect {
+ GPUStorageBuf *indirect_buf;
+} DRWCommandComputeIndirect;
+
typedef struct DRWCommandBarrier {
eGPUBarrier type;
} DRWCommandBarrier;
@@ -282,6 +287,7 @@ typedef union DRWCommand {
DRWCommandDrawProcedural procedural;
DRWCommandCompute compute;
DRWCommandComputeRef compute_ref;
+ DRWCommandComputeIndirect compute_indirect;
DRWCommandBarrier barrier;
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 be45cee8759..a069a4e756c 100644
--- a/source/blender/draw/intern/draw_manager_data.c
+++ b/source/blender/draw/intern/draw_manager_data.c
@@ -820,6 +820,12 @@ static void drw_command_compute_ref(DRWShadingGroup *shgroup, int groups_ref[3])
cmd->groups_ref = groups_ref;
}
+static void drw_command_compute_indirect(DRWShadingGroup *shgroup, GPUStorageBuf *indirect_buf)
+{
+ DRWCommandComputeIndirect *cmd = drw_command_create(shgroup, DRW_CMD_COMPUTE_INDIRECT);
+ cmd->indirect_buf = indirect_buf;
+}
+
static void drw_command_barrier(DRWShadingGroup *shgroup, eGPUBarrier type)
{
DRWCommandBarrier *cmd = drw_command_create(shgroup, DRW_CMD_BARRIER);
@@ -958,6 +964,12 @@ void DRW_shgroup_call_compute_ref(DRWShadingGroup *shgroup, int groups_ref[3])
drw_command_compute_ref(shgroup, groups_ref);
}
+void DRW_shgroup_call_compute_indirect(DRWShadingGroup *shgroup, GPUStorageBuf *indirect_buf)
+{
+ BLI_assert(GPU_compute_shader_support());
+
+ drw_command_compute_indirect(shgroup, indirect_buf);
+}
void DRW_shgroup_barrier(DRWShadingGroup *shgroup, eGPUBarrier type)
{
BLI_assert(GPU_compute_shader_support());
diff --git a/source/blender/draw/intern/draw_manager_exec.c b/source/blender/draw/intern/draw_manager_exec.c
index 319f63eebad..682a91ee7d4 100644
--- a/source/blender/draw/intern/draw_manager_exec.c
+++ b/source/blender/draw/intern/draw_manager_exec.c
@@ -1051,6 +1051,9 @@ static void draw_shgroup(DRWShadingGroup *shgroup, DRWState pass_state)
cmd->compute_ref.groups_ref[1],
cmd->compute_ref.groups_ref[2]);
break;
+ case DRW_CMD_COMPUTE_INDIRECT:
+ GPU_compute_dispatch_indirect(shgroup->shader, cmd->compute_indirect.indirect_buf);
+ break;
case DRW_CMD_BARRIER:
GPU_memory_barrier(cmd->barrier.type);
break;