Skip to content

Commit 88f4c24

Browse files
bderodnfield
authored andcommitted
Support 16bit index buffers (flutter#11)
1 parent e768f4d commit 88f4c24

File tree

7 files changed

+41
-1
lines changed

7 files changed

+41
-1
lines changed

impeller/renderer/backend/metal/formats_mtl.h

+9
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,15 @@ constexpr MTLPrimitiveType ToMTLPrimitiveType(PrimitiveType type) {
107107
return MTLPrimitiveTypePoint;
108108
}
109109

110+
constexpr MTLIndexType ToMTLIndexType(IndexType type) {
111+
switch (type) {
112+
case IndexType::k16bit:
113+
return MTLIndexTypeUInt16;
114+
default:
115+
return MTLIndexTypeUInt32;
116+
}
117+
}
118+
110119
constexpr MTLBlendOperation ToMTLBlendOperation(BlendOperation type) {
111120
switch (type) {
112121
case BlendOperation::kAdd:

impeller/renderer/backend/metal/render_pass_mtl.mm

+5-1
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
#include "impeller/renderer/backend/metal/pipeline_mtl.h"
1414
#include "impeller/renderer/backend/metal/sampler_mtl.h"
1515
#include "impeller/renderer/backend/metal/texture_mtl.h"
16+
#include "impeller/renderer/formats.h"
1617
#include "impeller/renderer/host_buffer.h"
1718
#include "impeller/renderer/shader_types.h"
1819

@@ -434,6 +435,9 @@ static bool Bind(PassBindingsCache& pass,
434435
ShaderStage::kFragment)) {
435436
return false;
436437
}
438+
if (command.index_type == IndexType::kUnknown) {
439+
return false;
440+
}
437441
auto index_buffer = command.index_buffer.buffer;
438442
if (!index_buffer) {
439443
return false;
@@ -452,7 +456,7 @@ static bool Bind(PassBindingsCache& pass,
452456
// Returns void. All error checking must be done by this point.
453457
[encoder drawIndexedPrimitives:ToMTLPrimitiveType(command.primitive_type)
454458
indexCount:command.index_count
455-
indexType:MTLIndexTypeUInt32
459+
indexType:ToMTLIndexType(command.index_type)
456460
indexBuffer:mtl_index_buffer
457461
indexBufferOffset:command.index_buffer.range.offset
458462
instanceCount:1u

impeller/renderer/command.cc

+6
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,21 @@
44

55
#include "impeller/renderer/command.h"
66

7+
#include "impeller/renderer/formats.h"
78
#include "impeller/renderer/vertex_descriptor.h"
89

910
namespace impeller {
1011

1112
bool Command::BindVertices(const VertexBuffer& buffer) {
13+
if (index_type == IndexType::kUnknown) {
14+
return false;
15+
}
16+
1217
vertex_bindings.buffers[VertexDescriptor::kReservedVertexBufferIndex] =
1318
buffer.vertex_buffer;
1419
index_buffer = buffer.index_buffer;
1520
index_count = buffer.index_count;
21+
index_type = buffer.index_type;
1622
return true;
1723
}
1824

impeller/renderer/command.h

+1
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ struct Command {
6464
///
6565
BufferView index_buffer;
6666
size_t index_count = 0u;
67+
IndexType index_type = IndexType::kUnknown;
6768
std::string label;
6869
PrimitiveType primitive_type = PrimitiveType::kTriangle;
6970
WindingOrder winding = WindingOrder::kClockwise;

impeller/renderer/formats.h

+6
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,12 @@ enum class WindingOrder {
133133
kCounterClockwise,
134134
};
135135

136+
enum class IndexType {
137+
kUnknown,
138+
k16bit,
139+
k32bit,
140+
};
141+
136142
enum class PrimitiveType {
137143
kTriangle,
138144
kTriangleStrip,

impeller/renderer/vertex_buffer.h

+2
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,15 @@
55
#pragma once
66

77
#include "impeller/renderer/buffer_view.h"
8+
#include "impeller/renderer/formats.h"
89

910
namespace impeller {
1011

1112
struct VertexBuffer {
1213
BufferView vertex_buffer;
1314
BufferView index_buffer;
1415
size_t index_count = 0u;
16+
IndexType index_type = IndexType::kUnknown;
1517

1618
constexpr operator bool() const {
1719
return static_cast<bool>(vertex_buffer) && static_cast<bool>(index_buffer);

impeller/renderer/vertex_buffer_builder.h

+12
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,16 @@ class VertexBufferBuilder {
2929

3030
~VertexBufferBuilder() = default;
3131

32+
constexpr impeller::IndexType GetIndexType() const {
33+
if constexpr (sizeof(IndexType) == 2) {
34+
return impeller::IndexType::k16bit;
35+
} else if (sizeof(IndexType) == 4) {
36+
return impeller::IndexType::k32bit;
37+
} else {
38+
return impeller::IndexType::kUnknown;
39+
}
40+
}
41+
3242
void SetLabel(std::string label) { label_ = std::move(label); }
3343

3444
void Reserve(size_t count) { return vertices_.reserve(count); }
@@ -56,6 +66,7 @@ class VertexBufferBuilder {
5666
buffer.vertex_buffer = CreateVertexBufferView(host_buffer);
5767
buffer.index_buffer = CreateIndexBufferView(host_buffer);
5868
buffer.index_count = GetIndexCount();
69+
buffer.index_type = GetIndexType();
5970
return buffer;
6071
};
6172

@@ -65,6 +76,7 @@ class VertexBufferBuilder {
6576
buffer.vertex_buffer = CreateVertexBufferView(device_allocator);
6677
buffer.index_buffer = CreateIndexBufferView(device_allocator);
6778
buffer.index_count = GetIndexCount();
79+
buffer.index_type = GetIndexType();
6880
return buffer;
6981
};
7082

0 commit comments

Comments
 (0)