xref: /aosp_15_r20/external/skia/tools/window/GraphiteNativeVulkanWindowContext.h (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1 /*
2  * Copyright 2023 Google Inc.
3  *
4  * Use of this source code is governed by a BSD-style license that can be
5  * found in the LICENSE file.
6  */
7 #ifndef GraphiteVulkanWindowContext_DEFINED
8 #define GraphiteVulkanWindowContext_DEFINED
9 
10 #include "include/core/SkTypes.h"
11 
12 #ifdef SK_VULKAN
13 
14 #include "tools/gpu/vk/VkTestUtils.h"
15 #include "tools/window/WindowContext.h"
16 
17 class GrRenderTarget;
18 
19 namespace skgpu {
20 struct VulkanInterface;
21 }
22 
23 namespace skwindow::internal {
24 
25 class GraphiteVulkanWindowContext : public WindowContext {
26 public:
27     ~GraphiteVulkanWindowContext() override;
28 
29     sk_sp<SkSurface> getBackbufferSurface() override;
30 
isValid()31     bool isValid() override { return fDevice != VK_NULL_HANDLE; }
32 
resize(int w,int h)33     void resize(int w, int h) override { this->createSwapchain(w, h); }
34 
setDisplayParams(std::unique_ptr<const DisplayParams> params)35     void setDisplayParams(std::unique_ptr<const DisplayParams> params) override {
36         this->destroyContext();
37         fDisplayParams = std::move(params);
38         this->initializeContext();
39     }
40 
41     /** Platform specific function that creates a VkSurfaceKHR for a window */
42     using CreateVkSurfaceFn = std::function<VkSurfaceKHR(VkInstance)>;
43     /** Platform specific function that determines whether presentation will succeed. */
44     using CanPresentFn = sk_gpu_test::CanPresentFn;
45 
46     GraphiteVulkanWindowContext(std::unique_ptr<const DisplayParams>,
47                                 CreateVkSurfaceFn,
48                                 CanPresentFn,
49                                 PFN_vkGetInstanceProcAddr);
50 
51 private:
52     void initializeContext();
53     void destroyContext();
54 
55     struct BackbufferInfo {
56         uint32_t fImageIndex;          // image this is associated with
57         VkSemaphore fRenderSemaphore;  // we wait on this for rendering to be done
58     };
59 
60     BackbufferInfo* getAvailableBackbuffer();
61     bool createSwapchain(int width, int height);
62     bool createBuffers(VkFormat format, VkImageUsageFlags, SkColorType colorType, VkSharingMode);
63     void destroyBuffers();
64     void onSwapBuffers() override;
65 
66     VkInstance fInstance = VK_NULL_HANDLE;
67     VkPhysicalDevice fPhysicalDevice = VK_NULL_HANDLE;
68     VkDevice fDevice = VK_NULL_HANDLE;
69     VkDebugReportCallbackEXT fDebugCallback = VK_NULL_HANDLE;
70 
71     // Create functions
72     CreateVkSurfaceFn fCreateVkSurfaceFn;
73     CanPresentFn fCanPresentFn;
74 
75     PFN_vkGetInstanceProcAddr fGetInstanceProcAddr = nullptr;
76 
77     // WSI interface functions
78     PFN_vkDestroySurfaceKHR fDestroySurfaceKHR = nullptr;
79     PFN_vkGetPhysicalDeviceSurfaceSupportKHR fGetPhysicalDeviceSurfaceSupportKHR = nullptr;
80     PFN_vkGetPhysicalDeviceSurfaceCapabilitiesKHR fGetPhysicalDeviceSurfaceCapabilitiesKHR =
81             nullptr;
82     PFN_vkGetPhysicalDeviceSurfaceFormatsKHR fGetPhysicalDeviceSurfaceFormatsKHR = nullptr;
83     PFN_vkGetPhysicalDeviceSurfacePresentModesKHR fGetPhysicalDeviceSurfacePresentModesKHR =
84             nullptr;
85 
86     PFN_vkCreateSwapchainKHR fCreateSwapchainKHR = nullptr;
87     PFN_vkDestroySwapchainKHR fDestroySwapchainKHR = nullptr;
88     PFN_vkGetSwapchainImagesKHR fGetSwapchainImagesKHR = nullptr;
89     PFN_vkAcquireNextImageKHR fAcquireNextImageKHR = nullptr;
90     PFN_vkQueuePresentKHR fQueuePresentKHR = nullptr;
91 
92     PFN_vkDestroyInstance fDestroyInstance = nullptr;
93     PFN_vkDeviceWaitIdle fDeviceWaitIdle = nullptr;
94     PFN_vkDestroyDebugReportCallbackEXT fDestroyDebugReportCallbackEXT = nullptr;
95     PFN_vkQueueWaitIdle fQueueWaitIdle = nullptr;
96     PFN_vkDestroyDevice fDestroyDevice = nullptr;
97     PFN_vkGetDeviceQueue fGetDeviceQueue = nullptr;
98 
99     sk_sp<const skgpu::VulkanInterface> fInterface;
100 
101     VkSurfaceKHR fSurface;
102     VkSwapchainKHR fSwapchain;
103     uint32_t fGraphicsQueueIndex;
104     VkQueue fGraphicsQueue;
105     uint32_t fPresentQueueIndex;
106     VkQueue fPresentQueue;
107 
108     uint32_t fImageCount;
109     VkImage* fImages;              // images in the swapchain
110     VkImageLayout* fImageLayouts;  // layouts of these images when not color attachment
111     sk_sp<SkSurface>* fSurfaces;   // surfaces client renders to (may not be based on rts)
112     BackbufferInfo* fBackbuffers;
113     uint32_t fCurrentBackbufferIndex;
114     VkSemaphore fWaitSemaphore = VK_NULL_HANDLE;
115 };
116 
117 }  // namespace skwindow::internal
118 
119 #endif  // SK_VULKAN
120 
121 #endif  // GraphiteVulkanWindowContext_DEFINED
122