1*c8dee2aaSAndroid Build Coastguard Worker /* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2020 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 GrRingBuffer_DEFINED 9*c8dee2aaSAndroid Build Coastguard Worker #define GrRingBuffer_DEFINED 10*c8dee2aaSAndroid Build Coastguard Worker 11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRefCnt.h" 12*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkAssert.h" 13*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkMath.h" 14*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrGpuBuffer.h" 15*c8dee2aaSAndroid Build Coastguard Worker 16*c8dee2aaSAndroid Build Coastguard Worker #include <cstddef> 17*c8dee2aaSAndroid Build Coastguard Worker #include <cstdint> 18*c8dee2aaSAndroid Build Coastguard Worker #include <vector> 19*c8dee2aaSAndroid Build Coastguard Worker 20*c8dee2aaSAndroid Build Coastguard Worker class GrGpu; 21*c8dee2aaSAndroid Build Coastguard Worker enum class GrGpuBufferType; 22*c8dee2aaSAndroid Build Coastguard Worker 23*c8dee2aaSAndroid Build Coastguard Worker /** 24*c8dee2aaSAndroid Build Coastguard Worker * A wrapper for a GPU buffer that allocates slices in a continuous ring. 25*c8dee2aaSAndroid Build Coastguard Worker * 26*c8dee2aaSAndroid Build Coastguard Worker * It's assumed that suballocate and startSubmit are always called in the same thread, 27*c8dee2aaSAndroid Build Coastguard Worker * and that finishSubmit could be called in a separate thread. 28*c8dee2aaSAndroid Build Coastguard Worker */ 29*c8dee2aaSAndroid Build Coastguard Worker class GrRingBuffer { 30*c8dee2aaSAndroid Build Coastguard Worker public: GrRingBuffer(GrGpu * gpu,size_t size,size_t alignment,GrGpuBufferType intendedType)31*c8dee2aaSAndroid Build Coastguard Worker GrRingBuffer(GrGpu* gpu, size_t size, size_t alignment, GrGpuBufferType intendedType) 32*c8dee2aaSAndroid Build Coastguard Worker : fGpu(gpu) 33*c8dee2aaSAndroid Build Coastguard Worker , fTotalSize(size) 34*c8dee2aaSAndroid Build Coastguard Worker , fAlignment(alignment) 35*c8dee2aaSAndroid Build Coastguard Worker , fType(intendedType) 36*c8dee2aaSAndroid Build Coastguard Worker , fNewAllocation(false) 37*c8dee2aaSAndroid Build Coastguard Worker , fHead(0) 38*c8dee2aaSAndroid Build Coastguard Worker , fTail(0) 39*c8dee2aaSAndroid Build Coastguard Worker , fGenID(0) { 40*c8dee2aaSAndroid Build Coastguard Worker // We increment fHead and fTail without bound and let overflow handle any wrapping. 41*c8dee2aaSAndroid Build Coastguard Worker // Because of this, size needs to be a power of two. 42*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(SkIsPow2(size)); 43*c8dee2aaSAndroid Build Coastguard Worker } 44*c8dee2aaSAndroid Build Coastguard Worker 45*c8dee2aaSAndroid Build Coastguard Worker struct Slice { 46*c8dee2aaSAndroid Build Coastguard Worker GrGpuBuffer* fBuffer; 47*c8dee2aaSAndroid Build Coastguard Worker size_t fOffset; 48*c8dee2aaSAndroid Build Coastguard Worker }; 49*c8dee2aaSAndroid Build Coastguard Worker Slice suballocate(size_t size); 50*c8dee2aaSAndroid Build Coastguard Worker 51*c8dee2aaSAndroid Build Coastguard Worker // Backends should call startSubmit() at submit time 52*c8dee2aaSAndroid Build Coastguard Worker void startSubmit(GrGpu*); 53*c8dee2aaSAndroid Build Coastguard Worker size()54*c8dee2aaSAndroid Build Coastguard Worker size_t size() const { return fTotalSize; } 55*c8dee2aaSAndroid Build Coastguard Worker 56*c8dee2aaSAndroid Build Coastguard Worker private: 57*c8dee2aaSAndroid Build Coastguard Worker size_t getAllocationOffset(size_t size); 58*c8dee2aaSAndroid Build Coastguard Worker struct SubmitData { 59*c8dee2aaSAndroid Build Coastguard Worker GrRingBuffer* fOwner; 60*c8dee2aaSAndroid Build Coastguard Worker size_t fLastHead; 61*c8dee2aaSAndroid Build Coastguard Worker size_t fGenID; 62*c8dee2aaSAndroid Build Coastguard Worker }; 63*c8dee2aaSAndroid Build Coastguard Worker static void FinishSubmit(void*); 64*c8dee2aaSAndroid Build Coastguard Worker 65*c8dee2aaSAndroid Build Coastguard Worker GrGpu* fGpu; 66*c8dee2aaSAndroid Build Coastguard Worker sk_sp<GrGpuBuffer> fCurrentBuffer; 67*c8dee2aaSAndroid Build Coastguard Worker std::vector<sk_sp<GrGpuBuffer>> fPreviousBuffers; // previous buffers we've used in this submit 68*c8dee2aaSAndroid Build Coastguard Worker size_t fTotalSize; 69*c8dee2aaSAndroid Build Coastguard Worker size_t fAlignment; 70*c8dee2aaSAndroid Build Coastguard Worker GrGpuBufferType fType; 71*c8dee2aaSAndroid Build Coastguard Worker bool fNewAllocation; // true if there's been a new allocation in this submit 72*c8dee2aaSAndroid Build Coastguard Worker size_t fHead; // where we start allocating 73*c8dee2aaSAndroid Build Coastguard Worker size_t fTail; // where we start deallocating 74*c8dee2aaSAndroid Build Coastguard Worker uint64_t fGenID; // incremented when createBuffer is called 75*c8dee2aaSAndroid Build Coastguard Worker }; 76*c8dee2aaSAndroid Build Coastguard Worker 77*c8dee2aaSAndroid Build Coastguard Worker #endif 78