xref: /aosp_15_r20/external/skia/tools/graphite/vk/GraphiteVulkanTestContext.cpp (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1*c8dee2aaSAndroid Build Coastguard Worker /*
2*c8dee2aaSAndroid Build Coastguard Worker  * Copyright 2022 Google LLC
3*c8dee2aaSAndroid Build Coastguard Worker  *
4*c8dee2aaSAndroid Build Coastguard Worker  * Use of this source code is governed by a BSD-style license that can be
5*c8dee2aaSAndroid Build Coastguard Worker  * found in the LICENSE file.
6*c8dee2aaSAndroid Build Coastguard Worker  */
7*c8dee2aaSAndroid Build Coastguard Worker 
8*c8dee2aaSAndroid Build Coastguard Worker #include "tools/graphite/vk/GraphiteVulkanTestContext.h"
9*c8dee2aaSAndroid Build Coastguard Worker 
10*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/graphite/Context.h"
11*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/graphite/ContextOptions.h"
12*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/graphite/vk/VulkanGraphiteUtils.h"
13*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/vk/VulkanExtensions.h"
14*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/vk/VulkanMemoryAllocator.h"
15*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/graphite/ContextOptionsPriv.h"
16*c8dee2aaSAndroid Build Coastguard Worker #include "tools/gpu/ContextType.h"
17*c8dee2aaSAndroid Build Coastguard Worker #include "tools/gpu/vk/VkTestUtils.h"
18*c8dee2aaSAndroid Build Coastguard Worker #include "tools/graphite/TestOptions.h"
19*c8dee2aaSAndroid Build Coastguard Worker 
20*c8dee2aaSAndroid Build Coastguard Worker extern bool gCreateProtectedContext;
21*c8dee2aaSAndroid Build Coastguard Worker 
22*c8dee2aaSAndroid Build Coastguard Worker namespace skiatest::graphite {
23*c8dee2aaSAndroid Build Coastguard Worker 
Make()24*c8dee2aaSAndroid Build Coastguard Worker std::unique_ptr<GraphiteTestContext> VulkanTestContext::Make() {
25*c8dee2aaSAndroid Build Coastguard Worker     skgpu::VulkanBackendContext backendContext;
26*c8dee2aaSAndroid Build Coastguard Worker     skgpu::VulkanExtensions* extensions;
27*c8dee2aaSAndroid Build Coastguard Worker     VkPhysicalDeviceFeatures2* features;
28*c8dee2aaSAndroid Build Coastguard Worker     VkDebugReportCallbackEXT debugCallback = VK_NULL_HANDLE;
29*c8dee2aaSAndroid Build Coastguard Worker     PFN_vkDestroyDebugReportCallbackEXT destroyCallback = nullptr;
30*c8dee2aaSAndroid Build Coastguard Worker 
31*c8dee2aaSAndroid Build Coastguard Worker     PFN_vkGetInstanceProcAddr instProc;
32*c8dee2aaSAndroid Build Coastguard Worker     if (!sk_gpu_test::LoadVkLibraryAndGetProcAddrFuncs(&instProc)) {
33*c8dee2aaSAndroid Build Coastguard Worker         return nullptr;
34*c8dee2aaSAndroid Build Coastguard Worker     }
35*c8dee2aaSAndroid Build Coastguard Worker 
36*c8dee2aaSAndroid Build Coastguard Worker     extensions = new skgpu::VulkanExtensions();
37*c8dee2aaSAndroid Build Coastguard Worker     features = new VkPhysicalDeviceFeatures2;
38*c8dee2aaSAndroid Build Coastguard Worker     memset(features, 0, sizeof(VkPhysicalDeviceFeatures2));
39*c8dee2aaSAndroid Build Coastguard Worker     if (!sk_gpu_test::CreateVkBackendContext(instProc, &backendContext, extensions,
40*c8dee2aaSAndroid Build Coastguard Worker                                              features, &debugCallback,
41*c8dee2aaSAndroid Build Coastguard Worker                                              nullptr, sk_gpu_test::CanPresentFn(),
42*c8dee2aaSAndroid Build Coastguard Worker                                              gCreateProtectedContext)) {
43*c8dee2aaSAndroid Build Coastguard Worker         sk_gpu_test::FreeVulkanFeaturesStructs(features);
44*c8dee2aaSAndroid Build Coastguard Worker         delete features;
45*c8dee2aaSAndroid Build Coastguard Worker         delete extensions;
46*c8dee2aaSAndroid Build Coastguard Worker         return nullptr;
47*c8dee2aaSAndroid Build Coastguard Worker     }
48*c8dee2aaSAndroid Build Coastguard Worker     if (debugCallback != VK_NULL_HANDLE) {
49*c8dee2aaSAndroid Build Coastguard Worker         destroyCallback = (PFN_vkDestroyDebugReportCallbackEXT) instProc(
50*c8dee2aaSAndroid Build Coastguard Worker                 backendContext.fInstance, "vkDestroyDebugReportCallbackEXT");
51*c8dee2aaSAndroid Build Coastguard Worker     }
52*c8dee2aaSAndroid Build Coastguard Worker 
53*c8dee2aaSAndroid Build Coastguard Worker     return std::unique_ptr<GraphiteTestContext>(new VulkanTestContext(backendContext,
54*c8dee2aaSAndroid Build Coastguard Worker                                                                       extensions,
55*c8dee2aaSAndroid Build Coastguard Worker                                                                       features,
56*c8dee2aaSAndroid Build Coastguard Worker                                                                       debugCallback,
57*c8dee2aaSAndroid Build Coastguard Worker                                                                       destroyCallback));
58*c8dee2aaSAndroid Build Coastguard Worker }
59*c8dee2aaSAndroid Build Coastguard Worker 
60*c8dee2aaSAndroid Build Coastguard Worker #define ACQUIRE_VK_PROC_LOCAL(name, inst)                                                \
61*c8dee2aaSAndroid Build Coastguard Worker     PFN_vk##name localVk##name =                                                         \
62*c8dee2aaSAndroid Build Coastguard Worker             reinterpret_cast<PFN_vk##name>(fVulkan.fGetProc("vk" #name, inst, nullptr)); \
63*c8dee2aaSAndroid Build Coastguard Worker     do {                                                                                 \
64*c8dee2aaSAndroid Build Coastguard Worker         if (localVk##name == nullptr) {                                                  \
65*c8dee2aaSAndroid Build Coastguard Worker             SkDebugf("Function ptr for vk%s could not be acquired\n", #name);            \
66*c8dee2aaSAndroid Build Coastguard Worker             return;                                                                      \
67*c8dee2aaSAndroid Build Coastguard Worker         }                                                                                \
68*c8dee2aaSAndroid Build Coastguard Worker     } while (0)
69*c8dee2aaSAndroid Build Coastguard Worker 
~VulkanTestContext()70*c8dee2aaSAndroid Build Coastguard Worker VulkanTestContext::~VulkanTestContext() {
71*c8dee2aaSAndroid Build Coastguard Worker     fVulkan.fMemoryAllocator.reset();
72*c8dee2aaSAndroid Build Coastguard Worker     ACQUIRE_VK_PROC_LOCAL(DeviceWaitIdle, fVulkan.fInstance);
73*c8dee2aaSAndroid Build Coastguard Worker     ACQUIRE_VK_PROC_LOCAL(DestroyDevice, fVulkan.fInstance);
74*c8dee2aaSAndroid Build Coastguard Worker     ACQUIRE_VK_PROC_LOCAL(DestroyInstance, fVulkan.fInstance);
75*c8dee2aaSAndroid Build Coastguard Worker     localVkDeviceWaitIdle(fVulkan.fDevice);
76*c8dee2aaSAndroid Build Coastguard Worker     localVkDestroyDevice(fVulkan.fDevice, nullptr);
77*c8dee2aaSAndroid Build Coastguard Worker #ifdef SK_ENABLE_VK_LAYERS
78*c8dee2aaSAndroid Build Coastguard Worker     if (fDebugCallback != VK_NULL_HANDLE) {
79*c8dee2aaSAndroid Build Coastguard Worker         fDestroyDebugReportCallbackEXT(fVulkan.fInstance, fDebugCallback, nullptr);
80*c8dee2aaSAndroid Build Coastguard Worker     }
81*c8dee2aaSAndroid Build Coastguard Worker #else
82*c8dee2aaSAndroid Build Coastguard Worker     // Surpress unused private member variable warning
83*c8dee2aaSAndroid Build Coastguard Worker     (void)fDebugCallback;
84*c8dee2aaSAndroid Build Coastguard Worker     (void)fDestroyDebugReportCallbackEXT;
85*c8dee2aaSAndroid Build Coastguard Worker #endif
86*c8dee2aaSAndroid Build Coastguard Worker     localVkDestroyInstance(fVulkan.fInstance, nullptr);
87*c8dee2aaSAndroid Build Coastguard Worker     delete fExtensions;
88*c8dee2aaSAndroid Build Coastguard Worker 
89*c8dee2aaSAndroid Build Coastguard Worker     sk_gpu_test::FreeVulkanFeaturesStructs(fFeatures);
90*c8dee2aaSAndroid Build Coastguard Worker     delete fFeatures;
91*c8dee2aaSAndroid Build Coastguard Worker }
92*c8dee2aaSAndroid Build Coastguard Worker 
contextType()93*c8dee2aaSAndroid Build Coastguard Worker skgpu::ContextType VulkanTestContext::contextType() {
94*c8dee2aaSAndroid Build Coastguard Worker     return skgpu::ContextType::kVulkan;
95*c8dee2aaSAndroid Build Coastguard Worker }
96*c8dee2aaSAndroid Build Coastguard Worker 
makeContext(const TestOptions & options)97*c8dee2aaSAndroid Build Coastguard Worker std::unique_ptr<skgpu::graphite::Context> VulkanTestContext::makeContext(
98*c8dee2aaSAndroid Build Coastguard Worker         const TestOptions& options) {
99*c8dee2aaSAndroid Build Coastguard Worker     SkASSERT(!options.hasDawnOptions());
100*c8dee2aaSAndroid Build Coastguard Worker     skgpu::graphite::ContextOptions revisedContextOptions(options.fContextOptions);
101*c8dee2aaSAndroid Build Coastguard Worker     skgpu::graphite::ContextOptionsPriv contextOptionsPriv;
102*c8dee2aaSAndroid Build Coastguard Worker     if (!options.fContextOptions.fOptionsPriv) {
103*c8dee2aaSAndroid Build Coastguard Worker         revisedContextOptions.fOptionsPriv = &contextOptionsPriv;
104*c8dee2aaSAndroid Build Coastguard Worker     }
105*c8dee2aaSAndroid Build Coastguard Worker     // Needed to make synchronous readPixels work
106*c8dee2aaSAndroid Build Coastguard Worker     revisedContextOptions.fOptionsPriv->fStoreContextRefInRecorder = true;
107*c8dee2aaSAndroid Build Coastguard Worker     SkASSERT(fVulkan.fMemoryAllocator);
108*c8dee2aaSAndroid Build Coastguard Worker     return skgpu::graphite::ContextFactory::MakeVulkan(fVulkan, revisedContextOptions);
109*c8dee2aaSAndroid Build Coastguard Worker }
110*c8dee2aaSAndroid Build Coastguard Worker 
111*c8dee2aaSAndroid Build Coastguard Worker }  // namespace skiatest::graphite
112