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