5#ifndef FLUTTER_IMPELLER_RENDERER_VERTEX_BUFFER_BUILDER_H_
6#define FLUTTER_IMPELLER_RENDERER_VERTEX_BUFFER_BUILDER_H_
8#include <initializer_list>
12#include "flutter/fml/macros.h"
23template <
class VertexType_,
class IndexType_ = u
int16_t>
34 if (indices_.size() == 0) {
46 void SetLabel(
const std::string& label) { label_ = label; }
57 return indices_.size() > 0 ? indices_.size() : vertices_.size();
62 return vertices_.back();
66 vertices_.emplace_back(std::move(vertex));
71 std::initializer_list<VertexType_> vertices) {
72 vertices_.reserve(vertices.size());
73 for (
auto& vertex : vertices) {
74 vertices_.emplace_back(std::move(vertex));
80 indices_.emplace_back(index);
87 buffer.index_buffer = CreateIndexBufferView(host_buffer);
97 buffer.index_buffer = CreateIndexBufferView(device_allocator);
104 for (
auto& vertex : vertices_) {
110 std::vector<VertexType> vertices_;
111 std::vector<IndexType> indices_;
115 return buffer.Emplace(vertices_.data(),
120 BufferView CreateVertexBufferView(
Allocator& allocator)
const {
121 auto buffer = allocator.CreateBufferWithCopy(
122 reinterpret_cast<const uint8_t*
>(vertices_.data()),
127 if (!label_.empty()) {
133 std::vector<IndexType> CreateIndexBuffer()
const {
return indices_; }
135 BufferView CreateIndexBufferView(HostBuffer&
buffer)
const {
136 const auto index_buffer = CreateIndexBuffer();
137 if (index_buffer.size() == 0) {
140 return buffer.Emplace(index_buffer.data(),
141 index_buffer.size() *
sizeof(IndexType),
145 BufferView CreateIndexBufferView(
Allocator& allocator)
const {
146 const auto index_buffer = CreateIndexBuffer();
147 if (index_buffer.size() == 0) {
150 auto buffer = allocator.CreateBufferWithCopy(
151 reinterpret_cast<const uint8_t*
>(index_buffer.data()),
152 index_buffer.size() *
sizeof(IndexType));
156 if (!label_.empty()) {
An object that allocates device memory.
static BufferView AsBufferView(std::shared_ptr< DeviceBuffer > buffer)
Create a buffer view of this entire buffer.
VertexBuffer CreateVertexBuffer(HostBuffer &host_buffer) const
size_t GetVertexCount() const
VertexBufferBuilder & AppendVertex(VertexType_ vertex)
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)
void Reserve(size_t count)
VertexBuffer CreateVertexBuffer(Allocator &device_allocator) const
VertexBufferBuilder & AppendIndex(IndexType_ index)
void SetLabel(const std::string &label)
VertexBufferBuilder & AddVertices(std::initializer_list< VertexType_ > vertices)
constexpr impeller::IndexType GetIndexType() const
static const uint8_t buffer[]
#define FML_DCHECK(condition)
@ kNone
Does not use the index buffer.
std::string SPrintF(const char *format,...)