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