• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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