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

Commit d4e2188

Browse files
authored
[Impeller] Fix DrawPaint regression (#37561)
1 parent 1ae2858 commit d4e2188

11 files changed

+52
-41
lines changed

impeller/aiks/aiks_unittests.cc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1121,6 +1121,7 @@ TEST_P(AiksTest, CanDrawPaint) {
11211121
Paint paint;
11221122
paint.color = Color::MediumTurquoise();
11231123
Canvas canvas;
1124+
canvas.Scale(Vector2(0.2, 0.2));
11241125
canvas.DrawPaint(paint);
11251126
ASSERT_TRUE(OpenPlaygroundHere(canvas.EndRecordingAsPicture()));
11261127
}

impeller/entity/contents/clip_contents.cc

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -121,8 +121,7 @@ bool ClipContents::Render(const ContentContext& renderer,
121121
auto allocator = renderer.GetContext()->GetResourceAllocator();
122122
cmd.BindVertices(geometry_result.vertex_buffer);
123123

124-
info.mvp = Matrix::MakeOrthographic(pass.GetRenderTargetSize()) *
125-
entity.GetTransformation();
124+
info.mvp = geometry_result.transform;
126125
VS::BindVertInfo(cmd, pass.GetTransientsBuffer().EmplaceUniform(info));
127126

128127
pass.AddCommand(std::move(cmd));

impeller/entity/contents/linear_gradient_contents.cc

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -66,17 +66,17 @@ bool LinearGradientContents::Render(const ContentContext& renderer,
6666
gradient_info.half_texel = Vector2(0.5 / gradient_texture->GetSize().width,
6767
0.5 / gradient_texture->GetSize().height);
6868

69+
auto geometry_result =
70+
GetGeometry()->GetPositionBuffer(renderer, entity, pass);
71+
6972
VS::FrameInfo frame_info;
70-
frame_info.mvp = Matrix::MakeOrthographic(pass.GetRenderTargetSize()) *
71-
entity.GetTransformation();
73+
frame_info.mvp = geometry_result.transform;
7274
frame_info.matrix = GetInverseMatrix();
7375

7476
Command cmd;
7577
cmd.label = "LinearGradientFill";
7678
cmd.stencil_reference = entity.GetStencilDepth();
7779

78-
auto geometry_result =
79-
GetGeometry()->GetPositionBuffer(renderer, entity, pass);
8080
auto options = OptionsFromPassAndEntity(pass, entity);
8181
if (geometry_result.prevent_overdraw) {
8282
options.stencil_compare = CompareFunction::kEqual;

impeller/entity/contents/radial_gradient_contents.cc

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -66,17 +66,17 @@ bool RadialGradientContents::Render(const ContentContext& renderer,
6666
gradient_info.half_texel = Vector2(0.5 / gradient_texture->GetSize().width,
6767
0.5 / gradient_texture->GetSize().height);
6868

69+
auto geometry_result =
70+
GetGeometry()->GetPositionBuffer(renderer, entity, pass);
71+
6972
VS::FrameInfo frame_info;
70-
frame_info.mvp = Matrix::MakeOrthographic(pass.GetRenderTargetSize()) *
71-
entity.GetTransformation();
73+
frame_info.mvp = geometry_result.transform;
7274
frame_info.matrix = GetInverseMatrix();
7375

7476
Command cmd;
7577
cmd.label = "RadialGradientFill";
7678
cmd.stencil_reference = entity.GetStencilDepth();
7779

78-
auto geometry_result =
79-
GetGeometry()->GetPositionBuffer(renderer, entity, pass);
8080
auto options = OptionsFromPassAndEntity(pass, entity);
8181
if (geometry_result.prevent_overdraw) {
8282
options.stencil_compare = CompareFunction::kEqual;

impeller/entity/contents/runtime_effect_contents.cc

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -144,8 +144,7 @@ bool RuntimeEffectContents::Render(const ContentContext& renderer,
144144
///
145145

146146
VS::VertInfo frame_info;
147-
frame_info.mvp = Matrix::MakeOrthographic(pass.GetRenderTargetSize()) *
148-
entity.GetTransformation();
147+
frame_info.mvp = geometry_result.transform;
149148
VS::BindVertInfo(cmd, pass.GetTransientsBuffer().EmplaceUniform(frame_info));
150149

151150
//--------------------------------------------------------------------------

impeller/entity/contents/solid_color_contents.cc

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -71,8 +71,7 @@ bool SolidColorContents::Render(const ContentContext& renderer,
7171
cmd.BindVertices(geometry_result.vertex_buffer);
7272

7373
VS::VertInfo vert_info;
74-
vert_info.mvp = Matrix::MakeOrthographic(pass.GetRenderTargetSize()) *
75-
entity.GetTransformation();
74+
vert_info.mvp = geometry_result.transform;
7675
VS::BindVertInfo(cmd, pass.GetTransientsBuffer().EmplaceUniform(vert_info));
7776

7877
FS::FragInfo frag_info;

impeller/entity/contents/sweep_gradient_contents.cc

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -72,16 +72,16 @@ bool SweepGradientContents::Render(const ContentContext& renderer,
7272
gradient_info.half_texel = Vector2(0.5 / gradient_texture->GetSize().width,
7373
0.5 / gradient_texture->GetSize().height);
7474

75+
auto geometry_result =
76+
GetGeometry()->GetPositionBuffer(renderer, entity, pass);
77+
7578
VS::FrameInfo frame_info;
76-
frame_info.mvp = Matrix::MakeOrthographic(pass.GetRenderTargetSize()) *
77-
entity.GetTransformation();
79+
frame_info.mvp = geometry_result.transform;
7880
frame_info.matrix = GetInverseMatrix();
7981

8082
Command cmd;
8183
cmd.label = "SweepGradientFill";
8284
cmd.stencil_reference = entity.GetStencilDepth();
83-
auto geometry_result =
84-
GetGeometry()->GetPositionBuffer(renderer, entity, pass);
8585

8686
auto options = OptionsFromPassAndEntity(pass, entity);
8787
if (geometry_result.prevent_overdraw) {

impeller/entity/contents/tiled_texture_contents.cc

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -50,9 +50,11 @@ bool TiledTextureContents::Render(const ContentContext& renderer,
5050

5151
auto& host_buffer = pass.GetTransientsBuffer();
5252

53+
auto geometry_result =
54+
GetGeometry()->GetPositionBuffer(renderer, entity, pass);
55+
5356
VS::VertInfo vert_info;
54-
vert_info.mvp = Matrix::MakeOrthographic(pass.GetRenderTargetSize()) *
55-
entity.GetTransformation();
57+
vert_info.mvp = geometry_result.transform;
5658
vert_info.matrix = GetInverseMatrix();
5759
vert_info.texture_size = Vector2{static_cast<Scalar>(texture_size.width),
5860
static_cast<Scalar>(texture_size.height)};
@@ -67,9 +69,6 @@ bool TiledTextureContents::Render(const ContentContext& renderer,
6769
cmd.label = "TiledTextureFill";
6870
cmd.stencil_reference = entity.GetStencilDepth();
6971

70-
auto geometry_result =
71-
GetGeometry()->GetPositionBuffer(renderer, entity, pass);
72-
7372
auto options = OptionsFromPassAndEntity(pass, entity);
7473
if (geometry_result.prevent_overdraw) {
7574
options.stencil_compare = CompareFunction::kEqual;

impeller/entity/contents/vertices_contents.cc

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,8 +76,7 @@ bool VerticesContents::Render(const ContentContext& renderer,
7676
cmd.BindVertices(geometry_result.vertex_buffer);
7777

7878
VS::VertInfo vert_info;
79-
vert_info.mvp = Matrix::MakeOrthographic(pass.GetRenderTargetSize()) *
80-
entity.GetTransformation();
79+
vert_info.mvp = geometry_result.transform;
8180
vert_info.color = color_.Premultiply();
8281
VS::BindVertInfo(cmd,
8382
pass.GetTransientsBuffer().EmplaceUniform(vert_info));

impeller/entity/geometry.cc

Lines changed: 30 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
#include "impeller/entity/geometry.h"
66
#include "impeller/entity/contents/content_context.h"
77
#include "impeller/entity/position_color.vert.h"
8+
#include "impeller/geometry/matrix.h"
89
#include "impeller/geometry/path_builder.h"
910
#include "impeller/renderer/device_buffer.h"
1011
#include "impeller/renderer/render_pass.h"
@@ -106,6 +107,8 @@ GeometryResult VerticesGeometry::GetPositionBuffer(
106107
.index_count = vertices_.GetIndices().size(),
107108
.index_type = IndexType::k16bit,
108109
},
110+
.transform = Matrix::MakeOrthographic(pass.GetRenderTargetSize()) *
111+
entity.GetTransformation(),
109112
.prevent_overdraw = false,
110113
};
111114
}
@@ -168,6 +171,8 @@ GeometryResult VerticesGeometry::GetPositionColorBuffer(
168171
.index_count = vertices_.GetIndices().size(),
169172
.index_type = IndexType::k16bit,
170173
},
174+
.transform = Matrix::MakeOrthographic(pass.GetRenderTargetSize()) *
175+
entity.GetTransformation(),
171176
.prevent_overdraw = false,
172177
};
173178
}
@@ -224,6 +229,8 @@ GeometryResult FillPathGeometry::GetPositionBuffer(
224229
return GeometryResult{
225230
.type = PrimitiveType::kTriangle,
226231
.vertex_buffer = vertex_buffer,
232+
.transform = Matrix::MakeOrthographic(pass.GetRenderTargetSize()) *
233+
entity.GetTransformation(),
227234
.prevent_overdraw = false,
228235
};
229236
}
@@ -577,6 +584,8 @@ GeometryResult StrokePathGeometry::GetPositionBuffer(
577584
return GeometryResult{
578585
.type = PrimitiveType::kTriangleStrip,
579586
.vertex_buffer = vertex_buffer,
587+
.transform = Matrix::MakeOrthographic(pass.GetRenderTargetSize()) *
588+
entity.GetTransformation(),
580589
.prevent_overdraw = true,
581590
};
582591
}
@@ -627,14 +636,16 @@ GeometryResult CoverGeometry::GetPositionBuffer(const ContentContext& renderer,
627636
auto& host_buffer = pass.GetTransientsBuffer();
628637
return GeometryResult{
629638
.type = PrimitiveType::kTriangleStrip,
630-
.vertex_buffer = {.vertex_buffer = host_buffer.Emplace(
631-
rect.GetPoints().data(), 8 * sizeof(float),
632-
alignof(float)),
633-
.index_buffer = host_buffer.Emplace(
634-
kRectIndicies, 4 * sizeof(uint16_t),
635-
alignof(uint16_t)),
636-
.index_count = 4,
637-
.index_type = IndexType::k16bit},
639+
.vertex_buffer =
640+
{
641+
.vertex_buffer = host_buffer.Emplace(
642+
rect.GetPoints().data(), 8 * sizeof(float), alignof(float)),
643+
.index_buffer = host_buffer.Emplace(
644+
kRectIndicies, 4 * sizeof(uint16_t), alignof(uint16_t)),
645+
.index_count = 4,
646+
.index_type = IndexType::k16bit,
647+
},
648+
.transform = Matrix::MakeOrthographic(pass.GetRenderTargetSize()),
638649
.prevent_overdraw = false,
639650
};
640651
}
@@ -660,14 +671,17 @@ GeometryResult RectGeometry::GetPositionBuffer(const ContentContext& renderer,
660671
auto& host_buffer = pass.GetTransientsBuffer();
661672
return GeometryResult{
662673
.type = PrimitiveType::kTriangleStrip,
663-
.vertex_buffer = {.vertex_buffer = host_buffer.Emplace(
664-
rect_.GetPoints().data(), 8 * sizeof(float),
665-
alignof(float)),
666-
.index_buffer = host_buffer.Emplace(
667-
kRectIndicies, 4 * sizeof(uint16_t),
668-
alignof(uint16_t)),
669-
.index_count = 4,
670-
.index_type = IndexType::k16bit},
674+
.vertex_buffer =
675+
{
676+
.vertex_buffer = host_buffer.Emplace(
677+
rect_.GetPoints().data(), 8 * sizeof(float), alignof(float)),
678+
.index_buffer = host_buffer.Emplace(
679+
kRectIndicies, 4 * sizeof(uint16_t), alignof(uint16_t)),
680+
.index_count = 4,
681+
.index_type = IndexType::k16bit,
682+
},
683+
.transform = Matrix::MakeOrthographic(pass.GetRenderTargetSize()) *
684+
entity.GetTransformation(),
671685
.prevent_overdraw = false,
672686
};
673687
}

impeller/entity/geometry.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ class Tessellator;
2121
struct GeometryResult {
2222
PrimitiveType type;
2323
VertexBuffer vertex_buffer;
24+
Matrix transform;
2425
bool prevent_overdraw;
2526
};
2627

0 commit comments

Comments
 (0)