1 /* 2 * Copyright 2016 Google Inc. 3 * 4 * Use of this source code is governed by a BSD-style license that can be 5 * found in the LICENSE file. 6 */ 7 8 #ifndef GrVkGpuCommandBuffer_DEFINED 9 #define GrVkGpuCommandBuffer_DEFINED 10 11 #include "GrGpuCommandBuffer.h" 12 13 #include "GrColor.h" 14 #include "GrMesh.h" 15 #include "GrTypes.h" 16 #include "GrVkPipelineState.h" 17 18 class GrVkGpu; 19 class GrVkImage; 20 class GrVkRenderPass; 21 class GrVkRenderTarget; 22 class GrVkSecondaryCommandBuffer; 23 24 class GrVkGpuTextureCommandBuffer : public GrGpuTextureCommandBuffer { 25 public: GrVkGpuTextureCommandBuffer(GrVkGpu * gpu,GrTexture * texture,GrSurfaceOrigin origin)26 GrVkGpuTextureCommandBuffer(GrVkGpu* gpu, GrTexture* texture, GrSurfaceOrigin origin) 27 : INHERITED(texture, origin) 28 , fGpu(gpu) { 29 } 30 31 ~GrVkGpuTextureCommandBuffer() override; 32 33 void copy(GrSurface* src, GrSurfaceOrigin srcOrigin, const SkIRect& srcRect, 34 const SkIPoint& dstPoint) override; 35 36 void insertEventMarker(const char*) override; 37 38 private: 39 void submit() override; 40 41 struct CopyInfo { CopyInfoCopyInfo42 CopyInfo(GrSurface* src, GrSurfaceOrigin srcOrigin, const SkIRect& srcRect, 43 const SkIPoint& dstPoint) 44 : fSrc(src), fSrcOrigin(srcOrigin), fSrcRect(srcRect), fDstPoint(dstPoint) {} 45 46 GrSurface* fSrc; 47 GrSurfaceOrigin fSrcOrigin; 48 SkIRect fSrcRect; 49 SkIPoint fDstPoint; 50 }; 51 52 GrVkGpu* fGpu; 53 SkTArray<CopyInfo> fCopies; 54 55 typedef GrGpuTextureCommandBuffer INHERITED; 56 }; 57 58 class GrVkGpuRTCommandBuffer : public GrGpuRTCommandBuffer, private GrMesh::SendToGpuImpl { 59 public: 60 GrVkGpuRTCommandBuffer(GrVkGpu*, GrRenderTarget*, GrSurfaceOrigin, 61 const LoadAndStoreInfo&, 62 const StencilLoadAndStoreInfo&); 63 64 ~GrVkGpuRTCommandBuffer() override; 65 begin()66 void begin() override { } 67 void end() override; 68 69 void discard() override; 70 void insertEventMarker(const char*) override; 71 72 void inlineUpload(GrOpFlushState* state, GrDeferredTextureUploadFn& upload) override; 73 74 void copy(GrSurface* src, GrSurfaceOrigin srcOrigin, const SkIRect& srcRect, 75 const SkIPoint& dstPoint) override; 76 77 void submit() override; 78 79 private: 80 void init(); 81 82 GrGpu* gpu() override; 83 84 // Bind vertex and index buffers 85 void bindGeometry(const GrPrimitiveProcessor&, 86 const GrBuffer* indexBuffer, 87 const GrBuffer* vertexBuffer, 88 const GrBuffer* instanceBuffer); 89 90 GrVkPipelineState* prepareDrawState(const GrPipeline&, 91 const GrPrimitiveProcessor&, 92 GrPrimitiveType, 93 bool hasDynamicState); 94 95 void onDraw(const GrPipeline& pipeline, 96 const GrPrimitiveProcessor& primProc, 97 const GrMesh mesh[], 98 const GrPipeline::DynamicState[], 99 int meshCount, 100 const SkRect& bounds) override; 101 102 // GrMesh::SendToGpuImpl methods. These issue the actual Vulkan draw commands. 103 // Marked final as a hint to the compiler to not use virtual dispatch. sendMeshToGpu(const GrPrimitiveProcessor & primProc,GrPrimitiveType primType,const GrBuffer * vertexBuffer,int vertexCount,int baseVertex)104 void sendMeshToGpu(const GrPrimitiveProcessor& primProc, GrPrimitiveType primType, 105 const GrBuffer* vertexBuffer, int vertexCount, int baseVertex) final { 106 this->sendInstancedMeshToGpu(primProc, primType, vertexBuffer, vertexCount, baseVertex, 107 nullptr, 1, 0); 108 } 109 sendIndexedMeshToGpu(const GrPrimitiveProcessor & primProc,GrPrimitiveType primType,const GrBuffer * indexBuffer,int indexCount,int baseIndex,uint16_t,uint16_t,const GrBuffer * vertexBuffer,int baseVertex)110 void sendIndexedMeshToGpu(const GrPrimitiveProcessor& primProc, GrPrimitiveType primType, 111 const GrBuffer* indexBuffer, int indexCount, int baseIndex, 112 uint16_t /*minIndexValue*/, uint16_t /*maxIndexValue*/, 113 const GrBuffer* vertexBuffer, int baseVertex) final { 114 this->sendIndexedInstancedMeshToGpu(primProc, primType, indexBuffer, indexCount, baseIndex, 115 vertexBuffer, baseVertex, nullptr, 1, 0); 116 } 117 118 void sendInstancedMeshToGpu(const GrPrimitiveProcessor&, GrPrimitiveType, 119 const GrBuffer* vertexBuffer, int vertexCount, int baseVertex, 120 const GrBuffer* instanceBuffer, int instanceCount, 121 int baseInstance) final; 122 123 void sendIndexedInstancedMeshToGpu(const GrPrimitiveProcessor&, GrPrimitiveType, 124 const GrBuffer* indexBuffer, int indexCount, int baseIndex, 125 const GrBuffer* vertexBuffer, int baseVertex, 126 const GrBuffer* instanceBuffer, int instanceCount, 127 int baseInstance) final; 128 129 void onClear(const GrFixedClip&, GrColor color) override; 130 131 void onClearStencilClip(const GrFixedClip&, bool insideStencilMask) override; 132 133 void addAdditionalCommandBuffer(); 134 void addAdditionalRenderPass(); 135 136 struct InlineUploadInfo { InlineUploadInfoInlineUploadInfo137 InlineUploadInfo(GrOpFlushState* state, const GrDeferredTextureUploadFn& upload) 138 : fFlushState(state), fUpload(upload) {} 139 140 GrOpFlushState* fFlushState; 141 GrDeferredTextureUploadFn fUpload; 142 }; 143 144 struct CopyInfo { CopyInfoCopyInfo145 CopyInfo(GrSurface* src, GrSurfaceOrigin srcOrigin, const SkIRect& srcRect, 146 const SkIPoint& dstPoint) 147 : fSrc(src), fSrcOrigin(srcOrigin), fSrcRect(srcRect), fDstPoint(dstPoint) {} 148 149 GrSurface* fSrc; 150 GrSurfaceOrigin fSrcOrigin; 151 SkIRect fSrcRect; 152 SkIPoint fDstPoint; 153 }; 154 155 struct CommandBufferInfo { 156 const GrVkRenderPass* fRenderPass; 157 SkTArray<GrVkSecondaryCommandBuffer*> fCommandBuffers; 158 VkClearValue fColorClearValue; 159 SkRect fBounds; 160 bool fIsEmpty; 161 bool fStartsWithClear; 162 // The PreDrawUploads and PreCopies are sent to the GPU before submitting the secondary 163 // command buffer. 164 SkTArray<InlineUploadInfo> fPreDrawUploads; 165 SkTArray<CopyInfo> fPreCopies; 166 currentCmdBufCommandBufferInfo167 GrVkSecondaryCommandBuffer* currentCmdBuf() { 168 return fCommandBuffers.back(); 169 } 170 }; 171 172 SkTArray<CommandBufferInfo> fCommandBufferInfos; 173 int fCurrentCmdInfo; 174 175 GrVkGpu* fGpu; 176 VkAttachmentLoadOp fVkColorLoadOp; 177 VkAttachmentStoreOp fVkColorStoreOp; 178 VkAttachmentLoadOp fVkStencilLoadOp; 179 VkAttachmentStoreOp fVkStencilStoreOp; 180 GrColor4f fClearColor; 181 GrVkPipelineState* fLastPipelineState; 182 183 typedef GrGpuRTCommandBuffer INHERITED; 184 }; 185 186 #endif 187