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 "src/core/SkSafeMath.h" 12 #include "src/gpu/GrBuffer.h" 13 #include "src/gpu/GrNonAtomicRef.h" 14 15 class GrCpuBuffer final : public GrNonAtomicRef<GrCpuBuffer>, public GrBuffer { 16 public: Make(size_t size)17 static sk_sp<GrCpuBuffer> Make(size_t size) { 18 SkASSERT(size > 0); 19 SkSafeMath sm; 20 size_t combinedSize = sm.add(sizeof(GrCpuBuffer), size); 21 if (!sm.ok()) { 22 SK_ABORT("Buffer size is too big."); 23 } 24 auto mem = ::operator new(combinedSize); 25 return sk_sp<GrCpuBuffer>(new (mem) GrCpuBuffer((char*)mem + sizeof(GrCpuBuffer), size)); 26 } 27 ref()28 void ref() const override { GrNonAtomicRef<GrCpuBuffer>::ref(); } unref()29 void unref() const override { GrNonAtomicRef<GrCpuBuffer>::unref(); } size()30 size_t size() const override { return fSize; } isCpuBuffer()31 bool isCpuBuffer() const override { return true; } 32 data()33 char* data() { return reinterpret_cast<char*>(fData); } data()34 const char* data() const { return reinterpret_cast<const char*>(fData); } 35 36 private: GrCpuBuffer(void * data,size_t size)37 GrCpuBuffer(void* data, size_t size) : fData(data), fSize(size) {} 38 void* fData; 39 size_t fSize; 40 }; 41 42 #endif 43