1*c8dee2aaSAndroid Build Coastguard Worker /* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2019 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 GrCpuBuffer_DEFINED 9*c8dee2aaSAndroid Build Coastguard Worker #define GrCpuBuffer_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 "src/base/SkSafeMath.h" 14*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrBuffer.h" 15*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrNonAtomicRef.h" 16*c8dee2aaSAndroid Build Coastguard Worker 17*c8dee2aaSAndroid Build Coastguard Worker #include <cstddef> 18*c8dee2aaSAndroid Build Coastguard Worker #include <new> 19*c8dee2aaSAndroid Build Coastguard Worker 20*c8dee2aaSAndroid Build Coastguard Worker class GrCpuBuffer final : public GrNonAtomicRef<GrCpuBuffer>, public GrBuffer { 21*c8dee2aaSAndroid Build Coastguard Worker public: Make(size_t size)22*c8dee2aaSAndroid Build Coastguard Worker static sk_sp<GrCpuBuffer> Make(size_t size) { 23*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(size > 0); 24*c8dee2aaSAndroid Build Coastguard Worker SkSafeMath sm; 25*c8dee2aaSAndroid Build Coastguard Worker size_t combinedSize = sm.add(sizeof(GrCpuBuffer), size); 26*c8dee2aaSAndroid Build Coastguard Worker if (!sm.ok()) { 27*c8dee2aaSAndroid Build Coastguard Worker SK_ABORT("Buffer size is too big."); 28*c8dee2aaSAndroid Build Coastguard Worker } 29*c8dee2aaSAndroid Build Coastguard Worker auto mem = ::operator new(combinedSize); 30*c8dee2aaSAndroid Build Coastguard Worker return sk_sp<GrCpuBuffer>(new (mem) GrCpuBuffer((char*)mem + sizeof(GrCpuBuffer), size)); 31*c8dee2aaSAndroid Build Coastguard Worker } 32*c8dee2aaSAndroid Build Coastguard Worker 33*c8dee2aaSAndroid Build Coastguard Worker // TODO(b/30449950): use sized delete once P0722R3 is available delete(void * p)34*c8dee2aaSAndroid Build Coastguard Worker static void operator delete(void* p) { ::operator delete(p); } 35*c8dee2aaSAndroid Build Coastguard Worker ref()36*c8dee2aaSAndroid Build Coastguard Worker void ref() const override { GrNonAtomicRef<GrCpuBuffer>::ref(); } unref()37*c8dee2aaSAndroid Build Coastguard Worker void unref() const override { GrNonAtomicRef<GrCpuBuffer>::unref(); } size()38*c8dee2aaSAndroid Build Coastguard Worker size_t size() const override { return fSize; } isCpuBuffer()39*c8dee2aaSAndroid Build Coastguard Worker bool isCpuBuffer() const override { return true; } 40*c8dee2aaSAndroid Build Coastguard Worker data()41*c8dee2aaSAndroid Build Coastguard Worker char* data() { return reinterpret_cast<char*>(fData); } data()42*c8dee2aaSAndroid Build Coastguard Worker const char* data() const { return reinterpret_cast<const char*>(fData); } 43*c8dee2aaSAndroid Build Coastguard Worker 44*c8dee2aaSAndroid Build Coastguard Worker private: GrCpuBuffer(void * data,size_t size)45*c8dee2aaSAndroid Build Coastguard Worker GrCpuBuffer(void* data, size_t size) : fData(data), fSize(size) {} 46*c8dee2aaSAndroid Build Coastguard Worker void* fData; 47*c8dee2aaSAndroid Build Coastguard Worker size_t fSize; 48*c8dee2aaSAndroid Build Coastguard Worker }; 49*c8dee2aaSAndroid Build Coastguard Worker 50*c8dee2aaSAndroid Build Coastguard Worker #endif 51