1212#include " impeller/renderer/formats.h"
1313#include " impeller/renderer/render_pass.h"
1414#include " impeller/renderer/sampler_library.h"
15+ #include " impeller/renderer/vertex_buffer.h"
1516
1617namespace impeller {
1718
@@ -28,10 +29,27 @@ void VerticesContents::SetColor(Color color) {
2829 color_ = color.Premultiply ();
2930}
3031
32+ void VerticesContents::SetBlendMode (Entity::BlendMode blend_mode) {
33+ blend_mode_ = blend_mode;
34+ }
35+
36+ static PrimitiveType GetPrimitiveType (const Vertices& vertices) {
37+ switch (vertices.GetMode ()) {
38+ case VertexMode::kTriangle :
39+ return PrimitiveType::kTriangle ;
40+ case VertexMode::kTriangleStrip :
41+ return PrimitiveType::kTriangleStrip ;
42+ }
43+ }
44+
3145bool VerticesContents::Render (const ContentContext& renderer,
3246 const Entity& entity,
3347 RenderPass& pass) const {
34- using VS = VerticesVertexShader;
48+ if (!vertices_.IsValid ()) {
49+ return true ;
50+ }
51+
52+ using VS = VerticesPipeline::VertexShader;
3553
3654 const auto coverage_rect = vertices_.GetBoundingBox ();
3755
@@ -43,42 +61,36 @@ bool VerticesContents::Render(const ContentContext& renderer,
4361 return true ;
4462 }
4563
46- VertexBufferBuilder<VS::PerVertexData> vertex_builder;
47- std::vector<Point> points = vertices_.GetPoints ();
48- std::vector<uint16_t > indices = vertices_.GetIndices ();
49- // TODO: colors are currently unused, must be blended with
50- // paint color based on provided blend mode.
51- std::vector<Color> colors = vertices_.GetColors ();
52- VertexMode mode = vertices_.GetMode ();
53-
54- if (indices.size () == 0 ) {
55- for (size_t i = 0 ; i < points.size (); i += 1 ) {
56- VS::PerVertexData data;
57- data.point = points[i];
58- data.vertex_color = color_;
59- vertex_builder.AppendVertex (data);
60- }
61- } else {
62- for (size_t i = 0 ; i < indices.size (); i += 1 ) {
63- VS::PerVertexData data;
64- data.point = points[indices[i]];
65- data.vertex_color = color_;
66- vertex_builder.AppendVertex (data);
64+ std::vector<VS::PerVertexData> vertex_data;
65+ {
66+ const auto & positions = vertices_.GetPositions ();
67+ const auto & colors = vertices_.GetColors ();
68+ for (size_t i = 0 ; i < positions.size (); i++) {
69+ vertex_data.push_back (VS::PerVertexData{
70+ .position = positions[i],
71+ // TODO(108047): Blend these colors together when available. Use
72+ // colors[i] as the destination and color_ as the
73+ // source. Always use color_ when vertex colors are not
74+ // supplied.
75+ .color = i < colors.size () ? colors[i] : color_,
76+ });
6777 }
6878 }
6979
70- PrimitiveType primitiveType;
71- switch (mode) {
72- case VertexMode::kTriangle :
73- primitiveType = PrimitiveType::kTriangle ;
74- break ;
75- case VertexMode::kTriangleStrip :
76- primitiveType = PrimitiveType::kTriangleStrip ;
77- break ;
78- }
80+ size_t total_vtx_bytes = vertex_data.size () * sizeof (VS::PerVertexData);
81+ size_t total_idx_bytes = vertices_.GetIndices ().size () * sizeof (uint16_t );
7982
80- if (!vertex_builder.HasVertices ()) {
81- return true ;
83+ auto buffer = renderer.GetContext ()->GetTransientsAllocator ()->CreateBuffer (
84+ StorageMode::kHostVisible , total_vtx_bytes + total_idx_bytes);
85+
86+ if (!buffer->CopyHostBuffer (reinterpret_cast <uint8_t *>(vertex_data.data ()),
87+ Range{0 , total_vtx_bytes}, 0 )) {
88+ return false ;
89+ }
90+ if (!buffer->CopyHostBuffer (reinterpret_cast <uint8_t *>(const_cast <uint16_t *>(
91+ vertices_.GetIndices ().data ())),
92+ Range{0 , total_idx_bytes}, total_vtx_bytes)) {
93+ return false ;
8294 }
8395
8496 auto & host_buffer = pass.GetTransientsBuffer ();
@@ -91,8 +103,14 @@ bool VerticesContents::Render(const ContentContext& renderer,
91103 cmd.pipeline =
92104 renderer.GetVerticesPipeline (OptionsFromPassAndEntity (pass, entity));
93105 cmd.stencil_reference = entity.GetStencilDepth ();
94- cmd.primitive_type = primitiveType;
95- cmd.BindVertices (vertex_builder.CreateVertexBuffer (host_buffer));
106+ cmd.primitive_type = GetPrimitiveType (vertices_);
107+ cmd.BindVertices ({
108+ .vertex_buffer = {.buffer = buffer, .range = Range{0 , total_vtx_bytes}},
109+ .index_buffer = {.buffer = buffer,
110+ .range = Range{total_vtx_bytes, total_idx_bytes}},
111+ .index_count = vertices_.GetIndices ().size (),
112+ .index_type = IndexType::k16bit,
113+ });
96114 VS::BindFrameInfo (cmd, host_buffer.EmplaceUniform (frame_info));
97115 pass.AddCommand (std::move (cmd));
98116
0 commit comments