diff --git a/ci/licenses_golden/licenses_flutter b/ci/licenses_golden/licenses_flutter index b52c469b2f816..c93f8899a759d 100644 --- a/ci/licenses_golden/licenses_flutter +++ b/ci/licenses_golden/licenses_flutter @@ -40395,7 +40395,6 @@ ORIGIN: ../../../flutter/impeller/entity/shaders/gaussian_blur/kernel.vert + ../ ORIGIN: ../../../flutter/impeller/entity/shaders/gaussian_blur/kernel_decal.frag + ../../../flutter/LICENSE ORIGIN: ../../../flutter/impeller/entity/shaders/gaussian_blur/kernel_nodecal.frag + ../../../flutter/LICENSE ORIGIN: ../../../flutter/impeller/entity/shaders/geometry/points.comp + ../../../flutter/LICENSE -ORIGIN: ../../../flutter/impeller/entity/shaders/geometry/uv.comp + ../../../flutter/LICENSE ORIGIN: ../../../flutter/impeller/entity/shaders/glyph_atlas.frag + ../../../flutter/LICENSE ORIGIN: ../../../flutter/impeller/entity/shaders/glyph_atlas.vert + ../../../flutter/LICENSE ORIGIN: ../../../flutter/impeller/entity/shaders/glyph_atlas_color.frag + ../../../flutter/LICENSE @@ -40417,6 +40416,7 @@ ORIGIN: ../../../flutter/impeller/entity/shaders/solid_fill.vert + ../../../flut ORIGIN: ../../../flutter/impeller/entity/shaders/texture_fill.frag + ../../../flutter/LICENSE ORIGIN: ../../../flutter/impeller/entity/shaders/texture_fill.vert + ../../../flutter/LICENSE ORIGIN: ../../../flutter/impeller/entity/shaders/texture_fill_strict_src.frag + ../../../flutter/LICENSE +ORIGIN: ../../../flutter/impeller/entity/shaders/texture_uv_fill.vert + ../../../flutter/LICENSE ORIGIN: ../../../flutter/impeller/entity/shaders/tiled_texture_fill.frag + ../../../flutter/LICENSE ORIGIN: ../../../flutter/impeller/entity/shaders/tiled_texture_fill_external.frag + ../../../flutter/LICENSE ORIGIN: ../../../flutter/impeller/entity/shaders/vertices.frag + ../../../flutter/LICENSE @@ -43275,7 +43275,6 @@ FILE: ../../../flutter/impeller/entity/shaders/gaussian_blur/kernel.vert FILE: ../../../flutter/impeller/entity/shaders/gaussian_blur/kernel_decal.frag FILE: ../../../flutter/impeller/entity/shaders/gaussian_blur/kernel_nodecal.frag FILE: ../../../flutter/impeller/entity/shaders/geometry/points.comp -FILE: ../../../flutter/impeller/entity/shaders/geometry/uv.comp FILE: ../../../flutter/impeller/entity/shaders/glyph_atlas.frag FILE: ../../../flutter/impeller/entity/shaders/glyph_atlas.vert FILE: ../../../flutter/impeller/entity/shaders/glyph_atlas_color.frag @@ -43297,6 +43296,7 @@ FILE: ../../../flutter/impeller/entity/shaders/solid_fill.vert FILE: ../../../flutter/impeller/entity/shaders/texture_fill.frag FILE: ../../../flutter/impeller/entity/shaders/texture_fill.vert FILE: ../../../flutter/impeller/entity/shaders/texture_fill_strict_src.frag +FILE: ../../../flutter/impeller/entity/shaders/texture_uv_fill.vert FILE: ../../../flutter/impeller/entity/shaders/tiled_texture_fill.frag FILE: ../../../flutter/impeller/entity/shaders/tiled_texture_fill_external.frag FILE: ../../../flutter/impeller/entity/shaders/vertices.frag diff --git a/impeller/entity/BUILD.gn b/impeller/entity/BUILD.gn index 42d0a32a3f244..6a268d224117f 100644 --- a/impeller/entity/BUILD.gn +++ b/impeller/entity/BUILD.gn @@ -39,6 +39,7 @@ impeller_shaders("entity_shaders") { "shaders/gradients/sweep_gradient_fill.frag", "shaders/texture_fill.frag", "shaders/texture_fill.vert", + "shaders/texture_uv_fill.vert", "shaders/tiled_texture_fill.frag", "shaders/tiled_texture_fill_external.frag", "shaders/texture_fill_strict_src.frag", @@ -79,7 +80,6 @@ impeller_shaders("modern_entity_shaders") { "shaders/gradients/radial_gradient_ssbo_fill.frag", "shaders/gradients/sweep_gradient_ssbo_fill.frag", "shaders/geometry/points.comp", - "shaders/geometry/uv.comp", ] } diff --git a/impeller/entity/contents/clip_contents.h b/impeller/entity/contents/clip_contents.h index 6044692c6962a..5481298a2a8b2 100644 --- a/impeller/entity/contents/clip_contents.h +++ b/impeller/entity/contents/clip_contents.h @@ -9,7 +9,6 @@ #include #include -#include "flutter/fml/macros.h" #include "impeller/entity/contents/contents.h" #include "impeller/entity/entity.h" #include "impeller/entity/geometry/geometry.h" diff --git a/impeller/entity/contents/color_source_contents.h b/impeller/entity/contents/color_source_contents.h index 3c5b932100444..84a7e9a65a437 100644 --- a/impeller/entity/contents/color_source_contents.h +++ b/impeller/entity/contents/color_source_contents.h @@ -118,10 +118,7 @@ class ColorSourceContents : public Contents { RenderPass& pass, const PipelineBuilderCallback& pipeline_callback, typename VertexShaderT::FrameInfo frame_info, - const BindFragmentCallback& bind_fragment_callback, - bool enable_uvs = false, - Rect texture_coverage = {}, - const Matrix& effect_transform = {}) const { + const BindFragmentCallback& bind_fragment_callback) const { auto options = OptionsFromPassAndEntity(pass, entity); GeometryResult::Mode geometry_mode = GetGeometry()->GetResultMode(); @@ -181,10 +178,7 @@ class ColorSourceContents : public Contents { } GeometryResult geometry_result = - enable_uvs - ? geometry.GetPositionUVBuffer(texture_coverage, effect_transform, - renderer, entity, pass) - : geometry.GetPositionBuffer(renderer, entity, pass); + geometry.GetPositionBuffer(renderer, entity, pass); if (geometry_result.vertex_buffer.vertex_count == 0u) { return true; } diff --git a/impeller/entity/contents/content_context.cc b/impeller/entity/contents/content_context.cc index bd3e05c135f6a..34da4ffee1ad0 100644 --- a/impeller/entity/contents/content_context.cc +++ b/impeller/entity/contents/content_context.cc @@ -260,8 +260,7 @@ ContentContext::ContentContext( ? std::make_shared( context_->GetResourceAllocator()) : std::move(render_target_allocator)), - host_buffer_(HostBuffer::Create(context_->GetResourceAllocator())), - pending_command_buffers_(std::make_unique()) { + host_buffer_(HostBuffer::Create(context_->GetResourceAllocator())) { if (!context_ || !context_->IsValid()) { return; } @@ -422,8 +421,7 @@ ContentContext::ContentContext( rrect_blur_pipelines_.CreateDefault(*context_, options_trianglestrip); texture_strict_src_pipelines_.CreateDefault(*context_, options); - position_uv_pipelines_.CreateDefault(*context_, options); - tiled_texture_pipelines_.CreateDefault(*context_, options); + tiled_texture_pipelines_.CreateDefault(*context_, options, {supports_decal}); kernel_decal_pipelines_.CreateDefault(*context_, options_trianglestrip); kernel_nodecal_pipelines_.CreateDefault(*context_, options_trianglestrip); border_mask_blur_pipelines_.CreateDefault(*context_, options_trianglestrip); @@ -456,11 +454,6 @@ ContentContext::ContentContext( PointsComputeShaderPipeline::MakeDefaultPipelineDescriptor(*context_); point_field_compute_pipelines_ = context_->GetPipelineLibrary()->GetPipeline(pipeline_desc).Get(); - - auto uv_pipeline_desc = - UvComputeShaderPipeline::MakeDefaultPipelineDescriptor(*context_); - uv_compute_pipelines_ = - context_->GetPipelineLibrary()->GetPipeline(uv_pipeline_desc).Get(); } is_valid_ = true; diff --git a/impeller/entity/contents/content_context.h b/impeller/entity/contents/content_context.h index 361cd6650dc2e..062649f77bd30 100644 --- a/impeller/entity/contents/content_context.h +++ b/impeller/entity/contents/content_context.h @@ -57,8 +57,8 @@ #include "impeller/entity/texture_fill.frag.h" #include "impeller/entity/texture_fill.vert.h" #include "impeller/entity/texture_fill_strict_src.frag.h" +#include "impeller/entity/texture_uv_fill.vert.h" #include "impeller/entity/tiled_texture_fill.frag.h" -#include "impeller/entity/uv.comp.h" #include "impeller/entity/vertices.frag.h" #include "impeller/entity/yuv_to_rgb_filter.frag.h" @@ -129,10 +129,8 @@ using TexturePipeline = using TextureStrictSrcPipeline = RenderPipelineHandle; -using PositionUVPipeline = RenderPipelineHandle; using TiledTexturePipeline = - RenderPipelineHandle; using KernelDecalPipeline = RenderPipelineHandle; @@ -253,20 +251,13 @@ using FramebufferBlendSoftLightPipeline = /// Geometry Pipelines using PointsComputeShaderPipeline = ComputePipelineBuilder; -using UvComputeShaderPipeline = ComputePipelineBuilder; #ifdef IMPELLER_ENABLE_OPENGLES using TiledTextureExternalPipeline = - RenderPipelineHandle; #endif // IMPELLER_ENABLE_OPENGLES -// A struct used to isolate command buffer storage from the content -// context options to preserve const-ness. -struct PendingCommandBuffers { - std::vector> command_buffers; -}; - /// Pipeline state configuration. /// /// Each unique combination of these options requires a different pipeline state @@ -478,11 +469,6 @@ class ContentContext { } #endif // IMPELLER_ENABLE_OPENGLES - std::shared_ptr> GetPositionUVPipeline( - ContentContextOptions opts) const { - return GetPipeline(position_uv_pipelines_, opts); - } - std::shared_ptr> GetTiledTexturePipeline( ContentContextOptions opts) const { return GetPipeline(tiled_texture_pipelines_, opts); @@ -727,12 +713,6 @@ class ContentContext { return point_field_compute_pipelines_; } - std::shared_ptr> GetUvComputePipeline() - const { - FML_DCHECK(GetDeviceCapabilities().SupportsCompute()); - return uv_compute_pipelines_; - } - std::shared_ptr GetContext() const; const Capabilities& GetDeviceCapabilities() const; @@ -932,7 +912,6 @@ class ContentContext { mutable Variants tiled_texture_external_pipelines_; #endif // IMPELLER_ENABLE_OPENGLES - mutable Variants position_uv_pipelines_; mutable Variants tiled_texture_pipelines_; mutable Variants kernel_decal_pipelines_; mutable Variants kernel_nodecal_pipelines_; @@ -997,8 +976,6 @@ class ContentContext { framebuffer_blend_softlight_pipelines_; mutable std::shared_ptr> point_field_compute_pipelines_; - mutable std::shared_ptr> - uv_compute_pipelines_; template std::shared_ptr> GetPipeline( @@ -1058,7 +1035,6 @@ class ContentContext { #endif // IMPELLER_ENABLE_3D std::shared_ptr render_target_cache_; std::shared_ptr host_buffer_; - std::unique_ptr pending_command_buffers_; bool wireframe_ = false; ContentContext(const ContentContext&) = delete; diff --git a/impeller/entity/contents/texture_contents.cc b/impeller/entity/contents/texture_contents.cc index d48b4b6eaace2..72fce8d0ff211 100644 --- a/impeller/entity/contents/texture_contents.cc +++ b/impeller/entity/contents/texture_contents.cc @@ -14,7 +14,6 @@ #include "impeller/entity/texture_fill.frag.h" #include "impeller/entity/texture_fill.vert.h" #include "impeller/entity/texture_fill_strict_src.frag.h" -#include "impeller/entity/tiled_texture_fill_external.frag.h" #include "impeller/geometry/constants.h" #include "impeller/renderer/render_pass.h" #include "impeller/renderer/vertex_buffer_builder.h" @@ -114,7 +113,6 @@ bool TextureContents::Render(const ContentContext& renderer, using VS = TextureFillVertexShader; using FS = TextureFillFragmentShader; - using FSExternal = TiledTextureFillExternalFragmentShader; using FSStrict = TextureFillStrictSrcFragmentShader; if (destination_rect_.IsEmpty() || source_rect_.IsEmpty() || @@ -122,8 +120,9 @@ bool TextureContents::Render(const ContentContext& renderer, return true; // Nothing to render. } - bool is_external_texture = + [[maybe_unused]] bool is_external_texture = texture_->GetTextureDescriptor().type == TextureType::kTextureExternalOES; + FML_DCHECK(!is_external_texture); auto source_rect = capture.AddRect("Source rect", source_rect_); auto texture_coords = @@ -159,46 +158,14 @@ bool TextureContents::Render(const ContentContext& renderer, } pipeline_options.primitive_type = PrimitiveType::kTriangleStrip; - std::shared_ptr> pipeline; -#ifdef IMPELLER_ENABLE_OPENGLES - if (is_external_texture) { - pipeline = renderer.GetTiledTextureExternalPipeline(pipeline_options); - } -#endif // IMPELLER_ENABLE_OPENGLES - - if (!pipeline) { - if (strict_source_rect_enabled_) { - pipeline = renderer.GetTextureStrictSrcPipeline(pipeline_options); - } else { - pipeline = renderer.GetTexturePipeline(pipeline_options); - } - } - pass.SetPipeline(pipeline); + pass.SetPipeline(strict_source_rect_enabled_ + ? renderer.GetTextureStrictSrcPipeline(pipeline_options) + : renderer.GetTexturePipeline(pipeline_options)); pass.SetVertexBuffer(vertex_builder.CreateVertexBuffer(host_buffer)); VS::BindFrameInfo(pass, host_buffer.EmplaceUniform(frame_info)); - if (is_external_texture) { - FSExternal::FragInfo frag_info; - frag_info.x_tile_mode = - static_cast(sampler_descriptor_.width_address_mode); - frag_info.y_tile_mode = - static_cast(sampler_descriptor_.height_address_mode); - frag_info.alpha = capture.AddScalar("Alpha", GetOpacity()); - - auto sampler_descriptor = sampler_descriptor_; - // OES_EGL_image_external states that only CLAMP_TO_EDGE is valid, so - // we emulate all other tile modes here by remapping the texture - // coordinates. - sampler_descriptor.width_address_mode = SamplerAddressMode::kClampToEdge; - sampler_descriptor.height_address_mode = SamplerAddressMode::kClampToEdge; - - FSExternal::BindFragInfo(pass, host_buffer.EmplaceUniform((frag_info))); - FSExternal::BindSAMPLEREXTERNALOESTextureSampler( - pass, texture_, - renderer.GetContext()->GetSamplerLibrary()->GetSampler( - sampler_descriptor)); - } else if (strict_source_rect_enabled_) { + if (strict_source_rect_enabled_) { // For a strict source rect, shrink the texture coordinate range by half a // texel to ensure that linear filtering does not sample anything outside // the source rect bounds. diff --git a/impeller/entity/contents/tiled_texture_contents.cc b/impeller/entity/contents/tiled_texture_contents.cc index de6497033a307..3f6d4a3715203 100644 --- a/impeller/entity/contents/tiled_texture_contents.cc +++ b/impeller/entity/contents/tiled_texture_contents.cc @@ -6,8 +6,6 @@ #include "fml/logging.h" #include "impeller/entity/contents/content_context.h" -#include "impeller/entity/texture_fill.frag.h" -#include "impeller/entity/texture_fill.vert.h" #include "impeller/entity/tiled_texture_fill.frag.h" #include "impeller/entity/tiled_texture_fill_external.frag.h" #include "impeller/renderer/render_pass.h" @@ -116,7 +114,7 @@ bool TiledTextureContents::Render(const ContentContext& renderer, return true; } - using VS = TextureFillVertexShader; + using VS = TextureUvFillVertexShader; using FS = TiledTextureFillFragmentShader; using FSExternal = TiledTextureFillExternalFragmentShader; @@ -128,11 +126,11 @@ bool TiledTextureContents::Render(const ContentContext& renderer, bool is_external_texture = texture_->GetTextureDescriptor().type == TextureType::kTextureExternalOES; - bool uses_emulated_tile_mode = - UsesEmulatedTileMode(renderer.GetDeviceCapabilities()); - VS::FrameInfo frame_info; frame_info.texture_sampler_y_coord_scale = texture_->GetYCoordScale(); + frame_info.uv_transform = + Rect::MakeSize(texture_size).GetNormalizingTransform() * + GetInverseEffectTransform(); PipelineBuilderMethod pipeline_method; @@ -140,14 +138,10 @@ bool TiledTextureContents::Render(const ContentContext& renderer, if (is_external_texture) { pipeline_method = &ContentContext::GetTiledTextureExternalPipeline; } else { - pipeline_method = uses_emulated_tile_mode - ? &ContentContext::GetTiledTexturePipeline - : &ContentContext::GetTexturePipeline; + pipeline_method = &ContentContext::GetTiledTexturePipeline; } #else - pipeline_method = uses_emulated_tile_mode - ? &ContentContext::GetTiledTexturePipeline - : &ContentContext::GetTexturePipeline; + pipeline_method = &ContentContext::GetTiledTexturePipeline; #endif // IMPELLER_ENABLE_OPENGLES PipelineBuilderCallback pipeline_callback = @@ -156,15 +150,10 @@ bool TiledTextureContents::Render(const ContentContext& renderer, }; return ColorSourceContents::DrawGeometry( renderer, entity, pass, pipeline_callback, frame_info, - [this, &renderer, &is_external_texture, - &uses_emulated_tile_mode](RenderPass& pass) { + [this, &renderer, &is_external_texture](RenderPass& pass) { auto& host_buffer = renderer.GetTransientsBuffer(); - if (uses_emulated_tile_mode) { - pass.SetCommandLabel("TiledTextureFill"); - } else { - pass.SetCommandLabel("TextureFill"); - } + pass.SetCommandLabel("TextureFill"); if (is_external_texture) { FSExternal::FragInfo frag_info; @@ -172,17 +161,12 @@ bool TiledTextureContents::Render(const ContentContext& renderer, frag_info.y_tile_mode = static_cast(y_tile_mode_); frag_info.alpha = GetOpacityFactor(); FSExternal::BindFragInfo(pass, host_buffer.EmplaceUniform(frag_info)); - } else if (uses_emulated_tile_mode) { + } else { FS::FragInfo frag_info; frag_info.x_tile_mode = static_cast(x_tile_mode_); frag_info.y_tile_mode = static_cast(y_tile_mode_); frag_info.alpha = GetOpacityFactor(); FS::BindFragInfo(pass, host_buffer.EmplaceUniform(frag_info)); - } else { - TextureFillFragmentShader::FragInfo frag_info; - frag_info.alpha = GetOpacityFactor(); - TextureFillFragmentShader::BindFragInfo( - pass, host_buffer.EmplaceUniform(frag_info)); } if (is_external_texture) { @@ -221,10 +205,7 @@ bool TiledTextureContents::Render(const ContentContext& renderer, } return true; - }, - /*enable_uvs=*/true, - /*texture_coverage=*/Rect::MakeSize(texture_size), - /*effect_transform=*/GetInverseEffectTransform()); + }); } std::optional TiledTextureContents::RenderToSnapshot( diff --git a/impeller/entity/contents/vertices_contents.cc b/impeller/entity/contents/vertices_contents.cc index 9aeaa83023b83..b67aee75d192b 100644 --- a/impeller/entity/contents/vertices_contents.cc +++ b/impeller/entity/contents/vertices_contents.cc @@ -133,8 +133,8 @@ void VerticesUVContents::SetAlpha(Scalar alpha) { bool VerticesUVContents::Render(const ContentContext& renderer, const Entity& entity, RenderPass& pass) const { - using VS = TexturePipeline::VertexShader; - using FS = TexturePipeline::FragmentShader; + using VS = TiledTexturePipeline::VertexShader; + using FS = TiledTexturePipeline::FragmentShader; auto src_contents = parent_.GetSourceContents(); @@ -158,21 +158,23 @@ bool VerticesUVContents::Render(const ContentContext& renderer, if (!coverage.has_value()) { return false; } - auto geometry_result = geometry->GetPositionUVBuffer( - coverage.value(), Matrix(), renderer, entity, pass); + auto geometry_result = geometry->GetPositionBuffer(renderer, entity, pass); auto opts = OptionsFromPassAndEntity(pass, entity); opts.primitive_type = geometry_result.type; - pass.SetPipeline(renderer.GetTexturePipeline(opts)); + pass.SetPipeline(renderer.GetTiledTexturePipeline(opts)); pass.SetVertexBuffer(std::move(geometry_result.vertex_buffer)); VS::FrameInfo frame_info; frame_info.mvp = geometry_result.transform; frame_info.texture_sampler_y_coord_scale = snapshot->texture->GetYCoordScale(); + frame_info.uv_transform = coverage.value().GetNormalizingTransform(); VS::BindFrameInfo(pass, host_buffer.EmplaceUniform(frame_info)); FS::FragInfo frag_info; frag_info.alpha = alpha_ * snapshot->opacity; + frag_info.x_tile_mode = 0; + frag_info.y_tile_mode = 0; FS::BindFragInfo(pass, host_buffer.EmplaceUniform(frag_info)); FS::BindTextureSampler(pass, snapshot->texture, renderer.GetContext()->GetSamplerLibrary()->GetSampler( diff --git a/impeller/entity/entity_unittests.cc b/impeller/entity/entity_unittests.cc index 61594bd4d2e64..2df4baaad979a 100644 --- a/impeller/entity/entity_unittests.cc +++ b/impeller/entity/entity_unittests.cc @@ -2830,12 +2830,7 @@ TEST_P(EntityTest, CanComputeGeometryForEmptyPathsWithoutCrashing) { auto position_result = geom->GetPositionBuffer(*GetContentContext(), entity, render_pass); - auto uv_result = - geom->GetPositionUVBuffer(Rect::MakeLTRB(0, 0, 100, 100), Matrix(), - *GetContentContext(), entity, render_pass); - EXPECT_EQ(position_result.vertex_buffer.vertex_count, 0u); - EXPECT_EQ(uv_result.vertex_buffer.vertex_count, 0u); EXPECT_EQ(geom->GetResultMode(), GeometryResult::Mode::kNormal); } diff --git a/impeller/entity/geometry/circle_geometry.cc b/impeller/entity/geometry/circle_geometry.cc index bd9aa8c796378..4f782feeb1441 100644 --- a/impeller/entity/geometry/circle_geometry.cc +++ b/impeller/entity/geometry/circle_geometry.cc @@ -44,31 +44,6 @@ GeometryResult CircleGeometry::GetPositionBuffer(const ContentContext& renderer, return ComputePositionGeometry(renderer, generator, entity, pass); } -// |Geometry| -GeometryResult CircleGeometry::GetPositionUVBuffer( - Rect texture_coverage, - Matrix effect_transform, - const ContentContext& renderer, - const Entity& entity, - RenderPass& pass) const { - auto& transform = entity.GetTransform(); - auto uv_transform = - texture_coverage.GetNormalizingTransform() * effect_transform; - - Scalar half_width = stroke_width_ < 0 ? 0.0 - : LineGeometry::ComputePixelHalfWidth( - transform, stroke_width_); - std::shared_ptr tessellator = renderer.GetTessellator(); - - // We call the StrokedCircle method which will simplify to a - // FilledCircleGenerator if the inner_radius is <= 0. - auto generator = - tessellator->StrokedCircle(transform, center_, radius_, half_width); - - return ComputePositionUVGeometry(renderer, generator, uv_transform, entity, - pass); -} - GeometryVertexType CircleGeometry::GetVertexType() const { return GeometryVertexType::kPosition; } diff --git a/impeller/entity/geometry/circle_geometry.h b/impeller/entity/geometry/circle_geometry.h index be75f891317d1..d715a2fc02e2e 100644 --- a/impeller/entity/geometry/circle_geometry.h +++ b/impeller/entity/geometry/circle_geometry.h @@ -39,13 +39,6 @@ class CircleGeometry final : public Geometry { // |Geometry| std::optional GetCoverage(const Matrix& transform) const override; - // |Geometry| - GeometryResult GetPositionUVBuffer(Rect texture_coverage, - Matrix effect_transform, - const ContentContext& renderer, - const Entity& entity, - RenderPass& pass) const override; - Point center_; Scalar radius_; Scalar stroke_width_; diff --git a/impeller/entity/geometry/cover_geometry.cc b/impeller/entity/geometry/cover_geometry.cc index 1f80687d14752..cdf64d70c7fb4 100644 --- a/impeller/entity/geometry/cover_geometry.cc +++ b/impeller/entity/geometry/cover_geometry.cc @@ -33,18 +33,6 @@ GeometryResult CoverGeometry::GetPositionBuffer(const ContentContext& renderer, }; } -// |Geometry| -GeometryResult CoverGeometry::GetPositionUVBuffer( - Rect texture_coverage, - Matrix effect_transform, - const ContentContext& renderer, - const Entity& entity, - RenderPass& pass) const { - auto rect = Rect::MakeSize(pass.GetRenderTargetSize()); - return ComputeUVGeometryForRect(rect, texture_coverage, effect_transform, - renderer, entity, pass); -} - GeometryVertexType CoverGeometry::GetVertexType() const { return GeometryVertexType::kPosition; } diff --git a/impeller/entity/geometry/cover_geometry.h b/impeller/entity/geometry/cover_geometry.h index e9f56530cded2..5dfe6a76e8a3b 100644 --- a/impeller/entity/geometry/cover_geometry.h +++ b/impeller/entity/geometry/cover_geometry.h @@ -34,13 +34,6 @@ class CoverGeometry final : public Geometry { // |Geometry| std::optional GetCoverage(const Matrix& transform) const override; - // |Geometry| - GeometryResult GetPositionUVBuffer(Rect texture_coverage, - Matrix effect_transform, - const ContentContext& renderer, - const Entity& entity, - RenderPass& pass) const override; - CoverGeometry(const CoverGeometry&) = delete; CoverGeometry& operator=(const CoverGeometry&) = delete; diff --git a/impeller/entity/geometry/ellipse_geometry.cc b/impeller/entity/geometry/ellipse_geometry.cc index b0d21324b437e..623c9a8abf8a9 100644 --- a/impeller/entity/geometry/ellipse_geometry.cc +++ b/impeller/entity/geometry/ellipse_geometry.cc @@ -22,20 +22,6 @@ GeometryResult EllipseGeometry::GetPositionBuffer( entity, pass); } -// |Geometry| -GeometryResult EllipseGeometry::GetPositionUVBuffer( - Rect texture_coverage, - Matrix effect_transform, - const ContentContext& renderer, - const Entity& entity, - RenderPass& pass) const { - return ComputePositionUVGeometry( - renderer, - renderer.GetTessellator()->FilledEllipse(entity.GetTransform(), bounds_), - texture_coverage.GetNormalizingTransform() * effect_transform, entity, - pass); -} - GeometryVertexType EllipseGeometry::GetVertexType() const { return GeometryVertexType::kPosition; } diff --git a/impeller/entity/geometry/ellipse_geometry.h b/impeller/entity/geometry/ellipse_geometry.h index 892d03568e6de..734899bb28619 100644 --- a/impeller/entity/geometry/ellipse_geometry.h +++ b/impeller/entity/geometry/ellipse_geometry.h @@ -37,13 +37,6 @@ class EllipseGeometry final : public Geometry { // |Geometry| std::optional GetCoverage(const Matrix& transform) const override; - // |Geometry| - GeometryResult GetPositionUVBuffer(Rect texture_coverage, - Matrix effect_transform, - const ContentContext& renderer, - const Entity& entity, - RenderPass& pass) const override; - Rect bounds_; EllipseGeometry(const EllipseGeometry&) = delete; diff --git a/impeller/entity/geometry/fill_path_geometry.cc b/impeller/entity/geometry/fill_path_geometry.cc index 89088c86e8e3f..77286c0dad6ed 100644 --- a/impeller/entity/geometry/fill_path_geometry.cc +++ b/impeller/entity/geometry/fill_path_geometry.cc @@ -47,42 +47,6 @@ GeometryResult FillPathGeometry::GetPositionBuffer( }; } -// |Geometry| -GeometryResult FillPathGeometry::GetPositionUVBuffer( - Rect texture_coverage, - Matrix effect_transform, - const ContentContext& renderer, - const Entity& entity, - RenderPass& pass) const { - const auto& bounding_box = path_.GetBoundingBox(); - if (bounding_box.has_value() && bounding_box->IsEmpty()) { - return GeometryResult{ - .type = PrimitiveType::kTriangle, - .vertex_buffer = - VertexBuffer{ - .vertex_buffer = {}, - .vertex_count = 0, - .index_type = IndexType::k16bit, - }, - .transform = pass.GetOrthographicTransform() * entity.GetTransform(), - }; - } - - auto uv_transform = - texture_coverage.GetNormalizingTransform() * effect_transform; - - VertexBuffer vertex_buffer = renderer.GetTessellator()->TessellateConvex( - path_, renderer.GetTransientsBuffer(), - entity.GetTransform().GetMaxBasisLength(), uv_transform); - - return GeometryResult{ - .type = PrimitiveType::kTriangleStrip, - .vertex_buffer = vertex_buffer, - .transform = entity.GetShaderTransform(pass), - .mode = GetResultMode(), - }; -} - GeometryResult::Mode FillPathGeometry::GetResultMode() const { const auto& bounding_box = path_.GetBoundingBox(); if (path_.IsConvex() || diff --git a/impeller/entity/geometry/fill_path_geometry.h b/impeller/entity/geometry/fill_path_geometry.h index 722f7cc661c40..9127084a3384f 100644 --- a/impeller/entity/geometry/fill_path_geometry.h +++ b/impeller/entity/geometry/fill_path_geometry.h @@ -35,13 +35,6 @@ class FillPathGeometry final : public Geometry { // |Geometry| std::optional GetCoverage(const Matrix& transform) const override; - // |Geometry| - GeometryResult GetPositionUVBuffer(Rect texture_coverage, - Matrix effect_transform, - const ContentContext& renderer, - const Entity& entity, - RenderPass& pass) const override; - // |Geometry| GeometryResult::Mode GetResultMode() const override; diff --git a/impeller/entity/geometry/geometry.cc b/impeller/entity/geometry/geometry.cc index bc774a2a80e70..d595317d3656a 100644 --- a/impeller/entity/geometry/geometry.cc +++ b/impeller/entity/geometry/geometry.cc @@ -7,7 +7,6 @@ #include #include -#include "fml/status.h" #include "impeller/entity/contents/content_context.h" #include "impeller/entity/geometry/circle_geometry.h" #include "impeller/entity/geometry/cover_geometry.h" @@ -54,120 +53,6 @@ GeometryResult Geometry::ComputePositionGeometry( }; } -GeometryResult Geometry::ComputePositionUVGeometry( - const ContentContext& renderer, - const Tessellator::VertexGenerator& generator, - const Matrix& uv_transform, - const Entity& entity, - RenderPass& pass) { - using VT = TextureFillVertexShader::PerVertexData; - - size_t count = generator.GetVertexCount(); - - return GeometryResult{ - .type = generator.GetTriangleType(), - .vertex_buffer = - { - .vertex_buffer = renderer.GetTransientsBuffer().Emplace( - count * sizeof(VT), alignof(VT), - [&generator, &uv_transform](uint8_t* buffer) { - auto vertices = reinterpret_cast(buffer); - generator.GenerateVertices( - [&vertices, &uv_transform](const Point& p) { // - *vertices++ = { - .position = p, - .texture_coords = uv_transform * p, - }; - }); - FML_DCHECK(vertices == reinterpret_cast(buffer) + - generator.GetVertexCount()); - }), - .vertex_count = count, - .index_type = IndexType::kNone, - }, - .transform = entity.GetShaderTransform(pass), - }; -} - -VertexBufferBuilder -ComputeUVGeometryCPU( - VertexBufferBuilder& input, - Point texture_origin, - Size texture_coverage, - Matrix effect_transform) { - VertexBufferBuilder vertex_builder; - vertex_builder.Reserve(input.GetVertexCount()); - input.IterateVertices( - [&vertex_builder, &texture_coverage, &effect_transform, - &texture_origin](SolidFillVertexShader::PerVertexData old_vtx) { - TextureFillVertexShader::PerVertexData data; - data.position = old_vtx.position; - data.texture_coords = effect_transform * - (old_vtx.position - texture_origin) / - texture_coverage; - vertex_builder.AppendVertex(data); - }); - return vertex_builder; -} - -GeometryResult ComputeUVGeometryForRect(Rect source_rect, - Rect texture_bounds, - Matrix effect_transform, - const ContentContext& renderer, - const Entity& entity, - RenderPass& pass) { - auto& host_buffer = renderer.GetTransientsBuffer(); - - // Calculate UV-specific transform based on texture coverage and effect. - // For example, if the texture is 100x100 and the effect transform is - // scaling by 2.0, texture_bounds.GetNormalizingTransform() will result in a - // Matrix that scales by 0.01, and then if the effect_transform is - // Matrix::MakeScale(Vector2{2, 2}), the resulting uv_transform will have x - // and y basis vectors with scale 0.02. - auto uv_transform = texture_bounds.GetNormalizingTransform() * // - effect_transform; - - // Allocate space for vertex and UV data (4 vertices) - // 0: position - // 1: UV - // 2: position - // 3: UV - // etc. - Point data[8]; - - // Get the raw points from the rect and transform them into UV space. - auto points = source_rect.GetPoints(); - for (auto i = 0u, j = 0u; i < 8; i += 2, j++) { - // Store original coordinates. - data[i] = points[j]; - - // Store transformed UV coordinates. - data[i + 1] = uv_transform * points[j]; - } - - return GeometryResult{ - .type = PrimitiveType::kTriangleStrip, - .vertex_buffer = - { - .vertex_buffer = host_buffer.Emplace( - /*buffer=*/data, - /*length=*/16 * sizeof(float), - /*align=*/alignof(float)), - .vertex_count = 4, - .index_type = IndexType::kNone, - }, - .transform = entity.GetShaderTransform(pass), - }; -} - -GeometryResult Geometry::GetPositionUVBuffer(Rect texture_coverage, - Matrix effect_transform, - const ContentContext& renderer, - const Entity& entity, - RenderPass& pass) const { - return {}; -} - GeometryResult::Mode Geometry::GetResultMode() const { return GeometryResult::Mode::kNormal; } diff --git a/impeller/entity/geometry/geometry.h b/impeller/entity/geometry/geometry.h index 5144ead7c433d..70939b8f0dc63 100644 --- a/impeller/entity/geometry/geometry.h +++ b/impeller/entity/geometry/geometry.h @@ -9,7 +9,6 @@ #include "impeller/core/vertex_buffer.h" #include "impeller/entity/contents/content_context.h" #include "impeller/entity/entity.h" -#include "impeller/entity/texture_fill.vert.h" #include "impeller/renderer/render_pass.h" #include "impeller/renderer/vertex_buffer_builder.h" @@ -52,34 +51,6 @@ enum GeometryVertexType { kUV, }; -/// @brief Compute UV geometry for a VBB that contains only position geometry. -/// -/// texture_origin should be set to 0, 0 for stroke and stroke based geometry, -/// like the point field. -VertexBufferBuilder -ComputeUVGeometryCPU( - VertexBufferBuilder& input, - Point texture_origin, - Size texture_coverage, - Matrix effect_transform); - -/// @brief Computes geometry and UV coordinates for a rectangle to be rendered. -/// -/// UV is the horizontal and vertical coordinates within the texture. -/// -/// @param source_rect The rectangle to be rendered. -/// @param texture_bounds The local space bounding box of the geometry. -/// @param effect_transform The transform to apply to the UV coordinates. -/// @param renderer The content context to use for allocating buffers. -/// @param entity The entity to use for the transform. -/// @param pass The render pass to use for the transform. -GeometryResult ComputeUVGeometryForRect(Rect source_rect, - Rect texture_bounds, - Matrix effect_transform, - const ContentContext& renderer, - const Entity& entity, - RenderPass& pass); - class Geometry { public: static std::shared_ptr MakeFillPath( @@ -122,12 +93,6 @@ class Geometry { const Entity& entity, RenderPass& pass) const = 0; - virtual GeometryResult GetPositionUVBuffer(Rect texture_coverage, - Matrix effect_transform, - const ContentContext& renderer, - const Entity& entity, - RenderPass& pass) const = 0; - virtual GeometryResult::Mode GetResultMode() const; virtual GeometryVertexType GetVertexType() const = 0; @@ -156,13 +121,6 @@ class Geometry { const Tessellator::VertexGenerator& generator, const Entity& entity, RenderPass& pass); - - static GeometryResult ComputePositionUVGeometry( - const ContentContext& renderer, - const Tessellator::VertexGenerator& generator, - const Matrix& uv_transform, - const Entity& entity, - RenderPass& pass); }; } // namespace impeller diff --git a/impeller/entity/geometry/geometry_unittests.cc b/impeller/entity/geometry/geometry_unittests.cc index 990b1419659ed..09061eb2628ae 100644 --- a/impeller/entity/geometry/geometry_unittests.cc +++ b/impeller/entity/geometry/geometry_unittests.cc @@ -61,21 +61,6 @@ class ImpellerEntityUnitTestAccessor { return StrokePathGeometry::GenerateSolidStrokeVertices( polyline, stroke_width, miter_limit, stroke_join, stroke_cap, scale); } - - static std::vector - GenerateSolidStrokeVerticesUV(const Path::Polyline& polyline, - Scalar stroke_width, - Scalar miter_limit, - Join stroke_join, - Cap stroke_cap, - Scalar scale, - Point texture_origin, - Size texture_size, - const Matrix& effect_transform) { - return StrokePathGeometry::GenerateSolidStrokeVerticesUV( - polyline, stroke_width, miter_limit, stroke_join, stroke_cap, scale, - texture_origin, texture_size, effect_transform); - } }; namespace testing { @@ -142,95 +127,6 @@ TEST(EntityGeometryTest, RoundRectGeometryCoversArea) { EXPECT_TRUE(geometry->CoversArea({}, Rect::MakeLTRB(1, 30, 99, 70))); } -TEST(EntityGeometryTest, StrokePathGeometryTransformOfLine) { - auto path = - PathBuilder().AddLine(Point(100, 100), Point(200, 100)).TakePath(); - auto points = std::make_unique>(); - auto polyline = - path.CreatePolyline(1.0f, std::move(points), - [&points](Path::Polyline::PointBufferPtr reclaimed) { - points = std::move(reclaimed); - }); - - auto vertices = ImpellerEntityUnitTestAccessor::GenerateSolidStrokeVertices( - polyline, 10.0f, 10.0f, Join::kBevel, Cap::kButt, 1.0); - - std::vector expected = { - {.position = Point(100.0f, 105.0f)}, // - {.position = Point(100.0f, 95.0f)}, // - {.position = Point(100.0f, 105.0f)}, // - {.position = Point(100.0f, 95.0f)}, // - {.position = Point(200.0f, 105.0f)}, // - {.position = Point(200.0f, 95.0f)}, // - {.position = Point(200.0f, 105.0f)}, // - {.position = Point(200.0f, 95.0f)}, // - }; - - EXPECT_SOLID_VERTICES_NEAR(vertices, expected); - - { - auto uv_vertices = - ImpellerEntityUnitTestAccessor::GenerateSolidStrokeVerticesUV( - polyline, 10.0f, 10.0f, Join::kBevel, Cap::kButt, 1.0, // - Point(50.0f, 40.0f), Size(20.0f, 40.0f), Matrix()); - // uvx = (x - 50) / 20 - // uvy = (y - 40) / 40 - auto uv = [](const Point& p) { - return Point((p.x - 50.0f) / 20.0f, // - (p.y - 40.0f) / 40.0f); - }; - std::vector uv_expected; - for (size_t i = 0; i < expected.size(); i++) { - auto p = expected[i].position; - uv_expected.push_back({.position = p, .texture_coords = uv(p)}); - } - - EXPECT_TEXTURE_VERTICES_NEAR(uv_vertices, uv_expected); - } - - { - auto uv_vertices = - ImpellerEntityUnitTestAccessor::GenerateSolidStrokeVerticesUV( - polyline, 10.0f, 10.0f, Join::kBevel, Cap::kButt, 1.0, // - Point(50.0f, 40.0f), Size(20.0f, 40.0f), - Matrix::MakeScale({8.0f, 4.0f, 1.0f})); - // uvx = ((x * 8) - 50) / 20 - // uvy = ((y * 4) - 40) / 40 - auto uv = [](const Point& p) { - return Point(((p.x * 8.0f) - 50.0f) / 20.0f, - ((p.y * 4.0f) - 40.0f) / 40.0f); - }; - std::vector uv_expected; - for (size_t i = 0; i < expected.size(); i++) { - auto p = expected[i].position; - uv_expected.push_back({.position = p, .texture_coords = uv(p)}); - } - - EXPECT_TEXTURE_VERTICES_NEAR(uv_vertices, uv_expected); - } - - { - auto uv_vertices = - ImpellerEntityUnitTestAccessor::GenerateSolidStrokeVerticesUV( - polyline, 10.0f, 10.0f, Join::kBevel, Cap::kButt, 1.0, // - Point(50.0f, 40.0f), Size(20.0f, 40.0f), - Matrix::MakeTranslation({8.0f, 4.0f})); - // uvx = ((x + 8) - 50) / 20 - // uvy = ((y + 4) - 40) / 40 - auto uv = [](const Point& p) { - return Point(((p.x + 8.0f) - 50.0f) / 20.0f, - ((p.y + 4.0f) - 40.0f) / 40.0f); - }; - std::vector uv_expected; - for (size_t i = 0; i < expected.size(); i++) { - auto p = expected[i].position; - uv_expected.push_back({.position = p, .texture_coords = uv(p)}); - } - - EXPECT_TEXTURE_VERTICES_NEAR(uv_vertices, uv_expected); - } -} - TEST(EntityGeometryTest, GeometryResultHasReasonableDefaults) { GeometryResult result; EXPECT_EQ(result.type, PrimitiveType::kTriangleStrip); diff --git a/impeller/entity/geometry/line_geometry.cc b/impeller/entity/geometry/line_geometry.cc index ea5f087fb5ad7..cb4c658fca7a2 100644 --- a/impeller/entity/geometry/line_geometry.cc +++ b/impeller/entity/geometry/line_geometry.cc @@ -108,58 +108,6 @@ GeometryResult LineGeometry::GetPositionBuffer(const ContentContext& renderer, }; } -// |Geometry| -GeometryResult LineGeometry::GetPositionUVBuffer(Rect texture_coverage, - Matrix effect_transform, - const ContentContext& renderer, - const Entity& entity, - RenderPass& pass) const { - auto& host_buffer = renderer.GetTransientsBuffer(); - using VT = TextureFillVertexShader::PerVertexData; - - auto& transform = entity.GetTransform(); - auto radius = ComputePixelHalfWidth(transform, width_); - - auto uv_transform = - texture_coverage.GetNormalizingTransform() * effect_transform; - - if (cap_ == Cap::kRound) { - std::shared_ptr tessellator = renderer.GetTessellator(); - auto generator = tessellator->RoundCapLine(transform, p0_, p1_, radius); - return ComputePositionUVGeometry(renderer, generator, uv_transform, entity, - pass); - } - - Point corners[4]; - if (!ComputeCorners(corners, transform, cap_ == Cap::kSquare)) { - return kEmptyResult; - } - - size_t count = 4; - BufferView vertex_buffer = - host_buffer.Emplace(count * sizeof(VT), alignof(VT), - [&uv_transform, &corners](uint8_t* buffer) { - auto vertices = reinterpret_cast(buffer); - for (auto& corner : corners) { - *vertices++ = { - .position = corner, - .texture_coords = uv_transform * corner, - }; - } - }); - - return GeometryResult{ - .type = PrimitiveType::kTriangleStrip, - .vertex_buffer = - { - .vertex_buffer = vertex_buffer, - .vertex_count = count, - .index_type = IndexType::kNone, - }, - .transform = entity.GetShaderTransform(pass), - }; -} - GeometryVertexType LineGeometry::GetVertexType() const { return GeometryVertexType::kPosition; } diff --git a/impeller/entity/geometry/line_geometry.h b/impeller/entity/geometry/line_geometry.h index 58032074ed5d9..072dc7056b70b 100644 --- a/impeller/entity/geometry/line_geometry.h +++ b/impeller/entity/geometry/line_geometry.h @@ -57,13 +57,6 @@ class LineGeometry final : public Geometry { // |Geometry| std::optional GetCoverage(const Matrix& transform) const override; - // |Geometry| - GeometryResult GetPositionUVBuffer(Rect texture_coverage, - Matrix effect_transform, - const ContentContext& renderer, - const Entity& entity, - RenderPass& pass) const override; - Point p0_; Point p1_; Scalar width_; diff --git a/impeller/entity/geometry/point_field_geometry.cc b/impeller/entity/geometry/point_field_geometry.cc index 3aabb90176569..dd169b1823fd6 100644 --- a/impeller/entity/geometry/point_field_geometry.cc +++ b/impeller/entity/geometry/point_field_geometry.cc @@ -34,33 +34,6 @@ GeometryResult PointFieldGeometry::GetPositionBuffer( }; } -GeometryResult PointFieldGeometry::GetPositionUVBuffer( - Rect texture_coverage, - Matrix effect_transform, - const ContentContext& renderer, - const Entity& entity, - RenderPass& pass) const { - if (renderer.GetDeviceCapabilities().SupportsCompute()) { - return GetPositionBufferGPU(renderer, entity, pass, texture_coverage, - effect_transform); - } - - auto vtx_builder = GetPositionBufferCPU(renderer, entity, pass); - if (!vtx_builder.has_value()) { - return {}; - } - auto uv_vtx_builder = - ComputeUVGeometryCPU(vtx_builder.value(), {0, 0}, - texture_coverage.GetSize(), effect_transform); - - auto& host_buffer = renderer.GetTransientsBuffer(); - return { - .type = PrimitiveType::kTriangleStrip, - .vertex_buffer = uv_vtx_builder.CreateVertexBuffer(host_buffer), - .transform = entity.GetShaderTransform(pass), - }; -} - std::optional> PointFieldGeometry::GetPositionBufferCPU(const ContentContext& renderer, const Entity& entity, @@ -127,9 +100,7 @@ PointFieldGeometry::GetPositionBufferCPU(const ContentContext& renderer, GeometryResult PointFieldGeometry::GetPositionBufferGPU( const ContentContext& renderer, const Entity& entity, - RenderPass& pass, - std::optional texture_coverage, - std::optional effect_transform) const { + RenderPass& pass) const { FML_DCHECK(renderer.GetDeviceCapabilities().SupportsCompute()); if (radius_ < 0.0) { return {}; @@ -186,33 +157,6 @@ GeometryResult PointFieldGeometry::GetPositionBufferGPU( output = geometry_buffer; } - if (texture_coverage.has_value() && effect_transform.has_value()) { - BufferView geometry_uv_buffer = host_buffer.Emplace( - nullptr, total * sizeof(Vector4), - std::max(DefaultUniformAlignment(), alignof(Vector4))); - - using UV = UvComputeShader; - - compute_pass->AddBufferMemoryBarrier(); - compute_pass->SetCommandLabel("UV Geometry"); - compute_pass->SetPipeline(renderer.GetUvComputePipeline()); - - UV::FrameInfo frame_info; - frame_info.count = total; - frame_info.effect_transform = effect_transform.value(); - frame_info.texture_origin = {0, 0}; - frame_info.texture_size = Vector2(texture_coverage.value().GetSize()); - - UV::BindFrameInfo(*compute_pass, host_buffer.EmplaceUniform(frame_info)); - UV::BindGeometryData(*compute_pass, geometry_buffer); - UV::BindGeometryUVData(*compute_pass, geometry_uv_buffer); - - if (!compute_pass->Compute(ISize(total, 1)).ok()) { - return {}; - } - output = geometry_uv_buffer; - } - if (!compute_pass->EncodeCommands()) { return {}; } diff --git a/impeller/entity/geometry/point_field_geometry.h b/impeller/entity/geometry/point_field_geometry.h index 9d43f07cb9fbe..1c5fa1fc0212c 100644 --- a/impeller/entity/geometry/point_field_geometry.h +++ b/impeller/entity/geometry/point_field_geometry.h @@ -23,25 +23,15 @@ class PointFieldGeometry final : public Geometry { const Entity& entity, RenderPass& pass) const override; - // |Geometry| - GeometryResult GetPositionUVBuffer(Rect texture_coverage, - Matrix effect_transform, - const ContentContext& renderer, - const Entity& entity, - RenderPass& pass) const override; - // |Geometry| GeometryVertexType GetVertexType() const override; // |Geometry| std::optional GetCoverage(const Matrix& transform) const override; - GeometryResult GetPositionBufferGPU( - const ContentContext& renderer, - const Entity& entity, - RenderPass& pass, - std::optional texture_coverage = std::nullopt, - std::optional effect_transform = std::nullopt) const; + GeometryResult GetPositionBufferGPU(const ContentContext& renderer, + const Entity& entity, + RenderPass& pass) const; std::optional> GetPositionBufferCPU(const ContentContext& renderer, diff --git a/impeller/entity/geometry/rect_geometry.cc b/impeller/entity/geometry/rect_geometry.cc index 6d72efb2f235a..f4b1dff2fde04 100644 --- a/impeller/entity/geometry/rect_geometry.cc +++ b/impeller/entity/geometry/rect_geometry.cc @@ -25,16 +25,6 @@ GeometryResult RectGeometry::GetPositionBuffer(const ContentContext& renderer, }; } -// |Geometry| -GeometryResult RectGeometry::GetPositionUVBuffer(Rect texture_coverage, - Matrix effect_transform, - const ContentContext& renderer, - const Entity& entity, - RenderPass& pass) const { - return ComputeUVGeometryForRect(rect_, texture_coverage, effect_transform, - renderer, entity, pass); -} - GeometryVertexType RectGeometry::GetVertexType() const { return GeometryVertexType::kPosition; } diff --git a/impeller/entity/geometry/rect_geometry.h b/impeller/entity/geometry/rect_geometry.h index bed8c23d6c419..57ff2fd0152a6 100644 --- a/impeller/entity/geometry/rect_geometry.h +++ b/impeller/entity/geometry/rect_geometry.h @@ -32,13 +32,6 @@ class RectGeometry final : public Geometry { // |Geometry| std::optional GetCoverage(const Matrix& transform) const override; - // |Geometry| - GeometryResult GetPositionUVBuffer(Rect texture_coverage, - Matrix effect_transform, - const ContentContext& renderer, - const Entity& entity, - RenderPass& pass) const override; - private: Rect rect_; diff --git a/impeller/entity/geometry/round_rect_geometry.cc b/impeller/entity/geometry/round_rect_geometry.cc index edcf12074afe6..ae95d728d8b90 100644 --- a/impeller/entity/geometry/round_rect_geometry.cc +++ b/impeller/entity/geometry/round_rect_geometry.cc @@ -19,21 +19,6 @@ GeometryResult RoundRectGeometry::GetPositionBuffer( entity, pass); } -// |Geometry| -GeometryResult RoundRectGeometry::GetPositionUVBuffer( - Rect texture_coverage, - Matrix effect_transform, - const ContentContext& renderer, - const Entity& entity, - RenderPass& pass) const { - return ComputePositionUVGeometry( - renderer, - renderer.GetTessellator()->FilledRoundRect(entity.GetTransform(), bounds_, - radii_), - texture_coverage.GetNormalizingTransform() * effect_transform, entity, - pass); -} - GeometryVertexType RoundRectGeometry::GetVertexType() const { return GeometryVertexType::kPosition; } diff --git a/impeller/entity/geometry/round_rect_geometry.h b/impeller/entity/geometry/round_rect_geometry.h index 78f0523a20f1f..ee55bdc258ea0 100644 --- a/impeller/entity/geometry/round_rect_geometry.h +++ b/impeller/entity/geometry/round_rect_geometry.h @@ -37,13 +37,6 @@ class RoundRectGeometry final : public Geometry { // |Geometry| std::optional GetCoverage(const Matrix& transform) const override; - // |Geometry| - GeometryResult GetPositionUVBuffer(Rect texture_coverage, - Matrix effect_transform, - const ContentContext& renderer, - const Entity& entity, - RenderPass& pass) const override; - const Rect bounds_; const Size radii_; diff --git a/impeller/entity/geometry/stroke_path_geometry.cc b/impeller/entity/geometry/stroke_path_geometry.cc index 49f8ee92d0a07..f6eb60fe2b100 100644 --- a/impeller/entity/geometry/stroke_path_geometry.cc +++ b/impeller/entity/geometry/stroke_path_geometry.cc @@ -7,7 +7,6 @@ #include "impeller/core/buffer_view.h" #include "impeller/core/formats.h" #include "impeller/entity/geometry/geometry.h" -#include "impeller/entity/texture_fill.vert.h" #include "impeller/geometry/path_builder.h" #include "impeller/geometry/path_component.h" @@ -45,49 +44,6 @@ class PositionWriter { std::vector data_ = {}; }; -class PositionUVWriter { - public: - PositionUVWriter(const Point& texture_origin, - const Size& texture_size, - const Matrix& effect_transform) - : texture_origin_(texture_origin), - texture_size_(texture_size), - effect_transform_(effect_transform) {} - - const std::vector& GetData() { - if (effect_transform_.IsIdentity()) { - auto origin = texture_origin_; - auto scale = 1.0 / texture_size_; - - for (auto& pvd : data_) { - pvd.texture_coords = (pvd.position - origin) * scale; - } - } else { - auto texture_rect = Rect::MakeOriginSize(texture_origin_, texture_size_); - Matrix uv_transform = - texture_rect.GetNormalizingTransform() * effect_transform_; - - for (auto& pvd : data_) { - pvd.texture_coords = uv_transform * pvd.position; - } - } - return data_; - } - - void AppendVertex(const Point& point) { - data_.emplace_back(TextureFillVertexShader::PerVertexData{ - .position = point, - // .texture_coords = default, will be filled in during |GetData()| - }); - } - - private: - std::vector data_ = {}; - const Point texture_origin_; - const Size texture_size_; - const Matrix effect_transform_; -}; - template class StrokeGenerator { public: @@ -525,27 +481,6 @@ StrokePathGeometry::GenerateSolidStrokeVertices(const Path::Polyline& polyline, return vtx_builder.GetData(); } -std::vector -StrokePathGeometry::GenerateSolidStrokeVerticesUV( - const Path::Polyline& polyline, - Scalar stroke_width, - Scalar miter_limit, - Join stroke_join, - Cap stroke_cap, - Scalar scale, - Point texture_origin, - Size texture_size, - const Matrix& effect_transform) { - auto scaled_miter_limit = stroke_width * miter_limit * 0.5f; - auto join_proc = GetJoinProc(stroke_join); - auto cap_proc = GetCapProc(stroke_cap); - StrokeGenerator stroke_generator(polyline, stroke_width, scaled_miter_limit, - join_proc, cap_proc, scale); - PositionUVWriter vtx_builder(texture_origin, texture_size, effect_transform); - stroke_generator.Generate(vtx_builder); - return vtx_builder.GetData(); -} - StrokePathGeometry::StrokePathGeometry(const Path& path, Scalar stroke_width, Scalar miter_limit, @@ -619,52 +554,6 @@ GeometryResult StrokePathGeometry::GetPositionBuffer( }; } -GeometryResult StrokePathGeometry::GetPositionUVBuffer( - Rect texture_coverage, - Matrix effect_transform, - const ContentContext& renderer, - const Entity& entity, - RenderPass& pass) const { - if (stroke_width_ < 0.0) { - return {}; - } - auto determinant = entity.GetTransform().GetDeterminant(); - if (determinant == 0) { - return {}; - } - - Scalar min_size = 1.0f / sqrt(std::abs(determinant)); - Scalar stroke_width = std::max(stroke_width_, min_size); - - auto& host_buffer = renderer.GetTransientsBuffer(); - auto scale = entity.GetTransform().GetMaxBasisLength(); - auto polyline = renderer.GetTessellator()->CreateTempPolyline(path_, scale); - - PositionUVWriter writer(Point{0, 0}, texture_coverage.GetSize(), - effect_transform); - CreateSolidStrokeVertices(writer, polyline, stroke_width, - miter_limit_ * stroke_width_ * 0.5f, - GetJoinProc(stroke_join_), - GetCapProc(stroke_cap_), scale); - - BufferView buffer_view = host_buffer.Emplace( - writer.GetData().data(), - writer.GetData().size() * sizeof(TextureFillVertexShader::PerVertexData), - alignof(TextureFillVertexShader::PerVertexData)); - - return GeometryResult{ - .type = PrimitiveType::kTriangleStrip, - .vertex_buffer = - { - .vertex_buffer = buffer_view, - .vertex_count = writer.GetData().size(), - .index_type = IndexType::kNone, - }, - .transform = entity.GetShaderTransform(pass), - .mode = GeometryResult::Mode::kPreventOverdraw, - }; -} - GeometryResult::Mode StrokePathGeometry::GetResultMode() const { return GeometryResult::Mode::kPreventOverdraw; } diff --git a/impeller/entity/geometry/stroke_path_geometry.h b/impeller/entity/geometry/stroke_path_geometry.h index 254bcc0a03e0e..1772e8ada685d 100644 --- a/impeller/entity/geometry/stroke_path_geometry.h +++ b/impeller/entity/geometry/stroke_path_geometry.h @@ -34,13 +34,6 @@ class StrokePathGeometry final : public Geometry { const Entity& entity, RenderPass& pass) const override; - // |Geometry| - GeometryResult GetPositionUVBuffer(Rect texture_coverage, - Matrix effect_transform, - const ContentContext& renderer, - const Entity& entity, - RenderPass& pass) const override; - // |Geometry| GeometryResult::Mode GetResultMode() const override; @@ -59,17 +52,6 @@ class StrokePathGeometry final : public Geometry { Cap stroke_cap, Scalar scale); - static std::vector - GenerateSolidStrokeVerticesUV(const Path::Polyline& polyline, - Scalar stroke_width, - Scalar miter_limit, - Join stroke_join, - Cap stroke_cap, - Scalar scale, - Point texture_origin, - Size texture_size, - const Matrix& effect_transform); - friend class ImpellerBenchmarkAccessor; friend class ImpellerEntityUnitTestAccessor; diff --git a/impeller/entity/geometry/vertices_geometry.cc b/impeller/entity/geometry/vertices_geometry.cc index a352a212c59d5..5e6d14a6d44cd 100644 --- a/impeller/entity/geometry/vertices_geometry.cc +++ b/impeller/entity/geometry/vertices_geometry.cc @@ -187,63 +187,6 @@ GeometryResult VerticesGeometry::GetPositionColorBuffer( }; } -GeometryResult VerticesGeometry::GetPositionUVBuffer( - Rect texture_coverage, - Matrix effect_transform, - const ContentContext& renderer, - const Entity& entity, - RenderPass& pass) const { - using VS = TexturePipeline::VertexShader; - - auto index_count = indices_.size(); - auto vertex_count = vertices_.size(); - auto uv_transform = - texture_coverage.GetNormalizingTransform() * effect_transform; - auto has_texture_coordinates = HasTextureCoordinates(); - - size_t total_vtx_bytes = vertices_.size() * sizeof(VS::PerVertexData); - size_t total_idx_bytes = index_count * sizeof(uint16_t); - auto vertex_buffer = renderer.GetTransientsBuffer().Emplace( - total_vtx_bytes, alignof(VS::PerVertexData), [&](uint8_t* data) { - VS::PerVertexData* vtx_contents = - reinterpret_cast(data); - for (auto i = 0u; i < vertices_.size(); i++) { - auto vertex = vertices_[i]; - auto texture_coord = - has_texture_coordinates ? texture_coordinates_[i] : vertices_[i]; - auto uv = uv_transform * texture_coord; - // From experimentation we need to clamp these values to < 1.0 or else - // there can be flickering. - VS::PerVertexData vertex_data = { - .position = vertex, - .texture_coords = - Point(std::clamp(uv.x, 0.0f, 1.0f - kEhCloseEnough), - std::clamp(uv.y, 0.0f, 1.0f - kEhCloseEnough)), - }; - std::memcpy(vtx_contents++, &vertex_data, sizeof(VS::PerVertexData)); - } - }); - - BufferView index_buffer = {}; - if (index_count > 0) { - index_buffer = renderer.GetTransientsBuffer().Emplace( - indices_.data(), total_idx_bytes, alignof(uint16_t)); - } - - return GeometryResult{ - .type = GetPrimitiveType(), - .vertex_buffer = - { - .vertex_buffer = vertex_buffer, - .index_buffer = index_buffer, - .vertex_count = index_count > 0 ? index_count : vertex_count, - .index_type = - index_count > 0 ? IndexType::k16bit : IndexType::kNone, - }, - .transform = entity.GetShaderTransform(pass), - }; -} - GeometryResult VerticesGeometry::GetPositionUVColorBuffer( Rect texture_coverage, Matrix effect_transform, diff --git a/impeller/entity/geometry/vertices_geometry.h b/impeller/entity/geometry/vertices_geometry.h index c28b4288a1b8b..b3a11223455e2 100644 --- a/impeller/entity/geometry/vertices_geometry.h +++ b/impeller/entity/geometry/vertices_geometry.h @@ -37,13 +37,6 @@ class VerticesGeometry final : public Geometry { const Entity& entity, RenderPass& pass) const; - // |Geometry| - GeometryResult GetPositionUVBuffer(Rect texture_coverage, - Matrix effect_transform, - const ContentContext& renderer, - const Entity& entity, - RenderPass& pass) const override; - // |Geometry| GeometryResult GetPositionBuffer(const ContentContext& renderer, const Entity& entity, diff --git a/impeller/entity/shaders/geometry/uv.comp b/impeller/entity/shaders/geometry/uv.comp deleted file mode 100644 index de4aacc18963b..0000000000000 --- a/impeller/entity/shaders/geometry/uv.comp +++ /dev/null @@ -1,60 +0,0 @@ -// Copyright 2013 The Flutter Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include -#include - -// Unused, see See PointFieldGeometry::GetPositionBuffer -layout(local_size_x = 16) in; - -layout(std430) readonly buffer GeometryData { - // Size of this input data is frame_info.count; - vec2 points[]; -} -geometry_data; - -layout(std430) writeonly buffer GeometryUVData { - // Size of this output data is frame_info.count; - // x,y is the original geometry. - // u,v is the texture UV. - vec4 points_uv[]; -} -geometry_uv_data; - -uniform FrameInfo { - uint count; - mat4 effect_transform; - vec2 texture_origin; - vec2 texture_size; -} -frame_info; - -vec2 project_point(mat4 m, vec2 v) { - float w = v.x * m[0][3] + v.y * m[1][3] + m[3][3]; - vec2 result = vec2(v.x * m[0][0] + v.y * m[1][0] + m[3][0], - v.x * m[0][1] + v.y * m[1][1] + m[3][1]); - - // This is Skia's behavior, but it may be reasonable to allow UB for the w=0 - // case. - if (w != 0) { - w = 1 / w; - } - return result * w; -} - -void main() { - uint ident = gl_GlobalInvocationID.x; - if (ident >= frame_info.count) { - return; - } - - vec2 point = geometry_data.points[ident]; - - vec2 coverage_coords = - (point - frame_info.texture_origin) / frame_info.texture_size; - vec2 texture_coords = - project_point(frame_info.effect_transform, coverage_coords); - - geometry_uv_data.points_uv[ident] = vec4(point, texture_coords); -} diff --git a/impeller/entity/shaders/texture_uv_fill.vert b/impeller/entity/shaders/texture_uv_fill.vert new file mode 100644 index 0000000000000..11e91d833c7bf --- /dev/null +++ b/impeller/entity/shaders/texture_uv_fill.vert @@ -0,0 +1,26 @@ +// Copyright 2013 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include +#include + +// A shader that computes texture UVs from a normalizing transform. +uniform FrameInfo { + mat4 mvp; + // A normlizing transform created from the texture bounds and effect transform + mat4 uv_transform; + float texture_sampler_y_coord_scale; +} +frame_info; + +in vec2 position; + +out vec2 v_texture_coords; + +void main() { + gl_Position = frame_info.mvp * vec4(position, 0.0, 1.0); + vec2 texture_coords = (frame_info.uv_transform * vec4(position, 0.0, 1.0)).xy; + v_texture_coords = + IPRemapCoords(texture_coords, frame_info.texture_sampler_y_coord_scale); +} diff --git a/impeller/entity/shaders/tiled_texture_fill.frag b/impeller/entity/shaders/tiled_texture_fill.frag index 747bb646dac3d..25b2af3526ecf 100644 --- a/impeller/entity/shaders/tiled_texture_fill.frag +++ b/impeller/entity/shaders/tiled_texture_fill.frag @@ -7,6 +7,8 @@ precision mediump float; #include #include +layout(constant_id = 0) const float supports_decal = 1.0; + uniform f16sampler2D texture_sampler; uniform FragInfo { @@ -21,11 +23,18 @@ in highp vec2 v_texture_coords; out f16vec4 frag_color; void main() { - frag_color = - IPHalfSampleWithTileMode(texture_sampler, // sampler - v_texture_coords, // texture coordinates - float16_t(frag_info.x_tile_mode), // x tile mode - float16_t(frag_info.y_tile_mode) // y tile mode - ) * - float16_t(frag_info.alpha); + if (supports_decal == 1.0) { + frag_color = texture(texture_sampler, // sampler + v_texture_coords, // texture coordinates + float16_t(kDefaultMipBias)) * + float16_t(frag_info.alpha); + } else { + frag_color = IPHalfSampleWithTileMode( + texture_sampler, // sampler + v_texture_coords, // texture coordinates + float16_t(frag_info.x_tile_mode), // x tile mode + float16_t(frag_info.y_tile_mode) // y tile mode + ) * + float16_t(frag_info.alpha); + } } diff --git a/impeller/geometry/geometry_benchmarks.cc b/impeller/geometry/geometry_benchmarks.cc index 3ea82c5ba1970..e119a01b4296e 100644 --- a/impeller/geometry/geometry_benchmarks.cc +++ b/impeller/geometry/geometry_benchmarks.cc @@ -5,7 +5,6 @@ #include "flutter/benchmarking/benchmarking.h" #include "flutter/impeller/entity/solid_fill.vert.h" -#include "flutter/impeller/entity/texture_fill.vert.h" #include "impeller/entity/geometry/stroke_path_geometry.h" #include "impeller/geometry/path.h" @@ -26,21 +25,6 @@ class ImpellerBenchmarkAccessor { return StrokePathGeometry::GenerateSolidStrokeVertices( polyline, stroke_width, miter_limit, stroke_join, stroke_cap, scale); } - - static std::vector - GenerateSolidStrokeVerticesUV(const Path::Polyline& polyline, - Scalar stroke_width, - Scalar miter_limit, - Join stroke_join, - Cap stroke_cap, - Scalar scale, - Point texture_origin, - Size texture_size, - const Matrix& effect_transform) { - return StrokePathGeometry::GenerateSolidStrokeVerticesUV( - polyline, stroke_width, miter_limit, stroke_join, stroke_cap, scale, - texture_origin, texture_size, effect_transform); - } }; namespace { @@ -80,28 +64,16 @@ static void BM_Polyline(benchmark::State& state, Args&&... args) { state.counters["TotalPointCount"] = point_count; } -enum class UVMode { - kNoUV, - kUVRect, - kUVRectTx, -}; - template static void BM_StrokePolyline(benchmark::State& state, Args&&... args) { auto args_tuple = std::make_tuple(std::move(args)...); auto path = std::get(args_tuple); auto cap = std::get(args_tuple); auto join = std::get(args_tuple); - auto generate_uv = std::get(args_tuple); const Scalar stroke_width = 5.0f; const Scalar miter_limit = 10.0f; const Scalar scale = 1.0f; - const Point texture_origin = Point(0, 0); - const Size texture_size = Size(100, 100); - const Matrix effect_transform = (generate_uv == UVMode::kUVRectTx) - ? Matrix::MakeScale({2.0f, 2.0f, 1.0f}) - : Matrix(); auto points = std::make_unique>(); points->reserve(2048); @@ -114,16 +86,9 @@ static void BM_StrokePolyline(benchmark::State& state, Args&&... args) { size_t point_count = 0u; size_t single_point_count = 0u; while (state.KeepRunning()) { - if (generate_uv == UVMode::kNoUV) { - auto vertices = ImpellerBenchmarkAccessor::GenerateSolidStrokeVertices( - polyline, stroke_width, miter_limit, join, cap, scale); - single_point_count = vertices.size(); - } else { - auto vertices = ImpellerBenchmarkAccessor::GenerateSolidStrokeVerticesUV( - polyline, stroke_width, miter_limit, join, cap, scale, // - texture_origin, texture_size, effect_transform); - single_point_count = vertices.size(); - } + auto vertices = ImpellerBenchmarkAccessor::GenerateSolidStrokeVertices( + polyline, stroke_width, miter_limit, join, cap, scale); + single_point_count = vertices.size(); point_count += single_point_count; } state.counters["SinglePointCount"] = single_point_count; @@ -152,7 +117,7 @@ static void BM_Convex(benchmark::State& state, Args&&... args) { #define MAKE_STROKE_BENCHMARK_CAPTURE(path, cap, join, closed, uvname, uvtype) \ BENCHMARK_CAPTURE(BM_StrokePolyline, stroke_##path##_##cap##_##join##uvname, \ - Create##path(closed), Cap::k##cap, Join::k##join, uvtype) + Create##path(closed), Cap::k##cap, Join::k##join) #define MAKE_STROKE_BENCHMARK_CAPTURE_CAPS_JOINS(path, uvname, uvtype) \ MAKE_STROKE_BENCHMARK_CAPTURE(path, Butt, Bevel, false, uvname, uvtype); \ @@ -161,29 +126,20 @@ static void BM_Convex(benchmark::State& state, Args&&... args) { MAKE_STROKE_BENCHMARK_CAPTURE(path, Square, Bevel, false, uvname, uvtype); \ MAKE_STROKE_BENCHMARK_CAPTURE(path, Round, Bevel, false, uvname, uvtype) -#define MAKE_STROKE_BENCHMARK_CAPTURE_UVS(path) \ - MAKE_STROKE_BENCHMARK_CAPTURE_CAPS_JOINS(path, , UVMode::kNoUV); \ - MAKE_STROKE_BENCHMARK_CAPTURE_CAPS_JOINS(path, _uv, UVMode::kUVRectTx); \ - MAKE_STROKE_BENCHMARK_CAPTURE_CAPS_JOINS(path, _uvNoTx, UVMode::kUVRect) - BENCHMARK_CAPTURE(BM_Polyline, cubic_polyline, CreateCubic(true), false); BENCHMARK_CAPTURE(BM_Polyline, unclosed_cubic_polyline, CreateCubic(false), false); -MAKE_STROKE_BENCHMARK_CAPTURE_UVS(Cubic); BENCHMARK_CAPTURE(BM_Polyline, quad_polyline, CreateQuadratic(true), false); BENCHMARK_CAPTURE(BM_Polyline, unclosed_quad_polyline, CreateQuadratic(false), false); -MAKE_STROKE_BENCHMARK_CAPTURE_UVS(Quadratic); BENCHMARK_CAPTURE(BM_Convex, rrect_convex, CreateRRect(), true); -MAKE_STROKE_BENCHMARK_CAPTURE(RRect, Butt, Bevel, , , UVMode::kNoUV); -MAKE_STROKE_BENCHMARK_CAPTURE(RRect, Butt, Bevel, , _uv, UVMode::kUVRectTx); -MAKE_STROKE_BENCHMARK_CAPTURE(RRect, Butt, Bevel, , _uvNoTx, UVMode::kUVRect); +MAKE_STROKE_BENCHMARK_CAPTURE(RRect, Butt, Bevel, , , ); namespace { diff --git a/impeller/geometry/path_component.cc b/impeller/geometry/path_component.cc index 3751ba1726a79..11f7da4ed736e 100644 --- a/impeller/geometry/path_component.cc +++ b/impeller/geometry/path_component.cc @@ -11,9 +11,8 @@ namespace impeller { VertexWriter::VertexWriter(std::vector& points, - std::vector& indices, - std::optional uv_transform) - : points_(points), indices_(indices), uv_transform_(uv_transform) {} + std::vector& indices) + : points_(points), indices_(indices) {} void VertexWriter::EndContour() { if (points_.size() == 0u || contour_start_ == points_.size() - 1) { @@ -66,9 +65,6 @@ void VertexWriter::EndContour() { void VertexWriter::Write(Point point) { points_.emplace_back(point); - if (uv_transform_.has_value()) { - points_.emplace_back(*uv_transform_ * point); - } } /* diff --git a/impeller/geometry/path_component.h b/impeller/geometry/path_component.h index 5e5e2106b7682..ff7f15ae121fa 100644 --- a/impeller/geometry/path_component.h +++ b/impeller/geometry/path_component.h @@ -21,8 +21,7 @@ namespace impeller { class VertexWriter { public: explicit VertexWriter(std::vector& points, - std::vector& indices, - std::optional uv_transform); + std::vector& indices); ~VertexWriter() = default; @@ -35,7 +34,6 @@ class VertexWriter { size_t contour_start_ = 0u; std::vector& points_; std::vector& indices_; - std::optional uv_transform_; }; struct LinearPathComponent { diff --git a/impeller/tessellator/tessellator.cc b/impeller/tessellator/tessellator.cc index ac63c66078fb9..4fba4a71f9d38 100644 --- a/impeller/tessellator/tessellator.cc +++ b/impeller/tessellator/tessellator.cc @@ -33,12 +33,10 @@ Path::Polyline Tessellator::CreateTempPolyline(const Path& path, VertexBuffer Tessellator::TessellateConvex(const Path& path, HostBuffer& host_buffer, - Scalar tolerance, - std::optional uv_transform) { + Scalar tolerance) { FML_DCHECK(point_buffer_); FML_DCHECK(index_buffer_); - TessellateConvexInternal(path, *point_buffer_, *index_buffer_, tolerance, - uv_transform); + TessellateConvexInternal(path, *point_buffer_, *index_buffer_, tolerance); if (point_buffer_->empty()) { return VertexBuffer{ @@ -68,12 +66,11 @@ VertexBuffer Tessellator::TessellateConvex(const Path& path, void Tessellator::TessellateConvexInternal(const Path& path, std::vector& point_buffer, std::vector& index_buffer, - Scalar tolerance, - std::optional uv_transform) { + Scalar tolerance) { index_buffer_->clear(); point_buffer_->clear(); - VertexWriter writer(point_buffer, index_buffer, uv_transform); + VertexWriter writer(point_buffer, index_buffer); path.WritePolyline(tolerance, writer); writer.EndContour(); diff --git a/impeller/tessellator/tessellator.h b/impeller/tessellator/tessellator.h index 013bf4dff044b..1b95336c9afc6 100644 --- a/impeller/tessellator/tessellator.h +++ b/impeller/tessellator/tessellator.h @@ -174,26 +174,20 @@ class Tessellator { /// path for rendering. /// @param[in] host_buffer The host buffer for allocation of vertices/index /// data. - /// @param[in] uv_transform If provided, then uvs are also generated into the - /// point buffer. Defaults to std::nullopt. /// /// @return A vertex buffer containing all data from the provided curve. - VertexBuffer TessellateConvex( - const Path& path, - HostBuffer& host_buffer, - Scalar tolerance, - std::optional uv_transform = std::nullopt); + VertexBuffer TessellateConvex(const Path& path, + HostBuffer& host_buffer, + Scalar tolerance); /// Visible for testing. /// /// This method only exists for the ease of benchmarking without using the /// real allocator needed by the [host_buffer]. - void TessellateConvexInternal( - const Path& path, - std::vector& point_buffer, - std::vector& index_buffer, - Scalar tolerance, - std::optional uv_transform = std::nullopt); + void TessellateConvexInternal(const Path& path, + std::vector& point_buffer, + std::vector& index_buffer, + Scalar tolerance); //---------------------------------------------------------------------------- /// @brief Create a temporary polyline. Only one per-process can exist at diff --git a/impeller/tools/malioc.json b/impeller/tools/malioc.json index a0e3a966be0aa..3f5ff33f9a5b2 100644 --- a/impeller/tools/malioc.json +++ b/impeller/tools/malioc.json @@ -5710,12 +5710,169 @@ } } }, + "flutter/impeller/entity/gles/texture_uv_fill.vert.gles": { + "Mali-G78": { + "core": "Mali-G78", + "filename": "flutter/impeller/entity/gles/texture_uv_fill.vert.gles", + "has_uniform_computation": true, + "type": "Vertex", + "variants": { + "Position": { + "fp16_arithmetic": 0, + "has_stack_spilling": false, + "performance": { + "longest_path_bound_pipelines": [ + "load_store" + ], + "longest_path_cycles": [ + 0.140625, + 0.140625, + 0.0, + 0.0, + 2.0, + 0.0 + ], + "pipelines": [ + "arith_total", + "arith_fma", + "arith_cvt", + "arith_sfu", + "load_store", + "texture" + ], + "shortest_path_bound_pipelines": [ + "load_store" + ], + "shortest_path_cycles": [ + 0.140625, + 0.140625, + 0.0, + 0.0, + 2.0, + 0.0 + ], + "total_bound_pipelines": [ + "load_store" + ], + "total_cycles": [ + 0.140625, + 0.140625, + 0.0, + 0.0, + 2.0, + 0.0 + ] + }, + "stack_spill_bytes": 0, + "thread_occupancy": 100, + "uniform_registers_used": 28, + "work_registers_used": 32 + }, + "Varying": { + "fp16_arithmetic": 0, + "has_stack_spilling": false, + "performance": { + "longest_path_bound_pipelines": [ + "load_store" + ], + "longest_path_cycles": [ + 0.078125, + 0.078125, + 0.015625, + 0.0, + 3.0, + 0.0 + ], + "pipelines": [ + "arith_total", + "arith_fma", + "arith_cvt", + "arith_sfu", + "load_store", + "texture" + ], + "shortest_path_bound_pipelines": [ + "load_store" + ], + "shortest_path_cycles": [ + 0.078125, + 0.078125, + 0.015625, + 0.0, + 3.0, + 0.0 + ], + "total_bound_pipelines": [ + "load_store" + ], + "total_cycles": [ + 0.078125, + 0.078125, + 0.015625, + 0.0, + 3.0, + 0.0 + ] + }, + "stack_spill_bytes": 0, + "thread_occupancy": 100, + "uniform_registers_used": 16, + "work_registers_used": 9 + } + } + }, + "Mali-T880": { + "core": "Mali-T880", + "filename": "flutter/impeller/entity/gles/texture_uv_fill.vert.gles", + "has_uniform_computation": false, + "type": "Vertex", + "variants": { + "Main": { + "has_stack_spilling": false, + "performance": { + "longest_path_bound_pipelines": [ + "load_store" + ], + "longest_path_cycles": [ + 3.299999952316284, + 4.0, + 0.0 + ], + "pipelines": [ + "arithmetic", + "load_store", + "texture" + ], + "shortest_path_bound_pipelines": [ + "load_store" + ], + "shortest_path_cycles": [ + 3.299999952316284, + 4.0, + 0.0 + ], + "total_bound_pipelines": [ + "load_store" + ], + "total_cycles": [ + 3.3333332538604736, + 4.0, + 0.0 + ] + }, + "thread_occupancy": 100, + "uniform_registers_used": 7, + "work_registers_used": 3 + } + } + } + }, "flutter/impeller/entity/gles/tiled_texture_fill.frag.gles": { "Mali-G78": { "core": "Mali-G78", "filename": "flutter/impeller/entity/gles/tiled_texture_fill.frag.gles", "has_side_effects": false, - "has_uniform_computation": true, + "has_uniform_computation": false, "modifies_coverage": false, "reads_color_buffer": false, "type": "Fragment", @@ -5723,17 +5880,17 @@ "uses_late_zs_update": false, "variants": { "Main": { - "fp16_arithmetic": 33, + "fp16_arithmetic": 100, "has_stack_spilling": false, "performance": { "longest_path_bound_pipelines": [ - "arith_total", - "arith_cvt" + "varying", + "texture" ], "longest_path_cycles": [ - 0.265625, + 0.046875, 0.03125, - 0.265625, + 0.046875, 0.0, 0.0, 0.25, @@ -5753,22 +5910,22 @@ "texture" ], "shortest_path_cycles": [ - 0.0625, 0.03125, - 0.0625, + 0.03125, + 0.015625, 0.0, 0.0, 0.25, 0.25 ], "total_bound_pipelines": [ - "arith_total", - "arith_cvt" + "varying", + "texture" ], "total_cycles": [ - 0.265625, + 0.046875, 0.03125, - 0.265625, + 0.046875, 0.0, 0.0, 0.25, @@ -5792,10 +5949,12 @@ "has_stack_spilling": false, "performance": { "longest_path_bound_pipelines": [ - "arithmetic" + "arithmetic", + "load_store", + "texture" ], "longest_path_cycles": [ - 3.299999952316284, + 1.0, 1.0, 1.0 ], @@ -5805,18 +5964,21 @@ "texture" ], "shortest_path_bound_pipelines": [ - "arithmetic" + "arithmetic", + "load_store", + "texture" ], "shortest_path_cycles": [ - 1.3200000524520874, 1.0, - 0.0 + 1.0, + 1.0 ], "total_bound_pipelines": [ - "arithmetic" + "load_store", + "texture" ], "total_cycles": [ - 3.6666667461395264, + 0.6666666865348816, 1.0, 1.0 ] @@ -8651,36 +8813,27 @@ } } }, - "flutter/impeller/entity/tiled_texture_fill.frag.vkspv": { + "flutter/impeller/entity/texture_uv_fill.vert.vkspv": { "Mali-G78": { "core": "Mali-G78", - "filename": "flutter/impeller/entity/tiled_texture_fill.frag.vkspv", - "has_side_effects": false, + "filename": "flutter/impeller/entity/texture_uv_fill.vert.vkspv", "has_uniform_computation": true, - "modifies_coverage": false, - "reads_color_buffer": false, - "type": "Fragment", - "uses_late_zs_test": false, - "uses_late_zs_update": false, + "type": "Vertex", "variants": { - "Main": { - "fp16_arithmetic": 33, + "Position": { + "fp16_arithmetic": 0, "has_stack_spilling": false, "performance": { "longest_path_bound_pipelines": [ - "arith_total", - "arith_cvt", - "varying", - "texture" + "load_store" ], "longest_path_cycles": [ - 0.25, - 0.03125, - 0.25, - 0.0625, + 0.125, + 0.125, 0.0, - 0.25, - 0.25 + 0.0, + 2.0, + 0.0 ], "pipelines": [ "arith_total", @@ -8688,49 +8841,94 @@ "arith_cvt", "arith_sfu", "load_store", - "varying", "texture" ], "shortest_path_bound_pipelines": [ - "varying" + "load_store" ], "shortest_path_cycles": [ - 0.140625, - 0.03125, - 0.140625, - 0.0625, + 0.125, + 0.125, 0.0, - 0.25, + 0.0, + 2.0, 0.0 ], "total_bound_pipelines": [ + "load_store" + ], + "total_cycles": [ + 0.125, + 0.125, + 0.0, + 0.0, + 2.0, + 0.0 + ] + }, + "stack_spill_bytes": 0, + "thread_occupancy": 100, + "uniform_registers_used": 40, + "work_registers_used": 32 + }, + "Varying": { + "fp16_arithmetic": 0, + "has_stack_spilling": false, + "performance": { + "longest_path_bound_pipelines": [ + "load_store" + ], + "longest_path_cycles": [ + 0.078125, + 0.078125, + 0.015625, + 0.0, + 3.0, + 0.0 + ], + "pipelines": [ "arith_total", + "arith_fma", "arith_cvt", - "varying", + "arith_sfu", + "load_store", "texture" ], + "shortest_path_bound_pipelines": [ + "load_store" + ], + "shortest_path_cycles": [ + 0.078125, + 0.078125, + 0.015625, + 0.0, + 3.0, + 0.0 + ], + "total_bound_pipelines": [ + "load_store" + ], "total_cycles": [ - 0.25, - 0.03125, - 0.25, - 0.0625, + 0.078125, + 0.078125, + 0.015625, 0.0, - 0.25, - 0.25 + 3.0, + 0.0 ] }, "stack_spill_bytes": 0, "thread_occupancy": 100, - "uniform_registers_used": 4, - "work_registers_used": 7 + "uniform_registers_used": 32, + "work_registers_used": 9 } } } }, - "flutter/impeller/entity/tiled_texture_fill_external.frag.vkspv": { + "flutter/impeller/entity/tiled_texture_fill.frag.vkspv": { "Mali-G78": { "core": "Mali-G78", - "filename": "flutter/impeller/entity/tiled_texture_fill_external.frag.vkspv", + "filename": "flutter/impeller/entity/tiled_texture_fill.frag.vkspv", "has_side_effects": false, "has_uniform_computation": true, "modifies_coverage": false, @@ -8744,16 +8942,16 @@ "has_stack_spilling": false, "performance": { "longest_path_bound_pipelines": [ - "arith_total", - "arith_cvt" + "varying", + "texture" ], "longest_path_cycles": [ - 0.328125, - 0.1875, - 0.328125, + 0.03125, + 0.03125, + 0.015625, 0.0, 0.0, - 0.125, + 0.25, 0.25 ], "pipelines": [ @@ -8766,60 +8964,68 @@ "texture" ], "shortest_path_bound_pipelines": [ - "varying" + "varying", + "texture" ], "shortest_path_cycles": [ - 0.109375, 0.03125, - 0.109375, + 0.03125, + 0.015625, 0.0, 0.0, - 0.125, - 0.0 + 0.25, + 0.25 ], "total_bound_pipelines": [ - "arith_total", - "arith_cvt" + "varying", + "texture" ], "total_cycles": [ - 0.390625, - 0.21875, - 0.390625, + 0.03125, + 0.03125, + 0.015625, 0.0, 0.0, - 0.125, + 0.25, 0.25 ] }, "stack_spill_bytes": 0, "thread_occupancy": 100, - "uniform_registers_used": 6, - "work_registers_used": 6 + "uniform_registers_used": 4, + "work_registers_used": 5 } } } }, - "flutter/impeller/entity/uv.comp.vkspv": { + "flutter/impeller/entity/tiled_texture_fill_external.frag.vkspv": { "Mali-G78": { "core": "Mali-G78", - "filename": "flutter/impeller/entity/uv.comp.vkspv", + "filename": "flutter/impeller/entity/tiled_texture_fill_external.frag.vkspv", + "has_side_effects": false, "has_uniform_computation": true, - "type": "Compute", + "modifies_coverage": false, + "reads_color_buffer": false, + "type": "Fragment", + "uses_late_zs_test": false, + "uses_late_zs_update": false, "variants": { "Main": { - "fp16_arithmetic": 0, + "fp16_arithmetic": 100, "has_stack_spilling": false, "performance": { "longest_path_bound_pipelines": [ - "load_store" + "arith_total", + "arith_cvt" ], "longest_path_cycles": [ + 0.328125, 0.1875, - 0.1875, + 0.328125, + 0.0, + 0.0, 0.125, - 0.0625, - 2.0, - 0.0 + 0.25 ], "pipelines": [ "arith_total", @@ -8827,37 +9033,39 @@ "arith_cvt", "arith_sfu", "load_store", + "varying", "texture" ], "shortest_path_bound_pipelines": [ - "arith_total", - "arith_cvt" + "varying" ], "shortest_path_cycles": [ - 0.046875, - 0.0, - 0.046875, + 0.109375, + 0.03125, + 0.109375, 0.0, 0.0, + 0.125, 0.0 ], "total_bound_pipelines": [ - "load_store" + "arith_total", + "arith_cvt" ], "total_cycles": [ - 0.1875, - 0.1875, + 0.390625, + 0.21875, + 0.390625, + 0.0, + 0.0, 0.125, - 0.0625, - 2.0, - 0.0 + 0.25 ] }, - "shared_storage_used": 0, "stack_spill_bytes": 0, "thread_occupancy": 100, - "uniform_registers_used": 24, - "work_registers_used": 10 + "uniform_registers_used": 6, + "work_registers_used": 6 } } }