Skip to content

Commit 8445494

Browse files
committed
Add draw_indirect & dispatch_indirect
1 parent 9a93ea3 commit 8445494

4 files changed

Lines changed: 63 additions & 0 deletions

File tree

pathfinder/gpu/command_encoder.cpp

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,17 @@ void CommandEncoder::draw_instanced(uint32_t vertex_count, uint32_t instance_cou
105105
commands_.push_back(cmd);
106106
}
107107

108+
void CommandEncoder::draw_indirect(Buffer *buffer, uint32_t offset) {
109+
Command cmd;
110+
cmd.type = CommandType::DrawIndirect;
111+
112+
auto &args = cmd.args.indirect;
113+
args.buffer = buffer;
114+
args.offset = offset;
115+
116+
commands_.push_back(cmd);
117+
}
118+
108119
void CommandEncoder::end_render_pass() {
109120
Command cmd{};
110121
cmd.type = CommandType::EndRenderPass;
@@ -136,6 +147,17 @@ void CommandEncoder::dispatch(uint32_t group_size_x, uint32_t group_size_y, uint
136147
commands_.push_back(cmd);
137148
}
138149

150+
void CommandEncoder::dispatch_indirect(Buffer *buffer, uint32_t offset) {
151+
Command cmd;
152+
cmd.type = CommandType::DispatchIndirect;
153+
154+
auto &args = cmd.args.indirect;
155+
args.buffer = buffer;
156+
args.offset = offset;
157+
158+
commands_.push_back(cmd);
159+
}
160+
139161
void CommandEncoder::end_compute_pass() {
140162
Command cmd{};
141163
cmd.type = CommandType::EndComputePass;

pathfinder/gpu/command_encoder.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,13 +29,15 @@ enum class CommandType {
2929
BindDescriptorSet,
3030
Draw,
3131
DrawInstanced,
32+
DrawIndirect,
3233
EndRenderPass,
3334

3435
// COMPUTE PASS
3536

3637
BeginComputePass,
3738
BindComputePipeline,
3839
Dispatch,
40+
DispatchIndirect,
3941
EndComputePass,
4042

4143
// DATA TRANSFER
@@ -82,6 +84,10 @@ struct Command {
8284
uint32_t vertex_count;
8385
uint32_t instance_count;
8486
} draw_instanced;
87+
struct {
88+
Buffer *buffer;
89+
size_t offset;
90+
} indirect;
8591
struct {
8692
ComputePipeline *pipeline;
8793
} bind_compute_pipeline;
@@ -155,6 +161,8 @@ class CommandEncoder {
155161

156162
void draw_instanced(uint32_t vertex_count, uint32_t instance_count);
157163

164+
void draw_indirect(Buffer *buffer, uint32_t offset);
165+
158166
void end_render_pass();
159167

160168
// COMPUTE PASS
@@ -165,6 +173,8 @@ class CommandEncoder {
165173

166174
void dispatch(uint32_t group_size_x, uint32_t group_size_y, uint32_t group_size_z);
167175

176+
void dispatch_indirect(Buffer *buffer, uint32_t offset);
177+
168178
void end_compute_pass();
169179

170180
// DATA TRANSFER

pathfinder/gpu/gl/command_encoder.cpp

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -225,6 +225,27 @@ bool CommandEncoderGl::finish() {
225225

226226
gl_check_error("DrawInstanced");
227227
} break;
228+
#ifdef PATHFINDER_ENABLE_COMPUTE
229+
case CommandType::DrawIndirect: {
230+
auto &args = cmd.args.indirect;
231+
auto buffer_gl = (BufferGl *)args.buffer;
232+
233+
glBindBuffer(GL_DRAW_INDIRECT_BUFFER, buffer_gl->get_handle());
234+
glDrawArraysIndirect(GL_TRIANGLES, reinterpret_cast<void *>(args.offset));
235+
236+
gl_check_error("DrawIndirect");
237+
} break;
238+
case CommandType::DispatchIndirect: {
239+
auto &args = cmd.args.indirect;
240+
auto buffer_gl = (BufferGl *)args.buffer;
241+
242+
glBindBuffer(GL_DISPATCH_INDIRECT_BUFFER, buffer_gl->get_handle());
243+
glDispatchComputeIndirect(static_cast<GLintptr>(args.offset));
244+
glMemoryBarrier(GL_SHADER_STORAGE_BARRIER_BIT);
245+
246+
gl_check_error("DispatchIndirect");
247+
} break;
248+
#endif
228249
case CommandType::EndRenderPass: {
229250
render_pipeline_ = nullptr;
230251
} break;

pathfinder/gpu/vk/command_encoder.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -321,6 +321,11 @@ bool CommandEncoderVk::finish() {
321321
auto &args = cmd.args.draw_instanced;
322322
vkCmdDraw(vk_command_buffer_, args.vertex_count, args.instance_count, 0, 0);
323323
} break;
324+
case CommandType::DrawIndirect: {
325+
auto &args = cmd.args.indirect;
326+
auto buffer_vk = static_cast<BufferVk *>(args.buffer);
327+
vkCmdDrawIndirect(vk_command_buffer_, buffer_vk->get_vk_buffer(), args.offset, 1, 0);
328+
} break;
324329
case CommandType::EndRenderPass: {
325330
vkCmdEndRenderPass(vk_command_buffer_);
326331

@@ -353,6 +358,11 @@ bool CommandEncoderVk::finish() {
353358
// Dispatch compute job.
354359
vkCmdDispatch(vk_command_buffer_, args.group_size_x, args.group_size_y, args.group_size_z);
355360
} break;
361+
case CommandType::DispatchIndirect: {
362+
auto &args = cmd.args.indirect;
363+
auto buffer_vk = static_cast<BufferVk *>(args.buffer);
364+
vkCmdDispatchIndirect(vk_command_buffer_, buffer_vk->get_vk_buffer(), args.offset);
365+
} break;
356366
case CommandType::EndComputePass: {
357367
compute_pipeline_ = nullptr;
358368
} break;

0 commit comments

Comments
 (0)