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::BufferUsage GrGpuBufferTypeToDawnUsageBit(GrGpuBufferType type) {
14 switch (type) {
15 case GrGpuBufferType::kVertex:
16 return dawn::BufferUsage::Vertex;
17 case GrGpuBufferType::kIndex:
18 return dawn::BufferUsage::Index;
19 case GrGpuBufferType::kXferCpuToGpu:
20 return dawn::BufferUsage::CopySrc;
21 case GrGpuBufferType::kXferGpuToCpu:
22 return dawn::BufferUsage::CopyDst;
23 default:
24 SkASSERT(!"buffer type not supported by Dawn");
25 return dawn::BufferUsage::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 , fStagingBuffer(nullptr) {
34 dawn::BufferDescriptor bufferDesc;
35 bufferDesc.size = sizeInBytes;
36 bufferDesc.usage = GrGpuBufferTypeToDawnUsageBit(type) | dawn::BufferUsage::CopyDst;
37 fBuffer = this->getDawnGpu()->device().CreateBuffer(&bufferDesc);
38 this->registerWithCache(SkBudgeted::kYes);
39 }
40
~GrDawnBuffer()41 GrDawnBuffer::~GrDawnBuffer() {
42 }
43
onMap()44 void GrDawnBuffer::onMap() {
45 if (this->wasDestroyed()) {
46 return;
47 }
48 fStagingBuffer = getDawnGpu()->getStagingBuffer(this->size());
49 fMapPtr = fStagingBuffer->fData;
50 }
51
onUnmap()52 void GrDawnBuffer::onUnmap() {
53 if (this->wasDestroyed()) {
54 return;
55 }
56 fStagingBuffer->fBuffer.Unmap();
57 fMapPtr = nullptr;
58 getDawnGpu()->getCopyEncoder()
59 .CopyBufferToBuffer(fStagingBuffer->fBuffer, 0, fBuffer, 0, this->size());
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 this->onMap();
67 memcpy(fStagingBuffer->fData, src, srcSizeInBytes);
68 this->onUnmap();
69 return true;
70 }
71
getDawnGpu() const72 GrDawnGpu* GrDawnBuffer::getDawnGpu() const {
73 SkASSERT(!this->wasDestroyed());
74 return static_cast<GrDawnGpu*>(this->getGpu());
75 }
76