Skip to content

Commit 90b1b5b

Browse files
committed
Support index buffer
1 parent 8445494 commit 90b1b5b

6 files changed

Lines changed: 56 additions & 4 deletions

File tree

pathfinder/gpu/command_encoder.cpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,22 @@ void CommandEncoder::draw(uint32_t first_vertex, uint32_t vertex_count) {
9494
commands_.push_back(cmd);
9595
}
9696

97+
void CommandEncoder::draw_indexed(uint32_t index_count,
98+
uint32_t instance_count,
99+
uint32_t first_index,
100+
uint32_t first_instance) {
101+
Command cmd;
102+
cmd.type = CommandType::DrawIndexed;
103+
104+
auto &args = cmd.args.draw_indexed;
105+
args.index_count = index_count;
106+
args.first_index = first_index;
107+
args.instance_count = instance_count;
108+
args.first_instance = first_instance;
109+
110+
commands_.push_back(cmd);
111+
}
112+
97113
void CommandEncoder::draw_instanced(uint32_t vertex_count, uint32_t instance_count) {
98114
Command cmd{};
99115
cmd.type = CommandType::DrawInstanced;

pathfinder/gpu/command_encoder.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ enum class CommandType {
2828
BindVertexBuffers,
2929
BindDescriptorSet,
3030
Draw,
31+
DrawIndexed,
3132
DrawInstanced,
3233
DrawIndirect,
3334
EndRenderPass,
@@ -80,6 +81,12 @@ struct Command {
8081
uint32_t first_vertex;
8182
uint32_t vertex_count;
8283
} draw;
84+
struct {
85+
uint32_t index_count;
86+
uint32_t first_index;
87+
uint32_t instance_count;
88+
uint32_t first_instance;
89+
} draw_indexed;
8390
struct {
8491
uint32_t vertex_count;
8592
uint32_t instance_count;
@@ -159,6 +166,9 @@ class CommandEncoder {
159166
/// Draw call.
160167
void draw(uint32_t first_vertex, uint32_t vertex_count);
161168

169+
/// We don't support vertex offset, as it's not supported by GLES 3.0.
170+
void draw_indexed(uint32_t index_count, uint32_t instance_count, uint32_t first_index, uint32_t first_instance);
171+
162172
void draw_instanced(uint32_t vertex_count, uint32_t instance_count);
163173

164174
void draw_indirect(Buffer *buffer, uint32_t offset);

pathfinder/gpu/gl/buffer.cpp

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,7 @@ BufferGl::BufferGl(const BufferDescriptor &desc) : Buffer(desc) {
2626
target = GL_ARRAY_BUFFER;
2727
} break;
2828
case BufferType::Index: {
29-
Logger::error("Cannot handle index buffers yet!");
30-
abort();
29+
target = GL_ELEMENT_ARRAY_BUFFER;
3130
} break;
3231
case BufferType::Storage: {
3332
#ifdef PATHFINDER_ENABLE_COMPUTE
@@ -58,7 +57,7 @@ void BufferGl::upload_via_mapping(size_t data_size, size_t offset, const void *d
5857
gl_buffer_type = GL_UNIFORM_BUFFER;
5958
} break;
6059
case BufferType::Index: {
61-
Logger::error("Cannot handle index buffers yet!");
60+
gl_buffer_type = GL_ELEMENT_ARRAY_BUFFER;
6261
} break;
6362
case BufferType::Storage: {
6463
#ifdef PATHFINDER_ENABLE_COMPUTE

pathfinder/gpu/gl/command_encoder.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -218,6 +218,17 @@ bool CommandEncoderGl::finish() {
218218

219219
gl_check_error("Draw");
220220
} break;
221+
case CommandType::DrawIndexed: {
222+
auto &args = cmd.args.draw_indexed;
223+
224+
glDrawElementsInstanced(GL_TRIANGLES,
225+
GLint(args.index_count),
226+
GL_UNSIGNED_INT,
227+
reinterpret_cast<void *>(args.first_index),
228+
args.instance_count);
229+
230+
gl_check_error("DrawIndexed");
231+
} break;
221232
case CommandType::DrawInstanced: {
222233
auto &args = cmd.args.draw_instanced;
223234

pathfinder/gpu/vk/command_encoder.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -317,6 +317,15 @@ bool CommandEncoderVk::finish() {
317317
auto &args = cmd.args.draw;
318318
vkCmdDraw(vk_command_buffer_, args.vertex_count, 1, 0, 0);
319319
} break;
320+
case CommandType::DrawIndexed: {
321+
auto &args = cmd.args.draw_indexed;
322+
vkCmdDrawIndexed(vk_command_buffer_,
323+
args.index_count,
324+
args.instance_count,
325+
args.first_index,
326+
0, // No support for vertex offset
327+
args.first_instance);
328+
} break;
320329
case CommandType::DrawInstanced: {
321330
auto &args = cmd.args.draw_instanced;
322331
vkCmdDraw(vk_command_buffer_, args.vertex_count, args.instance_count, 0, 0);

pathfinder/gpu/vk/device.cpp

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -392,10 +392,17 @@ std::shared_ptr<Buffer> DeviceVk::create_buffer(const BufferDescriptor &desc, co
392392
buffer_vk->vk_buffer_,
393393
buffer_vk->vk_device_memory_);
394394
} break;
395+
case BufferType::Index: {
396+
create_vk_buffer(desc.size,
397+
VK_BUFFER_USAGE_TRANSFER_DST_BIT | VK_BUFFER_USAGE_INDEX_BUFFER_BIT,
398+
vk_memory_property,
399+
buffer_vk->vk_buffer_,
400+
buffer_vk->vk_device_memory_);
401+
} break;
395402
case BufferType::Storage: {
396403
create_vk_buffer(desc.size,
397404
VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT |
398-
VK_BUFFER_USAGE_STORAGE_BUFFER_BIT,
405+
VK_BUFFER_USAGE_STORAGE_BUFFER_BIT | VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT,
399406
vk_memory_property,
400407
buffer_vk->vk_buffer_,
401408
buffer_vk->vk_device_memory_);

0 commit comments

Comments
 (0)