[Impeller] Fix DrawPaint regression (flutter/engine#37561)
This commit is contained in:
@@ -1121,6 +1121,7 @@ TEST_P(AiksTest, CanDrawPaint) {
|
||||
Paint paint;
|
||||
paint.color = Color::MediumTurquoise();
|
||||
Canvas canvas;
|
||||
canvas.Scale(Vector2(0.2, 0.2));
|
||||
canvas.DrawPaint(paint);
|
||||
ASSERT_TRUE(OpenPlaygroundHere(canvas.EndRecordingAsPicture()));
|
||||
}
|
||||
|
||||
@@ -121,8 +121,7 @@ bool ClipContents::Render(const ContentContext& renderer,
|
||||
auto allocator = renderer.GetContext()->GetResourceAllocator();
|
||||
cmd.BindVertices(geometry_result.vertex_buffer);
|
||||
|
||||
info.mvp = Matrix::MakeOrthographic(pass.GetRenderTargetSize()) *
|
||||
entity.GetTransformation();
|
||||
info.mvp = geometry_result.transform;
|
||||
VS::BindVertInfo(cmd, pass.GetTransientsBuffer().EmplaceUniform(info));
|
||||
|
||||
pass.AddCommand(std::move(cmd));
|
||||
|
||||
@@ -66,17 +66,17 @@ bool LinearGradientContents::Render(const ContentContext& renderer,
|
||||
gradient_info.half_texel = Vector2(0.5 / gradient_texture->GetSize().width,
|
||||
0.5 / gradient_texture->GetSize().height);
|
||||
|
||||
auto geometry_result =
|
||||
GetGeometry()->GetPositionBuffer(renderer, entity, pass);
|
||||
|
||||
VS::FrameInfo frame_info;
|
||||
frame_info.mvp = Matrix::MakeOrthographic(pass.GetRenderTargetSize()) *
|
||||
entity.GetTransformation();
|
||||
frame_info.mvp = geometry_result.transform;
|
||||
frame_info.matrix = GetInverseMatrix();
|
||||
|
||||
Command cmd;
|
||||
cmd.label = "LinearGradientFill";
|
||||
cmd.stencil_reference = entity.GetStencilDepth();
|
||||
|
||||
auto geometry_result =
|
||||
GetGeometry()->GetPositionBuffer(renderer, entity, pass);
|
||||
auto options = OptionsFromPassAndEntity(pass, entity);
|
||||
if (geometry_result.prevent_overdraw) {
|
||||
options.stencil_compare = CompareFunction::kEqual;
|
||||
|
||||
@@ -66,17 +66,17 @@ bool RadialGradientContents::Render(const ContentContext& renderer,
|
||||
gradient_info.half_texel = Vector2(0.5 / gradient_texture->GetSize().width,
|
||||
0.5 / gradient_texture->GetSize().height);
|
||||
|
||||
auto geometry_result =
|
||||
GetGeometry()->GetPositionBuffer(renderer, entity, pass);
|
||||
|
||||
VS::FrameInfo frame_info;
|
||||
frame_info.mvp = Matrix::MakeOrthographic(pass.GetRenderTargetSize()) *
|
||||
entity.GetTransformation();
|
||||
frame_info.mvp = geometry_result.transform;
|
||||
frame_info.matrix = GetInverseMatrix();
|
||||
|
||||
Command cmd;
|
||||
cmd.label = "RadialGradientFill";
|
||||
cmd.stencil_reference = entity.GetStencilDepth();
|
||||
|
||||
auto geometry_result =
|
||||
GetGeometry()->GetPositionBuffer(renderer, entity, pass);
|
||||
auto options = OptionsFromPassAndEntity(pass, entity);
|
||||
if (geometry_result.prevent_overdraw) {
|
||||
options.stencil_compare = CompareFunction::kEqual;
|
||||
|
||||
@@ -144,8 +144,7 @@ bool RuntimeEffectContents::Render(const ContentContext& renderer,
|
||||
///
|
||||
|
||||
VS::VertInfo frame_info;
|
||||
frame_info.mvp = Matrix::MakeOrthographic(pass.GetRenderTargetSize()) *
|
||||
entity.GetTransformation();
|
||||
frame_info.mvp = geometry_result.transform;
|
||||
VS::BindVertInfo(cmd, pass.GetTransientsBuffer().EmplaceUniform(frame_info));
|
||||
|
||||
//--------------------------------------------------------------------------
|
||||
|
||||
@@ -71,8 +71,7 @@ bool SolidColorContents::Render(const ContentContext& renderer,
|
||||
cmd.BindVertices(geometry_result.vertex_buffer);
|
||||
|
||||
VS::VertInfo vert_info;
|
||||
vert_info.mvp = Matrix::MakeOrthographic(pass.GetRenderTargetSize()) *
|
||||
entity.GetTransformation();
|
||||
vert_info.mvp = geometry_result.transform;
|
||||
VS::BindVertInfo(cmd, pass.GetTransientsBuffer().EmplaceUniform(vert_info));
|
||||
|
||||
FS::FragInfo frag_info;
|
||||
|
||||
@@ -72,16 +72,16 @@ bool SweepGradientContents::Render(const ContentContext& renderer,
|
||||
gradient_info.half_texel = Vector2(0.5 / gradient_texture->GetSize().width,
|
||||
0.5 / gradient_texture->GetSize().height);
|
||||
|
||||
auto geometry_result =
|
||||
GetGeometry()->GetPositionBuffer(renderer, entity, pass);
|
||||
|
||||
VS::FrameInfo frame_info;
|
||||
frame_info.mvp = Matrix::MakeOrthographic(pass.GetRenderTargetSize()) *
|
||||
entity.GetTransformation();
|
||||
frame_info.mvp = geometry_result.transform;
|
||||
frame_info.matrix = GetInverseMatrix();
|
||||
|
||||
Command cmd;
|
||||
cmd.label = "SweepGradientFill";
|
||||
cmd.stencil_reference = entity.GetStencilDepth();
|
||||
auto geometry_result =
|
||||
GetGeometry()->GetPositionBuffer(renderer, entity, pass);
|
||||
|
||||
auto options = OptionsFromPassAndEntity(pass, entity);
|
||||
if (geometry_result.prevent_overdraw) {
|
||||
|
||||
@@ -50,9 +50,11 @@ bool TiledTextureContents::Render(const ContentContext& renderer,
|
||||
|
||||
auto& host_buffer = pass.GetTransientsBuffer();
|
||||
|
||||
auto geometry_result =
|
||||
GetGeometry()->GetPositionBuffer(renderer, entity, pass);
|
||||
|
||||
VS::VertInfo vert_info;
|
||||
vert_info.mvp = Matrix::MakeOrthographic(pass.GetRenderTargetSize()) *
|
||||
entity.GetTransformation();
|
||||
vert_info.mvp = geometry_result.transform;
|
||||
vert_info.matrix = GetInverseMatrix();
|
||||
vert_info.texture_size = Vector2{static_cast<Scalar>(texture_size.width),
|
||||
static_cast<Scalar>(texture_size.height)};
|
||||
@@ -67,9 +69,6 @@ bool TiledTextureContents::Render(const ContentContext& renderer,
|
||||
cmd.label = "TiledTextureFill";
|
||||
cmd.stencil_reference = entity.GetStencilDepth();
|
||||
|
||||
auto geometry_result =
|
||||
GetGeometry()->GetPositionBuffer(renderer, entity, pass);
|
||||
|
||||
auto options = OptionsFromPassAndEntity(pass, entity);
|
||||
if (geometry_result.prevent_overdraw) {
|
||||
options.stencil_compare = CompareFunction::kEqual;
|
||||
|
||||
@@ -76,8 +76,7 @@ bool VerticesContents::Render(const ContentContext& renderer,
|
||||
cmd.BindVertices(geometry_result.vertex_buffer);
|
||||
|
||||
VS::VertInfo vert_info;
|
||||
vert_info.mvp = Matrix::MakeOrthographic(pass.GetRenderTargetSize()) *
|
||||
entity.GetTransformation();
|
||||
vert_info.mvp = geometry_result.transform;
|
||||
vert_info.color = color_.Premultiply();
|
||||
VS::BindVertInfo(cmd,
|
||||
pass.GetTransientsBuffer().EmplaceUniform(vert_info));
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
#include "impeller/entity/geometry.h"
|
||||
#include "impeller/entity/contents/content_context.h"
|
||||
#include "impeller/entity/position_color.vert.h"
|
||||
#include "impeller/geometry/matrix.h"
|
||||
#include "impeller/geometry/path_builder.h"
|
||||
#include "impeller/renderer/device_buffer.h"
|
||||
#include "impeller/renderer/render_pass.h"
|
||||
@@ -106,6 +107,8 @@ GeometryResult VerticesGeometry::GetPositionBuffer(
|
||||
.index_count = vertices_.GetIndices().size(),
|
||||
.index_type = IndexType::k16bit,
|
||||
},
|
||||
.transform = Matrix::MakeOrthographic(pass.GetRenderTargetSize()) *
|
||||
entity.GetTransformation(),
|
||||
.prevent_overdraw = false,
|
||||
};
|
||||
}
|
||||
@@ -168,6 +171,8 @@ GeometryResult VerticesGeometry::GetPositionColorBuffer(
|
||||
.index_count = vertices_.GetIndices().size(),
|
||||
.index_type = IndexType::k16bit,
|
||||
},
|
||||
.transform = Matrix::MakeOrthographic(pass.GetRenderTargetSize()) *
|
||||
entity.GetTransformation(),
|
||||
.prevent_overdraw = false,
|
||||
};
|
||||
}
|
||||
@@ -224,6 +229,8 @@ GeometryResult FillPathGeometry::GetPositionBuffer(
|
||||
return GeometryResult{
|
||||
.type = PrimitiveType::kTriangle,
|
||||
.vertex_buffer = vertex_buffer,
|
||||
.transform = Matrix::MakeOrthographic(pass.GetRenderTargetSize()) *
|
||||
entity.GetTransformation(),
|
||||
.prevent_overdraw = false,
|
||||
};
|
||||
}
|
||||
@@ -577,6 +584,8 @@ GeometryResult StrokePathGeometry::GetPositionBuffer(
|
||||
return GeometryResult{
|
||||
.type = PrimitiveType::kTriangleStrip,
|
||||
.vertex_buffer = vertex_buffer,
|
||||
.transform = Matrix::MakeOrthographic(pass.GetRenderTargetSize()) *
|
||||
entity.GetTransformation(),
|
||||
.prevent_overdraw = true,
|
||||
};
|
||||
}
|
||||
@@ -627,14 +636,16 @@ GeometryResult CoverGeometry::GetPositionBuffer(const ContentContext& renderer,
|
||||
auto& host_buffer = pass.GetTransientsBuffer();
|
||||
return GeometryResult{
|
||||
.type = PrimitiveType::kTriangleStrip,
|
||||
.vertex_buffer = {.vertex_buffer = host_buffer.Emplace(
|
||||
rect.GetPoints().data(), 8 * sizeof(float),
|
||||
alignof(float)),
|
||||
.index_buffer = host_buffer.Emplace(
|
||||
kRectIndicies, 4 * sizeof(uint16_t),
|
||||
alignof(uint16_t)),
|
||||
.index_count = 4,
|
||||
.index_type = IndexType::k16bit},
|
||||
.vertex_buffer =
|
||||
{
|
||||
.vertex_buffer = host_buffer.Emplace(
|
||||
rect.GetPoints().data(), 8 * sizeof(float), alignof(float)),
|
||||
.index_buffer = host_buffer.Emplace(
|
||||
kRectIndicies, 4 * sizeof(uint16_t), alignof(uint16_t)),
|
||||
.index_count = 4,
|
||||
.index_type = IndexType::k16bit,
|
||||
},
|
||||
.transform = Matrix::MakeOrthographic(pass.GetRenderTargetSize()),
|
||||
.prevent_overdraw = false,
|
||||
};
|
||||
}
|
||||
@@ -660,14 +671,17 @@ GeometryResult RectGeometry::GetPositionBuffer(const ContentContext& renderer,
|
||||
auto& host_buffer = pass.GetTransientsBuffer();
|
||||
return GeometryResult{
|
||||
.type = PrimitiveType::kTriangleStrip,
|
||||
.vertex_buffer = {.vertex_buffer = host_buffer.Emplace(
|
||||
rect_.GetPoints().data(), 8 * sizeof(float),
|
||||
alignof(float)),
|
||||
.index_buffer = host_buffer.Emplace(
|
||||
kRectIndicies, 4 * sizeof(uint16_t),
|
||||
alignof(uint16_t)),
|
||||
.index_count = 4,
|
||||
.index_type = IndexType::k16bit},
|
||||
.vertex_buffer =
|
||||
{
|
||||
.vertex_buffer = host_buffer.Emplace(
|
||||
rect_.GetPoints().data(), 8 * sizeof(float), alignof(float)),
|
||||
.index_buffer = host_buffer.Emplace(
|
||||
kRectIndicies, 4 * sizeof(uint16_t), alignof(uint16_t)),
|
||||
.index_count = 4,
|
||||
.index_type = IndexType::k16bit,
|
||||
},
|
||||
.transform = Matrix::MakeOrthographic(pass.GetRenderTargetSize()) *
|
||||
entity.GetTransformation(),
|
||||
.prevent_overdraw = false,
|
||||
};
|
||||
}
|
||||
|
||||
@@ -21,6 +21,7 @@ class Tessellator;
|
||||
struct GeometryResult {
|
||||
PrimitiveType type;
|
||||
VertexBuffer vertex_buffer;
|
||||
Matrix transform;
|
||||
bool prevent_overdraw;
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user