@@ -68,37 +68,58 @@ bool LineGeometry::ComputeCorners(Point corners[4],
6868GeometryResult LineGeometry::GetPositionBuffer (const ContentContext& renderer,
6969 const Entity& entity,
7070 RenderPass& pass) const {
71+ auto & host_buffer = pass.GetTransientsBuffer ();
72+ using VT = SolidFillVertexShader::PerVertexData;
73+
7174 auto & transform = entity.GetTransform ();
7275 auto radius = ComputeHalfWidth (transform);
7376
74- VertexBufferBuilder<SolidFillVertexShader::PerVertexData> vtx_builder ;
75-
77+ size_t count ;
78+ BufferView vertex_buffer;
7679 if (cap_ == Cap::kRound ) {
80+ const Point& p0 = p0_;
81+ const Point& p1 = p1_;
82+
7783 CircleTessellator tessellator (transform, radius);
78- vtx_builder.Reserve (tessellator.GetCircleVertexCount ());
79- tessellator.GenerateRoundCapLineTriangleStrip (
80- [&vtx_builder](const Point& p) { //
81- vtx_builder.AppendVertex ({.position = p});
82- },
83- p0_, p1_, radius);
84+ count = tessellator.GetCircleVertexCount ();
85+ vertex_buffer =
86+ host_buffer.Emplace (count * sizeof (VT), alignof (VT),
87+ [&tessellator, &p0, &p1, radius](uint8_t * buffer) {
88+ auto vertices = reinterpret_cast <VT*>(buffer);
89+ tessellator.GenerateRoundCapLineTriangleStrip (
90+ [&vertices](const Point& p) { //
91+ *vertices++ = {
92+ .position = p,
93+ };
94+ },
95+ p0, p1, radius);
96+ });
8497 } else {
8598 Point corners[4 ];
8699 if (ComputeCorners (corners, transform, cap_ == Cap::kSquare )) {
87- vtx_builder.Reserve (4 );
88- vtx_builder.AppendVertex ({.position = corners[0 ]});
89- vtx_builder.AppendVertex ({.position = corners[1 ]});
90- vtx_builder.AppendVertex ({.position = corners[2 ]});
91- vtx_builder.AppendVertex ({.position = corners[3 ]});
100+ count = 4 ;
101+ vertex_buffer = host_buffer.Emplace (
102+ count * sizeof (VT), alignof (VT), [&corners](uint8_t * buffer) {
103+ auto vertices = reinterpret_cast <VT*>(buffer);
104+ for (auto & corner : corners) {
105+ *vertices++ = {
106+ .position = corner,
107+ };
108+ }
109+ });
110+ } else {
111+ return {};
92112 }
93113 }
94- if (!vtx_builder.HasVertices ()) {
95- return {};
96- }
97114
98115 return GeometryResult{
99116 .type = PrimitiveType::kTriangleStrip ,
100117 .vertex_buffer =
101- vtx_builder.CreateVertexBuffer (pass.GetTransientsBuffer ()),
118+ {
119+ .vertex_buffer = vertex_buffer,
120+ .vertex_count = count,
121+ .index_type = IndexType::kNone ,
122+ },
102123 .transform = Matrix::MakeOrthographic (pass.GetRenderTargetSize ()) *
103124 entity.GetTransform (),
104125 .prevent_overdraw = false ,
@@ -111,44 +132,64 @@ GeometryResult LineGeometry::GetPositionUVBuffer(Rect texture_coverage,
111132 const ContentContext& renderer,
112133 const Entity& entity,
113134 RenderPass& pass) const {
135+ auto & host_buffer = pass.GetTransientsBuffer ();
136+ using VT = TextureFillVertexShader::PerVertexData;
137+
114138 auto & transform = entity.GetTransform ();
115139 auto radius = ComputeHalfWidth (transform);
116140
117141 auto uv_transform =
118142 texture_coverage.GetNormalizingTransform () * effect_transform;
119- VertexBufferBuilder<TextureFillVertexShader::PerVertexData> vtx_builder;
120143
144+ size_t count;
145+ BufferView vertex_buffer;
121146 if (cap_ == Cap::kRound ) {
147+ const Point& p0 = p0_;
148+ const Point& p1 = p1_;
149+
122150 CircleTessellator tessellator (transform, radius);
123- vtx_builder.Reserve (tessellator.GetCircleVertexCount ());
124- tessellator.GenerateRoundCapLineTriangleStrip (
125- [&vtx_builder, &uv_transform](const Point& p) {
126- vtx_builder.AppendVertex ({
127- .position = p,
128- .texture_coords = uv_transform * p,
129- });
130- },
131- p0_, p1_, radius);
151+ count = tessellator.GetCircleVertexCount ();
152+ vertex_buffer = host_buffer.Emplace (
153+ count * sizeof (VT), alignof (VT),
154+ [&tessellator, &uv_transform, &p0, &p1, radius](uint8_t * buffer) {
155+ auto vertices = reinterpret_cast <VT*>(buffer);
156+ tessellator.GenerateRoundCapLineTriangleStrip (
157+ [&vertices, &uv_transform](const Point& p) { //
158+ *vertices++ = {
159+ .position = p,
160+ .texture_coords = uv_transform * p,
161+ };
162+ },
163+ p0, p1, radius);
164+ });
132165 } else {
133166 Point corners[4 ];
134167 if (ComputeCorners (corners, transform, cap_ == Cap::kSquare )) {
135- vtx_builder.Reserve (4 );
136- for (auto & corner : corners) {
137- vtx_builder.AppendVertex ({
138- .position = corner,
139- .texture_coords = uv_transform * corner,
140- });
141- }
168+ count = 4 ;
169+ vertex_buffer =
170+ host_buffer.Emplace (count * sizeof (VT), alignof (VT),
171+ [&uv_transform, &corners](uint8_t * buffer) {
172+ auto vertices = reinterpret_cast <VT*>(buffer);
173+ for (auto & corner : corners) {
174+ *vertices++ = {
175+ .position = corner,
176+ .texture_coords = uv_transform * corner,
177+ };
178+ }
179+ });
180+ } else {
181+ return {};
142182 }
143183 }
144- if (!vtx_builder.HasVertices ()) {
145- return {};
146- }
147184
148185 return GeometryResult{
149186 .type = PrimitiveType::kTriangleStrip ,
150187 .vertex_buffer =
151- vtx_builder.CreateVertexBuffer (pass.GetTransientsBuffer ()),
188+ {
189+ .vertex_buffer = vertex_buffer,
190+ .vertex_count = count,
191+ .index_type = IndexType::kNone ,
192+ },
152193 .transform = Matrix::MakeOrthographic (pass.GetRenderTargetSize ()) *
153194 entity.GetTransform (),
154195 .prevent_overdraw = false ,
0 commit comments