Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Commit a199692

Browse files
committed
Vertex/index/stencil ref state.
1 parent 196c26e commit a199692

2 files changed

Lines changed: 47 additions & 70 deletions

File tree

lib/gpu/render_pass.cc

Lines changed: 35 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
#include "impeller/core/formats.h"
1616
#include "impeller/core/sampler_descriptor.h"
1717
#include "impeller/core/shader_types.h"
18-
#include "impeller/core/vertex_buffer.h"
1918
#include "impeller/geometry/color.h"
2019
#include "impeller/renderer/command.h"
2120
#include "impeller/renderer/pipeline.h"
@@ -37,10 +36,6 @@ const std::shared_ptr<const impeller::Context>& RenderPass::GetContext() const {
3736
return render_pass_->GetContext();
3837
}
3938

40-
impeller::RenderPass& RenderPass::GetRenderPass() {
41-
return *render_pass_;
42-
}
43-
4439
impeller::RenderTarget& RenderPass::GetRenderTarget() {
4540
return render_target_;
4641
}
@@ -80,7 +75,6 @@ impeller::PipelineDescriptor& RenderPass::GetPipelineDescriptor() {
8075
bool RenderPass::Begin(flutter::gpu::CommandBuffer& command_buffer) {
8176
render_pass_ =
8277
command_buffer.GetCommandBuffer()->CreateRenderPass(render_target_);
83-
SetDefaultDrawState();
8478
if (!render_pass_) {
8579
return false;
8680
}
@@ -92,19 +86,15 @@ void RenderPass::SetPipeline(fml::RefPtr<RenderPipeline> pipeline) {
9286
render_pipeline_ = std::move(pipeline);
9387
}
9488

95-
void RenderPass::SetHasIndexBuffer(bool value) {
96-
has_index_buffer_ = value;
97-
}
98-
99-
bool RenderPass::HasIndexBuffer() const {
100-
return has_index_buffer_;
101-
}
102-
10389
void RenderPass::ClearBindings() {
10490
vertex_uniform_bindings.clear();
10591
vertex_texture_bindings.clear();
10692
fragment_uniform_bindings.clear();
10793
fragment_texture_bindings.clear();
94+
vertex_buffer = {};
95+
index_buffer = {};
96+
index_buffer_type = impeller::IndexType::kNone;
97+
element_count = 0;
10898
}
10999

110100
std::shared_ptr<impeller::Pipeline<impeller::PipelineDescriptor>>
@@ -179,14 +169,6 @@ RenderPass::GetOrCreatePipeline() {
179169
return pipeline;
180170
}
181171

182-
void RenderPass::SetDefaultDrawState() {
183-
// All of the renderpass bindings are reset after drawing.
184-
has_index_buffer_ = false;
185-
186-
// Explicitly turn off the index buffer by default.
187-
render_pass_->SetIndexBuffer({}, impeller::IndexType::kNone);
188-
}
189-
190172
bool RenderPass::Draw() {
191173
render_pass_->SetPipeline(GetOrCreatePipeline());
192174

@@ -215,9 +197,13 @@ bool RenderPass::Draw() {
215197
texture.texture.resource, texture.sampler);
216198
}
217199

218-
bool result = render_pass_->Draw().ok();
200+
render_pass_->SetVertexBuffer(vertex_buffer);
201+
render_pass_->SetIndexBuffer(index_buffer, index_buffer_type);
202+
render_pass_->SetElementCount(element_count);
219203

220-
SetDefaultDrawState();
204+
render_pass_->SetStencilReference(stencil_reference);
205+
206+
bool result = render_pass_->Draw().ok();
221207

222208
return result;
223209
}
@@ -307,17 +293,16 @@ void InternalFlutterGpu_RenderPass_BindPipeline(
307293
wrapper->SetPipeline(std::move(ref));
308294
}
309295

310-
template <typename TBuffer>
311-
static void BindVertexBuffer(flutter::gpu::RenderPass* wrapper,
312-
TBuffer buffer,
313-
int offset_in_bytes,
314-
int length_in_bytes,
315-
int vertex_count) {
316-
auto& render_pass = wrapper->GetRenderPass();
317-
render_pass.SetVertexBuffer(impeller::BufferView{
296+
static void BindVertexBuffer(
297+
flutter::gpu::RenderPass* wrapper,
298+
const std::shared_ptr<const impeller::DeviceBuffer>& buffer,
299+
int offset_in_bytes,
300+
int length_in_bytes,
301+
int vertex_count) {
302+
wrapper->vertex_buffer = impeller::BufferView{
318303
.buffer = buffer,
319304
.range = impeller::Range(offset_in_bytes, length_in_bytes),
320-
});
305+
};
321306

322307
// If the index type is set, then the `vertex_count` becomes the index
323308
// count... So don't overwrite the count if it's already been set when binding
@@ -327,8 +312,8 @@ static void BindVertexBuffer(flutter::gpu::RenderPass* wrapper,
327312
// but overall it would be a bit more explicit and we wouldn't
328313
// have to document this behavior where the presence of the index
329314
// buffer always takes precedent.
330-
if (!wrapper->HasIndexBuffer()) {
331-
render_pass.SetElementCount(vertex_count);
315+
if (!wrapper->has_index_buffer) {
316+
wrapper->element_count = vertex_count;
332317
}
333318
}
334319

@@ -360,27 +345,25 @@ void InternalFlutterGpu_RenderPass_BindVertexBufferHost(
360345
view->range.length, vertex_count);
361346
}
362347

363-
template <typename TBuffer>
364-
static void BindIndexBuffer(flutter::gpu::RenderPass* wrapper,
365-
TBuffer buffer,
366-
int offset_in_bytes,
367-
int length_in_bytes,
368-
int index_type,
369-
int index_count) {
370-
auto& render_pass = wrapper->GetRenderPass();
348+
static void BindIndexBuffer(
349+
flutter::gpu::RenderPass* wrapper,
350+
const std::shared_ptr<const impeller::DeviceBuffer>& buffer,
351+
int offset_in_bytes,
352+
int length_in_bytes,
353+
int index_type,
354+
int index_count) {
371355
impeller::IndexType type = flutter::gpu::ToImpellerIndexType(index_type);
372-
render_pass.SetIndexBuffer(
373-
impeller::BufferView{
374-
.buffer = buffer,
375-
.range = impeller::Range(offset_in_bytes, length_in_bytes),
376-
},
377-
type);
356+
wrapper->index_buffer = impeller::BufferView{
357+
.buffer = buffer,
358+
.range = impeller::Range(offset_in_bytes, length_in_bytes),
359+
};
360+
wrapper->index_buffer_type = type;
378361

379362
bool setting_index_buffer = type != impeller::IndexType::kNone;
380363
if (setting_index_buffer) {
381-
render_pass.SetElementCount(index_count);
364+
wrapper->element_count = index_count;
382365
}
383-
wrapper->SetHasIndexBuffer(setting_index_buffer);
366+
wrapper->has_index_buffer = setting_index_buffer;
384367
}
385368

386369
void InternalFlutterGpu_RenderPass_BindIndexBufferDevice(
@@ -597,8 +580,7 @@ void InternalFlutterGpu_RenderPass_SetDepthCompareOperation(
597580
void InternalFlutterGpu_RenderPass_SetStencilReference(
598581
flutter::gpu::RenderPass* wrapper,
599582
int stencil_reference) {
600-
auto& render_pass = wrapper->GetRenderPass();
601-
render_pass.SetStencilReference(static_cast<uint32_t>(stencil_reference));
583+
wrapper->stencil_reference = static_cast<uint32_t>(stencil_reference);
602584
}
603585

604586
void InternalFlutterGpu_RenderPass_SetStencilConfig(

lib/gpu/render_pass.h

Lines changed: 12 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -5,17 +5,14 @@
55
#ifndef FLUTTER_LIB_GPU_RENDER_PASS_H_
66
#define FLUTTER_LIB_GPU_RENDER_PASS_H_
77

8+
#include <cstdint>
89
#include <map>
910
#include <memory>
10-
#include <optional>
11-
#include <unordered_set>
1211
#include "flutter/lib/gpu/command_buffer.h"
1312
#include "flutter/lib/gpu/export.h"
1413
#include "flutter/lib/ui/dart_wrapper.h"
1514
#include "fml/memory/ref_ptr.h"
1615
#include "impeller/core/formats.h"
17-
#include "impeller/core/shader_types.h"
18-
#include "impeller/core/vertex_buffer.h"
1916
#include "impeller/renderer/command.h"
2017
#include "impeller/renderer/render_pass.h"
2118
#include "impeller/renderer/render_target.h"
@@ -38,8 +35,6 @@ class RenderPass : public RefCountedDartWrappable<RenderPass> {
3835

3936
const std::shared_ptr<const impeller::Context>& GetContext() const;
4037

41-
impeller::RenderPass& GetRenderPass();
42-
4338
impeller::RenderTarget& GetRenderTarget();
4439
const impeller::RenderTarget& GetRenderTarget() const;
4540

@@ -58,10 +53,6 @@ class RenderPass : public RefCountedDartWrappable<RenderPass> {
5853

5954
void SetPipeline(fml::RefPtr<RenderPipeline> pipeline);
6055

61-
void SetHasIndexBuffer(bool value);
62-
63-
bool HasIndexBuffer() const;
64-
6556
void ClearBindings();
6657

6758
bool Draw();
@@ -78,26 +69,30 @@ class RenderPass : public RefCountedDartWrappable<RenderPass> {
7869
BufferUniformMap fragment_uniform_bindings;
7970
TextureUniformMap fragment_texture_bindings;
8071

72+
impeller::BufferView vertex_buffer;
73+
impeller::BufferView index_buffer;
74+
impeller::IndexType index_buffer_type = impeller::IndexType::kNone;
75+
size_t element_count = 0;
76+
77+
uint32_t stencil_reference = 0;
78+
79+
// Helper flag to determine whether the vertex_count should override the
80+
// element count. The index count takes precedent.
81+
bool has_index_buffer = false;
82+
8183
private:
8284
/// Lookup an Impeller pipeline by building a descriptor based on the current
8385
/// command state.
8486
std::shared_ptr<impeller::Pipeline<impeller::PipelineDescriptor>>
8587
GetOrCreatePipeline();
8688

87-
/// Set up the default render pass draw state in-between draws.
88-
void SetDefaultDrawState();
89-
9089
impeller::RenderTarget render_target_;
9190
std::shared_ptr<impeller::RenderPass> render_pass_;
9291

9392
// Command encoding state.
9493
fml::RefPtr<RenderPipeline> render_pipeline_;
9594
impeller::PipelineDescriptor pipeline_descriptor_;
9695

97-
// Helper flag to determine whether the vertex_count should override the
98-
// element count. The index count takes precedent.
99-
bool has_index_buffer_ = false;
100-
10196
// Pipeline descriptor layout state. We always keep track of this state,
10297
// but we'll only apply it as necessary to match the RenderTarget.
10398
std::map<size_t, impeller::ColorAttachmentDescriptor> color_descriptors_;

0 commit comments

Comments
 (0)