forked from firka/flutter
[Impeller] Fix transform regressions for chained filters (flutter/engine#41332)
Resolves https://github.com/flutter/flutter/issues/124956. Fixes some recent transform issues that mainly apply to chained filters (like when both a color + image filter has been set). - For all filters, the returned entity should just be an identity matrix because the snapshot transform gets fully absorbed. - For all filters, given entity's transform should be applied in the coverage proc (although this currently makes no difference because of the way coverage is queried when snapshotting). - For filters drawing with coverage + transforming UVs, the transform handed to the contents of the deferred entity needs to be applied. Otherwise the entity won't get repositioned correctly while snapshotting.
This commit is contained in:
@@ -1955,7 +1955,7 @@ TEST_P(AiksTest, TranslucentSaveLayerWithBlendColorFilterDrawsCorrectly) {
|
||||
ASSERT_TRUE(OpenPlaygroundHere(canvas.EndRecordingAsPicture()));
|
||||
}
|
||||
|
||||
TEST_P(AiksTest, TranslucentSaveLayerWithBlendImageFilterAndDrawsCorrectly) {
|
||||
TEST_P(AiksTest, TranslucentSaveLayerWithBlendImageFilterDrawsCorrectly) {
|
||||
Canvas canvas;
|
||||
|
||||
canvas.DrawRect(Rect::MakeXYWH(100, 100, 300, 300), {.color = Color::Blue()});
|
||||
@@ -1976,7 +1976,7 @@ TEST_P(AiksTest, TranslucentSaveLayerWithBlendImageFilterAndDrawsCorrectly) {
|
||||
ASSERT_TRUE(OpenPlaygroundHere(canvas.EndRecordingAsPicture()));
|
||||
}
|
||||
|
||||
TEST_P(AiksTest, TranslucentSaveLayerWithColorImageFilterAndDrawsCorrectly) {
|
||||
TEST_P(AiksTest, TranslucentSaveLayerWithColorAndImageFilterDrawsCorrectly) {
|
||||
Canvas canvas;
|
||||
|
||||
canvas.DrawRect(Rect::MakeXYWH(100, 100, 300, 300), {.color = Color::Blue()});
|
||||
@@ -2060,6 +2060,38 @@ TEST_P(AiksTest, TranslucentSaveLayerWithColorMatrixImageFilterDrawsCorrectly) {
|
||||
ASSERT_TRUE(OpenPlaygroundHere(canvas.EndRecordingAsPicture()));
|
||||
}
|
||||
|
||||
TEST_P(AiksTest,
|
||||
TranslucentSaveLayerWithColorFilterAndImageFilterDrawsCorrectly) {
|
||||
Canvas canvas;
|
||||
|
||||
auto image = std::make_shared<Image>(CreateTextureForFixture("airplane.jpg"));
|
||||
canvas.DrawImage(image, {100, 100}, {});
|
||||
|
||||
canvas.SaveLayer({
|
||||
.color = Color::Black().WithAlpha(0.5),
|
||||
.image_filter =
|
||||
[](FilterInput::Ref input, const Matrix& effect_transform,
|
||||
bool is_subpass) {
|
||||
return ColorFilterContents::MakeColorMatrix(
|
||||
{std::move(input)}, {.array = {
|
||||
1, 0, 0, 0, 0, //
|
||||
0, 1, 0, 0, 0, //
|
||||
0, 0.2, 1, 0, 0, //
|
||||
0, 0, 0, 0.5, 0 //
|
||||
}});
|
||||
},
|
||||
.color_filter =
|
||||
[](FilterInput::Ref input) {
|
||||
return ColorFilterContents::MakeBlend(
|
||||
BlendMode::kModulate, {std::move(input)}, Color::Green());
|
||||
},
|
||||
});
|
||||
canvas.DrawImage(image, {100, 500}, {});
|
||||
canvas.Restore();
|
||||
|
||||
ASSERT_TRUE(OpenPlaygroundHere(canvas.EndRecordingAsPicture()));
|
||||
}
|
||||
|
||||
/// This is a regression check for https://github.com/flutter/engine/pull/41129
|
||||
/// The entire screen is green if successful. If failing, no frames will render,
|
||||
/// or the entire screen will be transparent black.
|
||||
|
||||
@@ -304,7 +304,8 @@ std::optional<Entity> BlendFilterContents::CreateForegroundAdvancedBlend(
|
||||
auto blend_uniform = host_buffer.EmplaceUniform(blend_info);
|
||||
FS::BindBlendInfo(cmd, blend_uniform);
|
||||
|
||||
frame_info.mvp = Matrix::MakeOrthographic(pass.GetRenderTargetSize());
|
||||
frame_info.mvp = Matrix::MakeOrthographic(pass.GetRenderTargetSize()) *
|
||||
entity.GetTransformation();
|
||||
|
||||
auto uniform_view = host_buffer.EmplaceUniform(frame_info);
|
||||
VS::BindFrameInfo(cmd, uniform_view);
|
||||
@@ -313,7 +314,7 @@ std::optional<Entity> BlendFilterContents::CreateForegroundAdvancedBlend(
|
||||
};
|
||||
CoverageProc coverage_proc =
|
||||
[coverage](const Entity& entity) -> std::optional<Rect> {
|
||||
return coverage;
|
||||
return coverage.TransformBounds(entity.GetTransformation());
|
||||
};
|
||||
|
||||
auto contents = AnonymousContents::Make(render_proc, coverage_proc);
|
||||
@@ -321,7 +322,6 @@ std::optional<Entity> BlendFilterContents::CreateForegroundAdvancedBlend(
|
||||
Entity sub_entity;
|
||||
sub_entity.SetContents(std::move(contents));
|
||||
sub_entity.SetStencilDepth(entity.GetStencilDepth());
|
||||
sub_entity.SetTransformation(entity.GetTransformation());
|
||||
|
||||
return sub_entity;
|
||||
}
|
||||
@@ -442,7 +442,8 @@ std::optional<Entity> BlendFilterContents::CreateForegroundPorterDuffBlend(
|
||||
|
||||
FS::BindFragInfo(cmd, host_buffer.EmplaceUniform(frag_info));
|
||||
|
||||
frame_info.mvp = Matrix::MakeOrthographic(pass.GetRenderTargetSize());
|
||||
frame_info.mvp = Matrix::MakeOrthographic(pass.GetRenderTargetSize()) *
|
||||
entity.GetTransformation();
|
||||
|
||||
auto uniform_view = host_buffer.EmplaceUniform(frame_info);
|
||||
VS::BindFrameInfo(cmd, uniform_view);
|
||||
@@ -452,7 +453,7 @@ std::optional<Entity> BlendFilterContents::CreateForegroundPorterDuffBlend(
|
||||
|
||||
CoverageProc coverage_proc =
|
||||
[coverage](const Entity& entity) -> std::optional<Rect> {
|
||||
return coverage;
|
||||
return coverage.TransformBounds(entity.GetTransformation());
|
||||
};
|
||||
|
||||
auto contents = AnonymousContents::Make(render_proc, coverage_proc);
|
||||
@@ -460,7 +461,6 @@ std::optional<Entity> BlendFilterContents::CreateForegroundPorterDuffBlend(
|
||||
Entity sub_entity;
|
||||
sub_entity.SetContents(std::move(contents));
|
||||
sub_entity.SetStencilDepth(entity.GetStencilDepth());
|
||||
sub_entity.SetTransformation(entity.GetTransformation());
|
||||
|
||||
return sub_entity;
|
||||
}
|
||||
|
||||
@@ -115,7 +115,8 @@ std::optional<Entity> BorderMaskBlurFilterContents::RenderFilter(
|
||||
cmd.stencil_reference = entity.GetStencilDepth();
|
||||
|
||||
VS::FrameInfo frame_info;
|
||||
frame_info.mvp = Matrix::MakeOrthographic(pass.GetRenderTargetSize());
|
||||
frame_info.mvp = Matrix::MakeOrthographic(pass.GetRenderTargetSize()) *
|
||||
entity.GetTransformation();
|
||||
frame_info.texture_sampler_y_coord_scale =
|
||||
input_snapshot->texture->GetYCoordScale();
|
||||
|
||||
@@ -136,7 +137,7 @@ std::optional<Entity> BorderMaskBlurFilterContents::RenderFilter(
|
||||
|
||||
CoverageProc coverage_proc =
|
||||
[coverage](const Entity& entity) -> std::optional<Rect> {
|
||||
return coverage;
|
||||
return coverage.TransformBounds(entity.GetTransformation());
|
||||
};
|
||||
|
||||
auto contents = AnonymousContents::Make(render_proc, coverage_proc);
|
||||
@@ -144,7 +145,6 @@ std::optional<Entity> BorderMaskBlurFilterContents::RenderFilter(
|
||||
Entity sub_entity;
|
||||
sub_entity.SetContents(std::move(contents));
|
||||
sub_entity.SetStencilDepth(entity.GetStencilDepth());
|
||||
sub_entity.SetTransformation(entity.GetTransformation());
|
||||
sub_entity.SetBlendMode(entity.GetBlendMode());
|
||||
return sub_entity;
|
||||
}
|
||||
|
||||
@@ -49,7 +49,7 @@ std::optional<Entity> ColorMatrixFilterContents::RenderFilter(
|
||||
//----------------------------------------------------------------------------
|
||||
/// Create AnonymousContents for rendering.
|
||||
///
|
||||
RenderProc render_proc = [input_snapshot, color_matrix = matrix_, coverage,
|
||||
RenderProc render_proc = [input_snapshot, color_matrix = matrix_,
|
||||
absorb_opacity = GetAbsorbOpacity()](
|
||||
const ContentContext& renderer,
|
||||
const Entity& entity, RenderPass& pass) -> bool {
|
||||
@@ -60,27 +60,25 @@ std::optional<Entity> ColorMatrixFilterContents::RenderFilter(
|
||||
auto options = OptionsFromPassAndEntity(pass, entity);
|
||||
cmd.pipeline = renderer.GetColorMatrixColorFilterPipeline(options);
|
||||
|
||||
auto size = input_snapshot->texture->GetSize();
|
||||
|
||||
VertexBufferBuilder<VS::PerVertexData> vtx_builder;
|
||||
vtx_builder.AddVertices({
|
||||
{coverage.origin, Point(0, 0)},
|
||||
{{coverage.origin.x + coverage.size.width, coverage.origin.y},
|
||||
Point(1, 0)},
|
||||
{{coverage.origin.x + coverage.size.width,
|
||||
coverage.origin.y + coverage.size.height},
|
||||
Point(1, 1)},
|
||||
{coverage.origin, Point(0, 0)},
|
||||
{{coverage.origin.x + coverage.size.width,
|
||||
coverage.origin.y + coverage.size.height},
|
||||
Point(1, 1)},
|
||||
{{coverage.origin.x, coverage.origin.y + coverage.size.height},
|
||||
Point(0, 1)},
|
||||
{Point(0, 0)},
|
||||
{Point(1, 0)},
|
||||
{Point(1, 1)},
|
||||
{Point(0, 0)},
|
||||
{Point(1, 1)},
|
||||
{Point(0, 1)},
|
||||
});
|
||||
auto& host_buffer = pass.GetTransientsBuffer();
|
||||
auto vtx_buffer = vtx_builder.CreateVertexBuffer(host_buffer);
|
||||
cmd.BindVertices(vtx_buffer);
|
||||
|
||||
VS::FrameInfo frame_info;
|
||||
frame_info.mvp = Matrix::MakeOrthographic(pass.GetRenderTargetSize());
|
||||
frame_info.mvp = Matrix::MakeOrthographic(pass.GetRenderTargetSize()) *
|
||||
entity.GetTransformation() * input_snapshot->transform *
|
||||
Matrix::MakeScale(Vector2(size));
|
||||
frame_info.texture_sampler_y_coord_scale =
|
||||
input_snapshot->texture->GetYCoordScale();
|
||||
|
||||
@@ -107,7 +105,7 @@ std::optional<Entity> ColorMatrixFilterContents::RenderFilter(
|
||||
|
||||
CoverageProc coverage_proc =
|
||||
[coverage](const Entity& entity) -> std::optional<Rect> {
|
||||
return coverage;
|
||||
return coverage.TransformBounds(entity.GetTransformation());
|
||||
};
|
||||
|
||||
auto contents = AnonymousContents::Make(render_proc, coverage_proc);
|
||||
@@ -115,8 +113,6 @@ std::optional<Entity> ColorMatrixFilterContents::RenderFilter(
|
||||
Entity sub_entity;
|
||||
sub_entity.SetContents(std::move(contents));
|
||||
sub_entity.SetStencilDepth(entity.GetStencilDepth());
|
||||
sub_entity.SetTransformation(Matrix::MakeTranslation(coverage.origin) *
|
||||
entity.GetTransformation());
|
||||
sub_entity.SetBlendMode(entity.GetBlendMode());
|
||||
return sub_entity;
|
||||
}
|
||||
|
||||
@@ -36,16 +36,10 @@ std::optional<Entity> LinearToSrgbFilterContents::RenderFilter(
|
||||
return std::nullopt;
|
||||
}
|
||||
|
||||
auto maybe_input_uvs = input_snapshot->GetCoverageUVs(coverage);
|
||||
if (!maybe_input_uvs.has_value()) {
|
||||
return std::nullopt;
|
||||
}
|
||||
auto input_uvs = maybe_input_uvs.value();
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
/// Create AnonymousContents for rendering.
|
||||
///
|
||||
RenderProc render_proc = [input_snapshot, coverage, input_uvs,
|
||||
RenderProc render_proc = [input_snapshot,
|
||||
absorb_opacity = GetAbsorbOpacity()](
|
||||
const ContentContext& renderer,
|
||||
const Entity& entity, RenderPass& pass) -> bool {
|
||||
@@ -56,20 +50,16 @@ std::optional<Entity> LinearToSrgbFilterContents::RenderFilter(
|
||||
auto options = OptionsFromPassAndEntity(pass, entity);
|
||||
cmd.pipeline = renderer.GetLinearToSrgbFilterPipeline(options);
|
||||
|
||||
auto size = input_snapshot->texture->GetSize();
|
||||
|
||||
VertexBufferBuilder<VS::PerVertexData> vtx_builder;
|
||||
vtx_builder.AddVertices({
|
||||
{coverage.origin, input_uvs[0]},
|
||||
{{coverage.origin.x + coverage.size.width, coverage.origin.y},
|
||||
input_uvs[1]},
|
||||
{{coverage.origin.x + coverage.size.width,
|
||||
coverage.origin.y + coverage.size.height},
|
||||
input_uvs[3]},
|
||||
{coverage.origin, input_uvs[0]},
|
||||
{{coverage.origin.x + coverage.size.width,
|
||||
coverage.origin.y + coverage.size.height},
|
||||
input_uvs[3]},
|
||||
{{coverage.origin.x, coverage.origin.y + coverage.size.height},
|
||||
input_uvs[2]},
|
||||
{Point(0, 0)},
|
||||
{Point(1, 0)},
|
||||
{Point(1, 1)},
|
||||
{Point(0, 0)},
|
||||
{Point(1, 1)},
|
||||
{Point(0, 1)},
|
||||
});
|
||||
|
||||
auto& host_buffer = pass.GetTransientsBuffer();
|
||||
@@ -77,7 +67,9 @@ std::optional<Entity> LinearToSrgbFilterContents::RenderFilter(
|
||||
cmd.BindVertices(vtx_buffer);
|
||||
|
||||
VS::FrameInfo frame_info;
|
||||
frame_info.mvp = Matrix::MakeOrthographic(pass.GetRenderTargetSize());
|
||||
frame_info.mvp = Matrix::MakeOrthographic(pass.GetRenderTargetSize()) *
|
||||
entity.GetTransformation() * input_snapshot->transform *
|
||||
Matrix::MakeScale(Vector2(size));
|
||||
frame_info.texture_sampler_y_coord_scale =
|
||||
input_snapshot->texture->GetYCoordScale();
|
||||
|
||||
@@ -94,7 +86,7 @@ std::optional<Entity> LinearToSrgbFilterContents::RenderFilter(
|
||||
|
||||
CoverageProc coverage_proc =
|
||||
[coverage](const Entity& entity) -> std::optional<Rect> {
|
||||
return coverage;
|
||||
return coverage.TransformBounds(entity.GetTransformation());
|
||||
};
|
||||
|
||||
auto contents = AnonymousContents::Make(render_proc, coverage_proc);
|
||||
@@ -102,7 +94,6 @@ std::optional<Entity> LinearToSrgbFilterContents::RenderFilter(
|
||||
Entity sub_entity;
|
||||
sub_entity.SetContents(std::move(contents));
|
||||
sub_entity.SetStencilDepth(entity.GetStencilDepth());
|
||||
sub_entity.SetTransformation(entity.GetTransformation());
|
||||
sub_entity.SetBlendMode(entity.GetBlendMode());
|
||||
return sub_entity;
|
||||
}
|
||||
|
||||
@@ -36,16 +36,10 @@ std::optional<Entity> SrgbToLinearFilterContents::RenderFilter(
|
||||
return std::nullopt;
|
||||
}
|
||||
|
||||
auto maybe_input_uvs = input_snapshot->GetCoverageUVs(coverage);
|
||||
if (!maybe_input_uvs.has_value()) {
|
||||
return std::nullopt;
|
||||
}
|
||||
auto input_uvs = maybe_input_uvs.value();
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
/// Create AnonymousContents for rendering.
|
||||
///
|
||||
RenderProc render_proc = [input_snapshot, coverage, input_uvs,
|
||||
RenderProc render_proc = [input_snapshot,
|
||||
absorb_opacity = GetAbsorbOpacity()](
|
||||
const ContentContext& renderer,
|
||||
const Entity& entity, RenderPass& pass) -> bool {
|
||||
@@ -56,20 +50,16 @@ std::optional<Entity> SrgbToLinearFilterContents::RenderFilter(
|
||||
auto options = OptionsFromPassAndEntity(pass, entity);
|
||||
cmd.pipeline = renderer.GetSrgbToLinearFilterPipeline(options);
|
||||
|
||||
auto size = input_snapshot->texture->GetSize();
|
||||
|
||||
VertexBufferBuilder<VS::PerVertexData> vtx_builder;
|
||||
vtx_builder.AddVertices({
|
||||
{coverage.origin, input_uvs[0]},
|
||||
{{coverage.origin.x + coverage.size.width, coverage.origin.y},
|
||||
input_uvs[1]},
|
||||
{{coverage.origin.x + coverage.size.width,
|
||||
coverage.origin.y + coverage.size.height},
|
||||
input_uvs[3]},
|
||||
{coverage.origin, input_uvs[0]},
|
||||
{{coverage.origin.x + coverage.size.width,
|
||||
coverage.origin.y + coverage.size.height},
|
||||
input_uvs[3]},
|
||||
{{coverage.origin.x, coverage.origin.y + coverage.size.height},
|
||||
input_uvs[2]},
|
||||
{Point(0, 0)},
|
||||
{Point(1, 0)},
|
||||
{Point(1, 1)},
|
||||
{Point(0, 0)},
|
||||
{Point(1, 1)},
|
||||
{Point(0, 1)},
|
||||
});
|
||||
|
||||
auto& host_buffer = pass.GetTransientsBuffer();
|
||||
@@ -77,7 +67,9 @@ std::optional<Entity> SrgbToLinearFilterContents::RenderFilter(
|
||||
cmd.BindVertices(vtx_buffer);
|
||||
|
||||
VS::FrameInfo frame_info;
|
||||
frame_info.mvp = Matrix::MakeOrthographic(pass.GetRenderTargetSize());
|
||||
frame_info.mvp = Matrix::MakeOrthographic(pass.GetRenderTargetSize()) *
|
||||
entity.GetTransformation() * input_snapshot->transform *
|
||||
Matrix::MakeScale(Vector2(size));
|
||||
frame_info.texture_sampler_y_coord_scale =
|
||||
input_snapshot->texture->GetYCoordScale();
|
||||
|
||||
@@ -94,7 +86,7 @@ std::optional<Entity> SrgbToLinearFilterContents::RenderFilter(
|
||||
|
||||
CoverageProc coverage_proc =
|
||||
[coverage](const Entity& entity) -> std::optional<Rect> {
|
||||
return coverage;
|
||||
return coverage.TransformBounds(entity.GetTransformation());
|
||||
};
|
||||
|
||||
auto contents = AnonymousContents::Make(render_proc, coverage_proc);
|
||||
@@ -102,7 +94,6 @@ std::optional<Entity> SrgbToLinearFilterContents::RenderFilter(
|
||||
Entity sub_entity;
|
||||
sub_entity.SetContents(std::move(contents));
|
||||
sub_entity.SetStencilDepth(entity.GetStencilDepth());
|
||||
sub_entity.SetTransformation(entity.GetTransformation());
|
||||
sub_entity.SetBlendMode(entity.GetBlendMode());
|
||||
return sub_entity;
|
||||
}
|
||||
|
||||
@@ -56,12 +56,6 @@ std::optional<Entity> YUVToRGBFilterContents::RenderFilter(
|
||||
return std::nullopt;
|
||||
}
|
||||
|
||||
auto maybe_input_uvs = y_input_snapshot->GetCoverageUVs(coverage);
|
||||
if (!maybe_input_uvs.has_value()) {
|
||||
return std::nullopt;
|
||||
}
|
||||
auto input_uvs = maybe_input_uvs.value();
|
||||
|
||||
if (y_input_snapshot->texture->GetTextureDescriptor().format !=
|
||||
PixelFormat::kR8UNormInt ||
|
||||
uv_input_snapshot->texture->GetTextureDescriptor().format !=
|
||||
@@ -72,8 +66,8 @@ std::optional<Entity> YUVToRGBFilterContents::RenderFilter(
|
||||
//----------------------------------------------------------------------------
|
||||
/// Create AnonymousContents for rendering.
|
||||
///
|
||||
RenderProc render_proc = [y_input_snapshot, uv_input_snapshot, coverage,
|
||||
yuv_color_space = yuv_color_space_, input_uvs](
|
||||
RenderProc render_proc = [y_input_snapshot, uv_input_snapshot,
|
||||
yuv_color_space = yuv_color_space_](
|
||||
const ContentContext& renderer,
|
||||
const Entity& entity, RenderPass& pass) -> bool {
|
||||
Command cmd;
|
||||
@@ -83,20 +77,16 @@ std::optional<Entity> YUVToRGBFilterContents::RenderFilter(
|
||||
auto options = OptionsFromPassAndEntity(pass, entity);
|
||||
cmd.pipeline = renderer.GetYUVToRGBFilterPipeline(options);
|
||||
|
||||
auto size = y_input_snapshot->texture->GetSize();
|
||||
|
||||
VertexBufferBuilder<VS::PerVertexData> vtx_builder;
|
||||
vtx_builder.AddVertices({
|
||||
{coverage.origin, input_uvs[0]},
|
||||
{{coverage.origin.x + coverage.size.width, coverage.origin.y},
|
||||
input_uvs[1]},
|
||||
{{coverage.origin.x + coverage.size.width,
|
||||
coverage.origin.y + coverage.size.height},
|
||||
input_uvs[3]},
|
||||
{coverage.origin, input_uvs[0]},
|
||||
{{coverage.origin.x + coverage.size.width,
|
||||
coverage.origin.y + coverage.size.height},
|
||||
input_uvs[3]},
|
||||
{{coverage.origin.x, coverage.origin.y + coverage.size.height},
|
||||
input_uvs[2]},
|
||||
{Point(0, 0)},
|
||||
{Point(1, 0)},
|
||||
{Point(1, 1)},
|
||||
{Point(0, 0)},
|
||||
{Point(1, 1)},
|
||||
{Point(0, 1)},
|
||||
});
|
||||
|
||||
auto& host_buffer = pass.GetTransientsBuffer();
|
||||
@@ -104,7 +94,9 @@ std::optional<Entity> YUVToRGBFilterContents::RenderFilter(
|
||||
cmd.BindVertices(vtx_buffer);
|
||||
|
||||
VS::FrameInfo frame_info;
|
||||
frame_info.mvp = Matrix::MakeOrthographic(pass.GetRenderTargetSize());
|
||||
frame_info.mvp = Matrix::MakeOrthographic(pass.GetRenderTargetSize()) *
|
||||
entity.GetTransformation() * y_input_snapshot->transform *
|
||||
Matrix::MakeScale(Vector2(size));
|
||||
frame_info.texture_sampler_y_coord_scale =
|
||||
y_input_snapshot->texture->GetYCoordScale();
|
||||
|
||||
@@ -131,7 +123,7 @@ std::optional<Entity> YUVToRGBFilterContents::RenderFilter(
|
||||
|
||||
CoverageProc coverage_proc =
|
||||
[coverage](const Entity& entity) -> std::optional<Rect> {
|
||||
return coverage;
|
||||
return coverage.TransformBounds(entity.GetTransformation());
|
||||
};
|
||||
|
||||
auto contents = AnonymousContents::Make(render_proc, coverage_proc);
|
||||
@@ -139,7 +131,6 @@ std::optional<Entity> YUVToRGBFilterContents::RenderFilter(
|
||||
Entity sub_entity;
|
||||
sub_entity.SetContents(std::move(contents));
|
||||
sub_entity.SetStencilDepth(entity.GetStencilDepth());
|
||||
sub_entity.SetTransformation(entity.GetTransformation());
|
||||
sub_entity.SetBlendMode(entity.GetBlendMode());
|
||||
return sub_entity;
|
||||
}
|
||||
|
||||
@@ -12,12 +12,11 @@ uniform FrameInfo {
|
||||
frame_info;
|
||||
|
||||
in vec2 position;
|
||||
in highp vec2 texture_coords;
|
||||
|
||||
out highp vec2 v_texture_coords;
|
||||
|
||||
void main() {
|
||||
gl_Position = frame_info.mvp * vec4(position, 0.0, 1.0);
|
||||
v_texture_coords =
|
||||
IPRemapCoords(texture_coords, frame_info.texture_sampler_y_coord_scale);
|
||||
IPRemapCoords(position, frame_info.texture_sampler_y_coord_scale);
|
||||
}
|
||||
|
||||
@@ -12,12 +12,11 @@ uniform FrameInfo {
|
||||
frame_info;
|
||||
|
||||
in vec2 position;
|
||||
in highp vec2 texture_coords;
|
||||
|
||||
out highp vec2 v_texture_coords;
|
||||
|
||||
void main() {
|
||||
gl_Position = frame_info.mvp * vec4(position, 0.0, 1.0);
|
||||
v_texture_coords =
|
||||
IPRemapCoords(texture_coords, frame_info.texture_sampler_y_coord_scale);
|
||||
IPRemapCoords(position, frame_info.texture_sampler_y_coord_scale);
|
||||
}
|
||||
|
||||
@@ -12,12 +12,11 @@ uniform FrameInfo {
|
||||
frame_info;
|
||||
|
||||
in vec2 position;
|
||||
in highp vec2 texture_coords;
|
||||
|
||||
out highp vec2 v_texture_coords;
|
||||
|
||||
void main() {
|
||||
gl_Position = frame_info.mvp * vec4(position, 0.0, 1.0);
|
||||
v_texture_coords =
|
||||
IPRemapCoords(texture_coords, frame_info.texture_sampler_y_coord_scale);
|
||||
IPRemapCoords(position, frame_info.texture_sampler_y_coord_scale);
|
||||
}
|
||||
|
||||
@@ -12,12 +12,11 @@ uniform FrameInfo {
|
||||
frame_info;
|
||||
|
||||
in vec2 position;
|
||||
in highp vec2 texture_coords;
|
||||
|
||||
out highp vec2 v_texture_coords;
|
||||
|
||||
void main() {
|
||||
gl_Position = frame_info.mvp * vec4(position, 0.0, 1.0);
|
||||
v_texture_coords =
|
||||
IPRemapCoords(texture_coords, frame_info.texture_sampler_y_coord_scale);
|
||||
IPRemapCoords(position, frame_info.texture_sampler_y_coord_scale);
|
||||
}
|
||||
|
||||
@@ -6570,16 +6570,16 @@
|
||||
"work_registers_used": 32
|
||||
},
|
||||
"Varying": {
|
||||
"fp16_arithmetic": 0,
|
||||
"fp16_arithmetic": 100,
|
||||
"has_stack_spilling": false,
|
||||
"performance": {
|
||||
"longest_path_bound_pipelines": [
|
||||
"load_store"
|
||||
],
|
||||
"longest_path_cycles": [
|
||||
0.078125,
|
||||
0.0625,
|
||||
0.015625,
|
||||
0.078125,
|
||||
0.0625,
|
||||
0.0,
|
||||
3.0,
|
||||
0.0
|
||||
@@ -6597,7 +6597,7 @@
|
||||
],
|
||||
"shortest_path_cycles": [
|
||||
0.0625,
|
||||
0.0,
|
||||
0.015625,
|
||||
0.0625,
|
||||
0.0,
|
||||
3.0,
|
||||
@@ -6607,9 +6607,9 @@
|
||||
"load_store"
|
||||
],
|
||||
"total_cycles": [
|
||||
0.078125,
|
||||
0.0625,
|
||||
0.015625,
|
||||
0.078125,
|
||||
0.0625,
|
||||
0.0,
|
||||
3.0,
|
||||
0.0
|
||||
@@ -6636,7 +6636,7 @@
|
||||
],
|
||||
"longest_path_cycles": [
|
||||
2.9700000286102295,
|
||||
5.0,
|
||||
4.0,
|
||||
0.0
|
||||
],
|
||||
"pipelines": [
|
||||
@@ -6649,7 +6649,7 @@
|
||||
],
|
||||
"shortest_path_cycles": [
|
||||
2.9700000286102295,
|
||||
5.0,
|
||||
4.0,
|
||||
0.0
|
||||
],
|
||||
"total_bound_pipelines": [
|
||||
@@ -6657,7 +6657,7 @@
|
||||
],
|
||||
"total_cycles": [
|
||||
3.0,
|
||||
5.0,
|
||||
4.0,
|
||||
0.0
|
||||
]
|
||||
},
|
||||
@@ -8421,16 +8421,16 @@
|
||||
"work_registers_used": 32
|
||||
},
|
||||
"Varying": {
|
||||
"fp16_arithmetic": 0,
|
||||
"fp16_arithmetic": 100,
|
||||
"has_stack_spilling": false,
|
||||
"performance": {
|
||||
"longest_path_bound_pipelines": [
|
||||
"load_store"
|
||||
],
|
||||
"longest_path_cycles": [
|
||||
0.078125,
|
||||
0.0625,
|
||||
0.015625,
|
||||
0.078125,
|
||||
0.0625,
|
||||
0.0,
|
||||
3.0,
|
||||
0.0
|
||||
@@ -8448,7 +8448,7 @@
|
||||
],
|
||||
"shortest_path_cycles": [
|
||||
0.0625,
|
||||
0.0,
|
||||
0.015625,
|
||||
0.0625,
|
||||
0.0,
|
||||
3.0,
|
||||
@@ -8458,9 +8458,9 @@
|
||||
"load_store"
|
||||
],
|
||||
"total_cycles": [
|
||||
0.078125,
|
||||
0.0625,
|
||||
0.015625,
|
||||
0.078125,
|
||||
0.0625,
|
||||
0.0,
|
||||
3.0,
|
||||
0.0
|
||||
@@ -8487,7 +8487,7 @@
|
||||
],
|
||||
"longest_path_cycles": [
|
||||
2.9700000286102295,
|
||||
5.0,
|
||||
4.0,
|
||||
0.0
|
||||
],
|
||||
"pipelines": [
|
||||
@@ -8500,7 +8500,7 @@
|
||||
],
|
||||
"shortest_path_cycles": [
|
||||
2.9700000286102295,
|
||||
5.0,
|
||||
4.0,
|
||||
0.0
|
||||
],
|
||||
"total_bound_pipelines": [
|
||||
@@ -8508,7 +8508,7 @@
|
||||
],
|
||||
"total_cycles": [
|
||||
3.0,
|
||||
5.0,
|
||||
4.0,
|
||||
0.0
|
||||
]
|
||||
},
|
||||
@@ -10176,16 +10176,16 @@
|
||||
"work_registers_used": 32
|
||||
},
|
||||
"Varying": {
|
||||
"fp16_arithmetic": 0,
|
||||
"fp16_arithmetic": 100,
|
||||
"has_stack_spilling": false,
|
||||
"performance": {
|
||||
"longest_path_bound_pipelines": [
|
||||
"load_store"
|
||||
],
|
||||
"longest_path_cycles": [
|
||||
0.078125,
|
||||
0.0625,
|
||||
0.015625,
|
||||
0.078125,
|
||||
0.0625,
|
||||
0.0,
|
||||
3.0,
|
||||
0.0
|
||||
@@ -10203,7 +10203,7 @@
|
||||
],
|
||||
"shortest_path_cycles": [
|
||||
0.0625,
|
||||
0.0,
|
||||
0.015625,
|
||||
0.0625,
|
||||
0.0,
|
||||
3.0,
|
||||
@@ -10213,9 +10213,9 @@
|
||||
"load_store"
|
||||
],
|
||||
"total_cycles": [
|
||||
0.078125,
|
||||
0.0625,
|
||||
0.015625,
|
||||
0.078125,
|
||||
0.0625,
|
||||
0.0,
|
||||
3.0,
|
||||
0.0
|
||||
@@ -10242,7 +10242,7 @@
|
||||
],
|
||||
"longest_path_cycles": [
|
||||
2.9700000286102295,
|
||||
5.0,
|
||||
4.0,
|
||||
0.0
|
||||
],
|
||||
"pipelines": [
|
||||
@@ -10255,7 +10255,7 @@
|
||||
],
|
||||
"shortest_path_cycles": [
|
||||
2.9700000286102295,
|
||||
5.0,
|
||||
4.0,
|
||||
0.0
|
||||
],
|
||||
"total_bound_pipelines": [
|
||||
@@ -10263,7 +10263,7 @@
|
||||
],
|
||||
"total_cycles": [
|
||||
3.0,
|
||||
5.0,
|
||||
4.0,
|
||||
0.0
|
||||
]
|
||||
},
|
||||
@@ -11239,16 +11239,16 @@
|
||||
"work_registers_used": 32
|
||||
},
|
||||
"Varying": {
|
||||
"fp16_arithmetic": 0,
|
||||
"fp16_arithmetic": 100,
|
||||
"has_stack_spilling": false,
|
||||
"performance": {
|
||||
"longest_path_bound_pipelines": [
|
||||
"load_store"
|
||||
],
|
||||
"longest_path_cycles": [
|
||||
0.078125,
|
||||
0.0625,
|
||||
0.015625,
|
||||
0.078125,
|
||||
0.0625,
|
||||
0.0,
|
||||
3.0,
|
||||
0.0
|
||||
@@ -11266,7 +11266,7 @@
|
||||
],
|
||||
"shortest_path_cycles": [
|
||||
0.0625,
|
||||
0.0,
|
||||
0.015625,
|
||||
0.0625,
|
||||
0.0,
|
||||
3.0,
|
||||
@@ -11276,9 +11276,9 @@
|
||||
"load_store"
|
||||
],
|
||||
"total_cycles": [
|
||||
0.078125,
|
||||
0.0625,
|
||||
0.015625,
|
||||
0.078125,
|
||||
0.0625,
|
||||
0.0,
|
||||
3.0,
|
||||
0.0
|
||||
@@ -11305,7 +11305,7 @@
|
||||
],
|
||||
"longest_path_cycles": [
|
||||
2.9700000286102295,
|
||||
5.0,
|
||||
4.0,
|
||||
0.0
|
||||
],
|
||||
"pipelines": [
|
||||
@@ -11318,7 +11318,7 @@
|
||||
],
|
||||
"shortest_path_cycles": [
|
||||
2.9700000286102295,
|
||||
5.0,
|
||||
4.0,
|
||||
0.0
|
||||
],
|
||||
"total_bound_pipelines": [
|
||||
@@ -11326,7 +11326,7 @@
|
||||
],
|
||||
"total_cycles": [
|
||||
3.0,
|
||||
5.0,
|
||||
4.0,
|
||||
0.0
|
||||
]
|
||||
},
|
||||
|
||||
Reference in New Issue
Block a user