blob: 4815e36f30119bbd6f028561a315a6a0f82b8b20 [file] [log] [blame]
Stephen White5048a6a2019-07-29 17:07:44 -04001/*
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
12namespace {
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
30GrDawnBuffer::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
41GrDawnBuffer::~GrDawnBuffer() {
42 delete[] fData;
43}
44
45void GrDawnBuffer::onMap() {
46 if (this->wasDestroyed()) {
47 return;
48 }
49 fData = new char[this->size()];
50 fMapPtr = fData;
51}
52
53void 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
62bool 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
70GrDawnGpu* GrDawnBuffer::getDawnGpu() const {
71 SkASSERT(!this->wasDestroyed());
72 return static_cast<GrDawnGpu*>(this->getGpu());
73}