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