diff --git a/engine/src/flutter/impeller/aiks/aiks_unittests.cc b/engine/src/flutter/impeller/aiks/aiks_unittests.cc index 6176c8ed978..c9db82e09d5 100644 --- a/engine/src/flutter/impeller/aiks/aiks_unittests.cc +++ b/engine/src/flutter/impeller/aiks/aiks_unittests.cc @@ -102,6 +102,7 @@ TEST_P(AiksTest, CanRenderInvertedImage) { ASSERT_TRUE(OpenPlaygroundHere(canvas.EndRecordingAsPicture())); } +namespace { bool GenerateMipmap(const std::shared_ptr& context, std::shared_ptr texture, std::string label) { @@ -118,79 +119,42 @@ bool GenerateMipmap(const std::shared_ptr& context, return buffer->SubmitCommands(); } -TEST_P(AiksTest, CanRenderTiledTexture) { - auto context = GetContext(); +void CanRenderTiledTexture(AiksTest* aiks_test, Entity::TileMode tile_mode) { + auto context = aiks_test->GetContext(); ASSERT_TRUE(context); - bool first_frame = true; - auto texture = CreateTextureForFixture("table_mountain_nx.png", - /*enable_mipmapping=*/true); - auto callback = [&](AiksContext& renderer, RenderTarget& render_target) { - if (first_frame) { - first_frame = false; - GenerateMipmap(context, texture, "table_mountain_nx"); - } - - const char* tile_mode_names[] = {"Clamp", "Repeat", "Mirror", "Decal"}; - const Entity::TileMode tile_modes[] = { - Entity::TileMode::kClamp, Entity::TileMode::kRepeat, - Entity::TileMode::kMirror, Entity::TileMode::kDecal}; - const char* mip_filter_names[] = {"None", "Nearest", "Linear"}; - const MipFilter mip_filters[] = {MipFilter::kNearest, MipFilter::kLinear}; - const char* min_mag_filter_names[] = {"Nearest", "Linear"}; - const MinMagFilter min_mag_filters[] = {MinMagFilter::kNearest, - MinMagFilter::kLinear}; - static int selected_x_tile_mode = 0; - static int selected_y_tile_mode = 0; - static int selected_mip_filter = 0; - static int selected_min_mag_filter = 0; - static float alpha = 1.0; - ImGui::Begin("Controls", nullptr, ImGuiWindowFlags_AlwaysAutoResize); - ImGui::SliderFloat("Alpha", &alpha, 0.0, 1.0); - ImGui::Combo("X tile mode", &selected_x_tile_mode, tile_mode_names, - sizeof(tile_mode_names) / sizeof(char*)); - ImGui::Combo("Y tile mode", &selected_y_tile_mode, tile_mode_names, - sizeof(tile_mode_names) / sizeof(char*)); - ImGui::Combo("Mip filter", &selected_mip_filter, mip_filter_names, - sizeof(mip_filter_names) / sizeof(char*)); - ImGui::Combo("Min Mag filter", &selected_min_mag_filter, - min_mag_filter_names, - sizeof(min_mag_filter_names) / sizeof(char*)); - static Matrix matrix = { - 1, 0, 0, 0, // - 0, 1, 0, 0, // - 0, 0, 1, 0, // - 0, 0, 0, 1 // - }; - std::string label = "##1"; - for (int i = 0; i < 4; i++) { - ImGui::InputScalarN(label.c_str(), ImGuiDataType_Float, &(matrix.vec[i]), - 4, NULL, NULL, "%.2f", 0); - label[2]++; - } - ImGui::End(); - - Canvas canvas; - Paint paint; - canvas.Translate({100.0, 100.0, 0}); - auto x_tile_mode = tile_modes[selected_x_tile_mode]; - auto y_tile_mode = tile_modes[selected_y_tile_mode]; - SamplerDescriptor descriptor; - descriptor.mip_filter = mip_filters[selected_mip_filter]; - descriptor.min_filter = min_mag_filters[selected_min_mag_filter]; - descriptor.mag_filter = min_mag_filters[selected_min_mag_filter]; - paint.color_source = [texture, x_tile_mode, y_tile_mode, descriptor]() { - auto contents = std::make_shared(); - contents->SetTexture(texture); - contents->SetTileModes(x_tile_mode, y_tile_mode); - contents->SetSamplerDescriptor(descriptor); - contents->SetEffectTransform(matrix); - return contents; - }; - paint.color = Color(1, 1, 1, alpha); - canvas.DrawRect({0, 0, 600, 600}, paint); - return renderer.Render(canvas.EndRecordingAsPicture(), render_target); + auto texture = aiks_test->CreateTextureForFixture("table_mountain_nx.png", + /*enable_mipmapping=*/true); + GenerateMipmap(context, texture, "table_mountain_nx"); + Canvas canvas; + canvas.Scale(aiks_test->GetContentScale()); + canvas.Translate({100.0f, 100.0f, 0}); + Paint paint; + paint.color_source = [texture, tile_mode]() { + auto contents = std::make_shared(); + contents->SetTexture(texture); + contents->SetTileModes(tile_mode, tile_mode); + return contents; }; - ASSERT_TRUE(OpenPlaygroundHere(callback)); + paint.color = Color(1, 1, 1, 1); + canvas.DrawRect({0, 0, 600, 600}, paint); + ASSERT_TRUE(aiks_test->OpenPlaygroundHere(canvas.EndRecordingAsPicture())); +} +} // namespace + +TEST_P(AiksTest, CanRenderTiledTextureClamp) { + CanRenderTiledTexture(this, Entity::TileMode::kClamp); +} + +TEST_P(AiksTest, CanRenderTiledTextureRepeat) { + CanRenderTiledTexture(this, Entity::TileMode::kRepeat); +} + +TEST_P(AiksTest, CanRenderTiledTextureMirror) { + CanRenderTiledTexture(this, Entity::TileMode::kMirror); +} + +TEST_P(AiksTest, CanRenderTiledTextureDecal) { + CanRenderTiledTexture(this, Entity::TileMode::kDecal); } TEST_P(AiksTest, CanRenderImageRect) { @@ -349,55 +313,41 @@ TEST_P(AiksTest, CanSaveLayerStandalone) { ASSERT_TRUE(OpenPlaygroundHere(canvas.EndRecordingAsPicture())); } -TEST_P(AiksTest, CanRenderLinearGradient) { - auto callback = [&](AiksContext& renderer, RenderTarget& render_target) { - const char* tile_mode_names[] = {"Clamp", "Repeat", "Mirror", "Decal"}; - const Entity::TileMode tile_modes[] = { - Entity::TileMode::kClamp, Entity::TileMode::kRepeat, - Entity::TileMode::kMirror, Entity::TileMode::kDecal}; +namespace { +void CanRenderLinearGradient(AiksTest* aiks_test, Entity::TileMode tile_mode) { + Canvas canvas; + canvas.Scale(aiks_test->GetContentScale()); + Paint paint; + canvas.Translate({100.0f, 0, 0}); + paint.color_source = [tile_mode]() { + std::vector colors = {Color{0.9568, 0.2627, 0.2118, 1.0}, + Color{0.1294, 0.5882, 0.9529, 0.0}}; + std::vector stops = {0.0, 1.0}; - static int selected_tile_mode = 0; - static float alpha = 1; - ImGui::Begin("Controls", nullptr, ImGuiWindowFlags_AlwaysAutoResize); - ImGui::SliderFloat("Alpha", &alpha, 0, 1); - ImGui::Combo("Tile mode", &selected_tile_mode, tile_mode_names, - sizeof(tile_mode_names) / sizeof(char*)); - static Matrix matrix = { - 1, 0, 0, 0, // - 0, 1, 0, 0, // - 0, 0, 1, 0, // - 0, 0, 0, 1 // - }; - std::string label = "##1"; - for (int i = 0; i < 4; i++) { - ImGui::InputScalarN(label.c_str(), ImGuiDataType_Float, &(matrix.vec[i]), - 4, NULL, NULL, "%.2f", 0); - label[2]++; - } - ImGui::End(); - - Canvas canvas; - Paint paint; - canvas.Translate({100.0, 100.0, 0}); - auto tile_mode = tile_modes[selected_tile_mode]; - paint.color_source = [tile_mode]() { - std::vector colors = {Color{0.9568, 0.2627, 0.2118, 1.0}, - Color{0.1294, 0.5882, 0.9529, 0.0}}; - std::vector stops = {0.0, 1.0}; - - auto contents = std::make_shared(); - contents->SetEndPoints({0, 0}, {200, 200}); - contents->SetColors(std::move(colors)); - contents->SetStops(std::move(stops)); - contents->SetTileMode(tile_mode); - contents->SetEffectTransform(matrix); - return contents; - }; - paint.color = Color(1.0, 1.0, 1.0, alpha); - canvas.DrawRect({0, 0, 600, 600}, paint); - return renderer.Render(canvas.EndRecordingAsPicture(), render_target); + auto contents = std::make_shared(); + contents->SetEndPoints({0, 0}, {200, 200}); + contents->SetColors(std::move(colors)); + contents->SetStops(std::move(stops)); + contents->SetTileMode(tile_mode); + return contents; }; - ASSERT_TRUE(OpenPlaygroundHere(callback)); + paint.color = Color(1.0, 1.0, 1.0, 1.0); + canvas.DrawRect({0, 0, 600, 600}, paint); + ASSERT_TRUE(aiks_test->OpenPlaygroundHere(canvas.EndRecordingAsPicture())); +} +} // namespace + +TEST_P(AiksTest, CanRenderLinearGradientClamp) { + CanRenderLinearGradient(this, Entity::TileMode::kClamp); +} +TEST_P(AiksTest, CanRenderLinearGradientRepeat) { + CanRenderLinearGradient(this, Entity::TileMode::kRepeat); +} +TEST_P(AiksTest, CanRenderLinearGradientMirror) { + CanRenderLinearGradient(this, Entity::TileMode::kMirror); +} +TEST_P(AiksTest, CanRenderLinearGradientDecal) { + CanRenderLinearGradient(this, Entity::TileMode::kDecal); } TEST_P(AiksTest, CanRenderLinearGradientWithOverlappingStops) { @@ -453,69 +403,57 @@ TEST_P(AiksTest, CanRenderLinearGradientWithOverlappingStops) { ASSERT_TRUE(OpenPlaygroundHere(callback)); } -TEST_P(AiksTest, CanRenderLinearGradientManyColors) { - auto callback = [&](AiksContext& renderer, RenderTarget& render_target) { - const char* tile_mode_names[] = {"Clamp", "Repeat", "Mirror", "Decal"}; - const Entity::TileMode tile_modes[] = { - Entity::TileMode::kClamp, Entity::TileMode::kRepeat, - Entity::TileMode::kMirror, Entity::TileMode::kDecal}; - - static int selected_tile_mode = 0; - static float alpha = 1; - ImGui::Begin("Controls", nullptr, ImGuiWindowFlags_AlwaysAutoResize); - ImGui::SliderFloat("Alpha", &alpha, 0, 1); - ImGui::Combo("Tile mode", &selected_tile_mode, tile_mode_names, - sizeof(tile_mode_names) / sizeof(char*)); - static Matrix matrix = { - 1, 0, 0, 0, // - 0, 1, 0, 0, // - 0, 0, 1, 0, // - 0, 0, 0, 1 // +namespace { +void CanRenderLinearGradientManyColors(AiksTest* aiks_test, + Entity::TileMode tile_mode) { + Canvas canvas; + canvas.Scale(aiks_test->GetContentScale()); + Paint paint; + canvas.Translate({100, 100, 0}); + paint.color_source = [tile_mode]() { + std::vector colors = { + Color{0x1f / 255.0, 0.0, 0x5c / 255.0, 1.0}, + Color{0x5b / 255.0, 0.0, 0x60 / 255.0, 1.0}, + Color{0x87 / 255.0, 0x01 / 255.0, 0x60 / 255.0, 1.0}, + Color{0xac / 255.0, 0x25 / 255.0, 0x53 / 255.0, 1.0}, + Color{0xe1 / 255.0, 0x6b / 255.0, 0x5c / 255.0, 1.0}, + Color{0xf3 / 255.0, 0x90 / 255.0, 0x60 / 255.0, 1.0}, + Color{0xff / 255.0, 0xb5 / 255.0, 0x6b / 250.0, 1.0}}; + std::vector stops = { + 0.0, + (1.0 / 6.0) * 1, + (1.0 / 6.0) * 2, + (1.0 / 6.0) * 3, + (1.0 / 6.0) * 4, + (1.0 / 6.0) * 5, + 1.0, }; - std::string label = "##1"; - for (int i = 0; i < 4; i++) { - ImGui::InputScalarN(label.c_str(), ImGuiDataType_Float, &(matrix.vec[i]), - 4, NULL, NULL, "%.2f", 0); - label[2]++; - } - ImGui::End(); - Canvas canvas; - Paint paint; - canvas.Translate({100.0, 100.0, 0}); - auto tile_mode = tile_modes[selected_tile_mode]; - paint.color_source = [tile_mode]() { - std::vector colors = { - Color{0x1f / 255.0, 0.0, 0x5c / 255.0, 1.0}, - Color{0x5b / 255.0, 0.0, 0x60 / 255.0, 1.0}, - Color{0x87 / 255.0, 0x01 / 255.0, 0x60 / 255.0, 1.0}, - Color{0xac / 255.0, 0x25 / 255.0, 0x53 / 255.0, 1.0}, - Color{0xe1 / 255.0, 0x6b / 255.0, 0x5c / 255.0, 1.0}, - Color{0xf3 / 255.0, 0x90 / 255.0, 0x60 / 255.0, 1.0}, - Color{0xff / 255.0, 0xb5 / 255.0, 0x6b / 250.0, 1.0}}; - std::vector stops = { - 0.0, - (1.0 / 6.0) * 1, - (1.0 / 6.0) * 2, - (1.0 / 6.0) * 3, - (1.0 / 6.0) * 4, - (1.0 / 6.0) * 5, - 1.0, - }; - - auto contents = std::make_shared(); - contents->SetEndPoints({0, 0}, {200, 200}); - contents->SetColors(std::move(colors)); - contents->SetStops(std::move(stops)); - contents->SetTileMode(tile_mode); - contents->SetEffectTransform(matrix); - return contents; - }; - paint.color = Color(1.0, 1.0, 1.0, alpha); - canvas.DrawRect({0, 0, 600, 600}, paint); - return renderer.Render(canvas.EndRecordingAsPicture(), render_target); + auto contents = std::make_shared(); + contents->SetEndPoints({0, 0}, {200, 200}); + contents->SetColors(std::move(colors)); + contents->SetStops(std::move(stops)); + contents->SetTileMode(tile_mode); + return contents; }; - ASSERT_TRUE(OpenPlaygroundHere(callback)); + paint.color = Color(1.0, 1.0, 1.0, 1.0); + canvas.DrawRect({0, 0, 600, 600}, paint); + canvas.Restore(); + ASSERT_TRUE(aiks_test->OpenPlaygroundHere(canvas.EndRecordingAsPicture())); +} +} // namespace + +TEST_P(AiksTest, CanRenderLinearGradientManyColorsClamp) { + CanRenderLinearGradientManyColors(this, Entity::TileMode::kClamp); +} +TEST_P(AiksTest, CanRenderLinearGradientManyColorsRepeat) { + CanRenderLinearGradientManyColors(this, Entity::TileMode::kRepeat); +} +TEST_P(AiksTest, CanRenderLinearGradientManyColorsMirror) { + CanRenderLinearGradientManyColors(this, Entity::TileMode::kMirror); +} +TEST_P(AiksTest, CanRenderLinearGradientManyColorsDecal) { + CanRenderLinearGradientManyColors(this, Entity::TileMode::kDecal); } TEST_P(AiksTest, CanRenderLinearGradientWayManyColors) { @@ -740,51 +678,39 @@ TEST_P(AiksTest, CanRenderRadialGradientManyColors) { ASSERT_TRUE(OpenPlaygroundHere(callback)); } -TEST_P(AiksTest, CanRenderSweepGradient) { - auto callback = [&](AiksContext& renderer, RenderTarget& render_target) { - const char* tile_mode_names[] = {"Clamp", "Repeat", "Mirror", "Decal"}; - const Entity::TileMode tile_modes[] = { - Entity::TileMode::kClamp, Entity::TileMode::kRepeat, - Entity::TileMode::kMirror, Entity::TileMode::kDecal}; - - static int selected_tile_mode = 0; - ImGui::Begin("Controls", nullptr, ImGuiWindowFlags_AlwaysAutoResize); - ImGui::Combo("Tile mode", &selected_tile_mode, tile_mode_names, - sizeof(tile_mode_names) / sizeof(char*)); - static Matrix matrix = { - 1, 0, 0, 0, // - 0, 1, 0, 0, // - 0, 0, 1, 0, // - 0, 0, 0, 1 // - }; - std::string label = "##1"; - for (int i = 0; i < 4; i++) { - ImGui::InputScalarN(label.c_str(), ImGuiDataType_Float, &(matrix.vec[i]), - 4, NULL, NULL, "%.2f", 0); - label[2]++; - } - ImGui::End(); - - Canvas canvas; - Paint paint; - canvas.Translate({100.0, 100.0, 0}); - auto tile_mode = tile_modes[selected_tile_mode]; - paint.color_source = [tile_mode]() { - auto contents = std::make_shared(); - contents->SetCenterAndAngles({100, 100}, Degrees(45), Degrees(135)); - std::vector colors = {Color{0.9568, 0.2627, 0.2118, 1.0}, - Color{0.1294, 0.5882, 0.9529, 1.0}}; - std::vector stops = {0.0, 1.0}; - contents->SetColors(std::move(colors)); - contents->SetStops(std::move(stops)); - contents->SetTileMode(tile_mode); - contents->SetEffectTransform(matrix); - return contents; - }; - canvas.DrawRect({0, 0, 600, 600}, paint); - return renderer.Render(canvas.EndRecordingAsPicture(), render_target); +namespace { +void CanRenderSweepGradient(AiksTest* aiks_test, Entity::TileMode tile_mode) { + Canvas canvas; + canvas.Scale(aiks_test->GetContentScale()); + Paint paint; + canvas.Translate({100, 100, 0}); + paint.color_source = [tile_mode]() { + auto contents = std::make_shared(); + contents->SetCenterAndAngles({100, 100}, Degrees(45), Degrees(135)); + std::vector colors = {Color{0.9568, 0.2627, 0.2118, 1.0}, + Color{0.1294, 0.5882, 0.9529, 1.0}}; + std::vector stops = {0.0, 1.0}; + contents->SetColors(std::move(colors)); + contents->SetStops(std::move(stops)); + contents->SetTileMode(tile_mode); + return contents; }; - ASSERT_TRUE(OpenPlaygroundHere(callback)); + canvas.DrawRect({0, 0, 600, 600}, paint); + ASSERT_TRUE(aiks_test->OpenPlaygroundHere(canvas.EndRecordingAsPicture())); +} +} // namespace + +TEST_P(AiksTest, CanRenderSweepGradientClamp) { + CanRenderSweepGradient(this, Entity::TileMode::kClamp); +} +TEST_P(AiksTest, CanRenderSweepGradientRepeat) { + CanRenderSweepGradient(this, Entity::TileMode::kRepeat); +} +TEST_P(AiksTest, CanRenderSweepGradientMirror) { + CanRenderSweepGradient(this, Entity::TileMode::kMirror); +} +TEST_P(AiksTest, CanRenderSweepGradientDecal) { + CanRenderSweepGradient(this, Entity::TileMode::kDecal); } TEST_P(AiksTest, CanRenderSweepGradientManyColors) { diff --git a/engine/src/flutter/impeller/golden_tests/golden_playground_test_mac.cc b/engine/src/flutter/impeller/golden_tests/golden_playground_test_mac.cc index 49c31937266..a19c4c2122f 100644 --- a/engine/src/flutter/impeller/golden_tests/golden_playground_test_mac.cc +++ b/engine/src/flutter/impeller/golden_tests/golden_playground_test_mac.cc @@ -58,12 +58,9 @@ void GoldenPlaygroundTest::SetUp() { } std::string test_name = GetTestName(); - if (test_name == "impeller_Play_AiksTest_CanRenderTiledTexture_Metal" || - test_name == + if (test_name == "impeller_Play_AiksTest_CanRenderLinearGradientWithOverlappingStops_" "Metal" || - test_name == - "impeller_Play_AiksTest_CanRenderLinearGradientManyColors_Metal" || test_name == "impeller_Play_AiksTest_CanRenderLinearGradientWayManyColors_Metal" || test_name == @@ -72,7 +69,6 @@ void GoldenPlaygroundTest::SetUp() { test_name == "impeller_Play_AiksTest_CanRenderRadialGradient_Metal" || test_name == "impeller_Play_AiksTest_CanRenderRadialGradientManyColors_Metal" || - test_name == "impeller_Play_AiksTest_CanRenderSweepGradient_Metal" || test_name == "impeller_Play_AiksTest_CanRenderSweepGradientManyColors_Metal" || test_name == "impeller_Play_AiksTest_CanPictureConvertToImage_Metal" || @@ -84,8 +80,7 @@ void GoldenPlaygroundTest::SetUp() { test_name == "impeller_Play_AiksTest_" "CoverageOriginShouldBeAccountedForInSubpasses_Metal" || - test_name == "impeller_Play_AiksTest_SceneColorSource_Metal" || - test_name == "impeller_Play_AiksTest_CanRenderLinearGradient_Metal") { + test_name == "impeller_Play_AiksTest_SceneColorSource_Metal") { GTEST_SKIP_( "GoldenPlaygroundTest doesn't support interactive playground tests " "yet.");