Index: src/gpu/vk/GrVkGpu.h |
diff --git a/src/gpu/vk/GrVkGpu.h b/src/gpu/vk/GrVkGpu.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..5bffdfdf93f8739f77929d656fbcea7e765f12b1 |
--- /dev/null |
+++ b/src/gpu/vk/GrVkGpu.h |
@@ -0,0 +1,220 @@ |
+/* |
+ * Copyright 2015 Google Inc. |
+ * |
+ * Use of this source code is governed by a BSD-style license that can be |
+ * found in the LICENSE file. |
+ */ |
+ |
+#ifndef GrVkGpu_DEFINED |
+#define GrVkGpu_DEFINED |
+ |
+#include "GrGpu.h" |
+#include "GrGpuFactory.h" |
+#include "GrVkCaps.h" |
+#include "GrVkIndexBuffer.h" |
+#include "GrVkProgram.h" |
+#include "GrVkResourceProvider.h" |
+#include "GrVkVertexBuffer.h" |
+#include "GrVkUtil.h" |
+ |
+#include "shaderc/shaderc.h" |
+#include "vulkan/vulkan.h" |
+ |
+class GrPipeline; |
+class GrNonInstancedVertices; |
+ |
+class GrVkBufferImpl; |
+class GrVkCommandBuffer; |
+class GrVkPipeline; |
+class GrVkRenderPass; |
+class GrVkTexture; |
+struct GrVkInterface; |
+ |
+class GrVkGpu : public GrGpu { |
+public: |
+ // Currently passing in the inst so that we can properly delete it when we are done. |
+ // Normally this would be done by the client. |
+ GrVkGpu(GrContext* context, const GrContextOptions& options, |
+ VkPhysicalDevice physDev, VkDevice device, VkQueue queue, VkCommandPool cmdPool, |
+ VkInstance inst); |
+ ~GrVkGpu() override; |
+ |
+ const GrVkInterface* vkInterface() const { return fInterface.get(); } |
+ const GrVkCaps& vkCaps() const { return *fVkCaps; } |
+ |
+ VkDevice device() const { return fDevice; } |
+ VkQueue queue() const { return fQueue; } |
+ VkCommandPool cmdPool() const { return fCmdPool; } |
+ VkPhysicalDeviceMemoryProperties physicalDeviceMemoryProperties() const { |
+ return fPhysDevMemProps; |
+ } |
+ |
+ GrVkResourceProvider& resourceProvider() { return fResourceProvider; } |
+ |
+ enum SyncQueue { |
+ kForce_SyncQueue, |
+ kSkip_SyncQueue |
+ }; |
+ |
+ bool onGetReadPixelsInfo(GrSurface* srcSurface, int readWidth, int readHeight, size_t rowBytes, |
+ GrPixelConfig readConfig, DrawPreference*, |
+ ReadPixelTempDrawInfo*) override; |
+ |
+ bool onGetWritePixelsInfo(GrSurface* dstSurface, int width, int height, |
+ GrPixelConfig srcConfig, DrawPreference*, |
+ WritePixelTempDrawInfo*) override; |
+ |
+ void buildProgramDesc(GrProgramDesc*, const GrPrimitiveProcessor&, |
+ const GrPipeline&) const override; |
+ |
+ void discard(GrRenderTarget*) override { |
+ SkDebugf("discard not yet implemented for Vulkan\n"); |
+ } |
+ |
+ bool onCopySurface(GrSurface* dst, |
+ GrSurface* src, |
+ const SkIRect& srcRect, |
+ const SkIPoint& dstPoint) override; |
+ |
+ bool initCopySurfaceDstDesc(const GrSurface* src, GrSurfaceDesc* desc) const override { |
+ SkDebugf("initCopySurfaceDstDesc not yet implemented for Vulkan\n"); |
+ return false; |
+ } |
+ |
+ void xferBarrier(GrRenderTarget*, GrXferBarrierType) override {} |
+ |
+ GrBackendObject createTestingOnlyBackendTexture(void* pixels, int w, int h, |
+ GrPixelConfig config) override; |
+ bool isTestingOnlyBackendTexture(GrBackendObject id) const override; |
+ void deleteTestingOnlyBackendTexture(GrBackendObject id, bool abandonTexture) override; |
+ |
+ GrStencilAttachment* createStencilAttachmentForRenderTarget(const GrRenderTarget*, |
+ int width, |
+ int height) override; |
+ |
+ void clearStencil(GrRenderTarget* target) override { |
+ SkDebugf("clearStencil not yet implemented for Vulkan\n"); |
+ } |
+ |
+ void drawDebugWireRect(GrRenderTarget*, const SkIRect&, GrColor) override { |
+ SkDebugf("drawDebugWireRect not yet implemented for Vulkan\n"); |
+ } |
+ |
+ void addMemoryBarrier(VkPipelineStageFlags srcStageMask, |
+ VkPipelineStageFlags dstStageMask, |
+ bool byRegion, |
+ VkMemoryBarrier* barrier) const; |
+ void addBufferMemoryBarrier(VkPipelineStageFlags srcStageMask, |
+ VkPipelineStageFlags dstStageMask, |
+ bool byRegion, |
+ VkBufferMemoryBarrier* barrier) const; |
+ void addImageMemoryBarrier(VkPipelineStageFlags srcStageMask, |
+ VkPipelineStageFlags dstStageMask, |
+ bool byRegion, |
+ VkImageMemoryBarrier* barrier) const; |
+ |
+ shaderc_compiler_t shadercCompiler() const { |
+ return fCompiler; |
+ } |
+ |
+ void finishDrawTarget() override; |
+ |
+private: |
+ void onResetContext(uint32_t resetBits) override { |
+ SkDebugf("onResetContext not yet implemented for Vulkan\n"); |
+ } |
+ |
+ GrTexture* onCreateTexture(const GrSurfaceDesc& desc, GrGpuResource::LifeCycle, |
+ const void* srcData, size_t rowBytes) override; |
+ |
+ GrTexture* onCreateCompressedTexture(const GrSurfaceDesc& desc, GrGpuResource::LifeCycle, |
+ const void* srcData) override { |
+ SkDebugf("onCreateCompressedTexture not yet implemented for Vulkan\n"); |
+ return NULL; |
+ } |
+ |
+ GrTexture* onWrapBackendTexture(const GrBackendTextureDesc&, GrWrapOwnership) override; |
+ |
+ GrRenderTarget* onWrapBackendRenderTarget(const GrBackendRenderTargetDesc&, |
+ GrWrapOwnership) override; |
+ |
+ GrVertexBuffer* onCreateVertexBuffer(size_t size, bool dynamic) override; |
+ GrIndexBuffer* onCreateIndexBuffer(size_t size, bool dynamic) override; |
+ GrTransferBuffer* onCreateTransferBuffer(size_t size, TransferType type) override; |
+ |
+ void onClear(GrRenderTarget*, const SkIRect& rect, GrColor color) override; |
+ |
+ void onClearStencilClip(GrRenderTarget*, const SkIRect& rect, bool insideClip) override { |
+ SkDebugf("onClearStencilClip not yet implemented for Vulkan\n"); |
+ } |
+ |
+ void onDraw(const DrawArgs&, const GrNonInstancedVertices&) override; |
+ |
+ bool onReadPixels(GrSurface* surface, |
+ int left, int top, int width, int height, |
+ GrPixelConfig, |
+ void* buffer, |
+ size_t rowBytes) override; |
+ |
+ bool onWritePixels(GrSurface* surface, |
+ int left, int top, int width, int height, |
+ GrPixelConfig config, const void* buffer, size_t rowBytes) override; |
+ |
+ bool onTransferPixels(GrSurface*, |
+ int left, int top, int width, int height, |
+ GrPixelConfig config, GrTransferBuffer* buffer, |
+ size_t offset, size_t rowBytes) override { |
+ SkDebugf("onTransferPixels not yet implemented for Vulkan\n"); |
+ return false; |
+ } |
+ |
+ void onResolveRenderTarget(GrRenderTarget* target) override { |
+ SkDebugf("onResolveRenderTarget not yet implemented for Vulkan\n"); |
+ } |
+ |
+ // Bind vertex and index buffers |
+ void bindGeometry(const GrPrimitiveProcessor&, const GrNonInstancedVertices&); |
+ |
+ // Ends and submits the current command buffer to the queue and then creates a new command |
+ // buffer and begins it. If sync is set to kForce_SyncQueue, the function will wait for all |
+ // work in the queue to finish before returning. |
+ void submitCommandBuffer(SyncQueue sync); |
+ |
+ void copySurfaceAsCopyImage(GrSurface* dst, |
+ GrSurface* src, |
+ const SkIRect& srcRect, |
+ const SkIPoint& dstPoint); |
+ |
+ void copySurfaceAsDraw(GrSurface* dst, |
+ GrSurface* src, |
+ const SkIRect& srcRect, |
+ const SkIPoint& dstPoint); |
+ |
+ // helper for onCreateTexture and writeTexturePixels |
+ bool uploadTexData(GrVkTexture* tex, |
+ int left, int top, int width, int height, |
+ GrPixelConfig dataConfig, |
+ const void* data, |
+ size_t rowBytes); |
+ |
+ SkAutoTUnref<const GrVkInterface> fInterface; |
+ SkAutoTUnref<GrVkCaps> fVkCaps; |
+ VkPhysicalDeviceMemoryProperties fPhysDevMemProps; |
+ VkDevice fDevice; |
+ VkQueue fQueue; // for now, one queue |
+ VkCommandPool fCmdPool; |
+ GrVkCommandBuffer* fCurrentCmdBuffer; |
+ GrVkResourceProvider fResourceProvider; |
+ |
+ // Shaderc compiler used for compiling glsl in spirv. We only want to create the compiler once |
+ // since there is significant overhead to the first compile of any compiler. |
+ shaderc_compiler_t fCompiler; |
+ |
+ // This is only for our current testing and building. The client should be holding on to the |
+ // VkInstance. |
+ VkInstance fVkInstance; |
+ |
+ typedef GrGpu INHERITED; |
+}; |
+ |
+#endif |