[Impeller] remove tessellation from texture (#40570)
[Impeller] remove tessellation from texture contents
diff --git a/impeller/entity/contents/texture_contents.cc b/impeller/entity/contents/texture_contents.cc
index aeb68bd..6bfea05 100644
--- a/impeller/entity/contents/texture_contents.cc
+++ b/impeller/entity/contents/texture_contents.cc
@@ -17,7 +17,6 @@
#include "impeller/renderer/formats.h"
#include "impeller/renderer/render_pass.h"
#include "impeller/renderer/sampler_library.h"
-#include "impeller/tessellator/tessellator.h"
namespace impeller {
@@ -27,7 +26,6 @@
std::shared_ptr<TextureContents> TextureContents::MakeRect(Rect destination) {
auto contents = std::make_shared<TextureContents>();
- contents->path_ = PathBuilder{}.AddRect(destination).TakePath();
contents->rect_ = destination;
return contents;
}
@@ -36,9 +34,8 @@
label_ = std::move(label);
}
-void TextureContents::SetPath(const Path& path) {
- path_ = path;
- rect_ = std::nullopt;
+void TextureContents::SetRect(Rect rect) {
+ rect_ = rect;
}
void TextureContents::SetTexture(std::shared_ptr<Texture> texture) {
@@ -73,7 +70,7 @@
if (opacity_ == 0) {
return std::nullopt;
}
- return path_.GetTransformedBoundingBox(entity.GetTransformation());
+ return rect_.TransformBounds(entity.GetTransformation());
};
std::optional<Snapshot> TextureContents::RenderToSnapshot(
@@ -81,21 +78,16 @@
const Entity& entity,
const std::optional<SamplerDescriptor>& sampler_descriptor,
bool msaa_enabled) const {
- auto bounds = path_.GetBoundingBox();
- if (!bounds.has_value()) {
- return std::nullopt;
- }
-
// Passthrough textures that have simple rectangle paths and complete source
// rects.
- if (rect_.has_value() &&
- source_rect_ == Rect::MakeSize(texture_->GetSize()) &&
+ auto bounds = rect_;
+ if (source_rect_ == Rect::MakeSize(texture_->GetSize()) &&
(opacity_ >= 1 - kEhCloseEnough || defer_applying_opacity_)) {
- auto scale = Vector2(bounds->size / Size(texture_->GetSize()));
+ auto scale = Vector2(bounds.size / Size(texture_->GetSize()));
return Snapshot{
.texture = texture_,
.transform = entity.GetTransformation() *
- Matrix::MakeTranslation(bounds->origin) *
+ Matrix::MakeTranslation(bounds.origin) *
Matrix::MakeScale(scale),
.sampler_descriptor = sampler_descriptor.value_or(sampler_descriptor_),
.opacity = opacity_};
@@ -120,66 +112,20 @@
bool TextureContents::Render(const ContentContext& renderer,
const Entity& entity,
RenderPass& pass) const {
- if (texture_ == nullptr) {
- return true;
- }
-
using VS = TextureFillVertexShader;
using FS = TextureFillFragmentShader;
- const auto coverage_rect = path_.GetBoundingBox();
+ const auto coverage_rect = rect_;
- if (!coverage_rect.has_value()) {
- return true;
- }
-
- if (coverage_rect->size.IsEmpty()) {
- return true;
- }
-
- const auto texture_size = texture_->GetSize();
- if (texture_size.IsEmpty()) {
- return true;
- }
-
- if (source_rect_.IsEmpty()) {
+ if (coverage_rect.size.IsEmpty() || source_rect_.IsEmpty() ||
+ texture_ == nullptr || texture_->GetSize().IsEmpty()) {
return true;
}
VertexBufferBuilder<VS::PerVertexData> vertex_builder;
- if (!rect_.has_value()) {
- const auto tess_result = renderer.GetTessellator()->Tessellate(
- path_.GetFillType(), path_.CreatePolyline(1.0f),
- [this, &vertex_builder, &coverage_rect, &texture_size](
- const float* vertices, size_t vertices_size,
- const uint16_t* indices, size_t indices_size) {
- for (auto i = 0u; i < vertices_size; i += 2) {
- vertex_builder.AppendVertex(ComputeVertexData(
- {vertices[i], vertices[i + 1]}, coverage_rect.value(),
- texture_size, source_rect_));
- }
- FML_DCHECK(vertex_builder.GetVertexCount() == vertices_size / 2);
- for (auto i = 0u; i < indices_size; i++) {
- vertex_builder.AppendIndex(indices[i]);
- }
- return true;
- });
-
- if (tess_result == Tessellator::Result::kInputError) {
- return true;
- }
- if (tess_result == Tessellator::Result::kTessellationError) {
- return false;
- }
- } else {
- for (const auto vtx : rect_->GetPoints()) {
- vertex_builder.AppendVertex(ComputeVertexData(
- vtx, coverage_rect.value(), texture_size, source_rect_));
- }
- }
-
- if (!vertex_builder.HasVertices()) {
- return true;
+ for (const auto vtx : rect_.GetPoints()) {
+ vertex_builder.AppendVertex(ComputeVertexData(
+ vtx, coverage_rect, texture_->GetSize(), source_rect_));
}
auto& host_buffer = pass.GetTransientsBuffer();
@@ -202,9 +148,8 @@
if (!stencil_enabled_) {
pipeline_options.stencil_compare = CompareFunction::kAlways;
}
- if (rect_.has_value()) {
- pipeline_options.primitive_type = PrimitiveType::kTriangleStrip;
- }
+ pipeline_options.primitive_type = PrimitiveType::kTriangleStrip;
+
cmd.pipeline = renderer.GetTexturePipeline(pipeline_options);
cmd.stencil_reference = entity.GetStencilDepth();
cmd.BindVertices(vertex_builder.CreateVertexBuffer(host_buffer));
diff --git a/impeller/entity/contents/texture_contents.h b/impeller/entity/contents/texture_contents.h
index 2e86425..bea6254 100644
--- a/impeller/entity/contents/texture_contents.h
+++ b/impeller/entity/contents/texture_contents.h
@@ -30,7 +30,7 @@
void SetLabel(std::string label);
- void SetPath(const Path& path);
+ void SetRect(Rect rect);
void SetTexture(std::shared_ptr<Texture> texture);
@@ -76,8 +76,7 @@
private:
std::string label_;
- Path path_;
- std::optional<Rect> rect_;
+ Rect rect_;
bool stencil_enabled_ = true;
std::shared_ptr<Texture> texture_;
diff --git a/impeller/entity/entity_unittests.cc b/impeller/entity/entity_unittests.cc
index a7177d0..1d4a707 100644
--- a/impeller/entity/entity_unittests.cc
+++ b/impeller/entity/entity_unittests.cc
@@ -1052,7 +1052,7 @@
if (selected_input_type == 0) {
auto texture = std::make_shared<TextureContents>();
texture->SetSourceRect(Rect::MakeSize(boston->GetSize()));
- texture->SetPath(PathBuilder{}.AddRect(input_rect).TakePath());
+ texture->SetRect(input_rect);
texture->SetTexture(boston);
texture->SetOpacity(input_color.alpha);
@@ -1176,7 +1176,7 @@
Rect::MakeXYWH(path_rect[0], path_rect[1], path_rect[2], path_rect[3]);
auto texture = std::make_shared<TextureContents>();
texture->SetSourceRect(Rect::MakeSize(boston->GetSize()));
- texture->SetPath(PathBuilder{}.AddRect(input_rect).TakePath());
+ texture->SetRect(input_rect);
texture->SetTexture(boston);
texture->SetOpacity(input_color.alpha);