1 /* 2 * Copyright 2019 Google Inc. 3 * 4 * Use of this source code is governed by a BSD-style license that can be 5 * found in the LICENSE file. 6 */ 7 8 #ifndef GrCpuBuffer_DEFINED 9 #define GrCpuBuffer_DEFINED 10 11 #include "include/core/SkRefCnt.h" 12 #include "include/private/base/SkAssert.h" 13 #include "src/base/SkSafeMath.h" 14 #include "src/gpu/ganesh/GrBuffer.h" 15 #include "src/gpu/ganesh/GrNonAtomicRef.h" 16 17 #include <cstddef> 18 #include <new> 19 20 class GrCpuBuffer final : public GrNonAtomicRef<GrCpuBuffer>, public GrBuffer { 21 public: Make(size_t size)22 static sk_sp<GrCpuBuffer> Make(size_t size) { 23 SkASSERT(size > 0); 24 SkSafeMath sm; 25 size_t combinedSize = sm.add(sizeof(GrCpuBuffer), size); 26 if (!sm.ok()) { 27 SK_ABORT("Buffer size is too big."); 28 } 29 auto mem = ::operator new(combinedSize); 30 return sk_sp<GrCpuBuffer>(new (mem) GrCpuBuffer((char*)mem + sizeof(GrCpuBuffer), size)); 31 } 32 33 // TODO(b/30449950): use sized delete once P0722R3 is available delete(void * p)34 static void operator delete(void* p) { ::operator delete(p); } 35 ref()36 void ref() const override { GrNonAtomicRef<GrCpuBuffer>::ref(); } unref()37 void unref() const override { GrNonAtomicRef<GrCpuBuffer>::unref(); } size()38 size_t size() const override { return fSize; } isCpuBuffer()39 bool isCpuBuffer() const override { return true; } 40 data()41 char* data() { return reinterpret_cast<char*>(fData); } data()42 const char* data() const { return reinterpret_cast<const char*>(fData); } 43 44 private: GrCpuBuffer(void * data,size_t size)45 GrCpuBuffer(void* data, size_t size) : fData(data), fSize(size) {} 46 void* fData; 47 size_t fSize; 48 }; 49 50 #endif 51