1*c8dee2aaSAndroid Build Coastguard Worker /* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2020 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 8*c8dee2aaSAndroid Build Coastguard Worker #ifndef GrMockOpTarget_DEFINED 9*c8dee2aaSAndroid Build Coastguard Worker #define GrMockOpTarget_DEFINED 10*c8dee2aaSAndroid Build Coastguard Worker 11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRefCnt.h" 12*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/ganesh/GrDirectContext.h" 13*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkAssert.h" 14*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkTArray.h" 15*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/gpu/ganesh/GrTypesPriv.h" 16*c8dee2aaSAndroid Build Coastguard Worker #include "src/base/SkArenaAlloc.h" 17*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrAppliedClip.h" 18*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrBuffer.h" 19*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrDirectContextPriv.h" 20*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrDrawIndirectCommand.h" 21*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrDstProxyView.h" 22*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrGpu.h" 23*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrGpuBuffer.h" 24*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrMeshDrawTarget.h" 25*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrSimpleMesh.h" 26*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrXferProcessor.h" 27*c8dee2aaSAndroid Build Coastguard Worker 28*c8dee2aaSAndroid Build Coastguard Worker #include <cstddef> 29*c8dee2aaSAndroid Build Coastguard Worker #include <cstdint> 30*c8dee2aaSAndroid Build Coastguard Worker #include <utility> 31*c8dee2aaSAndroid Build Coastguard Worker 32*c8dee2aaSAndroid Build Coastguard Worker class GrAtlasManager; 33*c8dee2aaSAndroid Build Coastguard Worker class GrCaps; 34*c8dee2aaSAndroid Build Coastguard Worker class GrDeferredUploadTarget; 35*c8dee2aaSAndroid Build Coastguard Worker class GrGeometryProcessor; 36*c8dee2aaSAndroid Build Coastguard Worker class GrRenderTargetProxy; 37*c8dee2aaSAndroid Build Coastguard Worker class GrResourceProvider; 38*c8dee2aaSAndroid Build Coastguard Worker class GrSurfaceProxy; 39*c8dee2aaSAndroid Build Coastguard Worker class GrSurfaceProxyView; 40*c8dee2aaSAndroid Build Coastguard Worker class GrThreadSafeCache; 41*c8dee2aaSAndroid Build Coastguard Worker 42*c8dee2aaSAndroid Build Coastguard Worker namespace skgpu { namespace ganesh { class SmallPathAtlasMgr; } } 43*c8dee2aaSAndroid Build Coastguard Worker namespace sktext { namespace gpu { class StrikeCache; } } 44*c8dee2aaSAndroid Build Coastguard Worker 45*c8dee2aaSAndroid Build Coastguard Worker 46*c8dee2aaSAndroid Build Coastguard Worker // This is a mock GrMeshDrawTarget implementation that just gives back pointers into 47*c8dee2aaSAndroid Build Coastguard Worker // pre-allocated CPU buffers, rather than allocating and mapping GPU buffers. 48*c8dee2aaSAndroid Build Coastguard Worker class GrMockOpTarget : public GrMeshDrawTarget { 49*c8dee2aaSAndroid Build Coastguard Worker public: GrMockOpTarget(sk_sp<GrDirectContext> mockContext)50*c8dee2aaSAndroid Build Coastguard Worker GrMockOpTarget(sk_sp<GrDirectContext> mockContext) : fMockContext(std::move(mockContext)) { 51*c8dee2aaSAndroid Build Coastguard Worker fStaticVertexBuffer = fMockContext->priv().getGpu()->createBuffer( 52*c8dee2aaSAndroid Build Coastguard Worker sizeof(fStaticVertexData), GrGpuBufferType::kVertex, kDynamic_GrAccessPattern); 53*c8dee2aaSAndroid Build Coastguard Worker fStaticIndirectBuffer = fMockContext->priv().getGpu()->createBuffer( 54*c8dee2aaSAndroid Build Coastguard Worker sizeof(fStaticIndirectData), GrGpuBufferType::kDrawIndirect, 55*c8dee2aaSAndroid Build Coastguard Worker kDynamic_GrAccessPattern); 56*c8dee2aaSAndroid Build Coastguard Worker } mockContext()57*c8dee2aaSAndroid Build Coastguard Worker const GrDirectContext* mockContext() const { return fMockContext.get(); } caps()58*c8dee2aaSAndroid Build Coastguard Worker const GrCaps& caps() const override { return *fMockContext->priv().caps(); } threadSafeCache()59*c8dee2aaSAndroid Build Coastguard Worker GrThreadSafeCache* threadSafeCache() const override { 60*c8dee2aaSAndroid Build Coastguard Worker return fMockContext->priv().threadSafeCache(); 61*c8dee2aaSAndroid Build Coastguard Worker } resourceProvider()62*c8dee2aaSAndroid Build Coastguard Worker GrResourceProvider* resourceProvider() const override { 63*c8dee2aaSAndroid Build Coastguard Worker return fMockContext->priv().resourceProvider(); 64*c8dee2aaSAndroid Build Coastguard Worker } 65*c8dee2aaSAndroid Build Coastguard Worker #ifndef SK_ENABLE_OPTIMIZE_SIZE smallPathAtlasManager()66*c8dee2aaSAndroid Build Coastguard Worker skgpu::ganesh::SmallPathAtlasMgr* smallPathAtlasManager() const override { return nullptr; } 67*c8dee2aaSAndroid Build Coastguard Worker #endif resetAllocator()68*c8dee2aaSAndroid Build Coastguard Worker void resetAllocator() { fAllocator.reset(); } allocator()69*c8dee2aaSAndroid Build Coastguard Worker SkArenaAlloc* allocator() override { return &fAllocator; } putBackVertices(int vertices,size_t vertexStride)70*c8dee2aaSAndroid Build Coastguard Worker void putBackVertices(int vertices, size_t vertexStride) override { /* no-op */ } detachAppliedClip()71*c8dee2aaSAndroid Build Coastguard Worker GrAppliedClip detachAppliedClip() override { return GrAppliedClip::Disabled(); } dstProxyView()72*c8dee2aaSAndroid Build Coastguard Worker const GrDstProxyView& dstProxyView() const override { return fDstProxyView; } renderPassBarriers()73*c8dee2aaSAndroid Build Coastguard Worker GrXferBarrierFlags renderPassBarriers() const override { return GrXferBarrierFlags::kNone; } colorLoadOp()74*c8dee2aaSAndroid Build Coastguard Worker GrLoadOp colorLoadOp() const override { return GrLoadOp::kLoad; } 75*c8dee2aaSAndroid Build Coastguard Worker makeVertexSpace(size_t vertexSize,int vertexCount,sk_sp<const GrBuffer> * buffer,int * startVertex)76*c8dee2aaSAndroid Build Coastguard Worker void* makeVertexSpace(size_t vertexSize, int vertexCount, sk_sp<const GrBuffer>* buffer, 77*c8dee2aaSAndroid Build Coastguard Worker int* startVertex) override { 78*c8dee2aaSAndroid Build Coastguard Worker if (vertexSize * vertexCount > sizeof(fStaticVertexData)) { 79*c8dee2aaSAndroid Build Coastguard Worker SK_ABORT("FATAL: wanted %zu bytes of static vertex data; only have %zu.\n", 80*c8dee2aaSAndroid Build Coastguard Worker vertexSize * vertexCount, sizeof(fStaticVertexData)); 81*c8dee2aaSAndroid Build Coastguard Worker } 82*c8dee2aaSAndroid Build Coastguard Worker *buffer = fStaticVertexBuffer; 83*c8dee2aaSAndroid Build Coastguard Worker *startVertex = 0; 84*c8dee2aaSAndroid Build Coastguard Worker return fStaticVertexData; 85*c8dee2aaSAndroid Build Coastguard Worker } 86*c8dee2aaSAndroid Build Coastguard Worker makeVertexSpaceAtLeast(size_t vertexSize,int minVertexCount,int fallbackVertexCount,sk_sp<const GrBuffer> * buffer,int * startVertex,int * actualVertexCount)87*c8dee2aaSAndroid Build Coastguard Worker void* makeVertexSpaceAtLeast(size_t vertexSize, int minVertexCount, int fallbackVertexCount, 88*c8dee2aaSAndroid Build Coastguard Worker sk_sp<const GrBuffer>* buffer, int* startVertex, 89*c8dee2aaSAndroid Build Coastguard Worker int* actualVertexCount) override { 90*c8dee2aaSAndroid Build Coastguard Worker if (vertexSize * minVertexCount > sizeof(fStaticVertexData)) { 91*c8dee2aaSAndroid Build Coastguard Worker SK_ABORT("FATAL: wanted %zu bytes of static vertex data; only have %zu.\n", 92*c8dee2aaSAndroid Build Coastguard Worker vertexSize * minVertexCount, sizeof(fStaticVertexData)); 93*c8dee2aaSAndroid Build Coastguard Worker } 94*c8dee2aaSAndroid Build Coastguard Worker *buffer = fStaticVertexBuffer; 95*c8dee2aaSAndroid Build Coastguard Worker *startVertex = 0; 96*c8dee2aaSAndroid Build Coastguard Worker *actualVertexCount = sizeof(fStaticVertexData) / vertexSize; 97*c8dee2aaSAndroid Build Coastguard Worker return fStaticVertexData; 98*c8dee2aaSAndroid Build Coastguard Worker } 99*c8dee2aaSAndroid Build Coastguard Worker makeDrawIndirectSpace(int drawCount,sk_sp<const GrBuffer> * buffer,size_t * offsetInBytes)100*c8dee2aaSAndroid Build Coastguard Worker GrDrawIndirectWriter makeDrawIndirectSpace(int drawCount, sk_sp<const GrBuffer>* buffer, 101*c8dee2aaSAndroid Build Coastguard Worker size_t* offsetInBytes) override { 102*c8dee2aaSAndroid Build Coastguard Worker if (sizeof(GrDrawIndirectCommand) * drawCount > sizeof(fStaticIndirectData)) { 103*c8dee2aaSAndroid Build Coastguard Worker SK_ABORT("FATAL: wanted %zu bytes of static indirect data; only have %zu.\n", 104*c8dee2aaSAndroid Build Coastguard Worker sizeof(GrDrawIndirectCommand) * drawCount, sizeof(fStaticIndirectData)); 105*c8dee2aaSAndroid Build Coastguard Worker } 106*c8dee2aaSAndroid Build Coastguard Worker *buffer = fStaticIndirectBuffer; 107*c8dee2aaSAndroid Build Coastguard Worker *offsetInBytes = 0; 108*c8dee2aaSAndroid Build Coastguard Worker return fStaticIndirectData; 109*c8dee2aaSAndroid Build Coastguard Worker } 110*c8dee2aaSAndroid Build Coastguard Worker putBackIndirectDraws(int count)111*c8dee2aaSAndroid Build Coastguard Worker void putBackIndirectDraws(int count) override { /* no-op */ } 112*c8dee2aaSAndroid Build Coastguard Worker makeDrawIndexedIndirectSpace(int drawCount,sk_sp<const GrBuffer> * buffer,size_t * offsetInBytes)113*c8dee2aaSAndroid Build Coastguard Worker GrDrawIndexedIndirectWriter makeDrawIndexedIndirectSpace(int drawCount, 114*c8dee2aaSAndroid Build Coastguard Worker sk_sp<const GrBuffer>* buffer, 115*c8dee2aaSAndroid Build Coastguard Worker size_t* offsetInBytes) override { 116*c8dee2aaSAndroid Build Coastguard Worker if (sizeof(GrDrawIndexedIndirectCommand) * drawCount > sizeof(fStaticIndirectData)) { 117*c8dee2aaSAndroid Build Coastguard Worker SK_ABORT("FATAL: wanted %zu bytes of static indirect data; only have %zu.\n", 118*c8dee2aaSAndroid Build Coastguard Worker sizeof(GrDrawIndexedIndirectCommand) * drawCount, sizeof(fStaticIndirectData)); 119*c8dee2aaSAndroid Build Coastguard Worker } 120*c8dee2aaSAndroid Build Coastguard Worker *buffer = fStaticIndirectBuffer; 121*c8dee2aaSAndroid Build Coastguard Worker *offsetInBytes = 0; 122*c8dee2aaSAndroid Build Coastguard Worker return fStaticIndirectData; 123*c8dee2aaSAndroid Build Coastguard Worker } 124*c8dee2aaSAndroid Build Coastguard Worker putBackIndexedIndirectDraws(int count)125*c8dee2aaSAndroid Build Coastguard Worker void putBackIndexedIndirectDraws(int count) override { /* no-op */ } 126*c8dee2aaSAndroid Build Coastguard Worker 127*c8dee2aaSAndroid Build Coastguard Worker // Call these methods to see what got written after the previous call to make*Space. peekStaticVertexData()128*c8dee2aaSAndroid Build Coastguard Worker const void* peekStaticVertexData() const { return fStaticVertexData; } peekStaticIndirectData()129*c8dee2aaSAndroid Build Coastguard Worker const void* peekStaticIndirectData() const { return fStaticIndirectData; } 130*c8dee2aaSAndroid Build Coastguard Worker 131*c8dee2aaSAndroid Build Coastguard Worker #define UNIMPL(...) __VA_ARGS__ override { SK_ABORT("unimplemented."); } 132*c8dee2aaSAndroid Build Coastguard Worker UNIMPL(void recordDraw(const GrGeometryProcessor*, const GrSimpleMesh[], int, 133*c8dee2aaSAndroid Build Coastguard Worker const GrSurfaceProxy* const[], GrPrimitiveType)) 134*c8dee2aaSAndroid Build Coastguard Worker UNIMPL(uint16_t* makeIndexSpace(int, sk_sp<const GrBuffer>*, int*)) 135*c8dee2aaSAndroid Build Coastguard Worker UNIMPL(uint16_t* makeIndexSpaceAtLeast(int, int, sk_sp<const GrBuffer>*, int*, int*)) 136*c8dee2aaSAndroid Build Coastguard Worker UNIMPL(void putBackIndices(int)) 137*c8dee2aaSAndroid Build Coastguard Worker UNIMPL(GrRenderTargetProxy* rtProxy() const) 138*c8dee2aaSAndroid Build Coastguard Worker UNIMPL(const GrSurfaceProxyView& writeView() const) 139*c8dee2aaSAndroid Build Coastguard Worker UNIMPL(const GrAppliedClip* appliedClip() const) 140*c8dee2aaSAndroid Build Coastguard Worker UNIMPL(bool usesMSAASurface() const) 141*c8dee2aaSAndroid Build Coastguard Worker UNIMPL(sktext::gpu::StrikeCache* strikeCache() const) 142*c8dee2aaSAndroid Build Coastguard Worker UNIMPL(GrAtlasManager* atlasManager() const) 143*c8dee2aaSAndroid Build Coastguard Worker UNIMPL(skia_private::TArray<GrSurfaceProxy*, true>* sampledProxyArray()) 144*c8dee2aaSAndroid Build Coastguard Worker UNIMPL(GrDeferredUploadTarget* deferredUploadTarget()) 145*c8dee2aaSAndroid Build Coastguard Worker #undef UNIMPL 146*c8dee2aaSAndroid Build Coastguard Worker 147*c8dee2aaSAndroid Build Coastguard Worker private: 148*c8dee2aaSAndroid Build Coastguard Worker sk_sp<GrDirectContext> fMockContext; 149*c8dee2aaSAndroid Build Coastguard Worker char fStaticVertexData[6 * 1024 * 1024]; 150*c8dee2aaSAndroid Build Coastguard Worker sk_sp<GrGpuBuffer> fStaticVertexBuffer; 151*c8dee2aaSAndroid Build Coastguard Worker char fStaticIndirectData[sizeof(GrDrawIndexedIndirectCommand) * 32]; 152*c8dee2aaSAndroid Build Coastguard Worker sk_sp<GrGpuBuffer> fStaticIndirectBuffer; 153*c8dee2aaSAndroid Build Coastguard Worker SkSTArenaAllocWithReset<1024 * 1024> fAllocator; 154*c8dee2aaSAndroid Build Coastguard Worker GrDstProxyView fDstProxyView; 155*c8dee2aaSAndroid Build Coastguard Worker }; 156*c8dee2aaSAndroid Build Coastguard Worker 157*c8dee2aaSAndroid Build Coastguard Worker #endif 158