xref: /aosp_15_r20/external/skia/src/gpu/ganesh/GrOpFlushState.h (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1*c8dee2aaSAndroid Build Coastguard Worker /*
2*c8dee2aaSAndroid Build Coastguard Worker  * Copyright 2015 Google Inc.
3*c8dee2aaSAndroid Build Coastguard Worker  *
4*c8dee2aaSAndroid Build Coastguard Worker  * Use of this source code is governed by a BSD-style license that can be
5*c8dee2aaSAndroid Build Coastguard Worker  * found in the LICENSE file.
6*c8dee2aaSAndroid Build Coastguard Worker  */
7*c8dee2aaSAndroid Build Coastguard Worker #ifndef GrOpFlushState_DEFINED
8*c8dee2aaSAndroid Build Coastguard Worker #define GrOpFlushState_DEFINED
9*c8dee2aaSAndroid Build Coastguard Worker 
10*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRefCnt.h"
11*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkAssert.h"
12*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkDebug.h"
13*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkTArray.h"
14*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/gpu/ganesh/GrTypesPriv.h"
15*c8dee2aaSAndroid Build Coastguard Worker #include "src/base/SkArenaAlloc.h"
16*c8dee2aaSAndroid Build Coastguard Worker #include "src/base/SkArenaAllocList.h"
17*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/AtlasTypes.h"
18*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrAppliedClip.h"
19*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrBuffer.h"
20*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrBufferAllocPool.h"
21*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrDeferredUpload.h"
22*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrDrawIndirectCommand.h"
23*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrDstProxyView.h"
24*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrGeometryProcessor.h"
25*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrMeshDrawTarget.h"
26*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrOpsRenderPass.h"
27*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrPipeline.h"
28*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrProgramInfo.h"
29*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrScissorState.h"
30*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrSurfaceProxyView.h"
31*c8dee2aaSAndroid Build Coastguard Worker 
32*c8dee2aaSAndroid Build Coastguard Worker #include <cstddef>
33*c8dee2aaSAndroid Build Coastguard Worker #include <cstdint>
34*c8dee2aaSAndroid Build Coastguard Worker #include <utility>
35*c8dee2aaSAndroid Build Coastguard Worker 
36*c8dee2aaSAndroid Build Coastguard Worker class GrAtlasManager;
37*c8dee2aaSAndroid Build Coastguard Worker class GrCaps;
38*c8dee2aaSAndroid Build Coastguard Worker class GrGpu;
39*c8dee2aaSAndroid Build Coastguard Worker class GrOp;
40*c8dee2aaSAndroid Build Coastguard Worker class GrRenderTargetProxy;
41*c8dee2aaSAndroid Build Coastguard Worker class GrResourceProvider;
42*c8dee2aaSAndroid Build Coastguard Worker class GrSurfaceProxy;
43*c8dee2aaSAndroid Build Coastguard Worker class GrThreadSafeCache;
44*c8dee2aaSAndroid Build Coastguard Worker enum class GrXferBarrierFlags;
45*c8dee2aaSAndroid Build Coastguard Worker struct GrSimpleMesh;
46*c8dee2aaSAndroid Build Coastguard Worker struct GrUserStencilSettings;
47*c8dee2aaSAndroid Build Coastguard Worker struct SkIRect;
48*c8dee2aaSAndroid Build Coastguard Worker struct SkRect;
49*c8dee2aaSAndroid Build Coastguard Worker 
50*c8dee2aaSAndroid Build Coastguard Worker namespace skgpu::ganesh {
51*c8dee2aaSAndroid Build Coastguard Worker class SmallPathAtlasMgr;
52*c8dee2aaSAndroid Build Coastguard Worker }
53*c8dee2aaSAndroid Build Coastguard Worker namespace sktext::gpu {
54*c8dee2aaSAndroid Build Coastguard Worker class StrikeCache;
55*c8dee2aaSAndroid Build Coastguard Worker }
56*c8dee2aaSAndroid Build Coastguard Worker 
57*c8dee2aaSAndroid Build Coastguard Worker /** Tracks the state across all the GrOps (really just the GrDrawOps) in a OpsTask flush. */
58*c8dee2aaSAndroid Build Coastguard Worker class GrOpFlushState final : public GrDeferredUploadTarget, public GrMeshDrawTarget {
59*c8dee2aaSAndroid Build Coastguard Worker public:
60*c8dee2aaSAndroid Build Coastguard Worker     // vertexSpace and indexSpace may either be null or an alloation of size
61*c8dee2aaSAndroid Build Coastguard Worker     // GrBufferAllocPool::kDefaultBufferSize. If the latter, then CPU memory is only allocated for
62*c8dee2aaSAndroid Build Coastguard Worker     // vertices/indices when a buffer larger than kDefaultBufferSize is required.
63*c8dee2aaSAndroid Build Coastguard Worker     GrOpFlushState(GrGpu*, GrResourceProvider*, skgpu::TokenTracker*,
64*c8dee2aaSAndroid Build Coastguard Worker                    sk_sp<GrBufferAllocPool::CpuBufferCache> = nullptr);
65*c8dee2aaSAndroid Build Coastguard Worker 
~GrOpFlushState()66*c8dee2aaSAndroid Build Coastguard Worker     ~GrOpFlushState() final { this->reset(); }
67*c8dee2aaSAndroid Build Coastguard Worker 
68*c8dee2aaSAndroid Build Coastguard Worker     /** This is called after each op has a chance to prepare its draws and before the draws are
69*c8dee2aaSAndroid Build Coastguard Worker         executed. */
70*c8dee2aaSAndroid Build Coastguard Worker     void preExecuteDraws();
71*c8dee2aaSAndroid Build Coastguard Worker 
72*c8dee2aaSAndroid Build Coastguard Worker     /** Called to upload data to a texture using the GrDeferredTextureUploadFn. If the uploaded
73*c8dee2aaSAndroid Build Coastguard Worker         surface needs to be prepared for being sampled in a draw after the upload, the caller
74*c8dee2aaSAndroid Build Coastguard Worker         should pass in true for shouldPrepareSurfaceForSampling. This feature is needed for Vulkan
75*c8dee2aaSAndroid Build Coastguard Worker         when doing inline uploads to reset the image layout back to sampled. */
76*c8dee2aaSAndroid Build Coastguard Worker     void doUpload(GrDeferredTextureUploadFn&, bool shouldPrepareSurfaceForSampling = false);
77*c8dee2aaSAndroid Build Coastguard Worker 
78*c8dee2aaSAndroid Build Coastguard Worker     /** Called as ops are executed. Must be called in the same order as the ops were prepared. */
79*c8dee2aaSAndroid Build Coastguard Worker     void executeDrawsAndUploadsForMeshDrawOp(const GrOp* op, const SkRect& chainBounds,
80*c8dee2aaSAndroid Build Coastguard Worker                                              const GrPipeline*, const GrUserStencilSettings*);
81*c8dee2aaSAndroid Build Coastguard Worker 
opsRenderPass()82*c8dee2aaSAndroid Build Coastguard Worker     GrOpsRenderPass* opsRenderPass() { return fOpsRenderPass; }
setOpsRenderPass(GrOpsRenderPass * renderPass)83*c8dee2aaSAndroid Build Coastguard Worker     void setOpsRenderPass(GrOpsRenderPass* renderPass) { fOpsRenderPass = renderPass; }
84*c8dee2aaSAndroid Build Coastguard Worker 
gpu()85*c8dee2aaSAndroid Build Coastguard Worker     GrGpu* gpu() { return fGpu; }
86*c8dee2aaSAndroid Build Coastguard Worker 
87*c8dee2aaSAndroid Build Coastguard Worker     void reset();
88*c8dee2aaSAndroid Build Coastguard Worker 
89*c8dee2aaSAndroid Build Coastguard Worker     /** Additional data required on a per-op basis when executing GrOps. */
90*c8dee2aaSAndroid Build Coastguard Worker     struct OpArgs {
91*c8dee2aaSAndroid Build Coastguard Worker         // TODO: why does OpArgs have the op we're going to pass it to as a member? Remove it.
OpArgsOpArgs92*c8dee2aaSAndroid Build Coastguard Worker         explicit OpArgs(GrOp* op, const GrSurfaceProxyView& surfaceView, bool usesMSAASurface,
93*c8dee2aaSAndroid Build Coastguard Worker                         GrAppliedClip* appliedClip, const GrDstProxyView& dstProxyView,
94*c8dee2aaSAndroid Build Coastguard Worker                         GrXferBarrierFlags renderPassXferBarriers, GrLoadOp colorLoadOp)
95*c8dee2aaSAndroid Build Coastguard Worker                 : fOp(op)
96*c8dee2aaSAndroid Build Coastguard Worker                 , fSurfaceView(surfaceView)
97*c8dee2aaSAndroid Build Coastguard Worker                 , fRenderTargetProxy(surfaceView.asRenderTargetProxy())
98*c8dee2aaSAndroid Build Coastguard Worker                 , fUsesMSAASurface(usesMSAASurface)
99*c8dee2aaSAndroid Build Coastguard Worker                 , fAppliedClip(appliedClip)
100*c8dee2aaSAndroid Build Coastguard Worker                 , fDstProxyView(dstProxyView)
101*c8dee2aaSAndroid Build Coastguard Worker                 , fRenderPassXferBarriers(renderPassXferBarriers)
102*c8dee2aaSAndroid Build Coastguard Worker                 , fColorLoadOp(colorLoadOp) {
103*c8dee2aaSAndroid Build Coastguard Worker             SkASSERT(surfaceView.asRenderTargetProxy());
104*c8dee2aaSAndroid Build Coastguard Worker         }
105*c8dee2aaSAndroid Build Coastguard Worker 
opOpArgs106*c8dee2aaSAndroid Build Coastguard Worker         GrOp* op() { return fOp; }
writeViewOpArgs107*c8dee2aaSAndroid Build Coastguard Worker         const GrSurfaceProxyView& writeView() const { return fSurfaceView; }
rtProxyOpArgs108*c8dee2aaSAndroid Build Coastguard Worker         GrRenderTargetProxy* rtProxy() const { return fRenderTargetProxy; }
109*c8dee2aaSAndroid Build Coastguard Worker         // True if the op under consideration belongs to an opsTask that renders to an MSAA buffer.
usesMSAASurfaceOpArgs110*c8dee2aaSAndroid Build Coastguard Worker         bool usesMSAASurface() const { return fUsesMSAASurface; }
appliedClipOpArgs111*c8dee2aaSAndroid Build Coastguard Worker         GrAppliedClip* appliedClip() { return fAppliedClip; }
appliedClipOpArgs112*c8dee2aaSAndroid Build Coastguard Worker         const GrAppliedClip* appliedClip() const { return fAppliedClip; }
dstProxyViewOpArgs113*c8dee2aaSAndroid Build Coastguard Worker         const GrDstProxyView& dstProxyView() const { return fDstProxyView; }
renderPassBarriersOpArgs114*c8dee2aaSAndroid Build Coastguard Worker         GrXferBarrierFlags renderPassBarriers() const { return fRenderPassXferBarriers; }
colorLoadOpOpArgs115*c8dee2aaSAndroid Build Coastguard Worker         GrLoadOp colorLoadOp() const { return fColorLoadOp; }
116*c8dee2aaSAndroid Build Coastguard Worker 
117*c8dee2aaSAndroid Build Coastguard Worker #ifdef SK_DEBUG
validateOpArgs118*c8dee2aaSAndroid Build Coastguard Worker         void validate() const {
119*c8dee2aaSAndroid Build Coastguard Worker             SkASSERT(fOp);
120*c8dee2aaSAndroid Build Coastguard Worker             SkASSERT(fSurfaceView);
121*c8dee2aaSAndroid Build Coastguard Worker         }
122*c8dee2aaSAndroid Build Coastguard Worker #endif
123*c8dee2aaSAndroid Build Coastguard Worker 
124*c8dee2aaSAndroid Build Coastguard Worker     private:
125*c8dee2aaSAndroid Build Coastguard Worker         GrOp*                         fOp;
126*c8dee2aaSAndroid Build Coastguard Worker         const GrSurfaceProxyView&     fSurfaceView;
127*c8dee2aaSAndroid Build Coastguard Worker         GrRenderTargetProxy*          fRenderTargetProxy;
128*c8dee2aaSAndroid Build Coastguard Worker         bool                          fUsesMSAASurface;
129*c8dee2aaSAndroid Build Coastguard Worker         GrAppliedClip*                fAppliedClip;
130*c8dee2aaSAndroid Build Coastguard Worker         GrDstProxyView                fDstProxyView;   // TODO: do we still need the dst proxy here?
131*c8dee2aaSAndroid Build Coastguard Worker         GrXferBarrierFlags            fRenderPassXferBarriers;
132*c8dee2aaSAndroid Build Coastguard Worker         GrLoadOp                      fColorLoadOp;
133*c8dee2aaSAndroid Build Coastguard Worker     };
134*c8dee2aaSAndroid Build Coastguard Worker 
setOpArgs(OpArgs * opArgs)135*c8dee2aaSAndroid Build Coastguard Worker     void setOpArgs(OpArgs* opArgs) { fOpArgs = opArgs; }
136*c8dee2aaSAndroid Build Coastguard Worker 
drawOpArgs()137*c8dee2aaSAndroid Build Coastguard Worker     const OpArgs& drawOpArgs() const {
138*c8dee2aaSAndroid Build Coastguard Worker         SkASSERT(fOpArgs);
139*c8dee2aaSAndroid Build Coastguard Worker         SkDEBUGCODE(fOpArgs->validate());
140*c8dee2aaSAndroid Build Coastguard Worker         return *fOpArgs;
141*c8dee2aaSAndroid Build Coastguard Worker     }
142*c8dee2aaSAndroid Build Coastguard Worker 
setSampledProxyArray(skia_private::TArray<GrSurfaceProxy *,true> * sampledProxies)143*c8dee2aaSAndroid Build Coastguard Worker     void setSampledProxyArray(skia_private::TArray<GrSurfaceProxy*, true>* sampledProxies) {
144*c8dee2aaSAndroid Build Coastguard Worker         fSampledProxies = sampledProxies;
145*c8dee2aaSAndroid Build Coastguard Worker     }
146*c8dee2aaSAndroid Build Coastguard Worker 
sampledProxyArray()147*c8dee2aaSAndroid Build Coastguard Worker     skia_private::TArray<GrSurfaceProxy*, true>* sampledProxyArray() override {
148*c8dee2aaSAndroid Build Coastguard Worker         return fSampledProxies;
149*c8dee2aaSAndroid Build Coastguard Worker     }
150*c8dee2aaSAndroid Build Coastguard Worker 
151*c8dee2aaSAndroid Build Coastguard Worker     /** Overrides of GrDeferredUploadTarget. */
152*c8dee2aaSAndroid Build Coastguard Worker 
tokenTracker()153*c8dee2aaSAndroid Build Coastguard Worker     const skgpu::TokenTracker* tokenTracker() final { return fTokenTracker; }
154*c8dee2aaSAndroid Build Coastguard Worker     skgpu::AtlasToken addInlineUpload(GrDeferredTextureUploadFn&&) final;
155*c8dee2aaSAndroid Build Coastguard Worker     skgpu::AtlasToken addASAPUpload(GrDeferredTextureUploadFn&&) final;
156*c8dee2aaSAndroid Build Coastguard Worker 
157*c8dee2aaSAndroid Build Coastguard Worker     /** Overrides of GrMeshDrawTarget. */
158*c8dee2aaSAndroid Build Coastguard Worker     void recordDraw(const GrGeometryProcessor*,
159*c8dee2aaSAndroid Build Coastguard Worker                     const GrSimpleMesh[],
160*c8dee2aaSAndroid Build Coastguard Worker                     int meshCnt,
161*c8dee2aaSAndroid Build Coastguard Worker                     const GrSurfaceProxy* const primProcProxies[],
162*c8dee2aaSAndroid Build Coastguard Worker                     GrPrimitiveType) final;
163*c8dee2aaSAndroid Build Coastguard Worker     void* makeVertexSpace(size_t vertexSize, int vertexCount, sk_sp<const GrBuffer>*,
164*c8dee2aaSAndroid Build Coastguard Worker                           int* startVertex) final;
165*c8dee2aaSAndroid Build Coastguard Worker     uint16_t* makeIndexSpace(int indexCount, sk_sp<const GrBuffer>*, int* startIndex) final;
166*c8dee2aaSAndroid Build Coastguard Worker     void* makeVertexSpaceAtLeast(size_t vertexSize, int minVertexCount, int fallbackVertexCount,
167*c8dee2aaSAndroid Build Coastguard Worker                                  sk_sp<const GrBuffer>*, int* startVertex,
168*c8dee2aaSAndroid Build Coastguard Worker                                  int* actualVertexCount) final;
169*c8dee2aaSAndroid Build Coastguard Worker     uint16_t* makeIndexSpaceAtLeast(int minIndexCount, int fallbackIndexCount,
170*c8dee2aaSAndroid Build Coastguard Worker                                     sk_sp<const GrBuffer>*, int* startIndex,
171*c8dee2aaSAndroid Build Coastguard Worker                                     int* actualIndexCount) final;
makeDrawIndirectSpace(int drawCount,sk_sp<const GrBuffer> * buffer,size_t * offset)172*c8dee2aaSAndroid Build Coastguard Worker     GrDrawIndirectWriter makeDrawIndirectSpace(int drawCount, sk_sp<const GrBuffer>* buffer,
173*c8dee2aaSAndroid Build Coastguard Worker                                                size_t* offset) override {
174*c8dee2aaSAndroid Build Coastguard Worker         return fDrawIndirectPool.makeSpace(drawCount, buffer, offset);
175*c8dee2aaSAndroid Build Coastguard Worker     }
makeDrawIndexedIndirectSpace(int drawCount,sk_sp<const GrBuffer> * buffer,size_t * offset)176*c8dee2aaSAndroid Build Coastguard Worker     GrDrawIndexedIndirectWriter makeDrawIndexedIndirectSpace(int drawCount,
177*c8dee2aaSAndroid Build Coastguard Worker                                                              sk_sp<const GrBuffer>* buffer,
178*c8dee2aaSAndroid Build Coastguard Worker                                                              size_t* offset) override {
179*c8dee2aaSAndroid Build Coastguard Worker         return fDrawIndirectPool.makeIndexedSpace(drawCount, buffer, offset);
180*c8dee2aaSAndroid Build Coastguard Worker     }
181*c8dee2aaSAndroid Build Coastguard Worker     void putBackIndices(int indexCount) final;
182*c8dee2aaSAndroid Build Coastguard Worker     void putBackVertices(int vertices, size_t vertexStride) final;
putBackIndirectDraws(int drawCount)183*c8dee2aaSAndroid Build Coastguard Worker     void putBackIndirectDraws(int drawCount) final { fDrawIndirectPool.putBack(drawCount); }
putBackIndexedIndirectDraws(int drawCount)184*c8dee2aaSAndroid Build Coastguard Worker     void putBackIndexedIndirectDraws(int drawCount) final {
185*c8dee2aaSAndroid Build Coastguard Worker         fDrawIndirectPool.putBackIndexed(drawCount);
186*c8dee2aaSAndroid Build Coastguard Worker     }
writeView()187*c8dee2aaSAndroid Build Coastguard Worker     const GrSurfaceProxyView& writeView() const final { return this->drawOpArgs().writeView(); }
rtProxy()188*c8dee2aaSAndroid Build Coastguard Worker     GrRenderTargetProxy* rtProxy() const final { return this->drawOpArgs().rtProxy(); }
usesMSAASurface()189*c8dee2aaSAndroid Build Coastguard Worker     bool usesMSAASurface() const final { return this->drawOpArgs().usesMSAASurface(); }
appliedClip()190*c8dee2aaSAndroid Build Coastguard Worker     const GrAppliedClip* appliedClip() const final { return this->drawOpArgs().appliedClip(); }
appliedHardClip()191*c8dee2aaSAndroid Build Coastguard Worker     const GrAppliedHardClip& appliedHardClip() const {
192*c8dee2aaSAndroid Build Coastguard Worker         return (fOpArgs->appliedClip()) ?
193*c8dee2aaSAndroid Build Coastguard Worker                 fOpArgs->appliedClip()->hardClip() : GrAppliedHardClip::Disabled();
194*c8dee2aaSAndroid Build Coastguard Worker     }
195*c8dee2aaSAndroid Build Coastguard Worker     GrAppliedClip detachAppliedClip() final;
dstProxyView()196*c8dee2aaSAndroid Build Coastguard Worker     const GrDstProxyView& dstProxyView() const final {
197*c8dee2aaSAndroid Build Coastguard Worker         return this->drawOpArgs().dstProxyView();
198*c8dee2aaSAndroid Build Coastguard Worker     }
199*c8dee2aaSAndroid Build Coastguard Worker 
renderPassBarriers()200*c8dee2aaSAndroid Build Coastguard Worker     GrXferBarrierFlags renderPassBarriers() const final {
201*c8dee2aaSAndroid Build Coastguard Worker         return this->drawOpArgs().renderPassBarriers();
202*c8dee2aaSAndroid Build Coastguard Worker     }
203*c8dee2aaSAndroid Build Coastguard Worker 
colorLoadOp()204*c8dee2aaSAndroid Build Coastguard Worker     GrLoadOp colorLoadOp() const final {
205*c8dee2aaSAndroid Build Coastguard Worker         return this->drawOpArgs().colorLoadOp();
206*c8dee2aaSAndroid Build Coastguard Worker     }
207*c8dee2aaSAndroid Build Coastguard Worker 
deferredUploadTarget()208*c8dee2aaSAndroid Build Coastguard Worker     GrDeferredUploadTarget* deferredUploadTarget() final { return this; }
209*c8dee2aaSAndroid Build Coastguard Worker     const GrCaps& caps() const final;
210*c8dee2aaSAndroid Build Coastguard Worker     GrThreadSafeCache* threadSafeCache() const final;
resourceProvider()211*c8dee2aaSAndroid Build Coastguard Worker     GrResourceProvider* resourceProvider() const final { return fResourceProvider; }
212*c8dee2aaSAndroid Build Coastguard Worker 
213*c8dee2aaSAndroid Build Coastguard Worker     sktext::gpu::StrikeCache* strikeCache() const final;
214*c8dee2aaSAndroid Build Coastguard Worker 
215*c8dee2aaSAndroid Build Coastguard Worker     // At this point we know we're flushing so full access to the GrAtlasManager and
216*c8dee2aaSAndroid Build Coastguard Worker     // SmallPathAtlasMgr is required (and permissible).
217*c8dee2aaSAndroid Build Coastguard Worker     GrAtlasManager* atlasManager() const final;
218*c8dee2aaSAndroid Build Coastguard Worker #if !defined(SK_ENABLE_OPTIMIZE_SIZE)
219*c8dee2aaSAndroid Build Coastguard Worker     skgpu::ganesh::SmallPathAtlasMgr* smallPathAtlasManager() const final;
220*c8dee2aaSAndroid Build Coastguard Worker #endif
221*c8dee2aaSAndroid Build Coastguard Worker 
222*c8dee2aaSAndroid Build Coastguard Worker     /** GrMeshDrawTarget override. */
allocator()223*c8dee2aaSAndroid Build Coastguard Worker     SkArenaAlloc* allocator() override { return &fArena; }
224*c8dee2aaSAndroid Build Coastguard Worker 
225*c8dee2aaSAndroid Build Coastguard Worker     // This is a convenience method that binds the given pipeline, and then, if our applied clip has
226*c8dee2aaSAndroid Build Coastguard Worker     // a scissor, sets the scissor rect from the applied clip.
bindPipelineAndScissorClip(const GrProgramInfo & programInfo,const SkRect & drawBounds)227*c8dee2aaSAndroid Build Coastguard Worker     void bindPipelineAndScissorClip(const GrProgramInfo& programInfo, const SkRect& drawBounds) {
228*c8dee2aaSAndroid Build Coastguard Worker         SkASSERT((programInfo.pipeline().isScissorTestEnabled()) ==
229*c8dee2aaSAndroid Build Coastguard Worker                  (this->appliedClip() && this->appliedClip()->scissorState().enabled()));
230*c8dee2aaSAndroid Build Coastguard Worker         this->bindPipeline(programInfo, drawBounds);
231*c8dee2aaSAndroid Build Coastguard Worker         if (programInfo.pipeline().isScissorTestEnabled()) {
232*c8dee2aaSAndroid Build Coastguard Worker             this->setScissorRect(this->appliedClip()->scissorState().rect());
233*c8dee2aaSAndroid Build Coastguard Worker         }
234*c8dee2aaSAndroid Build Coastguard Worker     }
235*c8dee2aaSAndroid Build Coastguard Worker 
236*c8dee2aaSAndroid Build Coastguard Worker     // This is a convenience method for when the primitive processor has exactly one texture. It
237*c8dee2aaSAndroid Build Coastguard Worker     // binds one texture for the primitive processor, and any others for FPs on the pipeline.
bindTextures(const GrGeometryProcessor & geomProc,const GrSurfaceProxy & singleGeomProcTexture,const GrPipeline & pipeline)238*c8dee2aaSAndroid Build Coastguard Worker     void bindTextures(const GrGeometryProcessor& geomProc,
239*c8dee2aaSAndroid Build Coastguard Worker                       const GrSurfaceProxy& singleGeomProcTexture,
240*c8dee2aaSAndroid Build Coastguard Worker                       const GrPipeline& pipeline) {
241*c8dee2aaSAndroid Build Coastguard Worker         SkASSERT(geomProc.numTextureSamplers() == 1);
242*c8dee2aaSAndroid Build Coastguard Worker         const GrSurfaceProxy* ptr = &singleGeomProcTexture;
243*c8dee2aaSAndroid Build Coastguard Worker         this->bindTextures(geomProc, &ptr, pipeline);
244*c8dee2aaSAndroid Build Coastguard Worker     }
245*c8dee2aaSAndroid Build Coastguard Worker 
246*c8dee2aaSAndroid Build Coastguard Worker     // Makes the appropriate bindBuffers() and draw*() calls for the provided mesh.
247*c8dee2aaSAndroid Build Coastguard Worker     void drawMesh(const GrSimpleMesh& mesh);
248*c8dee2aaSAndroid Build Coastguard Worker 
249*c8dee2aaSAndroid Build Coastguard Worker     // Pass-through methods to GrOpsRenderPass.
bindPipeline(const GrProgramInfo & programInfo,const SkRect & drawBounds)250*c8dee2aaSAndroid Build Coastguard Worker     void bindPipeline(const GrProgramInfo& programInfo, const SkRect& drawBounds) {
251*c8dee2aaSAndroid Build Coastguard Worker         fOpsRenderPass->bindPipeline(programInfo, drawBounds);
252*c8dee2aaSAndroid Build Coastguard Worker     }
setScissorRect(const SkIRect & scissorRect)253*c8dee2aaSAndroid Build Coastguard Worker     void setScissorRect(const SkIRect& scissorRect) {
254*c8dee2aaSAndroid Build Coastguard Worker         fOpsRenderPass->setScissorRect(scissorRect);
255*c8dee2aaSAndroid Build Coastguard Worker     }
bindTextures(const GrGeometryProcessor & geomProc,const GrSurfaceProxy * const geomProcTextures[],const GrPipeline & pipeline)256*c8dee2aaSAndroid Build Coastguard Worker     void bindTextures(const GrGeometryProcessor& geomProc,
257*c8dee2aaSAndroid Build Coastguard Worker                       const GrSurfaceProxy* const geomProcTextures[],
258*c8dee2aaSAndroid Build Coastguard Worker                       const GrPipeline& pipeline) {
259*c8dee2aaSAndroid Build Coastguard Worker         fOpsRenderPass->bindTextures(geomProc, geomProcTextures, pipeline);
260*c8dee2aaSAndroid Build Coastguard Worker     }
261*c8dee2aaSAndroid Build Coastguard Worker     void bindBuffers(sk_sp<const GrBuffer> indexBuffer, sk_sp<const GrBuffer> instanceBuffer,
262*c8dee2aaSAndroid Build Coastguard Worker                      sk_sp<const GrBuffer> vertexBuffer,
263*c8dee2aaSAndroid Build Coastguard Worker                      GrPrimitiveRestart primitiveRestart = GrPrimitiveRestart::kNo) {
264*c8dee2aaSAndroid Build Coastguard Worker         fOpsRenderPass->bindBuffers(std::move(indexBuffer), std::move(instanceBuffer),
265*c8dee2aaSAndroid Build Coastguard Worker                                     std::move(vertexBuffer), primitiveRestart);
266*c8dee2aaSAndroid Build Coastguard Worker     }
draw(int vertexCount,int baseVertex)267*c8dee2aaSAndroid Build Coastguard Worker     void draw(int vertexCount, int baseVertex) {
268*c8dee2aaSAndroid Build Coastguard Worker         fOpsRenderPass->draw(vertexCount, baseVertex);
269*c8dee2aaSAndroid Build Coastguard Worker     }
drawIndexed(int indexCount,int baseIndex,uint16_t minIndexValue,uint16_t maxIndexValue,int baseVertex)270*c8dee2aaSAndroid Build Coastguard Worker     void drawIndexed(int indexCount, int baseIndex, uint16_t minIndexValue, uint16_t maxIndexValue,
271*c8dee2aaSAndroid Build Coastguard Worker                      int baseVertex) {
272*c8dee2aaSAndroid Build Coastguard Worker         fOpsRenderPass->drawIndexed(indexCount, baseIndex, minIndexValue, maxIndexValue,
273*c8dee2aaSAndroid Build Coastguard Worker                                     baseVertex);
274*c8dee2aaSAndroid Build Coastguard Worker     }
drawInstanced(int instanceCount,int baseInstance,int vertexCount,int baseVertex)275*c8dee2aaSAndroid Build Coastguard Worker     void drawInstanced(int instanceCount, int baseInstance, int vertexCount, int baseVertex) {
276*c8dee2aaSAndroid Build Coastguard Worker         fOpsRenderPass->drawInstanced(instanceCount, baseInstance, vertexCount, baseVertex);
277*c8dee2aaSAndroid Build Coastguard Worker     }
drawIndexedInstanced(int indexCount,int baseIndex,int instanceCount,int baseInstance,int baseVertex)278*c8dee2aaSAndroid Build Coastguard Worker     void drawIndexedInstanced(int indexCount, int baseIndex, int instanceCount, int baseInstance,
279*c8dee2aaSAndroid Build Coastguard Worker                               int baseVertex) {
280*c8dee2aaSAndroid Build Coastguard Worker         fOpsRenderPass->drawIndexedInstanced(indexCount, baseIndex, instanceCount, baseInstance,
281*c8dee2aaSAndroid Build Coastguard Worker                                              baseVertex);
282*c8dee2aaSAndroid Build Coastguard Worker     }
drawIndirect(const GrBuffer * drawIndirectBuffer,size_t offset,int drawCount)283*c8dee2aaSAndroid Build Coastguard Worker     void drawIndirect(const GrBuffer* drawIndirectBuffer, size_t offset, int drawCount) {
284*c8dee2aaSAndroid Build Coastguard Worker         fOpsRenderPass->drawIndirect(drawIndirectBuffer, offset, drawCount);
285*c8dee2aaSAndroid Build Coastguard Worker     }
drawIndexedIndirect(const GrBuffer * drawIndirectBuffer,size_t offset,int drawCount)286*c8dee2aaSAndroid Build Coastguard Worker     void drawIndexedIndirect(const GrBuffer* drawIndirectBuffer, size_t offset, int drawCount) {
287*c8dee2aaSAndroid Build Coastguard Worker         fOpsRenderPass->drawIndexedIndirect(drawIndirectBuffer, offset, drawCount);
288*c8dee2aaSAndroid Build Coastguard Worker     }
drawIndexPattern(int patternIndexCount,int patternRepeatCount,int maxPatternRepetitionsInIndexBuffer,int patternVertexCount,int baseVertex)289*c8dee2aaSAndroid Build Coastguard Worker     void drawIndexPattern(int patternIndexCount, int patternRepeatCount,
290*c8dee2aaSAndroid Build Coastguard Worker                           int maxPatternRepetitionsInIndexBuffer, int patternVertexCount,
291*c8dee2aaSAndroid Build Coastguard Worker                           int baseVertex) {
292*c8dee2aaSAndroid Build Coastguard Worker         fOpsRenderPass->drawIndexPattern(patternIndexCount, patternRepeatCount,
293*c8dee2aaSAndroid Build Coastguard Worker                                          maxPatternRepetitionsInIndexBuffer, patternVertexCount,
294*c8dee2aaSAndroid Build Coastguard Worker                                          baseVertex);
295*c8dee2aaSAndroid Build Coastguard Worker     }
296*c8dee2aaSAndroid Build Coastguard Worker 
297*c8dee2aaSAndroid Build Coastguard Worker private:
298*c8dee2aaSAndroid Build Coastguard Worker     struct InlineUpload {
InlineUploadInlineUpload299*c8dee2aaSAndroid Build Coastguard Worker         InlineUpload(GrDeferredTextureUploadFn&& upload, skgpu::AtlasToken token)
300*c8dee2aaSAndroid Build Coastguard Worker                 : fUpload(std::move(upload)), fUploadBeforeToken(token) {}
301*c8dee2aaSAndroid Build Coastguard Worker         GrDeferredTextureUploadFn fUpload;
302*c8dee2aaSAndroid Build Coastguard Worker         skgpu::AtlasToken fUploadBeforeToken;
303*c8dee2aaSAndroid Build Coastguard Worker     };
304*c8dee2aaSAndroid Build Coastguard Worker 
305*c8dee2aaSAndroid Build Coastguard Worker     // A set of contiguous draws that share a draw token, geometry processor, and pipeline. The
306*c8dee2aaSAndroid Build Coastguard Worker     // meshes for the draw are stored in the fMeshes array. The reason for coalescing meshes
307*c8dee2aaSAndroid Build Coastguard Worker     // that share a geometry processor into a Draw is that it allows the Gpu object to setup
308*c8dee2aaSAndroid Build Coastguard Worker     // the shared state once and then issue draws for each mesh.
309*c8dee2aaSAndroid Build Coastguard Worker     struct Draw {
310*c8dee2aaSAndroid Build Coastguard Worker         ~Draw();
311*c8dee2aaSAndroid Build Coastguard Worker         // The geometry processor is always forced to be in an arena allocation. This object does
312*c8dee2aaSAndroid Build Coastguard Worker         // not need to manage its lifetime.
313*c8dee2aaSAndroid Build Coastguard Worker         const GrGeometryProcessor* fGeometryProcessor = nullptr;
314*c8dee2aaSAndroid Build Coastguard Worker         // Must have GrGeometryProcessor::numTextureSamplers() entries. Can be null if no samplers.
315*c8dee2aaSAndroid Build Coastguard Worker         const GrSurfaceProxy* const* fGeomProcProxies = nullptr;
316*c8dee2aaSAndroid Build Coastguard Worker         const GrSimpleMesh* fMeshes = nullptr;
317*c8dee2aaSAndroid Build Coastguard Worker         const GrOp* fOp = nullptr;
318*c8dee2aaSAndroid Build Coastguard Worker         int fMeshCnt = 0;
319*c8dee2aaSAndroid Build Coastguard Worker         GrPrimitiveType fPrimitiveType;
320*c8dee2aaSAndroid Build Coastguard Worker     };
321*c8dee2aaSAndroid Build Coastguard Worker 
322*c8dee2aaSAndroid Build Coastguard Worker     // Storage for ops' pipelines, draws, and inline uploads.
323*c8dee2aaSAndroid Build Coastguard Worker     SkArenaAllocWithReset fArena{sizeof(GrPipeline) * 100};
324*c8dee2aaSAndroid Build Coastguard Worker 
325*c8dee2aaSAndroid Build Coastguard Worker     // Store vertex and index data on behalf of ops that are flushed.
326*c8dee2aaSAndroid Build Coastguard Worker     GrVertexBufferAllocPool fVertexPool;
327*c8dee2aaSAndroid Build Coastguard Worker     GrIndexBufferAllocPool fIndexPool;
328*c8dee2aaSAndroid Build Coastguard Worker     GrDrawIndirectBufferAllocPool fDrawIndirectPool;
329*c8dee2aaSAndroid Build Coastguard Worker 
330*c8dee2aaSAndroid Build Coastguard Worker     // Data stored on behalf of the ops being flushed.
331*c8dee2aaSAndroid Build Coastguard Worker     SkArenaAllocList<GrDeferredTextureUploadFn> fASAPUploads;
332*c8dee2aaSAndroid Build Coastguard Worker     SkArenaAllocList<InlineUpload> fInlineUploads;
333*c8dee2aaSAndroid Build Coastguard Worker     SkArenaAllocList<Draw> fDraws;
334*c8dee2aaSAndroid Build Coastguard Worker 
335*c8dee2aaSAndroid Build Coastguard Worker     // All draws we store have an implicit draw token. This is the draw token for the first draw
336*c8dee2aaSAndroid Build Coastguard Worker     // in fDraws.
337*c8dee2aaSAndroid Build Coastguard Worker     skgpu::AtlasToken fBaseDrawToken = skgpu::AtlasToken::InvalidToken();
338*c8dee2aaSAndroid Build Coastguard Worker 
339*c8dee2aaSAndroid Build Coastguard Worker     // Info about the op that is currently preparing or executing using the flush state or null if
340*c8dee2aaSAndroid Build Coastguard Worker     // an op is not currently preparing of executing.
341*c8dee2aaSAndroid Build Coastguard Worker     OpArgs* fOpArgs = nullptr;
342*c8dee2aaSAndroid Build Coastguard Worker 
343*c8dee2aaSAndroid Build Coastguard Worker     // This field is only transiently set during flush. Each OpsTask will set it to point to an
344*c8dee2aaSAndroid Build Coastguard Worker     // array of proxies it uses before call onPrepare and onExecute.
345*c8dee2aaSAndroid Build Coastguard Worker     skia_private::TArray<GrSurfaceProxy*, true>* fSampledProxies;
346*c8dee2aaSAndroid Build Coastguard Worker 
347*c8dee2aaSAndroid Build Coastguard Worker     GrGpu* fGpu;
348*c8dee2aaSAndroid Build Coastguard Worker     GrResourceProvider* fResourceProvider;
349*c8dee2aaSAndroid Build Coastguard Worker     skgpu::TokenTracker* fTokenTracker;
350*c8dee2aaSAndroid Build Coastguard Worker     GrOpsRenderPass* fOpsRenderPass = nullptr;
351*c8dee2aaSAndroid Build Coastguard Worker 
352*c8dee2aaSAndroid Build Coastguard Worker     // Variables that are used to track where we are in lists as ops are executed
353*c8dee2aaSAndroid Build Coastguard Worker     SkArenaAllocList<Draw>::Iter fCurrDraw;
354*c8dee2aaSAndroid Build Coastguard Worker     SkArenaAllocList<InlineUpload>::Iter fCurrUpload;
355*c8dee2aaSAndroid Build Coastguard Worker };
356*c8dee2aaSAndroid Build Coastguard Worker 
357*c8dee2aaSAndroid Build Coastguard Worker #endif
358