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 #include "src/gpu/dawn/GrDawnBuffer.h"
9
10 #include "src/gpu/dawn/GrDawnGpu.h"
11
12 namespace {
GrGpuBufferTypeToDawnUsageBit(GrGpuBufferType type)13 dawn::BufferUsageBit GrGpuBufferTypeToDawnUsageBit(GrGpuBufferType type) {
14 switch (type) {
15 case GrGpuBufferType::kVertex:
16 return dawn::BufferUsageBit::Vertex;
17 case GrGpuBufferType::kIndex:
18 return dawn::BufferUsageBit::Index;
19 case GrGpuBufferType::kXferCpuToGpu:
20 return dawn::BufferUsageBit::CopySrc;
21 case GrGpuBufferType::kXferGpuToCpu:
22 return dawn::BufferUsageBit::CopyDst;
23 default:
24 SkASSERT(!"buffer type not supported by Dawn");
25 return dawn::BufferUsageBit::Vertex;
26 }
27 }
28 }
29
GrDawnBuffer(GrDawnGpu * gpu,size_t sizeInBytes,GrGpuBufferType type,GrAccessPattern pattern)30 GrDawnBuffer::GrDawnBuffer(GrDawnGpu* gpu, size_t sizeInBytes, GrGpuBufferType type,
31 GrAccessPattern pattern)
32 : INHERITED(gpu, sizeInBytes, type, pattern)
33 , fData(nullptr) {
34 dawn::BufferDescriptor bufferDesc;
35 bufferDesc.size = sizeInBytes;
36 bufferDesc.usage = GrGpuBufferTypeToDawnUsageBit(type) | dawn::BufferUsageBit::CopyDst;
37 fBuffer = this->getDawnGpu()->device().CreateBuffer(&bufferDesc);
38 this->registerWithCache(SkBudgeted::kYes);
39 }
40
~GrDawnBuffer()41 GrDawnBuffer::~GrDawnBuffer() {
42 delete[] fData;
43 }
44
onMap()45 void GrDawnBuffer::onMap() {
46 if (this->wasDestroyed()) {
47 return;
48 }
49 fData = new char[this->size()];
50 fMapPtr = fData;
51 }
52
onUnmap()53 void GrDawnBuffer::onUnmap() {
54 if (this->wasDestroyed()) {
55 return;
56 }
57 fBuffer.SetSubData(0, this->size(), reinterpret_cast<const uint8_t*>(fData));
58 delete[] fData;
59 fData = nullptr;
60 }
61
onUpdateData(const void * src,size_t srcSizeInBytes)62 bool GrDawnBuffer::onUpdateData(const void* src, size_t srcSizeInBytes) {
63 if (this->wasDestroyed()) {
64 return false;
65 }
66 fBuffer.SetSubData(0, srcSizeInBytes, static_cast<const uint8_t*>(src));
67 return true;
68 }
69
getDawnGpu() const70 GrDawnGpu* GrDawnBuffer::getDawnGpu() const {
71 SkASSERT(!this->wasDestroyed());
72 return static_cast<GrDawnGpu*>(this->getGpu());
73 }
74