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