19#include "gtest/gtest.h"
20#include "third_party/skia/include/core/SkMatrix.h"
21#include "third_party/skia/include/core/SkPoint.h"
53 preroll_state_stack, &cache, &raster_time, &ui_time);
55 paint_state_stack, &cache, &raster_time, &ui_time);
65 display_list_item, preroll_context, paint_context, matrix));
66 ASSERT_FALSE(display_list_item.
Draw(paint_context, &dummy_canvas, &paint));
75 display_list_item, preroll_context, paint_context, matrix));
76 ASSERT_FALSE(display_list_item.
Draw(paint_context, &dummy_canvas, &paint));
85 display_list_item, preroll_context, paint_context, matrix));
86 ASSERT_TRUE(display_list_item.
Draw(paint_context, &dummy_canvas, &paint));
113 preroll_state_stack, &cache, &raster_time, &ui_time);
115 paint_state_stack, &cache, &raster_time, &ui_time);
126 display_list_item, preroll_context, paint_context, matrix));
127 ASSERT_FALSE(display_list_item.
Draw(paint_context, &dummy_canvas, &paint));
134 display_list_item, preroll_context, paint_context, matrix));
135 ASSERT_FALSE(display_list_item.
Draw(paint_context, &dummy_canvas, &paint));
142 display_list_item, preroll_context, paint_context, matrix));
143 ASSERT_TRUE(display_list_item.
Draw(paint_context, &dummy_canvas, &paint));
147 size_t threshold = 0;
165 preroll_state_stack, &cache, &raster_time, &ui_time);
167 paint_state_stack, &cache, &raster_time, &ui_time);
176 display_list_item, preroll_context, paint_context, matrix));
177 ASSERT_FALSE(display_list_item.
Draw(paint_context, &dummy_canvas, &paint));
181 size_t picture_cache_limit_per_frame = 0;
199 preroll_state_stack, &cache, &raster_time, &ui_time);
201 paint_state_stack, &cache, &raster_time, &ui_time);
211 display_list_item, preroll_context, paint_context, matrix));
212 ASSERT_FALSE(display_list_item.
Draw(paint_context, &dummy_canvas, &paint));
215 display_list_item, preroll_context, paint_context, matrix));
216 ASSERT_FALSE(display_list_item.
Draw(paint_context, &dummy_canvas, &paint));
219 display_list_item, preroll_context, paint_context, matrix));
220 ASSERT_FALSE(display_list_item.
Draw(paint_context, &dummy_canvas, &paint));
224 size_t threshold = 1;
243 preroll_state_stack, &cache, &raster_time, &ui_time);
245 paint_state_stack, &cache, &raster_time, &ui_time);
264 ASSERT_FALSE(display_list_item_1.
Draw(paint_context, &dummy_canvas, &paint));
265 ASSERT_FALSE(display_list_item_2.
Draw(paint_context, &dummy_canvas, &paint));
282 ASSERT_TRUE(display_list_item_1.
Draw(paint_context, &dummy_canvas, &paint));
283 ASSERT_TRUE(display_list_item_2.
Draw(paint_context, &dummy_canvas, &paint));
297 ASSERT_TRUE(display_list_item_1.
Draw(paint_context, &dummy_canvas, &paint));
315 cache.
Draw(display_list_item_1.
GetId().value(), dummy_canvas, &paint));
316 ASSERT_FALSE(display_list_item_1.
Draw(paint_context, &dummy_canvas, &paint));
318 cache.
Draw(display_list_item_2.
GetId().value(), dummy_canvas, &paint));
319 ASSERT_FALSE(display_list_item_2.
Draw(paint_context, &dummy_canvas, &paint));
324 SkRect logical_rect = SkRect::MakeLTRB(0, 0, 300.2, 300.3);
325 SkMatrix ctm = SkMatrix::MakeAll(2.0, 0, 0, 0, 2.0, 0, 0, 0, 1);
327 ASSERT_EQ(result, SkRect::MakeLTRB(0.0, 0.0, 600.4, 600.6));
334 size_t threshold = 1;
340 sk_sp<DisplayList> display_list = builder.
Build();
363 preroll_state_stack, &cache, &raster_time, &ui_time);
365 paint_state_stack, &cache, &raster_time, &ui_time);
374 display_list_item, preroll_context, paint_context, ctm));
375 ASSERT_FALSE(display_list_item.
Draw(paint_context, &canvas, &paint));
381 display_list_item, preroll_context, paint_context, ctm));
382 ASSERT_TRUE(display_list_item.
Draw(paint_context, &canvas, &paint));
385 ASSERT_TRUE(cache.
Draw(display_list_item.
GetId().value(), canvas, &paint));
386 ASSERT_TRUE(display_list_item.
Draw(paint_context, &canvas, &paint));
390 size_t threshold = 1;
396 ASSERT_EQ(display_list->op_count(), 1u);
397 ASSERT_EQ(display_list->op_count(
true), 36u);
410 preroll_state_stack, &cache, &raster_time, &ui_time);
412 paint_state_stack, &cache, &raster_time, &ui_time);
422 display_list_item, preroll_context, paint_context, matrix));
423 ASSERT_FALSE(display_list_item.
Draw(paint_context, &dummy_canvas, &paint));
429 display_list_item, preroll_context, paint_context, matrix));
430 ASSERT_TRUE(display_list_item.
Draw(paint_context, &dummy_canvas, &paint));
437 size_t threshold = 1;
444 unsigned int complexity_score = calculator->
Compute(display_list.get());
446 ASSERT_EQ(complexity_score, 5u);
447 ASSERT_EQ(display_list->op_count(), 5u);
461 preroll_state_stack, &cache, &raster_time, &ui_time);
463 paint_state_stack, &cache, &raster_time, &ui_time);
473 display_list_item, preroll_context, paint_context, matrix));
474 ASSERT_FALSE(display_list_item.
Draw(paint_context, &dummy_canvas, &paint));
480 display_list_item, preroll_context, paint_context, matrix));
481 ASSERT_FALSE(display_list_item.
Draw(paint_context, &dummy_canvas, &paint));
485 complexity_score = calculator->
Compute(display_list.get());
487 ASSERT_EQ(complexity_score, 6u);
488 ASSERT_EQ(display_list->op_count(), 6u);
496 display_list_item_2, preroll_context, paint_context, matrix));
497 ASSERT_FALSE(display_list_item_2.
Draw(paint_context, &dummy_canvas, &paint));
503 display_list_item_2, preroll_context, paint_context, matrix));
504 ASSERT_TRUE(display_list_item_2.
Draw(paint_context, &dummy_canvas, &paint));
508 size_t threshold = 2;
516 int matrix_count =
sizeof(matrices) /
sizeof(matrices[0]);
531 preroll_state_stack, &cache, &raster_time, &ui_time);
533 paint_state_stack, &cache, &raster_time, &ui_time);
540 for (
int i = 0;
i < 10;
i++) {
543 for (
int j = 0; j < matrix_count; j++) {
546 display_list_item, preroll_context, paint_context, matrices[j]));
549 for (
int j = 0; j < matrix_count; j++) {
552 display_list_item.
Draw(paint_context, &dummy_canvas, &paint));
564 auto blur_layer = std::make_shared<ImageFilterLayer>(blur_filter);
566 auto transform_layer = std::make_shared<TransformLayer>(matrix);
568 child_layer->set_expected_paint_matrix(cache_matrix);
570 blur_layer->Add(child_layer);
571 transform_layer->Add(blur_layer);
573 size_t threshold = 2;
584 std::vector<RasterCacheItem*> cache_items;
589 preroll_state_stack, &cache, &raster_time, &ui_time);
590 preroll_holder.preroll_context.raster_cached_entries = &cache_items;
591 transform_layer->Preroll(&preroll_holder.preroll_context);
594 &raster_time, &ui_time);
598 *preroll_holder.preroll_context.raster_cached_entries,
599 &paint_holder.paint_context);
606 auto hash_function = map.hash_function();
607 SkMatrix matrix = SkMatrix::I();
615 auto layer_hash_code = hash_function(layer_key);
616 ASSERT_EQ(layer_hash_code, layer_cache_key_id.GetHash());
618 auto display_list_cache_key_id =
620 auto display_list_hash_code = hash_function(display_list_key);
621 ASSERT_EQ(display_list_hash_code, display_list_cache_key_id.GetHash());
623 auto layer_children_cache_key_id =
625 auto layer_children_hash_code = hash_function(layer_children_key);
626 ASSERT_EQ(layer_children_hash_code, layer_children_cache_key_id.GetHash());
631 SkMatrix matrix = SkMatrix::I();
637 map[layer_key] = 100;
638 map[display_list_key] = 300;
639 map[layer_children_key] = 400;
641 ASSERT_EQ(map[layer_key], 100);
642 ASSERT_EQ(map[display_list_key], 300);
643 ASSERT_EQ(map[layer_children_key], 400);
648 SkMatrix matrix = SkMatrix::I();
654 map[layer_first_key] = 50;
655 map[layer_second_key] = 100;
656 map[layer_third_key] = 150;
657 ASSERT_EQ(map[layer_first_key], 50);
658 ASSERT_EQ(map[layer_second_key], 100);
659 ASSERT_EQ(map[layer_third_key], 150);
665 map[picture_first_key] = 200;
666 map[picture_second_key] = 250;
667 map[picture_third_key] = 300;
668 ASSERT_EQ(map[picture_first_key], 200);
669 ASSERT_EQ(map[picture_second_key], 250);
670 ASSERT_EQ(map[picture_third_key], 300);
676 map[display_list_first_key] = 350;
677 map[display_list_second_key] = 400;
678 map[display_list_third_key] = 450;
679 ASSERT_EQ(map[display_list_first_key], 350);
680 ASSERT_EQ(map[display_list_second_key], 400);
681 ASSERT_EQ(map[display_list_third_key], 450);
693 map[layer_children_first_key] = 100;
694 map[layer_children_second_key] = 200;
695 map[layer_children_third_key] = 300;
696 ASSERT_EQ(map[layer_children_first_key], 100);
697 ASSERT_EQ(map[layer_children_second_key], 200);
698 ASSERT_EQ(map[layer_children_third_key], 300);
707 ASSERT_NE(first, second);
708 ASSERT_NE(first, third);
709 ASSERT_NE(second, third);
717 ASSERT_NE(fourth, fifth);
718 ASSERT_NE(fifth, sixth);
726 std::size_t first_hash = first.
GetHash();
727 std::size_t second_hash = second.
GetHash();
736 std::size_t third_hash = third.
GetHash();
737 std::size_t fourth_hash = fourth.GetHash();
747 ASSERT_EQ(first_hash, first.
GetHash());
748 ASSERT_EQ(second_hash, second.
GetHash());
749 ASSERT_EQ(third_hash, third.
GetHash());
750 ASSERT_EQ(fourth_hash, fourth.GetHash());
756 auto layer = std::make_shared<ContainerLayer>();
759 auto mock_layer = std::make_shared<MockLayer>(child_path);
760 layer->Add(mock_layer);
763 auto display_list_layer =
764 std::make_shared<DisplayListLayer>(
DlPoint(), display_list,
false,
false);
765 layer->Add(display_list_layer);
768 std::vector<RasterCacheKeyID> expected_ids;
769 expected_ids.emplace_back(
773 ASSERT_EQ(expected_ids[0], mock_layer->caching_key_id());
774 ASSERT_EQ(expected_ids[1], display_list_layer->caching_key_id());
775 ASSERT_EQ(ids, expected_ids);
778TEST(RasterCacheUtilsTest, SkMatrixIntegralTransCTM) {
779#define EXPECT_EQ_WITH_TRANSLATE(test, expected, expected_tx, expected_ty) \
781 EXPECT_EQ(test[SkMatrix::kMScaleX], expected[SkMatrix::kMScaleX]); \
782 EXPECT_EQ(test[SkMatrix::kMSkewX], expected[SkMatrix::kMSkewX]); \
783 EXPECT_EQ(test[SkMatrix::kMScaleY], expected[SkMatrix::kMScaleY]); \
784 EXPECT_EQ(test[SkMatrix::kMSkewY], expected[SkMatrix::kMSkewY]); \
785 EXPECT_EQ(test[SkMatrix::kMSkewX], expected[SkMatrix::kMSkewX]); \
786 EXPECT_EQ(test[SkMatrix::kMPersp0], expected[SkMatrix::kMPersp0]); \
787 EXPECT_EQ(test[SkMatrix::kMPersp1], expected[SkMatrix::kMPersp1]); \
788 EXPECT_EQ(test[SkMatrix::kMPersp2], expected[SkMatrix::kMPersp2]); \
789 EXPECT_EQ(test[SkMatrix::kMTransX], expected_tx); \
790 EXPECT_EQ(test[SkMatrix::kMTransY], expected_ty); \
793#define EXPECT_NON_INTEGER_TRANSLATION(matrix) \
794 EXPECT_TRUE(SkScalarFraction(matrix[SkMatrix::kMTransX]) != 0.0f || \
795 SkScalarFraction(matrix[SkMatrix::kMTransY]) != 0.0f)
799 SkMatrix matrix = SkMatrix::I();
803 EXPECT_EQ(get, matrix);
807 SkMatrix matrix = SkMatrix::Translate(10.0f, 12.0f);
811 EXPECT_EQ(get, matrix);
815 SkMatrix matrix = SkMatrix::Translate(10.2f, 12.0f);
821 EXPECT_EQ(get, compute);
825 SkMatrix matrix = SkMatrix::Translate(10.0f, 12.3f);
831 EXPECT_EQ(get, compute);
835 SkMatrix matrix = SkMatrix::Translate(10.7f, 12.3f);
841 EXPECT_EQ(get, compute);
845 SkMatrix matrix = SkMatrix::Scale(2.0f, 3.0f);
849 EXPECT_EQ(get, matrix);
853 SkMatrix matrix = SkMatrix::Scale(2.0f, 3.0f);
854 matrix.preTranslate(10.0f, 12.0f);
858 EXPECT_EQ(get, matrix);
862 SkMatrix matrix = SkMatrix::Scale(2.0f, 3.0f);
863 matrix.preTranslate(10.7f, 12.1f);
869 EXPECT_EQ(get, compute);
873 SkMatrix matrix = SkMatrix::Skew(0.5f, 0.1f);
877 EXPECT_EQ(get, matrix);
881 SkMatrix matrix = SkMatrix::Skew(0.5f, 0.1f);
882 matrix.preTranslate(10.7f, 12.1f);
887 EXPECT_EQ(get, matrix);
891 SkMatrix matrix = SkMatrix::RotateDeg(45);
895 EXPECT_EQ(get, matrix);
899 SkMatrix matrix = SkMatrix::RotateDeg(45);
900 matrix.preTranslate(10.7f, 12.1f);
905 EXPECT_EQ(get, matrix);
909 SkMatrix matrix = SkMatrix::I();
910 matrix.setPerspX(0.1);
914 EXPECT_EQ(get, matrix);
918 SkMatrix matrix = SkMatrix::I();
919 matrix.setPerspX(0.1);
920 matrix.preTranslate(10.7f, 12.1f);
925 EXPECT_EQ(get, matrix);
929 SkMatrix matrix = SkMatrix::I();
930 matrix.setPerspY(0.1);
934 EXPECT_EQ(get, matrix);
938 SkMatrix matrix = SkMatrix::I();
939 matrix.setPerspY(0.1);
940 matrix.preTranslate(10.7f, 12.1f);
945 EXPECT_EQ(get, matrix);
950 SkMatrix matrix = SkMatrix::MakeAll(
958 EXPECT_EQ(get, matrix);
963 SkMatrix matrix = SkMatrix::MakeAll(
968 matrix.preTranslate(10.7f, 12.1f);
973 EXPECT_EQ(get, matrix);
975#undef EXPECT_NON_INTEGER_TRANSLATION
976#undef EXPECT_EQ_WITH_TRANSLATE
979TEST(RasterCacheUtilsTest, SkM44IntegralTransCTM) {
980#define EXPECT_EQ_WITH_TRANSLATE(test, expected, tx, ty, label) \
982 EXPECT_EQ(test.rc(0, 0), expected.rc(0, 0)) << label; \
983 EXPECT_EQ(test.rc(0, 1), expected.rc(0, 1)) << label; \
984 EXPECT_EQ(test.rc(0, 2), expected.rc(0, 2)) << label; \
985 EXPECT_EQ(test.rc(0, 3), tx) << label; \
986 EXPECT_EQ(test.rc(1, 0), expected.rc(1, 0)) << label; \
987 EXPECT_EQ(test.rc(1, 1), expected.rc(1, 1)) << label; \
988 EXPECT_EQ(test.rc(1, 2), expected.rc(1, 2)) << label; \
989 EXPECT_EQ(test.rc(1, 3), ty) << label; \
990 EXPECT_EQ(test.rc(2, 0), expected.rc(2, 0)) << label; \
991 EXPECT_EQ(test.rc(2, 1), expected.rc(2, 1)) << label; \
992 EXPECT_EQ(test.rc(2, 2), expected.rc(2, 2)) << label; \
993 EXPECT_EQ(test.rc(2, 3), expected.rc(2, 3)) << label; \
994 EXPECT_EQ(test.rc(3, 0), expected.rc(3, 0)) << label; \
995 EXPECT_EQ(test.rc(3, 1), expected.rc(3, 1)) << label; \
996 EXPECT_EQ(test.rc(3, 2), expected.rc(3, 2)) << label; \
997 EXPECT_EQ(test.rc(3, 3), expected.rc(3, 3)) << label; \
1000#define EXPECT_NON_INTEGER_TRANSLATION(matrix) \
1001 EXPECT_TRUE(SkScalarFraction(matrix.rc(0, 3)) != 0.0f || \
1002 SkScalarFraction(matrix.rc(1, 3)) != 0.0f)
1004 for (
int r = 0; r < 4; r++) {
1005 for (
int c = 0; c < 4; c++) {
1029 auto label = std::to_string(r) +
", " + std::to_string(c);
1030 SkM44 matrix = SkM44::Translate(10.7f, 12.1f);
1032 matrix.setRC(r, c, 0.5f);
1039 EXPECT_EQ(get, compute) << label;
1045 EXPECT_EQ(get, matrix) << label;
1049#undef EXPECT_NON_INTEGER_TRANSLATION
1050#undef EXPECT_EQ_WITH_TRANSLATE
void SetTransform(const DlMatrix &matrix) override
void Translate(DlScalar tx, DlScalar ty) override
sk_sp< DisplayList > Build()
void DrawRect(const DlRect &rect, const DlPaint &paint) override
virtual bool ShouldBeCached(unsigned int complexity_score)=0
virtual unsigned int Compute(const DisplayList *display_list)=0
static DisplayListComplexityCalculator * GetInstance()
bool Draw(const PaintContext &context, const DlPaint *paint) const override
static std::shared_ptr< DlImageFilter > Make(DlScalar sigma_x, DlScalar sigma_y, DlTileMode tile_mode)
static DlPath MakeRect(const DlRect &rect)
static DlPath MakeOval(const DlRect &bounds)
Used for fixed refresh rate cases.
void set_delegate(DlCanvas *canvas)
void set_preroll_delegate(const DlRect &cull_rect, const DlMatrix &matrix)
static void TryToRasterCache(const std::vector< RasterCacheItem * > &raster_cached_entries, const PaintContext *paint_context, bool ignore_raster_cache=false)
bool Draw(const RasterCacheKeyID &id, DlCanvas &canvas, const DlPaint *paint, bool preserve_rtree=false) const
const RasterCacheMetrics & picture_metrics() const
size_t EstimatePictureCacheByteSize() const
Estimate how much memory is used by picture raster cache entries in bytes.
void EvictUnusedCacheEntries()
void set_matrix(const DlMatrix &matrix)
virtual std::optional< RasterCacheKeyID > GetId() const
std::unordered_map< RasterCacheKey, Value, Hash, Equal > Map
static constexpr uint64_t kDefaultUniqueID
std::size_t GetHash() const
static std::optional< std::vector< RasterCacheKeyID > > LayerChildrenIds(const Layer *layer)
static std::shared_ptr< MockLayer > Make(const DlPath &path, DlPaint paint=DlPaint())
A RasterCache implementation that simulates the act of rendering a Layer or DisplayList without the o...
#define FML_UNREACHABLE()
TEST_F(DisplayListTest, Defaults)
bool RasterCacheItemTryToRasterCache(DisplayListRasterCacheItem &display_list_item, PaintContext &paint_context)
LayerTestBase<::testing::Test > LayerTest
PrerollContextHolder GetSamplePrerollContextHolder(LayerStateStack &state_stack, RasterCache *raster_cache, FixedRefreshRateStopwatch *raster_time, FixedRefreshRateStopwatch *ui_time)
sk_sp< DisplayList > GetSampleDisplayList()
void RasterCacheItemPreroll(DisplayListRasterCacheItem &display_list_item, PrerollContext &context, const DlMatrix &matrix)
TEST(NativeAssetsManagerTest, NoAvailableAssets)
sk_sp< DisplayList > GetSampleNestedDisplayList()
PaintContextHolder GetSamplePaintContextHolder(LayerStateStack &state_stack, RasterCache *raster_cache, FixedRefreshRateStopwatch *raster_time, FixedRefreshRateStopwatch *ui_time)
bool RasterCacheItemPrerollAndTryToRasterCache(DisplayListRasterCacheItem &display_list_item, PrerollContext &context, PaintContext &paint_context, const DlMatrix &matrix)
impeller::Matrix DlMatrix
static constexpr DlRect kGiantRect
constexpr std::size_t HashCombine()
#define EXPECT_NON_INTEGER_TRANSLATION(matrix)
#define EXPECT_EQ_WITH_TRANSLATE(test, expected, expected_tx, expected_ty)
static constexpr DlColor kRed()
size_t total_count() const
size_t total_bytes() const
static bool ComputeIntegralTransCTM(const SkMatrix &in, SkMatrix *out)
Snap the translation components of the |in| matrix to integers and store the snapped matrix in |out|.
static SkMatrix GetIntegralTransCTM(const SkMatrix &ctm)
Snap the translation components of the matrix to integers.
static SkRect GetDeviceBounds(const SkRect &rect, const SkMatrix &ctm)
PaintContext paint_context
PrerollContext preroll_context
A 4x4 matrix using column-major storage.
static constexpr Matrix MakeTranslation(const Vector3 &t)
static constexpr Matrix MakeSkew(Scalar sx, Scalar sy)
static constexpr Matrix MakeScale(const Vector3 &s)
static constexpr TRect MakeWH(Type width, Type height)
static constexpr TRect MakeLTRB(Type left, Type top, Type right, Type bottom)