Index: tools/vulkan/VulkanTestContext.h |
diff --git a/tools/vulkan/VulkanTestContext.h b/tools/vulkan/VulkanTestContext.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..c1535b99523f82c8d815053f7830adecb94a4501 |
--- /dev/null |
+++ b/tools/vulkan/VulkanTestContext.h |
@@ -0,0 +1,92 @@ |
+ |
+/* |
+ * 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 VulkanTestContext_DEFINED |
+#define VulkanTestContext_DEFINED |
+ |
+#ifdef SK_VULKAN |
+ |
+#include "GrTypes.h" |
+#include "vk/GrVkBackendContext.h" |
+ |
+class SkSurface; |
+class GrContext; |
+ |
+class VulkanTestContext { |
+public: |
+ ~VulkanTestContext(); |
+ |
+ // each platform will have to implement these in its CPP file |
+ VkSurfaceKHR createVkSurface(void* platformData); |
+ bool canPresent(uint32_t queueFamilyIndex); |
+ |
+ static VulkanTestContext* Create(void* platformData, int msaaSampleCount) { |
+ VulkanTestContext* ctx = new VulkanTestContext(platformData, msaaSampleCount); |
+ if (!ctx->isValid()) { |
+ delete ctx; |
+ return nullptr; |
+ } |
+ return ctx; |
+ } |
+ |
+ SkSurface* getBackbufferSurface(); |
+ void swapBuffers(); |
+ |
+ bool makeCurrent() { return true; } |
+ int getStencilBits() { return 0; } |
+ int getSampleCount() { return 0; } |
+ |
+ bool isValid() { return SkToBool(fBackendContext.get()); } |
+ |
+ void resize() { |
+ this->createSwapchain(0, 0); |
+ } |
+ |
+ GrBackendContext getBackendContext() { return (GrBackendContext)fBackendContext.get(); } |
+ |
+private: |
+ VulkanTestContext(); |
+ VulkanTestContext(void*, int msaaSampleCount); |
+ void initializeContext(void*); |
+ 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(uint32_t width, uint32_t height); |
+ void createBuffers(); |
+ void destroyBuffers(); |
+ |
+ SkAutoTUnref<const GrVkBackendContext> fBackendContext; |
+ |
+ GrContext* fContext; |
+ VkSurfaceKHR fSurface; |
+ VkSwapchainKHR fSwapchain; |
+ uint32_t fPresentQueueIndex; |
+ VkQueue fPresentQueue; |
+ int fWidth; |
+ int fHeight; |
+ GrPixelConfig fPixelConfig; |
+ |
+ uint32_t fImageCount; |
+ VkImage* fImages; // images in the swapchain |
+ VkImageLayout* fImageLayouts; // layouts of these images when not color attachment |
+ sk_sp<SkSurface>* fSurfaces; // wrapped surface for those images |
+ VkCommandPool fCommandPool; |
+ BackbufferInfo* fBackbuffers; |
+ uint32_t fCurrentBackbufferIndex; |
+}; |
+ |
+#endif // SK_VULKAN |
+ |
+#endif |