Flutter Engine
 
Loading...
Searching...
No Matches
shell_test_platform_view_metal.mm
Go to the documentation of this file.
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
6
7#include <utility>
8
11
13
14namespace flutter::testing {
15
16std::unique_ptr<ShellTestPlatformView> ShellTestPlatformView::CreateMetal(
17 PlatformView::Delegate& delegate,
18 const TaskRunners& task_runners,
19 const std::shared_ptr<ShellTestVsyncClock>& vsync_clock,
20 const CreateVsyncWaiter& create_vsync_waiter,
21 const std::shared_ptr<ShellTestExternalViewEmbedder>& shell_test_external_view_embedder,
22 const std::shared_ptr<const fml::SyncSwitch>& is_gpu_disabled_sync_switch) {
23 return std::make_unique<ShellTestPlatformViewMetal>(
24 delegate, task_runners, vsync_clock, create_vsync_waiter, shell_test_external_view_embedder,
25 is_gpu_disabled_sync_switch);
26}
27
29 PlatformView::Delegate& delegate,
30 const TaskRunners& task_runners,
31 std::shared_ptr<ShellTestVsyncClock> vsync_clock,
32 CreateVsyncWaiter create_vsync_waiter,
33 std::shared_ptr<ShellTestExternalViewEmbedder> shell_test_external_view_embedder,
34 const std::shared_ptr<const fml::SyncSwitch>& is_gpu_disabled_sync_switch)
35 : ShellTestPlatformView(delegate, task_runners),
37 create_vsync_waiter_(std::move(create_vsync_waiter)),
38 vsync_clock_(std::move(vsync_clock)),
39 shell_test_external_view_embedder_(std::move(shell_test_external_view_embedder)) {
40 id<MTLDevice> device = nil;
41 if (GetSettings().enable_impeller) {
42 impeller_context_ =
44 gpuDisabledSyncSwitch:is_gpu_disabled_sync_switch];
45 FML_CHECK(impeller_context_.context);
46 device = impeller_context_.context->GetMTLDevice();
47 } else {
48 skia_context_ = [[FlutterDarwinContextMetalSkia alloc] initWithDefaultMTLDevice];
49 FML_CHECK(skia_context_.mainContext);
50 device = skia_context_.device;
51 }
52 auto descriptor =
53 [MTLTextureDescriptor texture2DDescriptorWithPixelFormat:MTLPixelFormatBGRA8Unorm
54 width:800
55 height:600
56 mipmapped:NO];
57 descriptor.usage = MTLTextureUsageRenderTarget | MTLTextureUsageShaderRead;
58 offscreen_texture_ = [device newTextureWithDescriptor:descriptor];
59}
60
62
63std::unique_ptr<VsyncWaiter> ShellTestPlatformViewMetal::CreateVSyncWaiter() {
64 return create_vsync_waiter_();
65}
66
67// |ShellTestPlatformView|
68void ShellTestPlatformViewMetal::SimulateVSync() {
69 vsync_clock_->SimulateVSync();
70}
71
72// |PlatformView|
73std::shared_ptr<ExternalViewEmbedder> ShellTestPlatformViewMetal::CreateExternalViewEmbedder() {
74 return shell_test_external_view_embedder_;
75}
76
77// |PlatformView|
78PointerDataDispatcherMaker ShellTestPlatformViewMetal::GetDispatcherMaker() {
79 return [](DefaultPointerDataDispatcher::Delegate& delegate) {
80 return std::make_unique<SmoothPointerDataDispatcher>(delegate);
81 };
82}
83
84// |PlatformView|
85std::unique_ptr<Surface> ShellTestPlatformViewMetal::CreateRenderingSurface() {
86 if (GetSettings().enable_impeller) {
87 auto context = impeller_context_.context;
88 return std::make_unique<GPUSurfaceMetalImpeller>(
89 this, std::make_shared<impeller::AiksContext>(context, nullptr));
90 }
91 return std::make_unique<GPUSurfaceMetalSkia>(this, skia_context_.mainContext);
92}
93
94// |PlatformView|
95std::shared_ptr<impeller::Context> ShellTestPlatformViewMetal::GetImpellerContext() const {
96 return impeller_context_.context;
97}
98
99// |GPUSurfaceMetalDelegate|
100GPUCAMetalLayerHandle ShellTestPlatformViewMetal::GetCAMetalLayer(const DlISize& frame_info) const {
101 FML_CHECK(false) << "A Metal Delegate configured with MTLRenderTargetType::kMTLTexture was asked "
102 "to acquire a layer.";
103 return nullptr;
104}
105
106// |GPUSurfaceMetalDelegate|
107bool ShellTestPlatformViewMetal::PresentDrawable(GrMTLHandle drawable) const {
108 FML_CHECK(false) << "A Metal Delegate configured with MTLRenderTargetType::kMTLTexture was asked "
109 "to present a layer drawable.";
110 return true;
111}
112
113// |GPUSurfaceMetalDelegate|
114GPUMTLTextureInfo ShellTestPlatformViewMetal::GetMTLTexture(const DlISize& frame_info) const {
115 return {
116 .texture_id = 0,
117 .texture = (__bridge GPUMTLTextureHandle)offscreen_texture_,
118 };
119}
120
121// |GPUSurfaceMetalDelegate|
122bool ShellTestPlatformViewMetal::PresentTexture(GPUMTLTextureInfo texture) const {
123 // The texture resides offscreen. There is nothing to render to.
124 return true;
125}
126
127} // namespace flutter::testing
Interface implemented by all platform surfaces that can present a metal backing store to the "screen"...
Used to forward events from the platform view to interested subsystems. This forwarding is done by th...
const Settings & GetSettings() const
Get the settings for this platform view instance.
static std::unique_ptr< ShellTestPlatformView > CreateMetal(PlatformView::Delegate &delegate, const TaskRunners &task_runners, const std::shared_ptr< ShellTestVsyncClock > &vsync_clock, const CreateVsyncWaiter &create_vsync_waiter, const std::shared_ptr< ShellTestExternalViewEmbedder > &shell_test_external_view_embedder, const std::shared_ptr< const fml::SyncSwitch > &is_gpu_disabled_sync_switch)
ShellTestPlatformViewMetal(PlatformView::Delegate &delegate, const TaskRunners &task_runners, std::shared_ptr< ShellTestVsyncClock > vsync_clock, CreateVsyncWaiter create_vsync_waiter, std::shared_ptr< ShellTestExternalViewEmbedder > shell_test_external_view_embedder, const std::shared_ptr< const fml::SyncSwitch > &is_gpu_disabled_sync_switch)
VkDevice device
Definition main.cc:69
#define FML_CHECK(condition)
Definition logging.h:104
std::shared_ptr< impeller::ContextMTL > context
FlTexture * texture
std::function< std::unique_ptr< VsyncWaiter >()> CreateVsyncWaiter
impeller::ISize32 DlISize
std::function< std::unique_ptr< PointerDataDispatcher >(PointerDataDispatcher::Delegate &)> PointerDataDispatcherMaker
Signature for constructing PointerDataDispatcher.
const void * GPUMTLTextureHandle
Definition ref_ptr.h:261
int32_t height
int32_t width