• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2017 The Dawn Authors
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 //     http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14 
15 #ifndef DAWNNATIVE_BUFFER_H_
16 #define DAWNNATIVE_BUFFER_H_
17 
18 #include "dawn_native/Error.h"
19 #include "dawn_native/Forward.h"
20 #include "dawn_native/ObjectBase.h"
21 
22 #include "dawn_native/dawn_platform.h"
23 
24 #include <memory>
25 
26 namespace dawn_native {
27 
28     MaybeError ValidateBufferDescriptor(DeviceBase* device, const BufferDescriptor* descriptor);
29 
30     static constexpr dawn::BufferUsageBit kReadOnlyBufferUsages =
31         dawn::BufferUsageBit::MapRead | dawn::BufferUsageBit::CopySrc |
32         dawn::BufferUsageBit::Index | dawn::BufferUsageBit::Vertex | dawn::BufferUsageBit::Uniform;
33 
34     static constexpr dawn::BufferUsageBit kWritableBufferUsages = dawn::BufferUsageBit::MapWrite |
35                                                                   dawn::BufferUsageBit::CopyDst |
36                                                                   dawn::BufferUsageBit::Storage;
37 
38     class BufferBase : public ObjectBase {
39         enum class BufferState {
40             Unmapped,
41             Mapped,
42             Destroyed,
43         };
44 
45       public:
46         BufferBase(DeviceBase* device, const BufferDescriptor* descriptor);
47         ~BufferBase();
48 
49         static BufferBase* MakeError(DeviceBase* device);
50         static BufferBase* MakeErrorMapped(DeviceBase* device,
51                                            uint64_t size,
52                                            uint8_t** mappedPointer);
53 
54         uint64_t GetSize() const;
55         dawn::BufferUsageBit GetUsage() const;
56 
57         MaybeError MapAtCreation(uint8_t** mappedPointer);
58 
59         MaybeError ValidateCanUseInSubmitNow() const;
60 
61         // Dawn API
62         void SetSubData(uint32_t start, uint32_t count, const void* data);
63         void MapReadAsync(DawnBufferMapReadCallback callback, void* userdata);
64         void MapWriteAsync(DawnBufferMapWriteCallback callback, void* userdata);
65         void Unmap();
66         void Destroy();
67 
68       protected:
69         BufferBase(DeviceBase* device, ObjectBase::ErrorTag tag);
70 
71         void CallMapReadCallback(uint32_t serial,
72                                  DawnBufferMapAsyncStatus status,
73                                  const void* pointer,
74                                  uint32_t dataLength);
75         void CallMapWriteCallback(uint32_t serial,
76                                   DawnBufferMapAsyncStatus status,
77                                   void* pointer,
78                                   uint32_t dataLength);
79 
80         void DestroyInternal();
81 
82       private:
83         virtual MaybeError MapAtCreationImpl(uint8_t** mappedPointer) = 0;
84         virtual MaybeError SetSubDataImpl(uint32_t start, uint32_t count, const void* data);
85         virtual void MapReadAsyncImpl(uint32_t serial) = 0;
86         virtual void MapWriteAsyncImpl(uint32_t serial) = 0;
87         virtual void UnmapImpl() = 0;
88         virtual void DestroyImpl() = 0;
89 
90         virtual bool IsMapWritable() const = 0;
91         MaybeError CopyFromStagingBuffer();
92 
93         MaybeError ValidateSetSubData(uint32_t start, uint32_t count) const;
94         MaybeError ValidateMap(dawn::BufferUsageBit requiredUsage) const;
95         MaybeError ValidateUnmap() const;
96         MaybeError ValidateDestroy() const;
97 
98         uint64_t mSize = 0;
99         dawn::BufferUsageBit mUsage = dawn::BufferUsageBit::None;
100 
101         DawnBufferMapReadCallback mMapReadCallback = nullptr;
102         DawnBufferMapWriteCallback mMapWriteCallback = nullptr;
103         void* mMapUserdata = 0;
104         uint32_t mMapSerial = 0;
105 
106         std::unique_ptr<StagingBufferBase> mStagingBuffer;
107 
108         BufferState mState;
109     };
110 
111 }  // namespace dawn_native
112 
113 #endif  // DAWNNATIVE_BUFFER_H_
114