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

Commit d4bae28

Browse files
authored
[Impeller] Add PolygonMode to render layer (#39810)
1 parent 952a89b commit d4bae28

File tree

9 files changed

+68
-8
lines changed

9 files changed

+68
-8
lines changed

impeller/renderer/backend/gles/render_pass_gles.cc

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -408,11 +408,22 @@ struct RenderPassData {
408408
return false;
409409
}
410410

411+
//--------------------------------------------------------------------------
412+
/// Determine the primitive type.
413+
///
414+
// GLES doesn't support setting the fill mode, so override the primitive
415+
// with GL_LINE_STRIP to somewhat emulate PolygonMode::kLine. This isn't
416+
// correct; full triangle outlines won't be drawn and disconnected
417+
// geometry may appear connected. However this can still be useful for
418+
// wireframe debug views.
419+
auto mode = pipeline.GetDescriptor().GetPolygonMode() == PolygonMode::kLine
420+
? GL_LINE_STRIP
421+
: ToMode(pipeline.GetDescriptor().GetPrimitiveType());
422+
411423
//--------------------------------------------------------------------------
412424
/// Finally! Invoke the draw call.
413425
///
414-
PrimitiveType primitive_type = pipeline.GetDescriptor().GetPrimitiveType();
415-
gl.DrawElements(ToMode(primitive_type), // mode
426+
gl.DrawElements(mode, // mode
416427
command.index_count, // count
417428
ToIndexType(command.index_type), // type
418429
reinterpret_cast<const GLvoid*>(static_cast<GLsizei>(

impeller/renderer/backend/metal/formats_mtl.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,16 @@ constexpr MTLPrimitiveType ToMTLPrimitiveType(PrimitiveType type) {
150150
return MTLPrimitiveTypePoint;
151151
}
152152

153+
constexpr MTLTriangleFillMode ToMTLTriangleFillMode(PolygonMode mode) {
154+
switch (mode) {
155+
case PolygonMode::kFill:
156+
return MTLTriangleFillModeFill;
157+
case PolygonMode::kLine:
158+
return MTLTriangleFillModeLines;
159+
}
160+
return MTLTriangleFillModeFill;
161+
}
162+
153163
constexpr MTLIndexType ToMTLIndexType(IndexType type) {
154164
switch (type) {
155165
case IndexType::k16bit:

impeller/renderer/backend/metal/render_pass_mtl.mm

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -468,6 +468,8 @@ static bool Bind(PassBindingsCache& pass,
468468
? MTLWindingClockwise
469469
: MTLWindingCounterClockwise];
470470
[encoder setCullMode:ToMTLCullMode(pipeline_desc.GetCullMode())];
471+
[encoder setTriangleFillMode:ToMTLTriangleFillMode(
472+
pipeline_desc.GetPolygonMode())];
471473
[encoder setStencilReferenceValue:command.stencil_reference];
472474

473475
if (!bind_stage_resources(command.vertex_bindings, ShaderStage::kVertex)) {

impeller/renderer/backend/vulkan/formats_vk.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -336,6 +336,16 @@ constexpr vk::IndexType ToVKIndexType(IndexType index_type) {
336336
FML_UNREACHABLE();
337337
}
338338

339+
constexpr vk::PolygonMode ToVKPolygonMode(PolygonMode mode) {
340+
switch (mode) {
341+
case PolygonMode::kFill:
342+
return vk::PolygonMode::eFill;
343+
case PolygonMode::kLine:
344+
return vk::PolygonMode::eLine;
345+
}
346+
FML_UNREACHABLE();
347+
}
348+
339349
constexpr vk::PrimitiveTopology ToVKPrimitiveTopology(PrimitiveType primitive) {
340350
switch (primitive) {
341351
case PrimitiveType::kTriangle:

impeller/renderer/backend/vulkan/pipeline_library_vk.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -275,7 +275,7 @@ std::unique_ptr<PipelineCreateInfoVK> PipelineLibraryVK::CreatePipeline(
275275
vk::PipelineRasterizationStateCreateInfo rasterization_state;
276276
rasterization_state.setFrontFace(vk::FrontFace::eClockwise);
277277
rasterization_state.setCullMode(vk::CullModeFlagBits::eNone);
278-
rasterization_state.setPolygonMode(vk::PolygonMode::eFill);
278+
rasterization_state.setPolygonMode(ToVKPolygonMode(desc.GetPolygonMode()));
279279
// requires GPU extensions to change.
280280
{
281281
rasterization_state.setLineWidth(1.0f);

impeller/renderer/formats.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -215,6 +215,11 @@ enum class PrimitiveType {
215215
// checks. Hence, they are not supported here.
216216
};
217217

218+
enum class PolygonMode {
219+
kFill,
220+
kLine,
221+
};
222+
218223
struct DepthRange {
219224
Scalar z_near = 0.0;
220225
Scalar z_far = 1.0;

impeller/renderer/pipeline_descriptor.cc

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ std::size_t PipelineDescriptor::GetHash() const {
4141
fml::HashCombineSeed(seed, winding_order_);
4242
fml::HashCombineSeed(seed, cull_mode_);
4343
fml::HashCombineSeed(seed, primitive_type_);
44+
fml::HashCombineSeed(seed, polygon_mode_);
4445
return seed;
4546
}
4647

@@ -59,7 +60,8 @@ bool PipelineDescriptor::IsEqual(const PipelineDescriptor& other) const {
5960
other.back_stencil_attachment_descriptor_ &&
6061
winding_order_ == other.winding_order_ &&
6162
cull_mode_ == other.cull_mode_ &&
62-
primitive_type_ == other.primitive_type_;
63+
primitive_type_ == other.primitive_type_ &&
64+
polygon_mode_ == other.polygon_mode_;
6365
}
6466

6567
PipelineDescriptor& PipelineDescriptor::SetLabel(std::string label) {
@@ -259,4 +261,12 @@ PrimitiveType PipelineDescriptor::GetPrimitiveType() const {
259261
return primitive_type_;
260262
}
261263

264+
void PipelineDescriptor::SetPolygonMode(PolygonMode mode) {
265+
polygon_mode_ = mode;
266+
}
267+
268+
PolygonMode PipelineDescriptor::GetPolygonMode() const {
269+
return polygon_mode_;
270+
}
271+
262272
} // namespace impeller

impeller/renderer/pipeline_descriptor.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,10 @@ class PipelineDescriptor final : public Comparable<PipelineDescriptor> {
125125

126126
PrimitiveType GetPrimitiveType() const;
127127

128+
void SetPolygonMode(PolygonMode mode);
129+
130+
PolygonMode GetPolygonMode() const;
131+
128132
private:
129133
std::string label_;
130134
SampleCount sample_count_ = SampleCount::kCount1;
@@ -142,6 +146,7 @@ class PipelineDescriptor final : public Comparable<PipelineDescriptor> {
142146
std::optional<StencilAttachmentDescriptor>
143147
back_stencil_attachment_descriptor_;
144148
PrimitiveType primitive_type_ = PrimitiveType::kTriangle;
149+
PolygonMode polygon_mode_ = PolygonMode::kFill;
145150
};
146151

147152
} // namespace impeller

impeller/renderer/renderer_unittests.cc

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -54,9 +54,6 @@ TEST_P(RendererTest, CanCreateBoxPrimitive) {
5454
auto desc = BoxPipelineBuilder::MakeDefaultPipelineDescriptor(*context);
5555
ASSERT_TRUE(desc.has_value());
5656
desc->SetSampleCount(SampleCount::kCount4);
57-
auto box_pipeline =
58-
context->GetPipelineLibrary()->GetPipeline(std::move(desc)).Get();
59-
ASSERT_TRUE(box_pipeline);
6057

6158
// Vertex buffer.
6259
VertexBufferBuilder<VS::PerVertexData> vertex_builder;
@@ -79,9 +76,19 @@ TEST_P(RendererTest, CanCreateBoxPrimitive) {
7976
auto sampler = context->GetSamplerLibrary()->GetSampler({});
8077
ASSERT_TRUE(sampler);
8178
SinglePassCallback callback = [&](RenderPass& pass) {
79+
ImGui::Begin("Controls", nullptr, ImGuiWindowFlags_AlwaysAutoResize);
80+
static bool wireframe;
81+
ImGui::Checkbox("Wireframe", &wireframe);
82+
ImGui::End();
83+
84+
desc->SetPolygonMode(wireframe ? PolygonMode::kLine : PolygonMode::kFill);
85+
auto pipeline = context->GetPipelineLibrary()->GetPipeline(desc).Get();
86+
87+
assert(pipeline && pipeline->IsValid());
88+
8289
Command cmd;
8390
cmd.label = "Box";
84-
cmd.pipeline = box_pipeline;
91+
cmd.pipeline = pipeline;
8592

8693
cmd.BindVertices(vertex_buffer);
8794

0 commit comments

Comments
 (0)