54bfb18dad
This should allow clients to include Skia and their vulkan files in any order. However, it does require that when clients are building their files that include skia with vulkan, they must have vulkan/vulkan_core.h on their include path somewhere. Bug: skia: Change-Id: I969db396c92127be7c8df754926d175f38b8aafa Reviewed-on: https://skia-review.googlesource.com/c/172147 Reviewed-by: Brian Salomon <bsalomon@google.com> Commit-Queue: Greg Daniel <egdaniel@google.com>
126 lines
4.5 KiB
C++
126 lines
4.5 KiB
C++
|
|
/*
|
|
* Copyright 2016 Google Inc.
|
|
*
|
|
* Use of this source code is governed by a BSD-style license that can be
|
|
* found in the LICENSE file.
|
|
*/
|
|
#ifndef VulkanWindowContext_DEFINED
|
|
#define VulkanWindowContext_DEFINED
|
|
|
|
#include "SkTypes.h" // required to pull in any SkUserConfig defines
|
|
|
|
#ifdef SK_VULKAN
|
|
|
|
#include "vk/GrVkVulkan.h"
|
|
|
|
#include "vk/GrVkBackendContext.h"
|
|
#include "vk/GrVkInterface.h"
|
|
#include "vk/VkTestUtils.h"
|
|
#include "WindowContext.h"
|
|
|
|
class GrRenderTarget;
|
|
|
|
namespace sk_app {
|
|
|
|
class VulkanWindowContext : public WindowContext {
|
|
public:
|
|
~VulkanWindowContext() override;
|
|
|
|
sk_sp<SkSurface> getBackbufferSurface() override;
|
|
void swapBuffers() override;
|
|
|
|
bool isValid() override { return fDevice != VK_NULL_HANDLE; }
|
|
|
|
void resize(int w, int h) override {
|
|
this->createSwapchain(w, h, fDisplayParams);
|
|
}
|
|
|
|
void setDisplayParams(const DisplayParams& params) override {
|
|
this->destroyContext();
|
|
fDisplayParams = params;
|
|
this->initializeContext();
|
|
}
|
|
|
|
/** Platform specific function that creates a VkSurfaceKHR for a window */
|
|
using CreateVkSurfaceFn = std::function<VkSurfaceKHR(VkInstance)>;
|
|
/** Platform specific function that determines whether presentation will succeed. */
|
|
using CanPresentFn = sk_gpu_test::CanPresentFn;
|
|
|
|
VulkanWindowContext(const DisplayParams&, CreateVkSurfaceFn, CanPresentFn,
|
|
PFN_vkGetInstanceProcAddr, PFN_vkGetDeviceProcAddr);
|
|
|
|
private:
|
|
void initializeContext();
|
|
void destroyContext();
|
|
|
|
struct BackbufferInfo {
|
|
uint32_t fImageIndex; // image this is associated with
|
|
VkSemaphore fAcquireSemaphore; // we signal on this for acquisition of image
|
|
VkSemaphore fRenderSemaphore; // we wait on this for rendering to be done
|
|
VkCommandBuffer fTransitionCmdBuffers[2]; // to transition layout between present and render
|
|
VkFence fUsageFences[2]; // used to ensure this data is no longer used on GPU
|
|
};
|
|
|
|
BackbufferInfo* getAvailableBackbuffer();
|
|
bool createSwapchain(int width, int height, const DisplayParams& params);
|
|
void createBuffers(VkFormat format, SkColorType colorType);
|
|
void destroyBuffers();
|
|
|
|
VkInstance fInstance = VK_NULL_HANDLE;
|
|
VkPhysicalDevice fPhysicalDevice = VK_NULL_HANDLE;
|
|
VkDevice fDevice = VK_NULL_HANDLE;
|
|
VkDebugReportCallbackEXT fDebugCallback = VK_NULL_HANDLE;
|
|
|
|
// Create functions
|
|
CreateVkSurfaceFn fCreateVkSurfaceFn;
|
|
CanPresentFn fCanPresentFn;
|
|
|
|
// Vulkan GetProcAddr functions
|
|
PFN_vkGetInstanceProcAddr fGetInstanceProcAddr = nullptr;
|
|
PFN_vkGetDeviceProcAddr fGetDeviceProcAddr = nullptr;
|
|
|
|
// WSI interface functions
|
|
PFN_vkDestroySurfaceKHR fDestroySurfaceKHR = nullptr;
|
|
PFN_vkGetPhysicalDeviceSurfaceSupportKHR fGetPhysicalDeviceSurfaceSupportKHR = nullptr;
|
|
PFN_vkGetPhysicalDeviceSurfaceCapabilitiesKHR fGetPhysicalDeviceSurfaceCapabilitiesKHR =nullptr;
|
|
PFN_vkGetPhysicalDeviceSurfaceFormatsKHR fGetPhysicalDeviceSurfaceFormatsKHR = nullptr;
|
|
PFN_vkGetPhysicalDeviceSurfacePresentModesKHR fGetPhysicalDeviceSurfacePresentModesKHR =nullptr;
|
|
|
|
PFN_vkCreateSwapchainKHR fCreateSwapchainKHR = nullptr;
|
|
PFN_vkDestroySwapchainKHR fDestroySwapchainKHR = nullptr;
|
|
PFN_vkGetSwapchainImagesKHR fGetSwapchainImagesKHR = nullptr;
|
|
PFN_vkAcquireNextImageKHR fAcquireNextImageKHR = nullptr;
|
|
PFN_vkQueuePresentKHR fQueuePresentKHR = nullptr;
|
|
|
|
PFN_vkDestroyInstance fDestroyInstance = nullptr;
|
|
PFN_vkDeviceWaitIdle fDeviceWaitIdle = nullptr;
|
|
PFN_vkDestroyDebugReportCallbackEXT fDestroyDebugReportCallbackEXT = nullptr;
|
|
PFN_vkQueueWaitIdle fQueueWaitIdle = nullptr;
|
|
PFN_vkDestroyDevice fDestroyDevice = nullptr;
|
|
PFN_vkGetDeviceQueue fGetDeviceQueue = nullptr;
|
|
|
|
sk_sp<const GrVkInterface> fInterface;
|
|
|
|
VkSurfaceKHR fSurface;
|
|
VkSwapchainKHR fSwapchain;
|
|
uint32_t fGraphicsQueueIndex;
|
|
VkQueue fGraphicsQueue;
|
|
uint32_t fPresentQueueIndex;
|
|
VkQueue fPresentQueue;
|
|
|
|
uint32_t fImageCount;
|
|
VkImage* fImages; // images in the swapchain
|
|
VkImageLayout* fImageLayouts; // layouts of these images when not color attachment
|
|
sk_sp<SkSurface>* fSurfaces; // surfaces client renders to (may not be based on rts)
|
|
VkCommandPool fCommandPool;
|
|
BackbufferInfo* fBackbuffers;
|
|
uint32_t fCurrentBackbufferIndex;
|
|
};
|
|
|
|
} // namespace sk_app
|
|
|
|
#endif // SK_VULKAN
|
|
|
|
#endif
|