blob: a4ed1fa47379cbb3273038253f288a3e636a4bb0 [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"
Greg Daniel487132b2018-12-20 14:09:36 -050017#include "vk/GrVkTypes.h"
egdaniel066df7c2016-06-08 14:02:27 -070018
19class GrVkGpu;
egdaniel9cb63402016-06-23 08:37:05 -070020class GrVkImage;
egdaniel066df7c2016-06-08 14:02:27 -070021class GrVkRenderPass;
22class GrVkRenderTarget;
23class GrVkSecondaryCommandBuffer;
24
Greg Daniel500d58b2017-08-24 15:59:33 -040025class GrVkGpuTextureCommandBuffer : public GrGpuTextureCommandBuffer {
egdaniel066df7c2016-06-08 14:02:27 -070026public:
Robert Phillips5b5d84c2018-08-09 15:12:18 -040027 GrVkGpuTextureCommandBuffer(GrVkGpu* gpu) : fGpu(gpu) {}
egdaniel066df7c2016-06-08 14:02:27 -070028
Greg Daniel500d58b2017-08-24 15:59:33 -040029 ~GrVkGpuTextureCommandBuffer() override;
30
Robert Phillipsb0e93a22017-08-29 08:26:54 -040031 void copy(GrSurface* src, GrSurfaceOrigin srcOrigin, const SkIRect& srcRect,
32 const SkIPoint& dstPoint) override;
Greg Daniel500d58b2017-08-24 15:59:33 -040033
34 void insertEventMarker(const char*) override;
35
Robert Phillips5b5d84c2018-08-09 15:12:18 -040036 void reset() {
37 fCopies.reset();
38 fTexture = nullptr;
39 }
Greg Daniel500d58b2017-08-24 15:59:33 -040040
Robert Phillips5b5d84c2018-08-09 15:12:18 -040041 void submit();
42
43private:
Greg Daniel500d58b2017-08-24 15:59:33 -040044 struct CopyInfo {
Robert Phillipsb0e93a22017-08-29 08:26:54 -040045 CopyInfo(GrSurface* src, GrSurfaceOrigin srcOrigin, const SkIRect& srcRect,
46 const SkIPoint& dstPoint)
47 : fSrc(src), fSrcOrigin(srcOrigin), fSrcRect(srcRect), fDstPoint(dstPoint) {}
Greg Daniel500d58b2017-08-24 15:59:33 -040048
Robert Phillipsb0e93a22017-08-29 08:26:54 -040049 GrSurface* fSrc;
50 GrSurfaceOrigin fSrcOrigin;
51 SkIRect fSrcRect;
52 SkIPoint fDstPoint;
Greg Daniel500d58b2017-08-24 15:59:33 -040053 };
54
55 GrVkGpu* fGpu;
56 SkTArray<CopyInfo> fCopies;
57
58 typedef GrGpuTextureCommandBuffer INHERITED;
59};
60
61class GrVkGpuRTCommandBuffer : public GrGpuRTCommandBuffer, private GrMesh::SendToGpuImpl {
62public:
Robert Phillips5b5d84c2018-08-09 15:12:18 -040063 GrVkGpuRTCommandBuffer(GrVkGpu*);
Greg Daniel500d58b2017-08-24 15:59:33 -040064
65 ~GrVkGpuRTCommandBuffer() override;
egdaniel066df7c2016-06-08 14:02:27 -070066
Robert Phillips74c627f2017-08-09 10:28:00 -040067 void begin() override { }
egdaniel066df7c2016-06-08 14:02:27 -070068 void end() override;
69
Robert Phillips19e51dc2017-08-09 09:30:51 -040070 void discard() override;
71 void insertEventMarker(const char*) override;
egdaniel066df7c2016-06-08 14:02:27 -070072
Brian Salomon943ed792017-10-30 09:37:55 -040073 void inlineUpload(GrOpFlushState* state, GrDeferredTextureUploadFn& upload) override;
Greg Daniel77b53f62016-10-18 11:48:51 -040074
Robert Phillipsb0e93a22017-08-29 08:26:54 -040075 void copy(GrSurface* src, GrSurfaceOrigin srcOrigin, const SkIRect& srcRect,
76 const SkIPoint& dstPoint) override;
Greg Daniel500d58b2017-08-24 15:59:33 -040077
Greg Daniel64cc9aa2018-10-19 13:54:56 -040078 void executeDrawable(std::unique_ptr<SkDrawable::GpuDrawHandler>) override;
79
Robert Phillips5b5d84c2018-08-09 15:12:18 -040080 void set(GrRenderTarget*, GrSurfaceOrigin,
81 const GrGpuRTCommandBuffer::LoadAndStoreInfo&,
82 const GrGpuRTCommandBuffer::StencilLoadAndStoreInfo&);
83 void reset();
84
85 void submit();
Greg Daniel500d58b2017-08-24 15:59:33 -040086
egdaniel066df7c2016-06-08 14:02:27 -070087private:
Robert Phillips19e51dc2017-08-09 09:30:51 -040088 void init();
Brian Salomonc293a292016-11-30 13:38:32 -050089
egdaniel9cb63402016-06-23 08:37:05 -070090 GrGpu* gpu() override;
91
egdaniel9cb63402016-06-23 08:37:05 -070092 // Bind vertex and index buffers
Brian Salomon802cb312018-06-08 18:05:20 -040093 void bindGeometry(const GrBuffer* indexBuffer,
Chris Dalton1d616352017-05-31 12:51:23 -060094 const GrBuffer* vertexBuffer,
95 const GrBuffer* instanceBuffer);
egdaniel9cb63402016-06-23 08:37:05 -070096
Brian Salomonff168d92018-06-23 15:17:27 -040097 GrVkPipelineState* prepareDrawState(const GrPrimitiveProcessor&,
98 const GrPipeline&,
Brian Salomon49348902018-06-26 09:12:38 -040099 const GrPipeline::FixedDynamicState*,
100 const GrPipeline::DynamicStateArrays*,
101 GrPrimitiveType);
egdaniel9cb63402016-06-23 08:37:05 -0700102
Brian Salomon49348902018-06-26 09:12:38 -0400103 void onDraw(const GrPrimitiveProcessor&,
104 const GrPipeline&,
105 const GrPipeline::FixedDynamicState*,
106 const GrPipeline::DynamicStateArrays*,
107 const GrMesh[],
Greg Daniel36a77ee2016-10-18 10:33:25 -0400108 int meshCount,
109 const SkRect& bounds) override;
egdaniel9cb63402016-06-23 08:37:05 -0700110
Chris Dalton114a3c02017-05-26 15:17:19 -0600111 // GrMesh::SendToGpuImpl methods. These issue the actual Vulkan draw commands.
112 // Marked final as a hint to the compiler to not use virtual dispatch.
Brian Salomon802cb312018-06-08 18:05:20 -0400113 void sendMeshToGpu(GrPrimitiveType primType, const GrBuffer* vertexBuffer, int vertexCount,
114 int baseVertex) final {
115 this->sendInstancedMeshToGpu(primType, vertexBuffer, vertexCount, baseVertex, nullptr, 1,
116 0);
Chris Dalton1d616352017-05-31 12:51:23 -0600117 }
Chris Dalton114a3c02017-05-26 15:17:19 -0600118
Brian Salomon802cb312018-06-08 18:05:20 -0400119 void sendIndexedMeshToGpu(GrPrimitiveType primType, const GrBuffer* indexBuffer, int indexCount,
120 int baseIndex, uint16_t /*minIndexValue*/, uint16_t /*maxIndexValue*/,
121 const GrBuffer* vertexBuffer, int baseVertex,
122 GrPrimitiveRestart restart) final {
123 SkASSERT(restart == GrPrimitiveRestart::kNo);
124 this->sendIndexedInstancedMeshToGpu(primType, indexBuffer, indexCount, baseIndex,
125 vertexBuffer, baseVertex, nullptr, 1, 0,
126 GrPrimitiveRestart::kNo);
Chris Dalton1d616352017-05-31 12:51:23 -0600127 }
128
Brian Salomon802cb312018-06-08 18:05:20 -0400129 void sendInstancedMeshToGpu(GrPrimitiveType, const GrBuffer* vertexBuffer, int vertexCount,
130 int baseVertex, const GrBuffer* instanceBuffer, int instanceCount,
Chris Dalton1d616352017-05-31 12:51:23 -0600131 int baseInstance) final;
132
Brian Salomon802cb312018-06-08 18:05:20 -0400133 void sendIndexedInstancedMeshToGpu(GrPrimitiveType, const GrBuffer* indexBuffer, int indexCount,
134 int baseIndex, const GrBuffer* vertexBuffer, int baseVertex,
Chris Dalton1d616352017-05-31 12:51:23 -0600135 const GrBuffer* instanceBuffer, int instanceCount,
Brian Salomon802cb312018-06-08 18:05:20 -0400136 int baseInstance, GrPrimitiveRestart) final;
Chris Dalton114a3c02017-05-26 15:17:19 -0600137
Brian Osman9a9baae2018-11-05 15:06:26 -0500138 void onClear(const GrFixedClip&, const SkPMColor4f& color) override;
egdaniel9cb63402016-06-23 08:37:05 -0700139
Robert Phillips19e51dc2017-08-09 09:30:51 -0400140 void onClearStencilClip(const GrFixedClip&, bool insideStencilMask) override;
egdaniel9cb63402016-06-23 08:37:05 -0700141
Greg Daniel77b53f62016-10-18 11:48:51 -0400142 void addAdditionalCommandBuffer();
Greg Daniel22bc8652017-03-22 15:45:43 -0400143 void addAdditionalRenderPass();
Greg Daniel77b53f62016-10-18 11:48:51 -0400144
145 struct InlineUploadInfo {
Brian Salomon943ed792017-10-30 09:37:55 -0400146 InlineUploadInfo(GrOpFlushState* state, const GrDeferredTextureUploadFn& upload)
147 : fFlushState(state), fUpload(upload) {}
Greg Daniel77b53f62016-10-18 11:48:51 -0400148
Brian Salomon742e31d2016-12-07 17:06:19 -0500149 GrOpFlushState* fFlushState;
Brian Salomon943ed792017-10-30 09:37:55 -0400150 GrDeferredTextureUploadFn fUpload;
Greg Daniel77b53f62016-10-18 11:48:51 -0400151 };
152
Greg Daniel500d58b2017-08-24 15:59:33 -0400153 struct CopyInfo {
Robert Phillipsb0e93a22017-08-29 08:26:54 -0400154 CopyInfo(GrSurface* src, GrSurfaceOrigin srcOrigin, const SkIRect& srcRect,
Greg Daniel55fa6472018-03-16 16:13:10 -0400155 const SkIPoint& dstPoint, bool shouldDiscardDst)
156 : fSrc(src)
157 , fSrcOrigin(srcOrigin)
158 , fSrcRect(srcRect)
159 , fDstPoint(dstPoint)
160 , fShouldDiscardDst(shouldDiscardDst) {}
Greg Daniel500d58b2017-08-24 15:59:33 -0400161
Robert Phillipsb0e93a22017-08-29 08:26:54 -0400162 GrSurface* fSrc;
163 GrSurfaceOrigin fSrcOrigin;
164 SkIRect fSrcRect;
165 SkIPoint fDstPoint;
Greg Daniel55fa6472018-03-16 16:13:10 -0400166 bool fShouldDiscardDst;
Greg Daniel500d58b2017-08-24 15:59:33 -0400167 };
168
Greg Daniela3c68df2018-03-16 13:46:53 -0400169 enum class LoadStoreState {
170 kUnknown,
171 kStartsWithClear,
172 kStartsWithDiscard,
173 kLoadAndStore,
174 };
175
Greg Daniel36a77ee2016-10-18 10:33:25 -0400176 struct CommandBufferInfo {
Greg Daniel22bc8652017-03-22 15:45:43 -0400177 const GrVkRenderPass* fRenderPass;
178 SkTArray<GrVkSecondaryCommandBuffer*> fCommandBuffers;
179 VkClearValue fColorClearValue;
180 SkRect fBounds;
Greg Daniela3c68df2018-03-16 13:46:53 -0400181 bool fIsEmpty = true;
182 LoadStoreState fLoadStoreState = LoadStoreState::kUnknown;
Greg Daniel500d58b2017-08-24 15:59:33 -0400183 // The PreDrawUploads and PreCopies are sent to the GPU before submitting the secondary
184 // command buffer.
Greg Daniel22bc8652017-03-22 15:45:43 -0400185 SkTArray<InlineUploadInfo> fPreDrawUploads;
Greg Daniel500d58b2017-08-24 15:59:33 -0400186 SkTArray<CopyInfo> fPreCopies;
Greg Danielea022cd2018-03-16 11:10:03 -0400187 // Array of images that will be sampled and thus need to be transfered to sampled layout
188 // before submitting the secondary command buffers. This must happen after we do any predraw
189 // uploads or copies.
190 SkTArray<GrVkImage*> fSampledImages;
Greg Daniel22bc8652017-03-22 15:45:43 -0400191
192 GrVkSecondaryCommandBuffer* currentCmdBuf() {
193 return fCommandBuffers.back();
194 }
Greg Daniel36a77ee2016-10-18 10:33:25 -0400195 };
196
197 SkTArray<CommandBufferInfo> fCommandBufferInfos;
Greg Daniel22bc8652017-03-22 15:45:43 -0400198 int fCurrentCmdInfo;
Greg Daniel36a77ee2016-10-18 10:33:25 -0400199
egdaniel066df7c2016-06-08 14:02:27 -0700200 GrVkGpu* fGpu;
Brian Salomonc293a292016-11-30 13:38:32 -0500201 VkAttachmentLoadOp fVkColorLoadOp;
202 VkAttachmentStoreOp fVkColorStoreOp;
203 VkAttachmentLoadOp fVkStencilLoadOp;
204 VkAttachmentStoreOp fVkStencilStoreOp;
Brian Osman9a9baae2018-11-05 15:06:26 -0500205 SkPMColor4f fClearColor;
Greg Daniel22bc8652017-03-22 15:45:43 -0400206 GrVkPipelineState* fLastPipelineState;
egdaniel9cb63402016-06-23 08:37:05 -0700207
Greg Daniel500d58b2017-08-24 15:59:33 -0400208 typedef GrGpuRTCommandBuffer INHERITED;
egdaniel066df7c2016-06-08 14:02:27 -0700209};
210
211#endif