[Impeller] Add GeometryResult enum with StC modes. (#50816)
Replace `prevent_overdraw` with an enum that also containing the two StC cases.
diff --git a/impeller/entity/contents/color_source_contents.h b/impeller/entity/contents/color_source_contents.h
index f3f7281..d89e522 100644
--- a/impeller/entity/contents/color_source_contents.h
+++ b/impeller/entity/contents/color_source_contents.h
@@ -123,7 +123,7 @@
// increment the stencil buffer as we draw, preventing overlapping fragments
// from drawing. Afterwards, we need to append another draw call to clean up
// the stencil buffer (happens below in this method).
- if (geometry_result.prevent_overdraw) {
+ if (geometry_result.mode == GeometryResult::Mode::kPreventOverdraw) {
options.stencil_mode =
ContentContextOptions::StencilMode::kLegacyClipIncrement;
}
@@ -156,7 +156,7 @@
// If we performed overdraw prevention, a subsection of the clip heightmap
// was incremented by 1 in order to self-clip. So simply append a clip
// restore to clean it up.
- if (geometry_result.prevent_overdraw) {
+ if (geometry_result.mode == GeometryResult::Mode::kPreventOverdraw) {
auto restore = ClipRestoreContents();
restore.SetRestoreCoverage(GetCoverage(entity));
return restore.Render(renderer, entity, pass);
diff --git a/impeller/entity/geometry/cover_geometry.cc b/impeller/entity/geometry/cover_geometry.cc
index 29518da..62c97c0 100644
--- a/impeller/entity/geometry/cover_geometry.cc
+++ b/impeller/entity/geometry/cover_geometry.cc
@@ -30,7 +30,6 @@
.index_type = IndexType::k16bit,
},
.transform = pass.GetOrthographicTransform() * entity.GetTransform(),
- .prevent_overdraw = false,
};
}
diff --git a/impeller/entity/geometry/fill_path_geometry.cc b/impeller/entity/geometry/fill_path_geometry.cc
index 8069ef9..5cd721a 100644
--- a/impeller/entity/geometry/fill_path_geometry.cc
+++ b/impeller/entity/geometry/fill_path_geometry.cc
@@ -32,7 +32,6 @@
.type = PrimitiveType::kTriangleStrip,
.vertex_buffer = vertex_buffer,
.transform = pass.GetOrthographicTransform() * entity.GetTransform(),
- .prevent_overdraw = false,
};
}
@@ -62,7 +61,6 @@
.type = PrimitiveType::kTriangle,
.vertex_buffer = vertex_buffer,
.transform = pass.GetOrthographicTransform() * entity.GetTransform(),
- .prevent_overdraw = false,
};
}
@@ -97,7 +95,6 @@
.vertex_buffer =
vertex_builder.CreateVertexBuffer(renderer.GetTransientsBuffer()),
.transform = pass.GetOrthographicTransform() * entity.GetTransform(),
- .prevent_overdraw = false,
};
}
@@ -130,7 +127,6 @@
.vertex_buffer =
vertex_builder.CreateVertexBuffer(renderer.GetTransientsBuffer()),
.transform = pass.GetOrthographicTransform() * entity.GetTransform(),
- .prevent_overdraw = false,
};
}
diff --git a/impeller/entity/geometry/geometry.cc b/impeller/entity/geometry/geometry.cc
index fe38adf..437dc45 100644
--- a/impeller/entity/geometry/geometry.cc
+++ b/impeller/entity/geometry/geometry.cc
@@ -51,7 +51,6 @@
.index_type = IndexType::kNone,
},
.transform = pass.GetOrthographicTransform() * entity.GetTransform(),
- .prevent_overdraw = false,
};
}
@@ -87,7 +86,6 @@
.index_type = IndexType::kNone,
},
.transform = pass.GetOrthographicTransform() * entity.GetTransform(),
- .prevent_overdraw = false,
};
}
@@ -159,7 +157,6 @@
.index_type = IndexType::kNone,
},
.transform = pass.GetOrthographicTransform() * entity.GetTransform(),
- .prevent_overdraw = false,
};
}
diff --git a/impeller/entity/geometry/geometry.h b/impeller/entity/geometry/geometry.h
index ef574fd..732e97d 100644
--- a/impeller/entity/geometry/geometry.h
+++ b/impeller/entity/geometry/geometry.h
@@ -18,10 +18,25 @@
class Tessellator;
struct GeometryResult {
- PrimitiveType type;
+ enum class Mode {
+ /// The geometry has no overlapping triangles.
+ kNormal,
+ /// The geometry may have overlapping triangles. The geometry should be
+ /// stenciled with the NonZero fill rule.
+ kNonZero,
+ /// The geometry may have overlapping triangles. The geometry should be
+ /// stenciled with the EvenOdd fill rule.
+ kEvenOdd,
+ /// The geometry may have overlapping triangles, but they should not
+ /// overdraw or cancel each other out. This is a special case for stroke
+ /// geometry.
+ kPreventOverdraw,
+ };
+
+ PrimitiveType type = PrimitiveType::kTriangleStrip;
VertexBuffer vertex_buffer;
Matrix transform;
- bool prevent_overdraw;
+ Mode mode = Mode::kNormal;
};
static const GeometryResult kEmptyResult = {
diff --git a/impeller/entity/geometry/geometry_unittests.cc b/impeller/entity/geometry/geometry_unittests.cc
index 6bc8c01..56354c1 100644
--- a/impeller/entity/geometry/geometry_unittests.cc
+++ b/impeller/entity/geometry/geometry_unittests.cc
@@ -208,5 +208,12 @@
}
}
+TEST(EntityGeometryTest, GeometryResultHasReasonableDefaults) {
+ GeometryResult result;
+ EXPECT_EQ(result.type, PrimitiveType::kTriangleStrip);
+ EXPECT_EQ(result.transform, Matrix());
+ EXPECT_EQ(result.mode, GeometryResult::Mode::kNormal);
+}
+
} // namespace testing
} // namespace impeller
diff --git a/impeller/entity/geometry/line_geometry.cc b/impeller/entity/geometry/line_geometry.cc
index 80b166b..e91d979 100644
--- a/impeller/entity/geometry/line_geometry.cc
+++ b/impeller/entity/geometry/line_geometry.cc
@@ -105,7 +105,6 @@
.index_type = IndexType::kNone,
},
.transform = pass.GetOrthographicTransform() * entity.GetTransform(),
- .prevent_overdraw = false,
};
}
@@ -158,7 +157,6 @@
.index_type = IndexType::kNone,
},
.transform = pass.GetOrthographicTransform() * entity.GetTransform(),
- .prevent_overdraw = false,
};
}
diff --git a/impeller/entity/geometry/point_field_geometry.cc b/impeller/entity/geometry/point_field_geometry.cc
index b1f142a..534ee53 100644
--- a/impeller/entity/geometry/point_field_geometry.cc
+++ b/impeller/entity/geometry/point_field_geometry.cc
@@ -30,7 +30,6 @@
.type = PrimitiveType::kTriangleStrip,
.vertex_buffer = vtx_builder->CreateVertexBuffer(host_buffer),
.transform = pass.GetOrthographicTransform() * entity.GetTransform(),
- .prevent_overdraw = false,
};
}
@@ -58,7 +57,6 @@
.type = PrimitiveType::kTriangleStrip,
.vertex_buffer = uv_vtx_builder.CreateVertexBuffer(host_buffer),
.transform = pass.GetOrthographicTransform() * entity.GetTransform(),
- .prevent_overdraw = false,
};
}
@@ -223,7 +221,6 @@
.vertex_count = total,
.index_type = IndexType::kNone},
.transform = pass.GetOrthographicTransform() * entity.GetTransform(),
- .prevent_overdraw = false,
};
}
diff --git a/impeller/entity/geometry/rect_geometry.cc b/impeller/entity/geometry/rect_geometry.cc
index 000e834..0790a97 100644
--- a/impeller/entity/geometry/rect_geometry.cc
+++ b/impeller/entity/geometry/rect_geometry.cc
@@ -22,7 +22,6 @@
.index_type = IndexType::kNone,
},
.transform = pass.GetOrthographicTransform() * entity.GetTransform(),
- .prevent_overdraw = false,
};
}
diff --git a/impeller/entity/geometry/stroke_path_geometry.cc b/impeller/entity/geometry/stroke_path_geometry.cc
index dc3ffae..c77045b 100644
--- a/impeller/entity/geometry/stroke_path_geometry.cc
+++ b/impeller/entity/geometry/stroke_path_geometry.cc
@@ -596,7 +596,7 @@
.index_type = IndexType::kNone,
},
.transform = pass.GetOrthographicTransform() * entity.GetTransform(),
- .prevent_overdraw = true,
+ .mode = GeometryResult::Mode::kPreventOverdraw,
};
}
@@ -642,7 +642,7 @@
.index_type = IndexType::kNone,
},
.transform = pass.GetOrthographicTransform() * entity.GetTransform(),
- .prevent_overdraw = true,
+ .mode = GeometryResult::Mode::kPreventOverdraw,
};
}
diff --git a/impeller/entity/geometry/vertices_geometry.cc b/impeller/entity/geometry/vertices_geometry.cc
index cfcc05b..7215603 100644
--- a/impeller/entity/geometry/vertices_geometry.cc
+++ b/impeller/entity/geometry/vertices_geometry.cc
@@ -139,7 +139,6 @@
index_count > 0 ? IndexType::k16bit : IndexType::kNone,
},
.transform = pass.GetOrthographicTransform() * entity.GetTransform(),
- .prevent_overdraw = false,
};
}
@@ -184,7 +183,6 @@
index_count > 0 ? IndexType::k16bit : IndexType::kNone,
},
.transform = pass.GetOrthographicTransform() * entity.GetTransform(),
- .prevent_overdraw = false,
};
}
@@ -242,7 +240,6 @@
index_count > 0 ? IndexType::k16bit : IndexType::kNone,
},
.transform = pass.GetOrthographicTransform() * entity.GetTransform(),
- .prevent_overdraw = false,
};
}