3
3
// found in the LICENSE file.
4
4
5
5
#include " flutter/shell/common/shell_test_platform_view_vulkan.h"
6
- #include " flutter/shell/gpu/gpu_surface_vulkan.h"
7
6
8
7
namespace flutter {
9
8
namespace testing {
@@ -30,7 +29,7 @@ void ShellTestPlatformViewVulkan::SimulateVSync() {
30
29
31
30
// |PlatformView|
32
31
std::unique_ptr<Surface> ShellTestPlatformViewVulkan::CreateRenderingSurface () {
33
- return std::make_unique<GPUSurfaceVulkan>( this , nullptr , true );
32
+ return std::make_unique<OffScreenSurface>(proc_table_ );
34
33
}
35
34
36
35
// |PlatformView|
@@ -40,9 +39,132 @@ PointerDataDispatcherMaker ShellTestPlatformViewVulkan::GetDispatcherMaker() {
40
39
};
41
40
}
42
41
43
- // |GPUSurfaceVulkanDelegate|
44
- fml::RefPtr<vulkan::VulkanProcTable> ShellTestPlatformViewVulkan::vk () {
45
- return proc_table_;
42
+ // TODO(gw280): This code was forked from vulkan_window.cc specifically for
43
+ // shell_test.
44
+ // We need to merge this functionality back into //vulkan.
45
+ // https://github.com/flutter/flutter/issues/51132
46
+ ShellTestPlatformViewVulkan::OffScreenSurface::OffScreenSurface (
47
+ fml::RefPtr<vulkan::VulkanProcTable> vk)
48
+ : valid_(false ), vk_(std::move(vk)) {
49
+ if (!vk_ || !vk_->HasAcquiredMandatoryProcAddresses ()) {
50
+ FML_DLOG (ERROR) << " Proc table has not acquired mandatory proc addresses." ;
51
+ return ;
52
+ }
53
+
54
+ // Create the application instance.
55
+ std::vector<std::string> extensions = {};
56
+
57
+ application_ = std::make_unique<vulkan::VulkanApplication>(
58
+ *vk_, " FlutterTest" , std::move (extensions));
59
+
60
+ if (!application_->IsValid () || !vk_->AreInstanceProcsSetup ()) {
61
+ // Make certain the application instance was created and it setup the
62
+ // instance proc table entries.
63
+ FML_DLOG (ERROR) << " Instance proc addresses have not been setup." ;
64
+ return ;
65
+ }
66
+
67
+ // Create the device.
68
+
69
+ logical_device_ = application_->AcquireFirstCompatibleLogicalDevice ();
70
+
71
+ if (logical_device_ == nullptr || !logical_device_->IsValid () ||
72
+ !vk_->AreDeviceProcsSetup ()) {
73
+ // Make certain the device was created and it setup the device proc table
74
+ // entries.
75
+ FML_DLOG (ERROR) << " Device proc addresses have not been setup." ;
76
+ return ;
77
+ }
78
+
79
+ // Create the Skia GrContext.
80
+ if (!CreateSkiaGrContext ()) {
81
+ FML_DLOG (ERROR) << " Could not create Skia context." ;
82
+ return ;
83
+ }
84
+
85
+ valid_ = true ;
86
+ }
87
+
88
+ bool ShellTestPlatformViewVulkan::OffScreenSurface::CreateSkiaGrContext () {
89
+ GrVkBackendContext backend_context;
90
+
91
+ if (!CreateSkiaBackendContext (&backend_context)) {
92
+ FML_DLOG (ERROR) << " Could not create Skia backend context." ;
93
+ return false ;
94
+ }
95
+
96
+ sk_sp<GrContext> context = GrContext::MakeVulkan (backend_context);
97
+
98
+ if (context == nullptr ) {
99
+ FML_DLOG (ERROR) << " Failed to create GrContext" ;
100
+ return false ;
101
+ }
102
+
103
+ context->setResourceCacheLimits (vulkan::kGrCacheMaxCount ,
104
+ vulkan::kGrCacheMaxByteSize );
105
+
106
+ context_ = context;
107
+
108
+ return true ;
109
+ }
110
+
111
+ bool ShellTestPlatformViewVulkan::OffScreenSurface::CreateSkiaBackendContext (
112
+ GrVkBackendContext* context) {
113
+ auto getProc = vk_->CreateSkiaGetProc ();
114
+
115
+ if (getProc == nullptr ) {
116
+ FML_DLOG (ERROR) << " GetProcAddress is null" ;
117
+ return false ;
118
+ }
119
+
120
+ uint32_t skia_features = 0 ;
121
+ if (!logical_device_->GetPhysicalDeviceFeaturesSkia (&skia_features)) {
122
+ FML_DLOG (ERROR) << " Failed to get Physical Device features" ;
123
+ return false ;
124
+ }
125
+
126
+ context->fInstance = application_->GetInstance ();
127
+ context->fPhysicalDevice = logical_device_->GetPhysicalDeviceHandle ();
128
+ context->fDevice = logical_device_->GetHandle ();
129
+ context->fQueue = logical_device_->GetQueueHandle ();
130
+ context->fGraphicsQueueIndex = logical_device_->GetGraphicsQueueIndex ();
131
+ context->fMinAPIVersion = application_->GetAPIVersion ();
132
+ context->fMaxAPIVersion = application_->GetAPIVersion ();
133
+ context->fFeatures = skia_features;
134
+ context->fGetProc = std::move (getProc);
135
+ context->fOwnsInstanceAndDevice = false ;
136
+ return true ;
137
+ }
138
+
139
+ ShellTestPlatformViewVulkan::OffScreenSurface::~OffScreenSurface () {}
140
+
141
+ bool ShellTestPlatformViewVulkan::OffScreenSurface::IsValid () {
142
+ return valid_;
143
+ }
144
+
145
+ std::unique_ptr<SurfaceFrame>
146
+ ShellTestPlatformViewVulkan::OffScreenSurface::AcquireFrame (
147
+ const SkISize& size) {
148
+ auto image_info = SkImageInfo::Make (size, SkColorType::kRGBA_8888_SkColorType ,
149
+ SkAlphaType::kOpaque_SkAlphaType );
150
+ auto surface = SkSurface::MakeRenderTarget (context_.get (), SkBudgeted::kNo ,
151
+ image_info, 0 , nullptr );
152
+ SurfaceFrame::SubmitCallback callback =
153
+ [](const SurfaceFrame&, SkCanvas* canvas) -> bool { return true ; };
154
+
155
+ return std::make_unique<SurfaceFrame>(std::move (surface), true ,
156
+ std::move (callback));
157
+ }
158
+
159
+ GrContext* ShellTestPlatformViewVulkan::OffScreenSurface::GetContext () {
160
+ return context_.get ();
161
+ }
162
+
163
+ SkMatrix ShellTestPlatformViewVulkan::OffScreenSurface::GetRootTransformation ()
164
+ const {
165
+ SkMatrix matrix;
166
+ matrix.reset ();
167
+ return matrix;
46
168
}
47
169
48
170
} // namespace testing
0 commit comments