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