Home | History | Annotate | Download | only in sk_app
      1 
      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  */
      8 #ifndef VulkanWindowContext_DEFINED
      9 #define VulkanWindowContext_DEFINED
     10 
     11 #include "SkTypes.h" // required to pull in any SkUserConfig defines
     12 
     13 #ifdef SK_VULKAN
     14 
     15 #include "vk/GrVkBackendContext.h"
     16 #include "WindowContext.h"
     17 
     18 class GrRenderTarget;
     19 
     20 namespace sk_app {
     21 
     22 class VulkanWindowContext : public WindowContext {
     23 public:
     24     ~VulkanWindowContext() override;
     25 
     26     sk_sp<SkSurface> getBackbufferSurface() override;
     27     void swapBuffers() override;
     28 
     29     bool isValid() override { return SkToBool(fBackendContext.get()); }
     30 
     31     void resize(int w, int h) override {
     32         this->createSwapchain(w, h, fDisplayParams);
     33     }
     34 
     35     void setDisplayParams(const DisplayParams& params) override {
     36         this->destroyContext();
     37         fDisplayParams = params;
     38         this->initializeContext();
     39     }
     40 
     41     GrBackendContext getBackendContext() override {
     42         return (GrBackendContext) fBackendContext.get();
     43     }
     44 
     45     /** Platform specific function that creates a VkSurfaceKHR for a window */
     46     using CreateVkSurfaceFn = std::function<VkSurfaceKHR(VkInstance)>;
     47     /** Platform specific function that determines whether presentation will succeed. */
     48     using CanPresentFn = GrVkBackendContext::CanPresentFn;
     49 
     50     VulkanWindowContext(const DisplayParams&, CreateVkSurfaceFn, CanPresentFn);
     51 
     52 private:
     53     void initializeContext();
     54     void destroyContext();
     55 
     56     struct BackbufferInfo {
     57         uint32_t        fImageIndex;          // image this is associated with
     58         VkSemaphore     fAcquireSemaphore;    // we signal on this for acquisition of image
     59         VkSemaphore     fRenderSemaphore;     // we wait on this for rendering to be done
     60         VkCommandBuffer fTransitionCmdBuffers[2]; // to transition layout between present and render
     61         VkFence         fUsageFences[2];      // used to ensure this data is no longer used on GPU
     62     };
     63 
     64     BackbufferInfo* getAvailableBackbuffer();
     65     bool createSwapchain(int width, int height, const DisplayParams& params);
     66     void createBuffers(VkFormat format);
     67     void destroyBuffers();
     68 
     69     sk_sp<const GrVkBackendContext> fBackendContext;
     70 
     71     // simple wrapper class that exists only to initialize a pointer to NULL
     72     template <typename FNPTR_TYPE> class VkPtr {
     73     public:
     74         VkPtr() : fPtr(NULL) {}
     75         VkPtr operator=(FNPTR_TYPE ptr) { fPtr = ptr; return *this; }
     76         operator FNPTR_TYPE() const { return fPtr; }
     77     private:
     78         FNPTR_TYPE fPtr;
     79     };
     80 
     81     // Create functions
     82     CreateVkSurfaceFn fCreateVkSurfaceFn;
     83     CanPresentFn      fCanPresentFn;
     84 
     85     // WSI interface functions
     86     VkPtr<PFN_vkDestroySurfaceKHR> fDestroySurfaceKHR;
     87     VkPtr<PFN_vkGetPhysicalDeviceSurfaceSupportKHR> fGetPhysicalDeviceSurfaceSupportKHR;
     88     VkPtr<PFN_vkGetPhysicalDeviceSurfaceCapabilitiesKHR> fGetPhysicalDeviceSurfaceCapabilitiesKHR;
     89     VkPtr<PFN_vkGetPhysicalDeviceSurfaceFormatsKHR> fGetPhysicalDeviceSurfaceFormatsKHR;
     90     VkPtr<PFN_vkGetPhysicalDeviceSurfacePresentModesKHR> fGetPhysicalDeviceSurfacePresentModesKHR;
     91 
     92     VkPtr<PFN_vkCreateSwapchainKHR> fCreateSwapchainKHR;
     93     VkPtr<PFN_vkDestroySwapchainKHR> fDestroySwapchainKHR;
     94     VkPtr<PFN_vkGetSwapchainImagesKHR> fGetSwapchainImagesKHR;
     95     VkPtr<PFN_vkAcquireNextImageKHR> fAcquireNextImageKHR;
     96     VkPtr<PFN_vkQueuePresentKHR> fQueuePresentKHR;
     97     VkPtr<PFN_vkCreateSharedSwapchainsKHR> fCreateSharedSwapchainsKHR;
     98 
     99     VkSurfaceKHR      fSurface;
    100     VkSwapchainKHR    fSwapchain;
    101     uint32_t          fPresentQueueIndex;
    102     VkQueue           fPresentQueue;
    103 
    104     uint32_t               fImageCount;
    105     VkImage*               fImages;         // images in the swapchain
    106     VkImageLayout*         fImageLayouts;   // layouts of these images when not color attachment
    107     sk_sp<SkSurface>*      fSurfaces;       // surfaces client renders to (may not be based on rts)
    108     VkCommandPool          fCommandPool;
    109     BackbufferInfo*        fBackbuffers;
    110     uint32_t               fCurrentBackbufferIndex;
    111 };
    112 
    113 }   // namespace sk_app
    114 
    115 #endif // SK_VULKAN
    116 
    117 #endif
    118