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 #ifndef GrDawnRingBuffer_DEFINED
9 #define GrDawnRingBuffer_DEFINED
10 
11 #include "src/gpu/GrBuffer.h"
12 #include "src/gpu/dawn/GrDawnBuffer.h"
13 #include "dawn/webgpu_cpp.h"
14 
15 class GrDawnGpu;
16 
17 class GrDawnRingBuffer : public SkRefCnt {
18 public:
19     GrDawnRingBuffer(GrDawnGpu* gpu, wgpu::BufferUsage usage);
20     ~GrDawnRingBuffer() override;
21 
22     struct Slice {
SliceSlice23         Slice(wgpu::Buffer buffer, int offset, void* data)
24           : fBuffer(buffer), fOffset(offset), fData(data) {}
SliceSlice25         Slice()
26           : fBuffer(nullptr), fOffset(0), fData(nullptr) {}
SliceSlice27         Slice(const Slice& other)
28           : fBuffer(other.fBuffer), fOffset(other.fOffset), fData(other.fData) {}
29         Slice& operator=(const Slice& other) {
30             fBuffer = other.fBuffer;
31             fOffset = other.fOffset;
32             fData = other.fData;
33             return *this;
34         }
35         wgpu::Buffer fBuffer;
36         int          fOffset;
37         void*        fData;
38     };
39     Slice allocate(int size);
40     void flush();
41 
42 private:
43     GrDawnGpu*            fGpu;
44     wgpu::BufferUsage     fUsage;
45     wgpu::Buffer          fBuffer;
46     wgpu::Buffer          fStagingBuffer;
47     void*                 fData;
48     int                   fOffset = 0;
49 };
50 
51 #endif
52