|
7 | 7 | #include "flutter/flow/layers/display_list_layer.h" |
8 | 8 |
|
9 | 9 | #include "flutter/display_list/display_list_builder.h" |
| 10 | +#include "flutter/flow/layers/layer_tree.h" |
10 | 11 | #include "flutter/flow/testing/diff_context_test.h" |
11 | 12 | #include "flutter/flow/testing/skia_gpu_object_layer_test.h" |
12 | 13 | #include "flutter/fml/macros.h" |
@@ -249,6 +250,8 @@ TEST_F(DisplayListLayerTest, CachedIncompatibleDisplayListOpacityInheritance) { |
249 | 250 | display_list_layer->Preroll(preroll_context()); |
250 | 251 | display_list_layer->Preroll(preroll_context()); |
251 | 252 | display_list_layer->Preroll(preroll_context()); |
| 253 | + LayerTree::TryToRasterCache(*preroll_context()->raster_cached_entries, |
| 254 | + &paint_context(), false); |
252 | 255 |
|
253 | 256 | int opacity_alpha = 0x7F; |
254 | 257 | SkPoint opacity_offset = SkPoint::Make(10, 10); |
@@ -516,5 +519,69 @@ TEST_F(DisplayListLayerTest, DisplayListAccessCountDependsOnVisibility) { |
516 | 519 | ASSERT_TRUE(raster_cache_item->Draw(paint_context(), nullptr)); |
517 | 520 | } |
518 | 521 |
|
| 522 | +TEST_F(DisplayListLayerTest, OverflowCachedDisplayListOpacityInheritance) { |
| 523 | + use_mock_raster_cache(); |
| 524 | + PrerollContext* context = preroll_context(); |
| 525 | + int per_frame = |
| 526 | + RasterCacheUtil::kDefaultPictureAndDispLayListCacheLimitPerFrame; |
| 527 | + int layer_count = per_frame + 1; |
| 528 | + SkPoint opacity_offset = {10, 10}; |
| 529 | + auto opacity_layer = std::make_shared<OpacityLayer>(0.5f, opacity_offset); |
| 530 | + std::shared_ptr<DisplayListLayer> layers[layer_count]; |
| 531 | + for (int i = 0; i < layer_count; i++) { |
| 532 | + DisplayListBuilder builder(false); |
| 533 | + builder.drawRect({0, 0, 100, 100}); |
| 534 | + builder.drawRect({50, 50, 100, 100}); |
| 535 | + auto display_list = builder.Build(); |
| 536 | + ASSERT_FALSE(display_list->can_apply_group_opacity()); |
| 537 | + SkPoint offset = {i * 200.0f, 0}; |
| 538 | + |
| 539 | + layers[i] = std::make_shared<DisplayListLayer>( |
| 540 | + offset, SkiaGPUObject(display_list, unref_queue()), true, false); |
| 541 | + opacity_layer->Add(layers[i]); |
| 542 | + } |
| 543 | + for (size_t j = 0; j < context->raster_cache->access_threshold(); j++) { |
| 544 | + context->raster_cache->BeginFrame(); |
| 545 | + for (int i = 0; i < layer_count; i++) { |
| 546 | + context->renderable_state_flags = 0; |
| 547 | + layers[i]->Preroll(context); |
| 548 | + ASSERT_EQ(context->renderable_state_flags, 0) << "pass " << (j + 1); |
| 549 | + } |
| 550 | + } |
| 551 | + opacity_layer->Preroll(context); |
| 552 | + ASSERT_FALSE(opacity_layer->children_can_accept_opacity()); |
| 553 | + LayerTree::TryToRasterCache(*context->raster_cached_entries, &paint_context(), |
| 554 | + false); |
| 555 | + context->raster_cached_entries->clear(); |
| 556 | + context->raster_cache->BeginFrame(); |
| 557 | + for (int i = 0; i < per_frame; i++) { |
| 558 | + context->renderable_state_flags = 0; |
| 559 | + layers[i]->Preroll(context); |
| 560 | + ASSERT_EQ(context->renderable_state_flags, |
| 561 | + LayerStateStack::kCallerCanApplyOpacity) |
| 562 | + << "layer " << (i + 1); |
| 563 | + } |
| 564 | + for (int i = per_frame; i < layer_count; i++) { |
| 565 | + context->renderable_state_flags = 0; |
| 566 | + layers[i]->Preroll(context); |
| 567 | + ASSERT_EQ(context->renderable_state_flags, 0) << "layer " << (i + 1); |
| 568 | + } |
| 569 | + opacity_layer->Preroll(context); |
| 570 | + ASSERT_FALSE(opacity_layer->children_can_accept_opacity()); |
| 571 | + LayerTree::TryToRasterCache(*context->raster_cached_entries, &paint_context(), |
| 572 | + false); |
| 573 | + context->raster_cached_entries->clear(); |
| 574 | + context->raster_cache->BeginFrame(); |
| 575 | + for (int i = 0; i < layer_count; i++) { |
| 576 | + context->renderable_state_flags = 0; |
| 577 | + layers[i]->Preroll(context); |
| 578 | + ASSERT_EQ(context->renderable_state_flags, |
| 579 | + LayerStateStack::kCallerCanApplyOpacity) |
| 580 | + << "layer " << (i + 1); |
| 581 | + } |
| 582 | + opacity_layer->Preroll(context); |
| 583 | + ASSERT_TRUE(opacity_layer->children_can_accept_opacity()); |
| 584 | +} |
| 585 | + |
519 | 586 | } // namespace testing |
520 | 587 | } // namespace flutter |
0 commit comments