blob: 1fca9dc83e644827d8e57f24d989e4c90579a42a [file] [log] [blame]
jvanverth9f372462016-04-06 06:08:59 -07001
2/*
3 * Copyright 2016 Google Inc.
4 *
5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file.
7 */
jvanvertha8d0d6c2016-05-05 12:32:03 -07008#ifndef VulkanWindowContext_DEFINED
9#define VulkanWindowContext_DEFINED
jvanverth9f372462016-04-06 06:08:59 -070010
djsollen9207cae2016-06-10 07:50:00 -070011#include "SkTypes.h" // required to pull in any SkUserConfig defines
12
jvanverth9f372462016-04-06 06:08:59 -070013#ifdef SK_VULKAN
14
jvanverth9f372462016-04-06 06:08:59 -070015#include "vk/GrVkBackendContext.h"
jvanvertha8d0d6c2016-05-05 12:32:03 -070016#include "WindowContext.h"
jvanverth9f372462016-04-06 06:08:59 -070017
jvanverthaf236b52016-05-20 06:01:06 -070018class GrRenderTarget;
jvanverth9f372462016-04-06 06:08:59 -070019
jvanvertha8d0d6c2016-05-05 12:32:03 -070020namespace sk_app {
21
22class VulkanWindowContext : public WindowContext {
jvanverth9f372462016-04-06 06:08:59 -070023public:
jvanvertha8d0d6c2016-05-05 12:32:03 -070024 ~VulkanWindowContext() override;
jvanverth9f372462016-04-06 06:08:59 -070025
jvanverthaf236b52016-05-20 06:01:06 -070026 sk_sp<SkSurface> getBackbufferSurface() override;
jvanvertha8d0d6c2016-05-05 12:32:03 -070027 void swapBuffers() override;
jvanverth9f372462016-04-06 06:08:59 -070028
Greg Daniel007267b2018-06-28 23:31:00 +000029 bool isValid() override { return SkToBool(fBackendContext.get()); }
jvanverth9f372462016-04-06 06:08:59 -070030
bsalomonccde4ab2016-07-27 08:50:12 -070031 void resize(int w, int h) override {
brianosman05de2162016-05-06 13:28:57 -070032 this->createSwapchain(w, h, fDisplayParams);
33 }
34
liyuqian796c5bb2016-05-09 08:49:29 -070035 void setDisplayParams(const DisplayParams& params) override {
Jim Van Verthfbdc0802017-05-02 16:15:53 -040036 this->destroyContext();
37 fDisplayParams = params;
38 this->initializeContext();
jvanverth9f372462016-04-06 06:08:59 -070039 }
40
bsalomond1bdd1f2016-07-26 12:02:50 -070041 /** 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. */
Greg Daniel007267b2018-06-28 23:31:00 +000044 using CanPresentFn = GrVkBackendContext::CanPresentFn;
bsalomond1bdd1f2016-07-26 12:02:50 -070045
Greg Daniel35970ec2017-11-10 10:03:05 -050046 VulkanWindowContext(const DisplayParams&, CreateVkSurfaceFn, CanPresentFn,
47 PFN_vkGetInstanceProcAddr, PFN_vkGetDeviceProcAddr);
bsalomond1bdd1f2016-07-26 12:02:50 -070048
jvanverth9f372462016-04-06 06:08:59 -070049private:
Jim Van Verthfbdc0802017-05-02 16:15:53 -040050 void initializeContext();
jvanverth9f372462016-04-06 06:08:59 -070051 void destroyContext();
52
53 struct BackbufferInfo {
54 uint32_t fImageIndex; // image this is associated with
55 VkSemaphore fAcquireSemaphore; // we signal on this for acquisition of image
56 VkSemaphore fRenderSemaphore; // we wait on this for rendering to be done
57 VkCommandBuffer fTransitionCmdBuffers[2]; // to transition layout between present and render
58 VkFence fUsageFences[2]; // used to ensure this data is no longer used on GPU
59 };
60
61 BackbufferInfo* getAvailableBackbuffer();
bsalomonccde4ab2016-07-27 08:50:12 -070062 bool createSwapchain(int width, int height, const DisplayParams& params);
Greg Danielfaa095e2017-12-19 13:15:02 -050063 void createBuffers(VkFormat format, SkColorType colorType);
jvanverth9f372462016-04-06 06:08:59 -070064 void destroyBuffers();
65
Greg Daniel007267b2018-06-28 23:31:00 +000066 sk_sp<const GrVkBackendContext> fBackendContext;
jvanverth9f372462016-04-06 06:08:59 -070067
jvanverthb0d43522016-04-21 11:46:23 -070068 // simple wrapper class that exists only to initialize a pointer to NULL
69 template <typename FNPTR_TYPE> class VkPtr {
70 public:
71 VkPtr() : fPtr(NULL) {}
72 VkPtr operator=(FNPTR_TYPE ptr) { fPtr = ptr; return *this; }
73 operator FNPTR_TYPE() const { return fPtr; }
74 private:
75 FNPTR_TYPE fPtr;
76 };
jvanvertha8d0d6c2016-05-05 12:32:03 -070077
Jim Van Verthfbdc0802017-05-02 16:15:53 -040078 // Create functions
79 CreateVkSurfaceFn fCreateVkSurfaceFn;
80 CanPresentFn fCanPresentFn;
81
Greg Daniel35970ec2017-11-10 10:03:05 -050082 // Vulkan GetProcAddr functions
83 VkPtr<PFN_vkGetInstanceProcAddr> fGetInstanceProcAddr;
84 VkPtr<PFN_vkGetDeviceProcAddr> fGetDeviceProcAddr;
85
jvanverthb0d43522016-04-21 11:46:23 -070086 // WSI interface functions
87 VkPtr<PFN_vkDestroySurfaceKHR> fDestroySurfaceKHR;
88 VkPtr<PFN_vkGetPhysicalDeviceSurfaceSupportKHR> fGetPhysicalDeviceSurfaceSupportKHR;
89 VkPtr<PFN_vkGetPhysicalDeviceSurfaceCapabilitiesKHR> fGetPhysicalDeviceSurfaceCapabilitiesKHR;
90 VkPtr<PFN_vkGetPhysicalDeviceSurfaceFormatsKHR> fGetPhysicalDeviceSurfaceFormatsKHR;
91 VkPtr<PFN_vkGetPhysicalDeviceSurfacePresentModesKHR> fGetPhysicalDeviceSurfacePresentModesKHR;
92
93 VkPtr<PFN_vkCreateSwapchainKHR> fCreateSwapchainKHR;
94 VkPtr<PFN_vkDestroySwapchainKHR> fDestroySwapchainKHR;
95 VkPtr<PFN_vkGetSwapchainImagesKHR> fGetSwapchainImagesKHR;
96 VkPtr<PFN_vkAcquireNextImageKHR> fAcquireNextImageKHR;
97 VkPtr<PFN_vkQueuePresentKHR> fQueuePresentKHR;
Greg Daniel35970ec2017-11-10 10:03:05 -050098 VkPtr<PFN_vkGetDeviceQueue> fGetDeviceQueue;
jvanverthb0d43522016-04-21 11:46:23 -070099
jvanverth9f372462016-04-06 06:08:59 -0700100 VkSurfaceKHR fSurface;
101 VkSwapchainKHR fSwapchain;
102 uint32_t fPresentQueueIndex;
103 VkQueue fPresentQueue;
jvanverth9f372462016-04-06 06:08:59 -0700104
jvanverthaf236b52016-05-20 06:01:06 -0700105 uint32_t fImageCount;
106 VkImage* fImages; // images in the swapchain
107 VkImageLayout* fImageLayouts; // layouts of these images when not color attachment
jvanverthaf236b52016-05-20 06:01:06 -0700108 sk_sp<SkSurface>* fSurfaces; // surfaces client renders to (may not be based on rts)
109 VkCommandPool fCommandPool;
110 BackbufferInfo* fBackbuffers;
111 uint32_t fCurrentBackbufferIndex;
jvanverth9f372462016-04-06 06:08:59 -0700112};
113
jvanvertha8d0d6c2016-05-05 12:32:03 -0700114} // namespace sk_app
115
jvanverth9f372462016-04-06 06:08:59 -0700116#endif // SK_VULKAN
117
118#endif