blob: c00e4aec1dffb57ae18bd5538895325d03208c37 [file] [log] [blame]
egdaniel066df7c2016-06-08 14:02:27 -07001/*
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"
Chris Dalton114a3c02017-05-26 15:17:19 -060014#include "GrMesh.h"
egdaniel9cb63402016-06-23 08:37:05 -070015#include "GrTypes.h"
16#include "GrVkPipelineState.h"
egdaniel066df7c2016-06-08 14:02:27 -070017
18class GrVkGpu;
egdaniel9cb63402016-06-23 08:37:05 -070019class GrVkImage;
egdaniel066df7c2016-06-08 14:02:27 -070020class GrVkRenderPass;
21class GrVkRenderTarget;
22class GrVkSecondaryCommandBuffer;
23
Greg Daniel500d58b2017-08-24 15:59:33 -040024class GrVkGpuTextureCommandBuffer : public GrGpuTextureCommandBuffer {
egdaniel066df7c2016-06-08 14:02:27 -070025public:
Robert Phillips5b5d84c2018-08-09 15:12:18 -040026 GrVkGpuTextureCommandBuffer(GrVkGpu* gpu) : fGpu(gpu) {}
egdaniel066df7c2016-06-08 14:02:27 -070027
Greg Daniel500d58b2017-08-24 15:59:33 -040028 ~GrVkGpuTextureCommandBuffer() override;
29
Robert Phillipsb0e93a22017-08-29 08:26:54 -040030 void copy(GrSurface* src, GrSurfaceOrigin srcOrigin, const SkIRect& srcRect,
31 const SkIPoint& dstPoint) override;
Greg Daniel500d58b2017-08-24 15:59:33 -040032
33 void insertEventMarker(const char*) override;
34
Robert Phillips5b5d84c2018-08-09 15:12:18 -040035 void reset() {
36 fCopies.reset();
37 fTexture = nullptr;
38 }
Greg Daniel500d58b2017-08-24 15:59:33 -040039
Robert Phillips5b5d84c2018-08-09 15:12:18 -040040 void submit();
41
42private:
Greg Daniel500d58b2017-08-24 15:59:33 -040043 struct CopyInfo {
Robert Phillipsb0e93a22017-08-29 08:26:54 -040044 CopyInfo(GrSurface* src, GrSurfaceOrigin srcOrigin, const SkIRect& srcRect,
45 const SkIPoint& dstPoint)
46 : fSrc(src), fSrcOrigin(srcOrigin), fSrcRect(srcRect), fDstPoint(dstPoint) {}
Greg Daniel500d58b2017-08-24 15:59:33 -040047
Robert Phillipsb0e93a22017-08-29 08:26:54 -040048 GrSurface* fSrc;
49 GrSurfaceOrigin fSrcOrigin;
50 SkIRect fSrcRect;
51 SkIPoint fDstPoint;
Greg Daniel500d58b2017-08-24 15:59:33 -040052 };
53
54 GrVkGpu* fGpu;
55 SkTArray<CopyInfo> fCopies;
56
57 typedef GrGpuTextureCommandBuffer INHERITED;
58};
59
60class GrVkGpuRTCommandBuffer : public GrGpuRTCommandBuffer, private GrMesh::SendToGpuImpl {
61public:
Robert Phillips5b5d84c2018-08-09 15:12:18 -040062 GrVkGpuRTCommandBuffer(GrVkGpu*);
Greg Daniel500d58b2017-08-24 15:59:33 -040063
64 ~GrVkGpuRTCommandBuffer() override;
egdaniel066df7c2016-06-08 14:02:27 -070065
Robert Phillips74c627f2017-08-09 10:28:00 -040066 void begin() override { }
egdaniel066df7c2016-06-08 14:02:27 -070067 void end() override;
68
Robert Phillips19e51dc2017-08-09 09:30:51 -040069 void discard() override;
70 void insertEventMarker(const char*) override;
egdaniel066df7c2016-06-08 14:02:27 -070071
Brian Salomon943ed792017-10-30 09:37:55 -040072 void inlineUpload(GrOpFlushState* state, GrDeferredTextureUploadFn& upload) override;
Greg Daniel77b53f62016-10-18 11:48:51 -040073
Robert Phillipsb0e93a22017-08-29 08:26:54 -040074 void copy(GrSurface* src, GrSurfaceOrigin srcOrigin, const SkIRect& srcRect,
75 const SkIPoint& dstPoint) override;
Greg Daniel500d58b2017-08-24 15:59:33 -040076
Robert Phillips5b5d84c2018-08-09 15:12:18 -040077 void set(GrRenderTarget*, GrSurfaceOrigin,
78 const GrGpuRTCommandBuffer::LoadAndStoreInfo&,
79 const GrGpuRTCommandBuffer::StencilLoadAndStoreInfo&);
80 void reset();
81
82 void submit();
Greg Daniel500d58b2017-08-24 15:59:33 -040083
egdaniel066df7c2016-06-08 14:02:27 -070084private:
Robert Phillips19e51dc2017-08-09 09:30:51 -040085 void init();
Brian Salomonc293a292016-11-30 13:38:32 -050086
egdaniel9cb63402016-06-23 08:37:05 -070087 GrGpu* gpu() override;
88
egdaniel9cb63402016-06-23 08:37:05 -070089 // Bind vertex and index buffers
Brian Salomon802cb312018-06-08 18:05:20 -040090 void bindGeometry(const GrBuffer* indexBuffer,
Chris Dalton1d616352017-05-31 12:51:23 -060091 const GrBuffer* vertexBuffer,
92 const GrBuffer* instanceBuffer);
egdaniel9cb63402016-06-23 08:37:05 -070093
Brian Salomonff168d92018-06-23 15:17:27 -040094 GrVkPipelineState* prepareDrawState(const GrPrimitiveProcessor&,
95 const GrPipeline&,
Brian Salomon49348902018-06-26 09:12:38 -040096 const GrPipeline::FixedDynamicState*,
97 const GrPipeline::DynamicStateArrays*,
98 GrPrimitiveType);
egdaniel9cb63402016-06-23 08:37:05 -070099
Brian Salomon49348902018-06-26 09:12:38 -0400100 void onDraw(const GrPrimitiveProcessor&,
101 const GrPipeline&,
102 const GrPipeline::FixedDynamicState*,
103 const GrPipeline::DynamicStateArrays*,
104 const GrMesh[],
Greg Daniel36a77ee2016-10-18 10:33:25 -0400105 int meshCount,
106 const SkRect& bounds) override;
egdaniel9cb63402016-06-23 08:37:05 -0700107
Chris Dalton114a3c02017-05-26 15:17:19 -0600108 // GrMesh::SendToGpuImpl methods. These issue the actual Vulkan draw commands.
109 // Marked final as a hint to the compiler to not use virtual dispatch.
Brian Salomon802cb312018-06-08 18:05:20 -0400110 void sendMeshToGpu(GrPrimitiveType primType, const GrBuffer* vertexBuffer, int vertexCount,
111 int baseVertex) final {
112 this->sendInstancedMeshToGpu(primType, vertexBuffer, vertexCount, baseVertex, nullptr, 1,
113 0);
Chris Dalton1d616352017-05-31 12:51:23 -0600114 }
Chris Dalton114a3c02017-05-26 15:17:19 -0600115
Brian Salomon802cb312018-06-08 18:05:20 -0400116 void sendIndexedMeshToGpu(GrPrimitiveType primType, const GrBuffer* indexBuffer, int indexCount,
117 int baseIndex, uint16_t /*minIndexValue*/, uint16_t /*maxIndexValue*/,
118 const GrBuffer* vertexBuffer, int baseVertex,
119 GrPrimitiveRestart restart) final {
120 SkASSERT(restart == GrPrimitiveRestart::kNo);
121 this->sendIndexedInstancedMeshToGpu(primType, indexBuffer, indexCount, baseIndex,
122 vertexBuffer, baseVertex, nullptr, 1, 0,
123 GrPrimitiveRestart::kNo);
Chris Dalton1d616352017-05-31 12:51:23 -0600124 }
125
Brian Salomon802cb312018-06-08 18:05:20 -0400126 void sendInstancedMeshToGpu(GrPrimitiveType, const GrBuffer* vertexBuffer, int vertexCount,
127 int baseVertex, const GrBuffer* instanceBuffer, int instanceCount,
Chris Dalton1d616352017-05-31 12:51:23 -0600128 int baseInstance) final;
129
Brian Salomon802cb312018-06-08 18:05:20 -0400130 void sendIndexedInstancedMeshToGpu(GrPrimitiveType, const GrBuffer* indexBuffer, int indexCount,
131 int baseIndex, const GrBuffer* vertexBuffer, int baseVertex,
Chris Dalton1d616352017-05-31 12:51:23 -0600132 const GrBuffer* instanceBuffer, int instanceCount,
Brian Salomon802cb312018-06-08 18:05:20 -0400133 int baseInstance, GrPrimitiveRestart) final;
Chris Dalton114a3c02017-05-26 15:17:19 -0600134
Robert Phillips19e51dc2017-08-09 09:30:51 -0400135 void onClear(const GrFixedClip&, GrColor color) override;
egdaniel9cb63402016-06-23 08:37:05 -0700136
Robert Phillips19e51dc2017-08-09 09:30:51 -0400137 void onClearStencilClip(const GrFixedClip&, bool insideStencilMask) override;
egdaniel9cb63402016-06-23 08:37:05 -0700138
Greg Daniel77b53f62016-10-18 11:48:51 -0400139 void addAdditionalCommandBuffer();
Greg Daniel22bc8652017-03-22 15:45:43 -0400140 void addAdditionalRenderPass();
Greg Daniel77b53f62016-10-18 11:48:51 -0400141
142 struct InlineUploadInfo {
Brian Salomon943ed792017-10-30 09:37:55 -0400143 InlineUploadInfo(GrOpFlushState* state, const GrDeferredTextureUploadFn& upload)
144 : fFlushState(state), fUpload(upload) {}
Greg Daniel77b53f62016-10-18 11:48:51 -0400145
Brian Salomon742e31d2016-12-07 17:06:19 -0500146 GrOpFlushState* fFlushState;
Brian Salomon943ed792017-10-30 09:37:55 -0400147 GrDeferredTextureUploadFn fUpload;
Greg Daniel77b53f62016-10-18 11:48:51 -0400148 };
149
Greg Daniel500d58b2017-08-24 15:59:33 -0400150 struct CopyInfo {
Robert Phillipsb0e93a22017-08-29 08:26:54 -0400151 CopyInfo(GrSurface* src, GrSurfaceOrigin srcOrigin, const SkIRect& srcRect,
Greg Daniel55fa6472018-03-16 16:13:10 -0400152 const SkIPoint& dstPoint, bool shouldDiscardDst)
153 : fSrc(src)
154 , fSrcOrigin(srcOrigin)
155 , fSrcRect(srcRect)
156 , fDstPoint(dstPoint)
157 , fShouldDiscardDst(shouldDiscardDst) {}
Greg Daniel500d58b2017-08-24 15:59:33 -0400158
Robert Phillipsb0e93a22017-08-29 08:26:54 -0400159 GrSurface* fSrc;
160 GrSurfaceOrigin fSrcOrigin;
161 SkIRect fSrcRect;
162 SkIPoint fDstPoint;
Greg Daniel55fa6472018-03-16 16:13:10 -0400163 bool fShouldDiscardDst;
Greg Daniel500d58b2017-08-24 15:59:33 -0400164 };
165
Greg Daniela3c68df2018-03-16 13:46:53 -0400166 enum class LoadStoreState {
167 kUnknown,
168 kStartsWithClear,
169 kStartsWithDiscard,
170 kLoadAndStore,
171 };
172
Greg Daniel36a77ee2016-10-18 10:33:25 -0400173 struct CommandBufferInfo {
Greg Daniel22bc8652017-03-22 15:45:43 -0400174 const GrVkRenderPass* fRenderPass;
175 SkTArray<GrVkSecondaryCommandBuffer*> fCommandBuffers;
176 VkClearValue fColorClearValue;
177 SkRect fBounds;
Greg Daniela3c68df2018-03-16 13:46:53 -0400178 bool fIsEmpty = true;
179 LoadStoreState fLoadStoreState = LoadStoreState::kUnknown;
Greg Daniel500d58b2017-08-24 15:59:33 -0400180 // The PreDrawUploads and PreCopies are sent to the GPU before submitting the secondary
181 // command buffer.
Greg Daniel22bc8652017-03-22 15:45:43 -0400182 SkTArray<InlineUploadInfo> fPreDrawUploads;
Greg Daniel500d58b2017-08-24 15:59:33 -0400183 SkTArray<CopyInfo> fPreCopies;
Greg Danielea022cd2018-03-16 11:10:03 -0400184 // Array of images that will be sampled and thus need to be transfered to sampled layout
185 // before submitting the secondary command buffers. This must happen after we do any predraw
186 // uploads or copies.
187 SkTArray<GrVkImage*> fSampledImages;
Greg Daniel22bc8652017-03-22 15:45:43 -0400188
189 GrVkSecondaryCommandBuffer* currentCmdBuf() {
190 return fCommandBuffers.back();
191 }
Greg Daniel36a77ee2016-10-18 10:33:25 -0400192 };
193
194 SkTArray<CommandBufferInfo> fCommandBufferInfos;
Greg Daniel22bc8652017-03-22 15:45:43 -0400195 int fCurrentCmdInfo;
Greg Daniel36a77ee2016-10-18 10:33:25 -0400196
egdaniel066df7c2016-06-08 14:02:27 -0700197 GrVkGpu* fGpu;
Brian Salomonc293a292016-11-30 13:38:32 -0500198 VkAttachmentLoadOp fVkColorLoadOp;
199 VkAttachmentStoreOp fVkColorStoreOp;
200 VkAttachmentLoadOp fVkStencilLoadOp;
201 VkAttachmentStoreOp fVkStencilStoreOp;
202 GrColor4f fClearColor;
Greg Daniel22bc8652017-03-22 15:45:43 -0400203 GrVkPipelineState* fLastPipelineState;
egdaniel9cb63402016-06-23 08:37:05 -0700204
Greg Daniel500d58b2017-08-24 15:59:33 -0400205 typedef GrGpuRTCommandBuffer INHERITED;
egdaniel066df7c2016-06-08 14:02:27 -0700206};
207
208#endif