Skip to content

Commit e60ee25

Browse files
committed
Add missing bind_index_buffer
1 parent 90b1b5b commit e60ee25

4 files changed

Lines changed: 38 additions & 3 deletions

File tree

pathfinder/gpu/command_encoder.cpp

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,18 @@ void CommandEncoder::bind_vertex_buffers(std::vector<std::pair<std::shared_ptr<B
6363
commands_.push_back(cmd);
6464
}
6565

66+
void CommandEncoder::bind_index_buffer(Buffer *buffer) {
67+
Command cmd{};
68+
cmd.type = CommandType::BindIndexBuffer;
69+
70+
auto &args = cmd.args.bind_index_buffer;
71+
args.buffer = buffer;
72+
args.offset = 0;
73+
args.data_type = DataType::u32;
74+
75+
commands_.push_back(cmd);
76+
}
77+
6678
void CommandEncoder::bind_descriptor_set(const std::shared_ptr<DescriptorSet> &descriptor_set) {
6779
Command cmd{};
6880
cmd.type = CommandType::BindDescriptorSet;
@@ -98,7 +110,7 @@ void CommandEncoder::draw_indexed(uint32_t index_count,
98110
uint32_t instance_count,
99111
uint32_t first_index,
100112
uint32_t first_instance) {
101-
Command cmd;
113+
Command cmd{};
102114
cmd.type = CommandType::DrawIndexed;
103115

104116
auto &args = cmd.args.draw_indexed;
@@ -122,7 +134,7 @@ void CommandEncoder::draw_instanced(uint32_t vertex_count, uint32_t instance_cou
122134
}
123135

124136
void CommandEncoder::draw_indirect(Buffer *buffer, uint32_t offset) {
125-
Command cmd;
137+
Command cmd{};
126138
cmd.type = CommandType::DrawIndirect;
127139

128140
auto &args = cmd.args.indirect;
@@ -164,7 +176,7 @@ void CommandEncoder::dispatch(uint32_t group_size_x, uint32_t group_size_y, uint
164176
}
165177

166178
void CommandEncoder::dispatch_indirect(Buffer *buffer, uint32_t offset) {
167-
Command cmd;
179+
Command cmd{};
168180
cmd.type = CommandType::DispatchIndirect;
169181

170182
auto &args = cmd.args.indirect;

pathfinder/gpu/command_encoder.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ enum class CommandType {
2626
SetViewport,
2727
BindRenderPipeline,
2828
BindVertexBuffers,
29+
BindIndexBuffer,
2930
BindDescriptorSet,
3031
Draw,
3132
DrawIndexed,
@@ -73,6 +74,8 @@ struct Command {
7374
} bind_vertex_buffers;
7475
struct {
7576
Buffer *buffer;
77+
DataType data_type; // u32 only.
78+
size_t offset; // Zero only.
7679
} bind_index_buffer;
7780
struct {
7881
DescriptorSet *descriptor_set;
@@ -159,6 +162,8 @@ class CommandEncoder {
159162

160163
void bind_vertex_buffers(std::vector<std::pair<std::shared_ptr<Buffer>, uint64_t>> vertex_buffers);
161164

165+
void bind_index_buffer(Buffer *buffer);
166+
162167
/// Bind uniform buffers and texture samplers.
163168
/// Image layout should be ready before calling this.
164169
void bind_descriptor_set(const std::shared_ptr<DescriptorSet> &descriptor_set);

pathfinder/gpu/gl/command_encoder.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,14 @@ bool CommandEncoderGl::finish() {
155155

156156
gl_check_error("BindVertexBuffers");
157157
} break;
158+
case CommandType::BindIndexBuffer: {
159+
const auto &args = cmd.args.bind_index_buffer;
160+
161+
auto buffer_gl = (BufferGl *)args.buffer;
162+
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, buffer_gl->get_handle());
163+
164+
gl_check_error("BindIndexBuffer");
165+
} break;
158166
case CommandType::BindDescriptorSet: {
159167
auto &args = cmd.args.bind_descriptor_set;
160168

pathfinder/gpu/vk/command_encoder.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -272,6 +272,16 @@ bool CommandEncoderVk::finish() {
272272
vertex_buffers.data(),
273273
offsets.data()); // Data offset of each buffer.
274274
} break;
275+
case CommandType::BindIndexBuffer: {
276+
auto &args = cmd.args.bind_index_buffer;
277+
278+
auto buffer_vk = static_cast<BufferVk *>(args.buffer);
279+
280+
VkBuffer buffer = buffer_vk->get_vk_buffer();
281+
VkDeviceSize offset = args.offset;
282+
283+
vkCmdBindIndexBuffer(vk_command_buffer_, buffer, offset, VK_INDEX_TYPE_UINT32);
284+
} break;
275285
case CommandType::BindDescriptorSet: {
276286
auto &args = cmd.args.bind_descriptor_set;
277287
auto descriptor_set_vk = static_cast<DescriptorSetVk *>(args.descriptor_set);

0 commit comments

Comments
 (0)