1*c8dee2aaSAndroid Build Coastguard Worker /* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2021 Google LLC 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 8*c8dee2aaSAndroid Build Coastguard Worker #ifndef GrMeshDrawTarget_DEFINED 9*c8dee2aaSAndroid Build Coastguard Worker #define GrMeshDrawTarget_DEFINED 10*c8dee2aaSAndroid Build Coastguard Worker 11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRefCnt.h" // IWYU pragma: keep 12*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkTArray.h" 13*c8dee2aaSAndroid Build Coastguard Worker #include "src/base/SkArenaAlloc.h" 14*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrAppliedClip.h" 15*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrDrawIndirectCommand.h" 16*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrSimpleMesh.h" 17*c8dee2aaSAndroid Build Coastguard Worker 18*c8dee2aaSAndroid Build Coastguard Worker #include <cstddef> 19*c8dee2aaSAndroid Build Coastguard Worker #include <cstdint> 20*c8dee2aaSAndroid Build Coastguard Worker 21*c8dee2aaSAndroid Build Coastguard Worker class GrAtlasManager; 22*c8dee2aaSAndroid Build Coastguard Worker class GrBuffer; 23*c8dee2aaSAndroid Build Coastguard Worker class GrCaps; 24*c8dee2aaSAndroid Build Coastguard Worker class GrDeferredUploadTarget; 25*c8dee2aaSAndroid Build Coastguard Worker class GrDstProxyView; 26*c8dee2aaSAndroid Build Coastguard Worker class GrGeometryProcessor; 27*c8dee2aaSAndroid Build Coastguard Worker class GrRenderTargetProxy; 28*c8dee2aaSAndroid Build Coastguard Worker class GrResourceProvider; 29*c8dee2aaSAndroid Build Coastguard Worker class GrSurfaceProxy; 30*c8dee2aaSAndroid Build Coastguard Worker class GrSurfaceProxyView; 31*c8dee2aaSAndroid Build Coastguard Worker class GrThreadSafeCache; 32*c8dee2aaSAndroid Build Coastguard Worker enum class GrLoadOp; 33*c8dee2aaSAndroid Build Coastguard Worker enum class GrPrimitiveType : uint8_t; 34*c8dee2aaSAndroid Build Coastguard Worker enum class GrXferBarrierFlags; 35*c8dee2aaSAndroid Build Coastguard Worker 36*c8dee2aaSAndroid Build Coastguard Worker namespace skgpu::ganesh { 37*c8dee2aaSAndroid Build Coastguard Worker class SmallPathAtlasMgr; 38*c8dee2aaSAndroid Build Coastguard Worker } 39*c8dee2aaSAndroid Build Coastguard Worker 40*c8dee2aaSAndroid Build Coastguard Worker namespace skgpu { 41*c8dee2aaSAndroid Build Coastguard Worker struct IndexWriter; 42*c8dee2aaSAndroid Build Coastguard Worker struct VertexWriter; 43*c8dee2aaSAndroid Build Coastguard Worker } // namespace skgpu 44*c8dee2aaSAndroid Build Coastguard Worker 45*c8dee2aaSAndroid Build Coastguard Worker namespace sktext::gpu { 46*c8dee2aaSAndroid Build Coastguard Worker class StrikeCache; 47*c8dee2aaSAndroid Build Coastguard Worker } 48*c8dee2aaSAndroid Build Coastguard Worker 49*c8dee2aaSAndroid Build Coastguard Worker /* 50*c8dee2aaSAndroid Build Coastguard Worker * Abstract interface that supports creating vertices, indices, and meshes, as well as 51*c8dee2aaSAndroid Build Coastguard Worker * invoking GPU draw operations. 52*c8dee2aaSAndroid Build Coastguard Worker */ 53*c8dee2aaSAndroid Build Coastguard Worker class GrMeshDrawTarget { 54*c8dee2aaSAndroid Build Coastguard Worker public: ~GrMeshDrawTarget()55*c8dee2aaSAndroid Build Coastguard Worker virtual ~GrMeshDrawTarget() {} 56*c8dee2aaSAndroid Build Coastguard Worker 57*c8dee2aaSAndroid Build Coastguard Worker /** Adds a draw of a mesh. 'primProcProxies' must have 58*c8dee2aaSAndroid Build Coastguard Worker * GrGeometryProcessor::numTextureSamplers() entries. Can be null if no samplers. 59*c8dee2aaSAndroid Build Coastguard Worker */ 60*c8dee2aaSAndroid Build Coastguard Worker virtual void recordDraw(const GrGeometryProcessor*, 61*c8dee2aaSAndroid Build Coastguard Worker const GrSimpleMesh[], 62*c8dee2aaSAndroid Build Coastguard Worker int meshCnt, 63*c8dee2aaSAndroid Build Coastguard Worker const GrSurfaceProxy* const primProcProxies[], 64*c8dee2aaSAndroid Build Coastguard Worker GrPrimitiveType) = 0; 65*c8dee2aaSAndroid Build Coastguard Worker 66*c8dee2aaSAndroid Build Coastguard Worker /** 67*c8dee2aaSAndroid Build Coastguard Worker * Helper for drawing GrSimpleMesh(es) with zero primProc textures. 68*c8dee2aaSAndroid Build Coastguard Worker */ recordDraw(const GrGeometryProcessor * gp,const GrSimpleMesh meshes[],int meshCnt,GrPrimitiveType primitiveType)69*c8dee2aaSAndroid Build Coastguard Worker void recordDraw(const GrGeometryProcessor* gp, 70*c8dee2aaSAndroid Build Coastguard Worker const GrSimpleMesh meshes[], 71*c8dee2aaSAndroid Build Coastguard Worker int meshCnt, 72*c8dee2aaSAndroid Build Coastguard Worker GrPrimitiveType primitiveType) { 73*c8dee2aaSAndroid Build Coastguard Worker this->recordDraw(gp, meshes, meshCnt, nullptr, primitiveType); 74*c8dee2aaSAndroid Build Coastguard Worker } 75*c8dee2aaSAndroid Build Coastguard Worker 76*c8dee2aaSAndroid Build Coastguard Worker /** 77*c8dee2aaSAndroid Build Coastguard Worker * Makes space for vertex data. The returned pointer is the location where vertex data 78*c8dee2aaSAndroid Build Coastguard Worker * should be written. On return the buffer that will hold the data as well as an offset into 79*c8dee2aaSAndroid Build Coastguard Worker * the buffer (in 'vertexSize' units) where the data will be placed. 80*c8dee2aaSAndroid Build Coastguard Worker */ 81*c8dee2aaSAndroid Build Coastguard Worker virtual void* makeVertexSpace(size_t vertexSize, int vertexCount, sk_sp<const GrBuffer>*, 82*c8dee2aaSAndroid Build Coastguard Worker int* startVertex) = 0; 83*c8dee2aaSAndroid Build Coastguard Worker 84*c8dee2aaSAndroid Build Coastguard Worker /** 85*c8dee2aaSAndroid Build Coastguard Worker * Makes space for index data. The returned pointer is the location where index data 86*c8dee2aaSAndroid Build Coastguard Worker * should be written. On return the buffer that will hold the data as well as an offset into 87*c8dee2aaSAndroid Build Coastguard Worker * the buffer (in uint16_t units) where the data will be placed. 88*c8dee2aaSAndroid Build Coastguard Worker */ 89*c8dee2aaSAndroid Build Coastguard Worker virtual uint16_t* makeIndexSpace(int indexCount, sk_sp<const GrBuffer>*, int* startIndex) = 0; 90*c8dee2aaSAndroid Build Coastguard Worker 91*c8dee2aaSAndroid Build Coastguard Worker /** 92*c8dee2aaSAndroid Build Coastguard Worker * This is similar to makeVertexSpace. It allows the caller to use up to 'actualVertexCount' 93*c8dee2aaSAndroid Build Coastguard Worker * vertices in the returned pointer, which may exceed 'minVertexCount'. 94*c8dee2aaSAndroid Build Coastguard Worker * 'fallbackVertexCount' is the maximum number of vertices that should be allocated if a new 95*c8dee2aaSAndroid Build Coastguard Worker * buffer is allocated on behalf of this request. 96*c8dee2aaSAndroid Build Coastguard Worker */ 97*c8dee2aaSAndroid Build Coastguard Worker virtual void* makeVertexSpaceAtLeast(size_t vertexSize, int minVertexCount, 98*c8dee2aaSAndroid Build Coastguard Worker int fallbackVertexCount, sk_sp<const GrBuffer>*, 99*c8dee2aaSAndroid Build Coastguard Worker int* startVertex, int* actualVertexCount) = 0; 100*c8dee2aaSAndroid Build Coastguard Worker 101*c8dee2aaSAndroid Build Coastguard Worker /** 102*c8dee2aaSAndroid Build Coastguard Worker * This is similar to makeIndexSpace. It allows the caller to use up to 'actualIndexCount' 103*c8dee2aaSAndroid Build Coastguard Worker * indices in the returned pointer, which may exceed 'minIndexCount'. 104*c8dee2aaSAndroid Build Coastguard Worker * 'fallbackIndexCount' is the maximum number of indices that should be allocated if a new 105*c8dee2aaSAndroid Build Coastguard Worker * buffer is allocated on behalf of this request. 106*c8dee2aaSAndroid Build Coastguard Worker */ 107*c8dee2aaSAndroid Build Coastguard Worker virtual uint16_t* makeIndexSpaceAtLeast(int minIndexCount, int fallbackIndexCount, 108*c8dee2aaSAndroid Build Coastguard Worker sk_sp<const GrBuffer>*, int* startIndex, 109*c8dee2aaSAndroid Build Coastguard Worker int* actualIndexCount) = 0; 110*c8dee2aaSAndroid Build Coastguard Worker 111*c8dee2aaSAndroid Build Coastguard Worker /** 112*c8dee2aaSAndroid Build Coastguard Worker * Makes space for elements in a draw-indirect buffer. Upon success, the returned pointer is a 113*c8dee2aaSAndroid Build Coastguard Worker * CPU mapping where the data should be written. 114*c8dee2aaSAndroid Build Coastguard Worker */ 115*c8dee2aaSAndroid Build Coastguard Worker virtual GrDrawIndirectWriter makeDrawIndirectSpace(int drawCount, sk_sp<const GrBuffer>* buffer, 116*c8dee2aaSAndroid Build Coastguard Worker size_t* offsetInBytes) = 0; 117*c8dee2aaSAndroid Build Coastguard Worker 118*c8dee2aaSAndroid Build Coastguard Worker /** 119*c8dee2aaSAndroid Build Coastguard Worker * Makes space for elements in a draw-indexed-indirect buffer. Upon success, the returned 120*c8dee2aaSAndroid Build Coastguard Worker * pointer is a CPU mapping where the data should be written. 121*c8dee2aaSAndroid Build Coastguard Worker */ 122*c8dee2aaSAndroid Build Coastguard Worker virtual GrDrawIndexedIndirectWriter makeDrawIndexedIndirectSpace(int drawCount, 123*c8dee2aaSAndroid Build Coastguard Worker sk_sp<const GrBuffer>*, 124*c8dee2aaSAndroid Build Coastguard Worker size_t* offsetInBytes) = 0; 125*c8dee2aaSAndroid Build Coastguard Worker 126*c8dee2aaSAndroid Build Coastguard Worker /** Helpers for ops that only need to use the VertexWriter to fill the data directly. */ 127*c8dee2aaSAndroid Build Coastguard Worker skgpu::VertexWriter makeVertexWriter(size_t vertexSize, int vertexCount, 128*c8dee2aaSAndroid Build Coastguard Worker sk_sp<const GrBuffer>*, int* startVertex); 129*c8dee2aaSAndroid Build Coastguard Worker skgpu::IndexWriter makeIndexWriter(int indexCount, sk_sp<const GrBuffer>*, int* startIndex); 130*c8dee2aaSAndroid Build Coastguard Worker skgpu::VertexWriter makeVertexWriterAtLeast(size_t vertexSize, int minVertexCount, 131*c8dee2aaSAndroid Build Coastguard Worker int fallbackVertexCount, sk_sp<const GrBuffer>*, 132*c8dee2aaSAndroid Build Coastguard Worker int* startVertex, int* actualVertexCount); 133*c8dee2aaSAndroid Build Coastguard Worker skgpu::IndexWriter makeIndexWriterAtLeast(int minIndexCount, int fallbackIndexCount, 134*c8dee2aaSAndroid Build Coastguard Worker sk_sp<const GrBuffer>*, int* startIndex, 135*c8dee2aaSAndroid Build Coastguard Worker int* actualIndexCount); 136*c8dee2aaSAndroid Build Coastguard Worker 137*c8dee2aaSAndroid Build Coastguard Worker /** Helpers for ops which over-allocate and then return excess data to the pool. */ 138*c8dee2aaSAndroid Build Coastguard Worker virtual void putBackIndices(int indices) = 0; 139*c8dee2aaSAndroid Build Coastguard Worker virtual void putBackVertices(int vertices, size_t vertexStride) = 0; 140*c8dee2aaSAndroid Build Coastguard Worker virtual void putBackIndirectDraws(int count) = 0; 141*c8dee2aaSAndroid Build Coastguard Worker virtual void putBackIndexedIndirectDraws(int count) = 0; 142*c8dee2aaSAndroid Build Coastguard Worker allocMesh()143*c8dee2aaSAndroid Build Coastguard Worker GrSimpleMesh* allocMesh() { return this->allocator()->make<GrSimpleMesh>(); } allocMeshes(int n)144*c8dee2aaSAndroid Build Coastguard Worker GrSimpleMesh* allocMeshes(int n) { return this->allocator()->makeArray<GrSimpleMesh>(n); } allocPrimProcProxyPtrs(int n)145*c8dee2aaSAndroid Build Coastguard Worker const GrSurfaceProxy** allocPrimProcProxyPtrs(int n) { 146*c8dee2aaSAndroid Build Coastguard Worker return this->allocator()->makeArray<const GrSurfaceProxy*>(n); 147*c8dee2aaSAndroid Build Coastguard Worker } 148*c8dee2aaSAndroid Build Coastguard Worker 149*c8dee2aaSAndroid Build Coastguard Worker virtual GrRenderTargetProxy* rtProxy() const = 0; 150*c8dee2aaSAndroid Build Coastguard Worker virtual const GrSurfaceProxyView& writeView() const = 0; 151*c8dee2aaSAndroid Build Coastguard Worker 152*c8dee2aaSAndroid Build Coastguard Worker virtual const GrAppliedClip* appliedClip() const = 0; 153*c8dee2aaSAndroid Build Coastguard Worker virtual GrAppliedClip detachAppliedClip() = 0; 154*c8dee2aaSAndroid Build Coastguard Worker 155*c8dee2aaSAndroid Build Coastguard Worker virtual const GrDstProxyView& dstProxyView() const = 0; 156*c8dee2aaSAndroid Build Coastguard Worker virtual bool usesMSAASurface() const = 0; 157*c8dee2aaSAndroid Build Coastguard Worker 158*c8dee2aaSAndroid Build Coastguard Worker virtual GrXferBarrierFlags renderPassBarriers() const = 0; 159*c8dee2aaSAndroid Build Coastguard Worker 160*c8dee2aaSAndroid Build Coastguard Worker virtual GrLoadOp colorLoadOp() const = 0; 161*c8dee2aaSAndroid Build Coastguard Worker 162*c8dee2aaSAndroid Build Coastguard Worker virtual GrThreadSafeCache* threadSafeCache() const = 0; 163*c8dee2aaSAndroid Build Coastguard Worker virtual GrResourceProvider* resourceProvider() const = 0; 164*c8dee2aaSAndroid Build Coastguard Worker uint32_t contextUniqueID() const; 165*c8dee2aaSAndroid Build Coastguard Worker 166*c8dee2aaSAndroid Build Coastguard Worker virtual sktext::gpu::StrikeCache* strikeCache() const = 0; 167*c8dee2aaSAndroid Build Coastguard Worker virtual GrAtlasManager* atlasManager() const = 0; 168*c8dee2aaSAndroid Build Coastguard Worker #if !defined(SK_ENABLE_OPTIMIZE_SIZE) 169*c8dee2aaSAndroid Build Coastguard Worker virtual skgpu::ganesh::SmallPathAtlasMgr* smallPathAtlasManager() const = 0; 170*c8dee2aaSAndroid Build Coastguard Worker #endif 171*c8dee2aaSAndroid Build Coastguard Worker 172*c8dee2aaSAndroid Build Coastguard Worker // This should be called during onPrepare of a GrOp. The caller should add any proxies to the 173*c8dee2aaSAndroid Build Coastguard Worker // array it will use that it did not access during a call to visitProxies. This is usually the 174*c8dee2aaSAndroid Build Coastguard Worker // case for atlases. 175*c8dee2aaSAndroid Build Coastguard Worker virtual skia_private::TArray<GrSurfaceProxy*, true>* sampledProxyArray() = 0; 176*c8dee2aaSAndroid Build Coastguard Worker 177*c8dee2aaSAndroid Build Coastguard Worker virtual const GrCaps& caps() const = 0; 178*c8dee2aaSAndroid Build Coastguard Worker 179*c8dee2aaSAndroid Build Coastguard Worker virtual GrDeferredUploadTarget* deferredUploadTarget() = 0; 180*c8dee2aaSAndroid Build Coastguard Worker 181*c8dee2aaSAndroid Build Coastguard Worker virtual SkArenaAlloc* allocator() = 0; 182*c8dee2aaSAndroid Build Coastguard Worker }; 183*c8dee2aaSAndroid Build Coastguard Worker 184*c8dee2aaSAndroid Build Coastguard Worker #endif 185