5 #ifndef FLUTTER_IMPELLER_RENDERER_VERTEX_BUFFER_BUILDER_H_
6 #define FLUTTER_IMPELLER_RENDERER_VERTEX_BUFFER_BUILDER_H_
8 #include <initializer_list>
10 #include <type_traits>
23 template <
class VertexType,
size_t size>
28 input.data(),
sizeof(VertexType) * size,
alignof(VertexType)),
34 template <
class VertexType_,
class IndexType_ = u
int16_t>
45 if (indices_.size() == 0) {
57 void SetLabel(
const std::string& label) { label_ = label; }
59 void Reserve(
size_t count) {
return vertices_.reserve(count); }
68 return indices_.size() > 0 ? indices_.size() : vertices_.size();
72 FML_DCHECK(!vertices_.empty());
73 return vertices_.back();
77 vertices_.emplace_back(std::move(vertex));
82 std::initializer_list<VertexType_> vertices) {
83 vertices_.reserve(vertices.size());
84 for (
auto& vertex : vertices) {
85 vertices_.emplace_back(std::move(vertex));
91 indices_.emplace_back(index);
98 buffer.
index_buffer = CreateIndexBufferView(host_buffer);
107 buffer.
vertex_buffer = CreateVertexBufferView(device_allocator);
108 buffer.
index_buffer = CreateIndexBufferView(device_allocator);
115 for (
auto& vertex : vertices_) {
121 std::vector<VertexType> vertices_;
122 std::vector<IndexType> indices_;
126 return buffer.
Emplace(vertices_.data(),
131 BufferView CreateVertexBufferView(Allocator& allocator)
const {
132 auto buffer = allocator.CreateBufferWithCopy(
133 reinterpret_cast<const uint8_t*
>(vertices_.data()),
138 if (!label_.empty()) {
139 buffer->SetLabel(
SPrintF(
"%s Vertices", label_.c_str()));
144 std::vector<IndexType> CreateIndexBuffer()
const {
return indices_; }
146 BufferView CreateIndexBufferView(HostBuffer& buffer)
const {
147 const auto index_buffer = CreateIndexBuffer();
148 if (index_buffer.size() == 0) {
151 return buffer.Emplace(index_buffer.data(),
156 BufferView CreateIndexBufferView(Allocator& allocator)
const {
157 const auto index_buffer = CreateIndexBuffer();
158 if (index_buffer.size() == 0) {
161 auto buffer = allocator.CreateBufferWithCopy(
162 reinterpret_cast<const uint8_t*
>(index_buffer.data()),
163 index_buffer.size() *
sizeof(
IndexType));
167 if (!label_.empty()) {
168 buffer->SetLabel(
SPrintF(
"%s Indices", label_.c_str()));
An object that allocates device memory.
static BufferView AsBufferView(std::shared_ptr< DeviceBuffer > buffer)
Create a buffer view of this entire buffer.
BufferView Emplace(const BufferType &buffer, size_t alignment=0)
Emplace non-uniform data (like contiguous vertices) onto the host buffer.
VertexBuffer CreateVertexBuffer(HostBuffer &host_buffer) const
size_t GetVertexCount() const
const VertexType & Last() const
~VertexBufferBuilder()=default
VertexBufferBuilder()=default
size_t GetIndexCount() const
void ReserveIndices(size_t count)
void IterateVertices(const std::function< void(VertexType &)> &iterator)
VertexBufferBuilder & AddVertices(std::initializer_list< VertexType_ > vertices)
void Reserve(size_t count)
VertexBuffer CreateVertexBuffer(Allocator &device_allocator) const
VertexBufferBuilder & AppendVertex(VertexType_ vertex)
void SetLabel(const std::string &label)
constexpr impeller::IndexType GetIndexType() const
VertexBufferBuilder & AppendIndex(IndexType_ index)
@ kNone
Does not use the index buffer.
std::string SPrintF(const char *format,...)
VertexBuffer CreateVertexBuffer(std::array< VertexType, size > input, HostBuffer &host_buffer)
Create an index-less vertex buffer from a fixed size array.
BufferView index_buffer
The index buffer binding used by the vertex shader stage.