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

Commit fb7cde6

Browse files
[Impeller] Support YUV external textures on iOS (#36685)
* Tweak Texture::Paint API * Support external textures for iOS * format code * Tweak code * format * Clean code * [Impeller] Support YUV external textures on iOS * Fix test * Clean code * Fix compile error * Add todo link * Clean code
1 parent 3593f34 commit fb7cde6

30 files changed

+464
-16
lines changed

ci/licenses_golden/licenses_flutter

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1212,6 +1212,8 @@ FILE: ../../../flutter/impeller/entity/contents/filters/morphology_filter_conten
12121212
FILE: ../../../flutter/impeller/entity/contents/filters/morphology_filter_contents.h
12131213
FILE: ../../../flutter/impeller/entity/contents/filters/srgb_to_linear_filter_contents.cc
12141214
FILE: ../../../flutter/impeller/entity/contents/filters/srgb_to_linear_filter_contents.h
1215+
FILE: ../../../flutter/impeller/entity/contents/filters/yuv_to_rgb_filter_contents.cc
1216+
FILE: ../../../flutter/impeller/entity/contents/filters/yuv_to_rgb_filter_contents.h
12151217
FILE: ../../../flutter/impeller/entity/contents/gradient_generator.cc
12161218
FILE: ../../../flutter/impeller/entity/contents/gradient_generator.h
12171219
FILE: ../../../flutter/impeller/entity/contents/linear_gradient_contents.cc
@@ -1301,6 +1303,8 @@ FILE: ../../../flutter/impeller/entity/shaders/texture_fill.vert
13011303
FILE: ../../../flutter/impeller/entity/shaders/tiled_texture_fill.frag
13021304
FILE: ../../../flutter/impeller/entity/shaders/tiled_texture_fill.vert
13031305
FILE: ../../../flutter/impeller/entity/shaders/vertices.frag
1306+
FILE: ../../../flutter/impeller/entity/shaders/yuv_to_rgb_filter.frag
1307+
FILE: ../../../flutter/impeller/entity/shaders/yuv_to_rgb_filter.vert
13041308
FILE: ../../../flutter/impeller/geometry/color.cc
13051309
FILE: ../../../flutter/impeller/geometry/color.h
13061310
FILE: ../../../flutter/impeller/geometry/constants.cc

common/graphics/texture.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,10 @@
1616

1717
class GrDirectContext;
1818

19+
namespace impeller {
20+
class AiksContext;
21+
};
22+
1923
namespace flutter {
2024

2125
class ContextListener {
@@ -39,6 +43,7 @@ class Texture : public ContextListener {
3943
SkCanvas* canvas = nullptr;
4044
DisplayListBuilder* builder = nullptr;
4145
GrDirectContext* gr_context = nullptr;
46+
impeller::AiksContext* aiks_context = nullptr;
4247
const SkPaint* sk_paint = nullptr;
4348
const DlPaint* dl_paint = nullptr;
4449
};

flow/compositor_context.cc

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -83,11 +83,12 @@ std::unique_ptr<CompositorContext::ScopedFrame> CompositorContext::AcquireFrame(
8383
bool surface_supports_readback,
8484
fml::RefPtr<fml::RasterThreadMerger>
8585
raster_thread_merger, // NOLINT(performance-unnecessary-value-param)
86-
DisplayListBuilder* display_list_builder) {
86+
DisplayListBuilder* display_list_builder,
87+
impeller::AiksContext* aiks_context) {
8788
return std::make_unique<ScopedFrame>(
8889
*this, gr_context, canvas, view_embedder, root_surface_transformation,
8990
instrumentation_enabled, surface_supports_readback, raster_thread_merger,
90-
display_list_builder);
91+
display_list_builder, aiks_context);
9192
}
9293

9394
CompositorContext::ScopedFrame::ScopedFrame(
@@ -99,11 +100,13 @@ CompositorContext::ScopedFrame::ScopedFrame(
99100
bool instrumentation_enabled,
100101
bool surface_supports_readback,
101102
fml::RefPtr<fml::RasterThreadMerger> raster_thread_merger,
102-
DisplayListBuilder* display_list_builder)
103+
DisplayListBuilder* display_list_builder,
104+
impeller::AiksContext* aiks_context)
103105
: context_(context),
104106
gr_context_(gr_context),
105107
canvas_(canvas),
106108
display_list_builder_(display_list_builder),
109+
aiks_context_(aiks_context),
107110
view_embedder_(view_embedder),
108111
root_surface_transformation_(root_surface_transformation),
109112
instrumentation_enabled_(instrumentation_enabled),

flow/compositor_context.h

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,8 @@ class CompositorContext {
114114
bool instrumentation_enabled,
115115
bool surface_supports_readback,
116116
fml::RefPtr<fml::RasterThreadMerger> raster_thread_merger,
117-
DisplayListBuilder* display_list_builder);
117+
DisplayListBuilder* display_list_builder,
118+
impeller::AiksContext* aiks_context);
118119

119120
virtual ~ScopedFrame();
120121

@@ -136,6 +137,8 @@ class CompositorContext {
136137

137138
GrDirectContext* gr_context() const { return gr_context_; }
138139

140+
impeller::AiksContext* aiks_context() const { return aiks_context_; }
141+
139142
virtual RasterStatus Raster(LayerTree& layer_tree,
140143
bool ignore_raster_cache,
141144
FrameDamage* frame_damage);
@@ -145,6 +148,7 @@ class CompositorContext {
145148
GrDirectContext* gr_context_;
146149
SkCanvas* canvas_;
147150
DisplayListBuilder* display_list_builder_;
151+
impeller::AiksContext* aiks_context_;
148152
ExternalViewEmbedder* view_embedder_;
149153
const SkMatrix& root_surface_transformation_;
150154
const bool instrumentation_enabled_;
@@ -168,7 +172,8 @@ class CompositorContext {
168172
bool instrumentation_enabled,
169173
bool surface_supports_readback,
170174
fml::RefPtr<fml::RasterThreadMerger> raster_thread_merger,
171-
DisplayListBuilder* display_list_builder);
175+
DisplayListBuilder* display_list_builder,
176+
impeller::AiksContext* aiks_context);
172177

173178
void OnGrContextCreated();
174179

flow/layers/layer.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,7 @@ struct PaintContext {
154154
SkScalar inherited_opacity = SK_Scalar1;
155155
DisplayListBuilder* leaf_nodes_builder = nullptr;
156156
DisplayListBuilderMultiplexer* builder_multiplexer = nullptr;
157+
impeller::AiksContext* aiks_context;
157158
};
158159

159160
// Represents a single composited layer. Created on the UI thread but then

flow/layers/layer_tree.cc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,7 @@ void LayerTree::Paint(CompositorContext::ScopedFrame& frame,
158158
.inherited_opacity = SK_Scalar1,
159159
.leaf_nodes_builder = builder,
160160
.builder_multiplexer = builder ? &builder_multiplexer : nullptr,
161+
.aiks_context = frame.aiks_context(),
161162
// clang-format on
162163
};
163164

flow/layers/layer_tree_unittests.cc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ class LayerTreeTest : public CanvasTest {
2828
false,
2929
true,
3030
nullptr,
31+
nullptr,
3132
nullptr)) {}
3233

3334
LayerTree& layer_tree() { return layer_tree_; }

flow/layers/texture_layer.cc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ void TextureLayer::Paint(PaintContext& context) const {
6363
.canvas = context.leaf_nodes_canvas,
6464
.builder = context.leaf_nodes_builder,
6565
.gr_context = context.gr_context,
66+
.aiks_context = context.aiks_context,
6667
.sk_paint = cache_paint.sk_paint(),
6768
.dl_paint = cache_paint.dl_paint(),
6869
};

impeller/aiks/aiks_context.cc

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,10 @@ std::shared_ptr<Context> AiksContext::GetContext() const {
3232
return context_;
3333
}
3434

35+
const ContentContext& AiksContext::GetContentContext() const {
36+
return *content_context_;
37+
}
38+
3539
bool AiksContext::Render(const Picture& picture, RenderTarget& render_target) {
3640
if (!IsValid()) {
3741
return false;

impeller/aiks/aiks_context.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@ class AiksContext {
2626

2727
std::shared_ptr<Context> GetContext() const;
2828

29+
const ContentContext& GetContentContext() const;
30+
2931
bool Render(const Picture& picture, RenderTarget& render_target);
3032

3133
private:

0 commit comments

Comments
 (0)