blob: 2616708d86868355b067ade81f4eef0d7e9cbbcc [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
Greg Daniel070cbaf2019-01-03 17:35:54 -050090 // Called instead of init when we are drawing to a render target that already wraps a secondary
91 // command buffer.
92 void initWrapped();
93
94 bool wrapsSecondaryCommandBuffer() const;
95
egdaniel9cb63402016-06-23 08:37:05 -070096 GrGpu* gpu() override;
97
egdaniel9cb63402016-06-23 08:37:05 -070098 // Bind vertex and index buffers
Brian Salomondbf70722019-02-07 11:31:24 -050099 void bindGeometry(const GrGpuBuffer* indexBuffer,
100 const GrGpuBuffer* vertexBuffer,
101 const GrGpuBuffer* instanceBuffer);
egdaniel9cb63402016-06-23 08:37:05 -0700102
Brian Salomonff168d92018-06-23 15:17:27 -0400103 GrVkPipelineState* prepareDrawState(const GrPrimitiveProcessor&,
104 const GrPipeline&,
Brian Salomon49348902018-06-26 09:12:38 -0400105 const GrPipeline::FixedDynamicState*,
106 const GrPipeline::DynamicStateArrays*,
107 GrPrimitiveType);
egdaniel9cb63402016-06-23 08:37:05 -0700108
Brian Salomon49348902018-06-26 09:12:38 -0400109 void onDraw(const GrPrimitiveProcessor&,
110 const GrPipeline&,
111 const GrPipeline::FixedDynamicState*,
112 const GrPipeline::DynamicStateArrays*,
113 const GrMesh[],
Greg Daniel36a77ee2016-10-18 10:33:25 -0400114 int meshCount,
115 const SkRect& bounds) override;
egdaniel9cb63402016-06-23 08:37:05 -0700116
Chris Dalton114a3c02017-05-26 15:17:19 -0600117 // GrMesh::SendToGpuImpl methods. These issue the actual Vulkan draw commands.
118 // Marked final as a hint to the compiler to not use virtual dispatch.
Brian Salomon802cb312018-06-08 18:05:20 -0400119 void sendMeshToGpu(GrPrimitiveType primType, const GrBuffer* vertexBuffer, int vertexCount,
120 int baseVertex) final {
121 this->sendInstancedMeshToGpu(primType, vertexBuffer, vertexCount, baseVertex, nullptr, 1,
122 0);
Chris Dalton1d616352017-05-31 12:51:23 -0600123 }
Chris Dalton114a3c02017-05-26 15:17:19 -0600124
Brian Salomon802cb312018-06-08 18:05:20 -0400125 void sendIndexedMeshToGpu(GrPrimitiveType primType, const GrBuffer* indexBuffer, int indexCount,
126 int baseIndex, uint16_t /*minIndexValue*/, uint16_t /*maxIndexValue*/,
127 const GrBuffer* vertexBuffer, int baseVertex,
128 GrPrimitiveRestart restart) final {
129 SkASSERT(restart == GrPrimitiveRestart::kNo);
130 this->sendIndexedInstancedMeshToGpu(primType, indexBuffer, indexCount, baseIndex,
131 vertexBuffer, baseVertex, nullptr, 1, 0,
132 GrPrimitiveRestart::kNo);
Chris Dalton1d616352017-05-31 12:51:23 -0600133 }
134
Brian Salomon802cb312018-06-08 18:05:20 -0400135 void sendInstancedMeshToGpu(GrPrimitiveType, const GrBuffer* vertexBuffer, int vertexCount,
136 int baseVertex, const GrBuffer* instanceBuffer, int instanceCount,
Chris Dalton1d616352017-05-31 12:51:23 -0600137 int baseInstance) final;
138
Brian Salomon802cb312018-06-08 18:05:20 -0400139 void sendIndexedInstancedMeshToGpu(GrPrimitiveType, const GrBuffer* indexBuffer, int indexCount,
140 int baseIndex, const GrBuffer* vertexBuffer, int baseVertex,
Chris Dalton1d616352017-05-31 12:51:23 -0600141 const GrBuffer* instanceBuffer, int instanceCount,
Brian Salomon802cb312018-06-08 18:05:20 -0400142 int baseInstance, GrPrimitiveRestart) final;
Chris Dalton114a3c02017-05-26 15:17:19 -0600143
Brian Osman9a9baae2018-11-05 15:06:26 -0500144 void onClear(const GrFixedClip&, const SkPMColor4f& color) override;
egdaniel9cb63402016-06-23 08:37:05 -0700145
Robert Phillips19e51dc2017-08-09 09:30:51 -0400146 void onClearStencilClip(const GrFixedClip&, bool insideStencilMask) override;
egdaniel9cb63402016-06-23 08:37:05 -0700147
Greg Daniel77b53f62016-10-18 11:48:51 -0400148 void addAdditionalCommandBuffer();
Greg Daniel22bc8652017-03-22 15:45:43 -0400149 void addAdditionalRenderPass();
Greg Daniel77b53f62016-10-18 11:48:51 -0400150
151 struct InlineUploadInfo {
Brian Salomon943ed792017-10-30 09:37:55 -0400152 InlineUploadInfo(GrOpFlushState* state, const GrDeferredTextureUploadFn& upload)
153 : fFlushState(state), fUpload(upload) {}
Greg Daniel77b53f62016-10-18 11:48:51 -0400154
Brian Salomon742e31d2016-12-07 17:06:19 -0500155 GrOpFlushState* fFlushState;
Brian Salomon943ed792017-10-30 09:37:55 -0400156 GrDeferredTextureUploadFn fUpload;
Greg Daniel77b53f62016-10-18 11:48:51 -0400157 };
158
Greg Daniel500d58b2017-08-24 15:59:33 -0400159 struct CopyInfo {
Robert Phillipsb0e93a22017-08-29 08:26:54 -0400160 CopyInfo(GrSurface* src, GrSurfaceOrigin srcOrigin, const SkIRect& srcRect,
Greg Daniel55fa6472018-03-16 16:13:10 -0400161 const SkIPoint& dstPoint, bool shouldDiscardDst)
162 : fSrc(src)
163 , fSrcOrigin(srcOrigin)
164 , fSrcRect(srcRect)
165 , fDstPoint(dstPoint)
166 , fShouldDiscardDst(shouldDiscardDst) {}
Greg Daniel500d58b2017-08-24 15:59:33 -0400167
Robert Phillipsb0e93a22017-08-29 08:26:54 -0400168 GrSurface* fSrc;
169 GrSurfaceOrigin fSrcOrigin;
170 SkIRect fSrcRect;
171 SkIPoint fDstPoint;
Greg Daniel55fa6472018-03-16 16:13:10 -0400172 bool fShouldDiscardDst;
Greg Daniel500d58b2017-08-24 15:59:33 -0400173 };
174
Greg Daniela3c68df2018-03-16 13:46:53 -0400175 enum class LoadStoreState {
176 kUnknown,
177 kStartsWithClear,
178 kStartsWithDiscard,
179 kLoadAndStore,
180 };
181
Greg Daniel36a77ee2016-10-18 10:33:25 -0400182 struct CommandBufferInfo {
Greg Daniel22bc8652017-03-22 15:45:43 -0400183 const GrVkRenderPass* fRenderPass;
184 SkTArray<GrVkSecondaryCommandBuffer*> fCommandBuffers;
185 VkClearValue fColorClearValue;
186 SkRect fBounds;
Greg Daniela3c68df2018-03-16 13:46:53 -0400187 bool fIsEmpty = true;
188 LoadStoreState fLoadStoreState = LoadStoreState::kUnknown;
Greg Daniel500d58b2017-08-24 15:59:33 -0400189 // The PreDrawUploads and PreCopies are sent to the GPU before submitting the secondary
190 // command buffer.
Greg Daniel22bc8652017-03-22 15:45:43 -0400191 SkTArray<InlineUploadInfo> fPreDrawUploads;
Greg Daniel500d58b2017-08-24 15:59:33 -0400192 SkTArray<CopyInfo> fPreCopies;
Greg Danielea022cd2018-03-16 11:10:03 -0400193 // Array of images that will be sampled and thus need to be transfered to sampled layout
194 // before submitting the secondary command buffers. This must happen after we do any predraw
195 // uploads or copies.
196 SkTArray<GrVkImage*> fSampledImages;
Greg Daniel22bc8652017-03-22 15:45:43 -0400197
198 GrVkSecondaryCommandBuffer* currentCmdBuf() {
199 return fCommandBuffers.back();
200 }
Greg Daniel36a77ee2016-10-18 10:33:25 -0400201 };
202
203 SkTArray<CommandBufferInfo> fCommandBufferInfos;
Greg Daniel22bc8652017-03-22 15:45:43 -0400204 int fCurrentCmdInfo;
Greg Daniel36a77ee2016-10-18 10:33:25 -0400205
egdaniel066df7c2016-06-08 14:02:27 -0700206 GrVkGpu* fGpu;
Brian Salomonc293a292016-11-30 13:38:32 -0500207 VkAttachmentLoadOp fVkColorLoadOp;
208 VkAttachmentStoreOp fVkColorStoreOp;
209 VkAttachmentLoadOp fVkStencilLoadOp;
210 VkAttachmentStoreOp fVkStencilStoreOp;
Brian Osman9a9baae2018-11-05 15:06:26 -0500211 SkPMColor4f fClearColor;
Greg Daniel22bc8652017-03-22 15:45:43 -0400212 GrVkPipelineState* fLastPipelineState;
egdaniel9cb63402016-06-23 08:37:05 -0700213
Greg Daniel500d58b2017-08-24 15:59:33 -0400214 typedef GrGpuRTCommandBuffer INHERITED;
egdaniel066df7c2016-06-08 14:02:27 -0700215};
216
217#endif