Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Commit 2e7bf6e

Browse files
committed
[embedder] Allow for the backing stores to not be cached
1 parent a9f332c commit 2e7bf6e

File tree

5 files changed

+46
-3
lines changed

5 files changed

+46
-3
lines changed

shell/platform/embedder/embedder.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -858,6 +858,8 @@ typedef struct {
858858
/// Indicates if this backing store was updated since the last time it was
859859
/// associated with a presented layer.
860860
bool did_update;
861+
/// Indicates whether this backing store can be cached and re-used.
862+
bool is_cacheable;
861863
union {
862864
/// The description of the OpenGL backing store.
863865
FlutterOpenGLBackingStore open_gl;

shell/platform/embedder/embedder_external_view_embedder.cc

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
#include "flutter/shell/platform/embedder/embedder_layers.h"
1010
#include "flutter/shell/platform/embedder/embedder_render_target.h"
11+
#include "flutter/shell/platform/embedder/embedder_struct_macros.h"
1112
#include "third_party/skia/include/gpu/GrDirectContext.h"
1213

1314
namespace flutter {
@@ -263,8 +264,12 @@ void EmbedderExternalViewEmbedder::SubmitFrame(
263264
// Hold all rendered layers in the render target cache for one frame to
264265
// see if they may be reused next frame.
265266
for (auto& render_target : matched_render_targets) {
266-
render_target_cache_.CacheRenderTarget(render_target.first,
267-
std::move(render_target.second));
267+
const FlutterBackingStore* backing_store =
268+
render_target.second->GetBackingStore();
269+
if (SAFE_ACCESS(backing_store, is_cacheable, true)) {
270+
render_target_cache_.CacheRenderTarget(render_target.first,
271+
std::move(render_target.second));
272+
}
268273
}
269274

270275
frame->Submit();

shell/platform/embedder/tests/embedder_assertions.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,8 @@ inline bool operator==(const FlutterSoftwareBackingStore& a,
9191
inline bool operator==(const FlutterBackingStore& a,
9292
const FlutterBackingStore& b) {
9393
if (!(a.struct_size == b.struct_size && a.user_data == b.user_data &&
94-
a.type == b.type && a.did_update == b.did_update)) {
94+
a.type == b.type && a.did_update == b.did_update &&
95+
a.is_cacheable == b.is_cacheable)) {
9596
return false;
9697
}
9798

shell/platform/embedder/tests/embedder_unittests.cc

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -552,6 +552,7 @@ TEST_F(EmbedderTest,
552552
FlutterBackingStore backing_store = *layers[0]->backing_store;
553553
backing_store.type = kFlutterBackingStoreTypeSoftware;
554554
backing_store.did_update = true;
555+
backing_store.is_cacheable = true;
555556
backing_store.software.height = 600;
556557

557558
FlutterLayer layer = {};
@@ -585,6 +586,7 @@ TEST_F(EmbedderTest,
585586
FlutterBackingStore backing_store = *layers[2]->backing_store;
586587
backing_store.type = kFlutterBackingStoreTypeSoftware;
587588
backing_store.did_update = true;
589+
backing_store.is_cacheable = true;
588590
backing_store.software.height = 600;
589591

590592
FlutterLayer layer = {};
@@ -618,6 +620,7 @@ TEST_F(EmbedderTest,
618620
FlutterBackingStore backing_store = *layers[4]->backing_store;
619621
backing_store.type = kFlutterBackingStoreTypeSoftware;
620622
backing_store.did_update = true;
623+
backing_store.is_cacheable = true;
621624
backing_store.software.height = 600;
622625

623626
FlutterLayer layer = {};
@@ -862,6 +865,7 @@ TEST_F(EmbedderTest, VerifyB143464703WithSoftwareBackend) {
862865
FlutterBackingStore backing_store = *layers[0]->backing_store;
863866
backing_store.type = kFlutterBackingStoreTypeSoftware;
864867
backing_store.did_update = true;
868+
backing_store.is_cacheable = true;
865869

866870
FlutterLayer layer = {};
867871
layer.struct_size = sizeof(layer);
@@ -894,6 +898,7 @@ TEST_F(EmbedderTest, VerifyB143464703WithSoftwareBackend) {
894898
FlutterBackingStore backing_store = *layers[2]->backing_store;
895899
backing_store.type = kFlutterBackingStoreTypeSoftware;
896900
backing_store.did_update = true;
901+
backing_store.is_cacheable = true;
897902

898903
FlutterLayer layer = {};
899904
layer.struct_size = sizeof(layer);

shell/platform/embedder/tests/embedder_unittests_gl.cc

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,7 @@ TEST_F(EmbedderTest, CompositorMustBeAbleToRenderToOpenGLFramebuffer) {
8585
backing_store.struct_size = sizeof(backing_store);
8686
backing_store.type = kFlutterBackingStoreTypeOpenGL;
8787
backing_store.did_update = true;
88+
backing_store.is_cacheable = true;
8889
backing_store.open_gl.type = kFlutterOpenGLTargetTypeFramebuffer;
8990

9091
FlutterLayer layer = {};
@@ -117,6 +118,7 @@ TEST_F(EmbedderTest, CompositorMustBeAbleToRenderToOpenGLFramebuffer) {
117118
backing_store.struct_size = sizeof(backing_store);
118119
backing_store.type = kFlutterBackingStoreTypeOpenGL;
119120
backing_store.did_update = true;
121+
backing_store.is_cacheable = true;
120122
backing_store.open_gl.type = kFlutterOpenGLTargetTypeFramebuffer;
121123

122124
FlutterLayer layer = {};
@@ -178,6 +180,7 @@ TEST_F(EmbedderTest, RasterCacheDisabledWithPlatformViews) {
178180
backing_store.struct_size = sizeof(backing_store);
179181
backing_store.type = kFlutterBackingStoreTypeOpenGL;
180182
backing_store.did_update = true;
183+
backing_store.is_cacheable = true;
181184
backing_store.open_gl.type = kFlutterOpenGLTargetTypeFramebuffer;
182185

183186
FlutterLayer layer = {};
@@ -210,6 +213,7 @@ TEST_F(EmbedderTest, RasterCacheDisabledWithPlatformViews) {
210213
backing_store.struct_size = sizeof(backing_store);
211214
backing_store.type = kFlutterBackingStoreTypeOpenGL;
212215
backing_store.did_update = true;
216+
backing_store.is_cacheable = true;
213217
backing_store.open_gl.type = kFlutterOpenGLTargetTypeFramebuffer;
214218

215219
FlutterLayer layer = {};
@@ -282,6 +286,7 @@ TEST_F(EmbedderTest, RasterCacheEnabled) {
282286
backing_store.struct_size = sizeof(backing_store);
283287
backing_store.type = kFlutterBackingStoreTypeOpenGL;
284288
backing_store.did_update = true;
289+
backing_store.is_cacheable = true;
285290
backing_store.open_gl.type = kFlutterOpenGLTargetTypeFramebuffer;
286291

287292
FlutterLayer layer = {};
@@ -351,6 +356,7 @@ TEST_F(EmbedderTest, CompositorMustBeAbleToRenderToOpenGLTexture) {
351356
backing_store.struct_size = sizeof(backing_store);
352357
backing_store.type = kFlutterBackingStoreTypeOpenGL;
353358
backing_store.did_update = true;
359+
backing_store.is_cacheable = true;
354360
backing_store.open_gl.type = kFlutterOpenGLTargetTypeTexture;
355361

356362
FlutterLayer layer = {};
@@ -383,6 +389,7 @@ TEST_F(EmbedderTest, CompositorMustBeAbleToRenderToOpenGLTexture) {
383389
backing_store.struct_size = sizeof(backing_store);
384390
backing_store.type = kFlutterBackingStoreTypeOpenGL;
385391
backing_store.did_update = true;
392+
backing_store.is_cacheable = true;
386393
backing_store.open_gl.type = kFlutterOpenGLTargetTypeTexture;
387394

388395
FlutterLayer layer = {};
@@ -443,6 +450,7 @@ TEST_F(EmbedderTest, CompositorMustBeAbleToRenderToSoftwareBuffer) {
443450
backing_store.struct_size = sizeof(backing_store);
444451
backing_store.type = kFlutterBackingStoreTypeSoftware;
445452
backing_store.did_update = true;
453+
backing_store.is_cacheable = true;
446454
ASSERT_FLOAT_EQ(
447455
backing_store.software.row_bytes * backing_store.software.height,
448456
800 * 4 * 600.0);
@@ -477,6 +485,7 @@ TEST_F(EmbedderTest, CompositorMustBeAbleToRenderToSoftwareBuffer) {
477485
backing_store.struct_size = sizeof(backing_store);
478486
backing_store.type = kFlutterBackingStoreTypeSoftware;
479487
backing_store.did_update = true;
488+
backing_store.is_cacheable = true;
480489
FlutterLayer layer = {};
481490
layer.struct_size = sizeof(layer);
482491
layer.type = kFlutterLayerContentTypeBackingStore;
@@ -537,6 +546,7 @@ TEST_F(EmbedderTest, CompositorMustBeAbleToRenderKnownScene) {
537546
FlutterBackingStore backing_store = *layers[0]->backing_store;
538547
backing_store.type = kFlutterBackingStoreTypeOpenGL;
539548
backing_store.did_update = true;
549+
backing_store.is_cacheable = true;
540550
backing_store.open_gl.type = kFlutterOpenGLTargetTypeTexture;
541551

542552
FlutterLayer layer = {};
@@ -570,6 +580,7 @@ TEST_F(EmbedderTest, CompositorMustBeAbleToRenderKnownScene) {
570580
FlutterBackingStore backing_store = *layers[2]->backing_store;
571581
backing_store.type = kFlutterBackingStoreTypeOpenGL;
572582
backing_store.did_update = true;
583+
backing_store.is_cacheable = true;
573584
backing_store.open_gl.type = kFlutterOpenGLTargetTypeTexture;
574585

575586
FlutterLayer layer = {};
@@ -603,6 +614,7 @@ TEST_F(EmbedderTest, CompositorMustBeAbleToRenderKnownScene) {
603614
FlutterBackingStore backing_store = *layers[4]->backing_store;
604615
backing_store.type = kFlutterBackingStoreTypeOpenGL;
605616
backing_store.did_update = true;
617+
backing_store.is_cacheable = true;
606618
backing_store.open_gl.type = kFlutterOpenGLTargetTypeTexture;
607619

608620
FlutterLayer layer = {};
@@ -720,6 +732,7 @@ TEST_F(EmbedderTest, CustomCompositorMustWorkWithCustomTaskRunner) {
720732
backing_store.struct_size = sizeof(backing_store);
721733
backing_store.type = kFlutterBackingStoreTypeOpenGL;
722734
backing_store.did_update = true;
735+
backing_store.is_cacheable = true;
723736
backing_store.open_gl.type = kFlutterOpenGLTargetTypeTexture;
724737

725738
FlutterLayer layer = {};
@@ -752,6 +765,7 @@ TEST_F(EmbedderTest, CustomCompositorMustWorkWithCustomTaskRunner) {
752765
backing_store.struct_size = sizeof(backing_store);
753766
backing_store.type = kFlutterBackingStoreTypeOpenGL;
754767
backing_store.did_update = true;
768+
backing_store.is_cacheable = true;
755769
backing_store.open_gl.type = kFlutterOpenGLTargetTypeTexture;
756770

757771
FlutterLayer layer = {};
@@ -834,6 +848,7 @@ TEST_F(EmbedderTest, CompositorMustBeAbleToRenderWithRootLayerOnly) {
834848
FlutterBackingStore backing_store = *layers[0]->backing_store;
835849
backing_store.type = kFlutterBackingStoreTypeOpenGL;
836850
backing_store.did_update = true;
851+
backing_store.is_cacheable = true;
837852
backing_store.open_gl.type = kFlutterOpenGLTargetTypeTexture;
838853

839854
FlutterLayer layer = {};
@@ -901,6 +916,7 @@ TEST_F(EmbedderTest, CompositorMustBeAbleToRenderWithPlatformLayerOnBottom) {
901916
FlutterBackingStore backing_store = *layers[0]->backing_store;
902917
backing_store.type = kFlutterBackingStoreTypeOpenGL;
903918
backing_store.did_update = true;
919+
backing_store.is_cacheable = true;
904920
backing_store.open_gl.type = kFlutterOpenGLTargetTypeTexture;
905921

906922
FlutterLayer layer = {};
@@ -1021,6 +1037,7 @@ TEST_F(EmbedderTest,
10211037
FlutterBackingStore backing_store = *layers[0]->backing_store;
10221038
backing_store.type = kFlutterBackingStoreTypeOpenGL;
10231039
backing_store.did_update = true;
1040+
backing_store.is_cacheable = true;
10241041
backing_store.open_gl.type = kFlutterOpenGLTargetTypeTexture;
10251042

10261043
FlutterLayer layer = {};
@@ -1054,6 +1071,7 @@ TEST_F(EmbedderTest,
10541071
FlutterBackingStore backing_store = *layers[2]->backing_store;
10551072
backing_store.type = kFlutterBackingStoreTypeOpenGL;
10561073
backing_store.did_update = true;
1074+
backing_store.is_cacheable = true;
10571075
backing_store.open_gl.type = kFlutterOpenGLTargetTypeTexture;
10581076

10591077
FlutterLayer layer = {};
@@ -1087,6 +1105,7 @@ TEST_F(EmbedderTest,
10871105
FlutterBackingStore backing_store = *layers[4]->backing_store;
10881106
backing_store.type = kFlutterBackingStoreTypeOpenGL;
10891107
backing_store.did_update = true;
1108+
backing_store.is_cacheable = true;
10901109
backing_store.open_gl.type = kFlutterOpenGLTargetTypeTexture;
10911110

10921111
FlutterLayer layer = {};
@@ -1365,6 +1384,7 @@ TEST_F(EmbedderTest, CanRenderGradientWithCompositorOnNonRootLayer) {
13651384
FlutterBackingStore backing_store = *layers[0]->backing_store;
13661385
backing_store.type = kFlutterBackingStoreTypeOpenGL;
13671386
backing_store.did_update = true;
1387+
backing_store.is_cacheable = true;
13681388
backing_store.open_gl.type = kFlutterOpenGLTargetTypeFramebuffer;
13691389

13701390
FlutterLayer layer = {};
@@ -1398,6 +1418,7 @@ TEST_F(EmbedderTest, CanRenderGradientWithCompositorOnNonRootLayer) {
13981418
FlutterBackingStore backing_store = *layers[2]->backing_store;
13991419
backing_store.type = kFlutterBackingStoreTypeOpenGL;
14001420
backing_store.did_update = true;
1421+
backing_store.is_cacheable = true;
14011422
backing_store.open_gl.type = kFlutterOpenGLTargetTypeFramebuffer;
14021423

14031424
FlutterLayer layer = {};
@@ -1478,6 +1499,7 @@ TEST_F(EmbedderTest, CanRenderGradientWithCompositorOnNonRootLayerWithXform) {
14781499
FlutterBackingStore backing_store = *layers[0]->backing_store;
14791500
backing_store.type = kFlutterBackingStoreTypeOpenGL;
14801501
backing_store.did_update = true;
1502+
backing_store.is_cacheable = true;
14811503
backing_store.open_gl.type = kFlutterOpenGLTargetTypeFramebuffer;
14821504

14831505
FlutterLayer layer = {};
@@ -1511,6 +1533,7 @@ TEST_F(EmbedderTest, CanRenderGradientWithCompositorOnNonRootLayerWithXform) {
15111533
FlutterBackingStore backing_store = *layers[2]->backing_store;
15121534
backing_store.type = kFlutterBackingStoreTypeOpenGL;
15131535
backing_store.did_update = true;
1536+
backing_store.is_cacheable = true;
15141537
backing_store.open_gl.type = kFlutterOpenGLTargetTypeFramebuffer;
15151538

15161539
FlutterLayer layer = {};
@@ -1822,6 +1845,7 @@ TEST_F(EmbedderTest,
18221845
FlutterBackingStore backing_store = *layers[0]->backing_store;
18231846
backing_store.type = kFlutterBackingStoreTypeOpenGL;
18241847
backing_store.did_update = true;
1848+
backing_store.is_cacheable = true;
18251849
backing_store.open_gl.type = kFlutterOpenGLTargetTypeTexture;
18261850

18271851
FlutterLayer layer = {};
@@ -1855,6 +1879,7 @@ TEST_F(EmbedderTest,
18551879
FlutterBackingStore backing_store = *layers[2]->backing_store;
18561880
backing_store.type = kFlutterBackingStoreTypeOpenGL;
18571881
backing_store.did_update = true;
1882+
backing_store.is_cacheable = true;
18581883
backing_store.open_gl.type = kFlutterOpenGLTargetTypeTexture;
18591884

18601885
FlutterLayer layer = {};
@@ -1917,6 +1942,7 @@ TEST_F(
19171942
FlutterBackingStore backing_store = *layers[0]->backing_store;
19181943
backing_store.type = kFlutterBackingStoreTypeOpenGL;
19191944
backing_store.did_update = true;
1945+
backing_store.is_cacheable = true;
19201946
backing_store.open_gl.type = kFlutterOpenGLTargetTypeTexture;
19211947

19221948
FlutterLayer layer = {};
@@ -1950,6 +1976,7 @@ TEST_F(
19501976
FlutterBackingStore backing_store = *layers[2]->backing_store;
19511977
backing_store.type = kFlutterBackingStoreTypeOpenGL;
19521978
backing_store.did_update = true;
1979+
backing_store.is_cacheable = true;
19531980
backing_store.open_gl.type = kFlutterOpenGLTargetTypeTexture;
19541981

19551982
FlutterLayer layer = {};
@@ -2083,6 +2110,7 @@ TEST_F(EmbedderTest, PlatformViewMutatorsAreValid) {
20832110
FlutterBackingStore backing_store = *layers[0]->backing_store;
20842111
backing_store.type = kFlutterBackingStoreTypeOpenGL;
20852112
backing_store.did_update = true;
2113+
backing_store.is_cacheable = true;
20862114
backing_store.open_gl.type = kFlutterOpenGLTargetTypeTexture;
20872115

20882116
FlutterLayer layer = {};
@@ -2179,6 +2207,7 @@ TEST_F(EmbedderTest, PlatformViewMutatorsAreValidWithPixelRatio) {
21792207
FlutterBackingStore backing_store = *layers[0]->backing_store;
21802208
backing_store.type = kFlutterBackingStoreTypeOpenGL;
21812209
backing_store.did_update = true;
2210+
backing_store.is_cacheable = true;
21822211
backing_store.open_gl.type = kFlutterOpenGLTargetTypeTexture;
21832212

21842213
FlutterLayer layer = {};
@@ -2281,6 +2310,7 @@ TEST_F(EmbedderTest,
22812310
FlutterBackingStore backing_store = *layers[0]->backing_store;
22822311
backing_store.type = kFlutterBackingStoreTypeOpenGL;
22832312
backing_store.did_update = true;
2313+
backing_store.is_cacheable = true;
22842314
backing_store.open_gl.type = kFlutterOpenGLTargetTypeTexture;
22852315

22862316
FlutterLayer layer = {};

0 commit comments

Comments
 (0)