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

Commit 1776db3

Browse files
committed
Move FlutterBackingStorePresentInfo into FlutterBackingStore
1 parent 07888be commit 1776db3

21 files changed

+590
-329
lines changed

ci/licenses_golden/licenses_flutter

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2785,6 +2785,8 @@ ORIGIN: ../../../flutter/shell/platform/darwin/macos/framework/Source/TestFlutte
27852785
ORIGIN: ../../../flutter/shell/platform/darwin/macos/framework/Source/TestFlutterPlatformView.mm + ../../../flutter/LICENSE
27862786
ORIGIN: ../../../flutter/shell/platform/embedder/embedder.cc + ../../../flutter/LICENSE
27872787
ORIGIN: ../../../flutter/shell/platform/embedder/embedder.h + ../../../flutter/LICENSE
2788+
ORIGIN: ../../../flutter/shell/platform/embedder/embedder_backing_store.cc + ../../../flutter/LICENSE
2789+
ORIGIN: ../../../flutter/shell/platform/embedder/embedder_backing_store.h + ../../../flutter/LICENSE
27882790
ORIGIN: ../../../flutter/shell/platform/embedder/embedder_engine.cc + ../../../flutter/LICENSE
27892791
ORIGIN: ../../../flutter/shell/platform/embedder/embedder_engine.h + ../../../flutter/LICENSE
27902792
ORIGIN: ../../../flutter/shell/platform/embedder/embedder_exports.lst + ../../../flutter/LICENSE
@@ -5480,6 +5482,8 @@ FILE: ../../../flutter/shell/platform/embedder/assets/EmbedderInfo.plist
54805482
FILE: ../../../flutter/shell/platform/embedder/assets/embedder.modulemap
54815483
FILE: ../../../flutter/shell/platform/embedder/embedder.cc
54825484
FILE: ../../../flutter/shell/platform/embedder/embedder.h
5485+
FILE: ../../../flutter/shell/platform/embedder/embedder_backing_store.cc
5486+
FILE: ../../../flutter/shell/platform/embedder/embedder_backing_store.h
54835487
FILE: ../../../flutter/shell/platform/embedder/embedder_engine.cc
54845488
FILE: ../../../flutter/shell/platform/embedder/embedder_engine.h
54855489
FILE: ../../../flutter/shell/platform/embedder/embedder_exports.lst

