GrCpuBuffer.h 1.3 KB

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