5 #include <unordered_map>
7 #include "flutter/display_list/dl_tile_mode.h"
8 #include "flutter/display_list/effects/dl_image_filter.h"
9 #include "flutter/display_list/geometry/dl_geometry_types.h"
10 #include "flutter/testing/testing.h"
11 #include "gtest/gtest.h"
26 std::optional<Rect> cull_rect = std::nullopt,
27 bool requires_readback =
false) {
29 onscreen_desc.
size = {100, 100};
35 std::shared_ptr<Texture> onscreen =
36 context.
GetContext()->GetResourceAllocator()->CreateTexture(
41 if (context.
GetContext()->GetCapabilities()->SupportsOffscreenMSAA()) {
47 std::shared_ptr<Texture> onscreen_msaa =
48 context.
GetContext()->GetResourceAllocator()->CreateTexture(
60 if (cull_rect.has_value()) {
61 return std::make_unique<Canvas>(
62 context, render_target,
false,
63 requires_readback, cull_rect.value());
65 return std::make_unique<Canvas>(context, render_target,
false,
76 canvas->Translate(
Vector3(100, 200));
78 canvas->GetCurrentTransform(),
86 canvas->GetCurrentTransform(),
94 canvas->GetCurrentTransform(),
100 canvas->Translate(
Vector3(100, 200));
102 canvas->GetCurrentTransform(),
114 ASSERT_EQ(canvas->GetSaveCount(), 1u);
115 ASSERT_EQ(canvas->Restore(),
false);
117 canvas->Translate(
Size{100, 100});
119 ASSERT_EQ(canvas->GetSaveCount(), 2u);
122 ASSERT_TRUE(canvas->Restore());
123 ASSERT_EQ(canvas->GetSaveCount(), 1u);
134 canvas->Translate(
Size{100, 100});
142 GTEST_SKIP() <<
"Test requires device with framebuffer fetch";
147 canvas->SetBackdropData({}, 3);
150 flutter::DlImageFilter::MakeBlur(4, 4, flutter::DlTileMode::kClamp);
153 EXPECT_TRUE(canvas->RequiresReadback());
155 canvas->SaveLayer({}, rect, blur.get(),
159 EXPECT_TRUE(canvas->RequiresReadback());
161 canvas->SaveLayer({}, rect, blur.get(),
165 EXPECT_TRUE(canvas->RequiresReadback());
167 canvas->SaveLayer({}, rect, blur.get(),
171 EXPECT_FALSE(canvas->RequiresReadback());
177 GTEST_SKIP() <<
"Test requires device with framebuffer fetch";
182 std::unordered_map<int64_t, BackdropData>
data;
184 canvas->SetBackdropData(
data, 3);
187 flutter::DlImageFilter::MakeBlur(4, 4, flutter::DlTileMode::kClamp);
189 EXPECT_TRUE(canvas->RequiresReadback());
190 canvas->DrawRect(flutter::DlRect::MakeLTRB(0, 0, 50, 50),
192 canvas->SaveLayer({}, std::nullopt, blur.get(),
197 EXPECT_FALSE(canvas->RequiresReadback());
199 canvas->SaveLayer({}, std::nullopt, blur.get(),
204 EXPECT_FALSE(canvas->RequiresReadback());
206 canvas->SaveLayer({}, std::nullopt, blur.get(),
211 EXPECT_FALSE(canvas->RequiresReadback());
217 GTEST_SKIP() <<
"Test requires device with framebuffer fetch";
222 std::unordered_map<int64_t, BackdropData>
data;
224 canvas->SetBackdropData(
data, 3);
227 flutter::DlImageFilter::MakeBlur(4, 4, flutter::DlTileMode::kClamp);
229 EXPECT_TRUE(canvas->RequiresReadback());
230 canvas->DrawRect(flutter::DlRect::MakeLTRB(0, 0, 50, 50),
232 canvas->SaveLayer({}, std::nullopt, blur.get(),
235 EXPECT_TRUE(canvas->RequiresReadback());
237 canvas->SaveLayer({}, std::nullopt, blur.get(),
240 EXPECT_FALSE(canvas->RequiresReadback());
242 canvas->SaveLayer({}, std::nullopt, blur.get(),
245 EXPECT_FALSE(canvas->RequiresReadback());
254 GTEST_SKIP() <<
"Test requires device with framebuffer fetch";
259 canvas->SetBackdropData({}, 2);
262 flutter::DlImageFilter::MakeBlur(4, 4, flutter::DlTileMode::kClamp);
264 EXPECT_TRUE(canvas->RequiresReadback());
265 canvas->DrawRect(flutter::DlRect::MakeLTRB(0, 0, 50, 50),
267 canvas->SaveLayer({}, std::nullopt, blur.get(),
273 canvas->SaveLayer({}, std::nullopt, blur.get(),
277 EXPECT_TRUE(canvas->RequiresReadback());
280 EXPECT_TRUE(canvas->RequiresReadback());
284 RenderCallback callback = [&](
RenderTarget& render_target) {
286 Canvas canvas(context, render_target,
true,
false);
288 std::vector<flutter::DlPoint> vertex_coordinates = {
293 std::vector<flutter::DlPoint> texture_coordinates = {
298 std::vector<uint16_t> indices = {0, 1, 2};
299 flutter::DlVertices::Builder vertices_builder(
300 flutter::DlVertexMode::kTriangleStrip, vertex_coordinates.size(),
301 flutter::DlVertices::Builder::kHasTextureCoordinates, indices.size());
302 vertices_builder.store_vertices(vertex_coordinates.data());
303 vertices_builder.store_indices(indices.data());
304 vertices_builder.store_texture_coordinates(texture_coordinates.data());
305 auto vertices = vertices_builder.build();
308 std::vector<flutter::DlColor> colors = {flutter::DlColor::kBlue(),
309 flutter::DlColor::kRed()};
310 std::vector<Scalar> stops = {0.0, 1.0};
311 auto gradient = flutter::DlColorSource::MakeLinear(
312 {0, 0}, {0, 600}, 2, colors.data(), stops.data(),
313 flutter::DlTileMode::kClamp);
317 canvas.
DrawVertices(std::make_shared<DlVerticesGeometry>(vertices, context),
328 auto runtime_stages =
329 OpenAssetAsRuntimeStage(
"runtime_stage_simple.frag.iplr");
333 ASSERT_TRUE(runtime_stage);
335 auto runtime_effect = flutter::DlRuntimeEffect::MakeImpeller(runtime_stage);
336 auto uniform_data = std::make_shared<std::vector<uint8_t>>();
337 auto color_source = flutter::DlColorSource::MakeRuntimeEffect(
338 runtime_effect, {}, uniform_data);
340 RenderCallback callback = [&](
RenderTarget& render_target) {
342 Canvas canvas(context, render_target,
true,
false);
344 std::vector<flutter::DlPoint> vertex_coordinates = {
350 std::vector<flutter::DlPoint> texture_coordinates = {
355 std::vector<uint16_t> indices = {0, 1, 2};
356 flutter::DlVertices::Builder vertices_builder(
357 flutter::DlVertexMode::kTriangleStrip, vertex_coordinates.size(),
358 flutter::DlVertices::Builder::kHasTextureCoordinates, indices.size());
359 vertices_builder.store_vertices(vertex_coordinates.data());
360 vertices_builder.store_indices(indices.data());
361 vertices_builder.store_texture_coordinates(texture_coordinates.data());
362 auto vertices = vertices_builder.build();
366 canvas.
DrawVertices(std::make_shared<DlVerticesGeometry>(vertices, context),
382 EXPECT_FALSE(canvas->SupportsBlitToOnscreen());
384 EXPECT_TRUE(canvas->SupportsBlitToOnscreen());
void DrawVertices(const std::shared_ptr< VerticesGeometry > &vertices, BlendMode blend_mode, const Paint &paint)
virtual bool SupportsFramebufferFetch() const =0
Whether the context backend is able to support pipelines with shaders that read from the framebuffer ...
virtual PixelFormat GetDefaultColorFormat() const =0
Returns a supported PixelFormat for textures that store 4-channel colors (red/green/blue/alpha).
const Capabilities & GetDeviceCapabilities() const
std::shared_ptr< Context > GetContext() const
bool OpenPlaygroundHere(const RenderCallback &render_callback)
RenderTarget & SetColorAttachment(const ColorAttachment &attachment, size_t index)
#define ASSERT_MATRIX_NEAR(a, b)
std::unique_ptr< Canvas > CreateTestCanvas(ContentContext &context, std::optional< Rect > cull_rect=std::nullopt, bool requires_readback=false)
TEST_P(AiksTest, DrawAtlasNoColor)
constexpr RuntimeStageBackend PlaygroundBackendToRuntimeStageBackend(PlaygroundBackend backend)
@ kContainsContents
The caller claims the bounds are a reasonably tight estimate of the coverage of the contents and shou...
std::shared_ptr< Texture > resolve_texture
std::shared_ptr< Texture > texture
static constexpr Color Azure()
A 4x4 matrix using column-major storage.
static constexpr Matrix MakeTranslation(const Vector3 &t)
const flutter::DlColorSource * color_source
constexpr static TRect MakeLTRB(Type left, Type top, Type right, Type bottom)
A lightweight object that describes the attributes of a texture that can then used an allocator to cr...
std::shared_ptr< const fml::Mapping > data