shell/platform/darwin/macos/framework/Source/FlutterCompositor.mm

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@
5757
info.surface = surface;
5858
info.offset = CGPointMake(layer->offset.x, layer->offset.y);
5959
info.zIndex = i;
60-
FlutterBackingStorePresentInfo* present_info = layer->backing_store_present_info;
60+
FlutterBackingStorePresentInfo* present_info = layer->backing_store->present_info;
6161
if (present_info != nullptr && present_info->paint_region != nullptr) {
6262
auto paint_region = present_info->paint_region;
6363
info.paintRegion = std::vector<FlutterRect>(

shell/platform/embedder/BUILD.gn

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,8 @@ template("embedder_source_set") {
5858
source_set(target_name) {
5959
sources = [
6060
"embedder.cc",
61+
"embedder_backing_store.cc",
62+
"embedder_backing_store.h",
6163
"embedder_engine.cc",
6264
"embedder_engine.h",
6365
"embedder_external_texture_resolver.cc",

shell/platform/embedder/embedder.cc

Lines changed: 23 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ extern const intptr_t kPlatformStrongDillSize;
5151
#include "flutter/shell/common/rasterizer.h"
5252
#include "flutter/shell/common/switches.h"
5353
#include "flutter/shell/platform/embedder/embedder.h"
54+
#include "flutter/shell/platform/embedder/embedder_backing_store.h"
5455
#include "flutter/shell/platform/embedder/embedder_engine.h"
5556
#include "flutter/shell/platform/embedder/embedder_external_texture_resolver.h"
5657
#include "flutter/shell/platform/embedder/embedder_platform_message_response.h"
@@ -924,7 +925,7 @@ static sk_sp<SkSurface> MakeSkSurfaceFromBackingStore(
924925

925926
static std::unique_ptr<flutter::EmbedderRenderTarget>
926927
MakeRenderTargetFromBackingStoreImpeller(
927-
FlutterBackingStore backing_store,
928+
flutter::EmbedderBackingStore backing_store,
928929
const fml::closure& on_release,
929930
const std::shared_ptr<impeller::AiksContext>& aiks_context,
930931
const FlutterBackingStoreConfig& config,
@@ -1046,7 +1047,7 @@ static sk_sp<SkSurface> MakeSkSurfaceFromBackingStore(
10461047
}
10471048

10481049
static std::unique_ptr<flutter::EmbedderRenderTarget>
1049-
MakeRenderTargetFromSkSurface(FlutterBackingStore backing_store,
1050+
MakeRenderTargetFromSkSurface(flutter::EmbedderBackingStore backing_store,
10501051
sk_sp<SkSurface> skia_surface,
10511052
fml::closure on_release) {
10521053
if (!skia_surface) {
@@ -1063,8 +1064,7 @@ CreateEmbedderRenderTarget(
10631064
GrDirectContext* context,
10641065
const std::shared_ptr<impeller::AiksContext>& aiks_context,
10651066
bool enable_impeller) {
1066-
FlutterBackingStore backing_store = {};
1067-
backing_store.struct_size = sizeof(backing_store);
1067+
flutter::EmbedderBackingStore backing_store;
10681068

10691069
// Safe access checks on the compositor struct have been performed in
10701070
// InferExternalViewEmbedderFromArgs and are not necessary here.
@@ -1073,13 +1073,16 @@ CreateEmbedderRenderTarget(
10731073

10741074
{
10751075
TRACE_EVENT0("flutter", "FlutterCompositorCreateBackingStore");
1076-
if (!c_create_callback(&config, &backing_store, compositor->user_data)) {
1076+
if (!c_create_callback(&config,
1077+
static_cast<FlutterBackingStore*>(
1078+
backing_store.GetBackingStorePointer()),
1079+
compositor->user_data)) {
10771080
FML_LOG(ERROR) << "Could not create the embedder backing store.";
10781081
return nullptr;
10791082
}
10801083
}
10811084

1082-
if (backing_store.struct_size != sizeof(backing_store)) {
1085+
if (!backing_store.IsValid()) {
10831086
FML_LOG(ERROR) << "Embedder modified the backing store struct size.";
10841087
return nullptr;
10851088
}
@@ -1091,28 +1094,30 @@ CreateEmbedderRenderTarget(
10911094
fml::ScopedCleanupClosure collect_callback(
10921095
[c_collect_callback, backing_store, user_data = compositor->user_data]() {
10931096
TRACE_EVENT0("flutter", "FlutterCompositorCollectBackingStore");
1094-
c_collect_callback(&backing_store, user_data);
1097+
c_collect_callback(static_cast<const FlutterBackingStore*>(
1098+
backing_store.GetBackingStorePointer()),
1099+
user_data);
10951100
});
10961101

10971102
// No safe access checks on the renderer are necessary since we allocated
10981103
// the struct.
10991104

11001105
std::unique_ptr<flutter::EmbedderRenderTarget> render_target;
11011106

1102-
switch (backing_store.type) {
1107+
switch (backing_store.type()) {
11031108
case kFlutterBackingStoreTypeOpenGL: {
1104-
switch (backing_store.open_gl.type) {
1109+
switch (backing_store.open_gl().type) {
11051110
case kFlutterOpenGLTargetTypeTexture: {
11061111
auto skia_surface = MakeSkSurfaceFromBackingStore(
1107-
context, config, &backing_store.open_gl.texture);
1112+
context, config, &backing_store.open_gl().texture);
11081113
render_target = MakeRenderTargetFromSkSurface(
11091114
backing_store, std::move(skia_surface),
11101115
collect_callback.Release());
11111116
break;
11121117
}
11131118
case kFlutterOpenGLTargetTypeFramebuffer: {
11141119
auto skia_surface = MakeSkSurfaceFromBackingStore(
1115-
context, config, &backing_store.open_gl.framebuffer);
1120+
context, config, &backing_store.open_gl().framebuffer);
11161121
render_target = MakeRenderTargetFromSkSurface(
11171122
backing_store, std::move(skia_surface),
11181123
collect_callback.Release());
@@ -1123,14 +1128,14 @@ CreateEmbedderRenderTarget(
11231128
}
11241129
case kFlutterBackingStoreTypeSoftware: {
11251130
auto skia_surface = MakeSkSurfaceFromBackingStore(
1126-
context, config, &backing_store.software);
1131+
context, config, &backing_store.software());
11271132
render_target = MakeRenderTargetFromSkSurface(
11281133
backing_store, std::move(skia_surface), collect_callback.Release());
11291134
break;
11301135
}
11311136
case kFlutterBackingStoreTypeSoftware2: {
11321137
auto skia_surface = MakeSkSurfaceFromBackingStore(
1133-
context, config, &backing_store.software2);
1138+
context, config, &backing_store.software2());
11341139
render_target = MakeRenderTargetFromSkSurface(
11351140
backing_store, std::move(skia_surface), collect_callback.Release());
11361141
break;
@@ -1139,18 +1144,18 @@ CreateEmbedderRenderTarget(
11391144
if (enable_impeller) {
11401145
render_target = MakeRenderTargetFromBackingStoreImpeller(
11411146
backing_store, collect_callback.Release(), aiks_context, config,
1142-
&backing_store.metal);
1147+
&backing_store.metal());
11431148
} else {
1144-
auto skia_surface = MakeSkSurfaceFromBackingStore(context, config,
1145-
&backing_store.metal);
1149+
auto skia_surface = MakeSkSurfaceFromBackingStore(
1150+
context, config, &backing_store.metal());
11461151
render_target = MakeRenderTargetFromSkSurface(
11471152
backing_store, std::move(skia_surface), collect_callback.Release());
11481153
}
11491154
break;
11501155
}
11511156
case kFlutterBackingStoreTypeVulkan: {
1152-
auto skia_surface =
1153-
MakeSkSurfaceFromBackingStore(context, config, &backing_store.vulkan);
1157+
auto skia_surface = MakeSkSurfaceFromBackingStore(
1158+
context, config, &backing_store.vulkan());
11541159
render_target = MakeRenderTargetFromSkSurface(
11551160
backing_store, std::move(skia_surface), collect_callback.Release());
11561161
break;

shell/platform/embedder/embedder.h

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1527,6 +1527,24 @@ typedef enum {
15271527
kFlutterBackingStoreTypeSoftware2,
15281528
} FlutterBackingStoreType;
15291529

1530+
typedef struct {
1531+
/// The size of this struct. Must be sizeof(FlutterRegion).
1532+
size_t struct_size;
1533+
/// Number of rectangles in the region.
1534+
size_t rects_count;
1535+
/// The rectangles that make up the region.
1536+
FlutterRect* rects;
1537+
} FlutterRegion;
1538+
1539+
typedef struct {
1540+
size_t struct_size;
1541+
1542+
/// The area of the backing store that contains Flutter contents. Pixels
1543+
/// outside of this area are transparent and the embedder may choose not
1544+
/// to render them. Coordinates are in physical pixels.
1545+
FlutterRegion* paint_region;
1546+
} FlutterBackingStorePresentInfo;
1547+
15301548
typedef struct {
15311549
/// The size of this struct. Must be sizeof(FlutterBackingStore).
15321550
size_t struct_size;
@@ -1551,6 +1569,10 @@ typedef struct {
15511569
// The description of the Vulkan backing store.
15521570
FlutterVulkanBackingStore vulkan;
15531571
};
1572+
1573+
/// Extra information set by the engine for the backing store that the
1574+
/// embedder may use during presentation.
1575+
FlutterBackingStorePresentInfo* present_info;
15541576
} FlutterBackingStore;
15551577

15561578
typedef struct {
@@ -1568,24 +1590,6 @@ typedef enum {
15681590
kFlutterLayerContentTypePlatformView,
15691591
} FlutterLayerContentType;
15701592

1571-
typedef struct {
1572-
/// The size of this struct. Must be sizeof(FlutterRegion).
1573-
size_t struct_size;
1574-
/// Number of rectangles in the region.
1575-
size_t rects_count;
1576-
/// The rectangles that make up the region.
1577-
FlutterRect* rects;
1578-
} FlutterRegion;
1579-
1580-
typedef struct {
1581-
size_t struct_size;
1582-
1583-
/// The area of the backing store that contains Flutter contents. Pixels
1584-
/// outside of this area are transparent and the embedder may choose not
1585-
/// to render them. Coordinates are in physical pixels.
1586-
FlutterRegion* paint_region;
1587-
} FlutterBackingStorePresentInfo;
1588-
15891593
typedef struct {
15901594
/// This size of this struct. Must be sizeof(FlutterLayer).
15911595
size_t struct_size;
@@ -1605,10 +1609,6 @@ typedef struct {
16051609
FlutterPoint offset;
16061610
/// The size of the layer (in physical pixels).
16071611
FlutterSize size;
1608-
1609-
/// Extra information for the backing store that the embedder may
1610-
/// use during presentation.
1611-
FlutterBackingStorePresentInfo* backing_store_present_info;
16121612
} FlutterLayer;
16131613

16141614
typedef bool (*FlutterBackingStoreCreateCallback)(
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
// Copyright 2013 The Flutter Authors. All rights reserved.
2+
// Use of this source code is governed by a BSD-style license that can be
3+
// found in the LICENSE file.
4+
5+
#include "flutter/shell/platform/embedder/embedder_backing_store.h"
6+
7+
namespace flutter {
8+
9+
bool EmbedderBackingStore::SetPresetInfo(FlutterBackingStorePresentInfo* info) {
10+
if (backing_store_.struct_size == sizeof(FlutterBackingStoreVersion2)) {
11+
version2_.present_info = info;
12+
return true;
13+
} else {
14+
return false;
15+
}
16+
}
17+
} // namespace flutter
Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
// Copyright 2013 The Flutter Authors. All rights reserved.
2+
// Use of this source code is governed by a BSD-style license that can be
3+
// found in the LICENSE file.
4+
5+
#ifndef FLUTTER_SHELL_PLATFORM_EMBEDDER_EMBEDDER_BACKING_STORE_H_
6+
#define FLUTTER_SHELL_PLATFORM_EMBEDDER_EMBEDDER_BACKING_STORE_H_
7+
8+
#include "flutter/shell/platform/embedder/embedder.h"
9+
10+
namespace flutter {
11+
12+
typedef struct {
13+
/// The size of this struct. Must be sizeof(FlutterBackingStore).
14+
size_t struct_size;
15+
/// A baton that is not interpreted by the engine in any way. The embedder may
16+
/// use this to associate resources that are tied to the lifecycle of the
17+
/// `FlutterBackingStore`.
18+
void* user_data;
19+
/// Specifies the type of backing store.
20+
FlutterBackingStoreType type;
21+
/// Indicates if this backing store was updated since the last time it was
22+
/// associated with a presented layer.
23+
bool did_update;
24+
union {
25+
/// The description of the OpenGL backing store.
26+
FlutterOpenGLBackingStore open_gl;
27+
/// The description of the software backing store.
28+
FlutterSoftwareBackingStore software;
29+
/// The description of the software backing store.
30+
FlutterSoftwareBackingStore2 software2;
31+
// The description of the Metal backing store.
32+
FlutterMetalBackingStore metal;
33+
// The description of the Vulkan backing store.
34+
FlutterVulkanBackingStore vulkan;
35+
};
36+
} FlutterBackingStoreVersion1;
37+
38+
typedef FlutterBackingStore FlutterBackingStoreVersion2;
39+
40+
/// Wrapper around FlutterBackingStore that handles different versions of the
41+
/// struct.
42+
class EmbedderBackingStore {
43+
public:
44+
EmbedderBackingStore() {
45+
// By default assume the oldest version of backing store. Embedder can
46+
// override this by setting the struct_size field.
47+
backing_store_ = {
48+
.struct_size = sizeof(FlutterBackingStoreVersion1),
49+
};
50+
}
51+
52+
bool IsValid() const {
53+
return backing_store_.struct_size == sizeof(FlutterBackingStoreVersion1) ||
54+
backing_store_.struct_size == sizeof(FlutterBackingStoreVersion2);
55+
}
56+
57+
FlutterBackingStoreType type() const { return version1_.type; }
58+
59+
const FlutterOpenGLBackingStore& open_gl() const { return version1_.open_gl; }
60+
61+
const FlutterSoftwareBackingStore& software() const {
62+
return version1_.software;
63+
}
64+
65+
const FlutterSoftwareBackingStore2& software2() const {
66+
return version1_.software2;
67+
}
68+
69+
const FlutterMetalBackingStore& metal() const { return version1_.metal; }
70+
71+
const FlutterVulkanBackingStore& vulkan() const { return version1_.vulkan; }
72+
73+
void SetDidUpdate(bool did_update) { version1_.did_update = true; }
74+
75+
bool SetPresetInfo(FlutterBackingStorePresentInfo* info);
76+
77+
/// Returns pointer to the backing store. This is intentionally opaque to
78+
/// prevent embedder from accessing the fields directly and is meant for
79+
/// passing back to the embedder client.
80+
void* GetBackingStorePointer() { return &backing_store_; }
81+
const void* GetBackingStorePointer() const { return &backing_store_; }
82+
83+
private:
84+
union {
85+
size_t struct_size_;
86+
FlutterBackingStoreVersion1 version1_;
87+
FlutterBackingStoreVersion2 version2_;
88+
FlutterBackingStore backing_store_;
89+
};
90+
};
91+
92+
} // namespace flutter
93+
94+
#endif // FLUTTER_SHELL_PLATFORM_EMBEDDER_EMBEDDER_BACKING_STORE_H_

shell/platform/embedder/embedder_layers.cc

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,14 @@ EmbedderLayers::EmbedderLayers(SkISize frame_size,
1818
EmbedderLayers::~EmbedderLayers() = default;
1919

2020
void EmbedderLayers::PushBackingStoreLayer(
21-
const FlutterBackingStore* store,
21+
EmbedderBackingStore* store,
2222
const std::vector<SkIRect>& paint_region_vec) {
2323
FlutterLayer layer = {};
2424

2525
layer.struct_size = sizeof(FlutterLayer);
2626
layer.type = kFlutterLayerContentTypeBackingStore;
27-
layer.backing_store = store;
27+
layer.backing_store =
28+
static_cast<const FlutterBackingStore*>(store->GetBackingStorePointer());
2829

2930
const auto layer_bounds =
3031
SkRect::MakeWH(frame_size_.width(), frame_size_.height());
@@ -61,7 +62,7 @@ void EmbedderLayers::PushBackingStoreLayer(
6162
present_info->struct_size = sizeof(FlutterBackingStorePresentInfo);
6263
present_info->paint_region = paint_region.get();
6364
regions_referenced_.push_back(std::move(paint_region));
64-
layer.backing_store_present_info = present_info.get();
65+
store->SetPresetInfo(present_info.get());
6566

6667
present_info_referenced_.push_back(std::move(present_info));
6768
presented_layers_.push_back(layer);

shell/platform/embedder/embedder_layers.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
#include "flutter/flow/embedded_views.h"
1212
#include "flutter/fml/macros.h"
1313
#include "flutter/shell/platform/embedder/embedder.h"
14+
#include "flutter/shell/platform/embedder/embedder_backing_store.h"
1415
#include "third_party/skia/include/core/SkMatrix.h"
1516
#include "third_party/skia/include/core/SkSize.h"
1617

@@ -24,7 +25,7 @@ class EmbedderLayers {
2425

2526
~EmbedderLayers();
2627

27-
void PushBackingStoreLayer(const FlutterBackingStore* store,
28+
void PushBackingStoreLayer(EmbedderBackingStore* store,
2829
const std::vector<SkIRect>& drawn_region);
2930

3031
void PushPlatformViewLayer(FlutterPlatformViewIdentifier identifier,

0 commit comments

Comments
 (0)