33// found in the LICENSE file.
44
55#include " flutter/shell/common/shell_test_platform_view_vulkan.h"
6- #include " flutter/shell/gpu/gpu_surface_vulkan.h"
76
87namespace flutter {
98namespace testing {
@@ -30,7 +29,7 @@ void ShellTestPlatformViewVulkan::SimulateVSync() {
3029
3130// |PlatformView|
3231std::unique_ptr<Surface> ShellTestPlatformViewVulkan::CreateRenderingSurface () {
33- return std::make_unique<GPUSurfaceVulkan>( this , nullptr , true );
32+ return std::make_unique<OffScreenSurface>(proc_table_ );
3433}
3534
3635// |PlatformView|
@@ -40,9 +39,132 @@ PointerDataDispatcherMaker ShellTestPlatformViewVulkan::GetDispatcherMaker() {
4039 };
4140}
4241
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;
46168}
47169
48170} // namespace testing
0 commit comments