mirror of
https://github.com/encounter/dawn-cmake.git
synced 2025-12-18 01:15:39 +00:00
Implement MapWrite except in the wire.
Also this MapWrite doesn't zero out memory yet.
This commit is contained in:
committed by
Corentin Wallez
parent
8565e0056a
commit
cc0a54dbdb
@@ -154,6 +154,10 @@ namespace backend { namespace vulkan {
|
||||
CallMapReadCallback(mapSerial, NXT_BUFFER_MAP_ASYNC_STATUS_SUCCESS, data);
|
||||
}
|
||||
|
||||
void Buffer::OnMapWriteCommandSerialFinished(uint32_t mapSerial, void* data) {
|
||||
CallMapWriteCallback(mapSerial, NXT_BUFFER_MAP_ASYNC_STATUS_SUCCESS, data);
|
||||
}
|
||||
|
||||
VkBuffer Buffer::GetHandle() const {
|
||||
return mHandle;
|
||||
}
|
||||
@@ -186,11 +190,19 @@ namespace backend { namespace vulkan {
|
||||
}
|
||||
|
||||
void Buffer::MapReadAsyncImpl(uint32_t serial, uint32_t start, uint32_t /*count*/) {
|
||||
const uint8_t* memory = mMemoryAllocation.GetMappedPointer();
|
||||
uint8_t* memory = mMemoryAllocation.GetMappedPointer();
|
||||
ASSERT(memory != nullptr);
|
||||
|
||||
MapReadRequestTracker* tracker = ToBackend(GetDevice())->GetMapReadRequestTracker();
|
||||
tracker->Track(this, serial, memory + start);
|
||||
MapRequestTracker* tracker = ToBackend(GetDevice())->GetMapRequestTracker();
|
||||
tracker->Track(this, serial, memory + start, false);
|
||||
}
|
||||
|
||||
void Buffer::MapWriteAsyncImpl(uint32_t serial, uint32_t start, uint32_t /*count*/) {
|
||||
uint8_t* memory = mMemoryAllocation.GetMappedPointer();
|
||||
ASSERT(memory != nullptr);
|
||||
|
||||
MapRequestTracker* tracker = ToBackend(GetDevice())->GetMapRequestTracker();
|
||||
tracker->Track(this, serial, memory + start, true);
|
||||
}
|
||||
|
||||
void Buffer::UnmapImpl() {
|
||||
@@ -203,25 +215,30 @@ namespace backend { namespace vulkan {
|
||||
RecordBarrier(commands, currentUsage, targetUsage);
|
||||
}
|
||||
|
||||
MapReadRequestTracker::MapReadRequestTracker(Device* device) : mDevice(device) {
|
||||
MapRequestTracker::MapRequestTracker(Device* device) : mDevice(device) {
|
||||
}
|
||||
|
||||
MapReadRequestTracker::~MapReadRequestTracker() {
|
||||
MapRequestTracker::~MapRequestTracker() {
|
||||
ASSERT(mInflightRequests.Empty());
|
||||
}
|
||||
|
||||
void MapReadRequestTracker::Track(Buffer* buffer, uint32_t mapSerial, const void* data) {
|
||||
void MapRequestTracker::Track(Buffer* buffer, uint32_t mapSerial, void* data, bool isWrite) {
|
||||
Request request;
|
||||
request.buffer = buffer;
|
||||
request.mapSerial = mapSerial;
|
||||
request.data = data;
|
||||
request.isWrite = isWrite;
|
||||
|
||||
mInflightRequests.Enqueue(std::move(request), mDevice->GetSerial());
|
||||
}
|
||||
|
||||
void MapReadRequestTracker::Tick(Serial finishedSerial) {
|
||||
void MapRequestTracker::Tick(Serial finishedSerial) {
|
||||
for (auto& request : mInflightRequests.IterateUpTo(finishedSerial)) {
|
||||
request.buffer->OnMapReadCommandSerialFinished(request.mapSerial, request.data);
|
||||
if (request.isWrite) {
|
||||
request.buffer->OnMapWriteCommandSerialFinished(request.mapSerial, request.data);
|
||||
} else {
|
||||
request.buffer->OnMapReadCommandSerialFinished(request.mapSerial, request.data);
|
||||
}
|
||||
}
|
||||
mInflightRequests.ClearUpTo(finishedSerial);
|
||||
}
|
||||
|
||||
@@ -31,6 +31,7 @@ namespace backend { namespace vulkan {
|
||||
~Buffer();
|
||||
|
||||
void OnMapReadCommandSerialFinished(uint32_t mapSerial, const void* data);
|
||||
void OnMapWriteCommandSerialFinished(uint32_t mapSerial, void* data);
|
||||
|
||||
VkBuffer GetHandle() const;
|
||||
|
||||
@@ -41,6 +42,7 @@ namespace backend { namespace vulkan {
|
||||
private:
|
||||
void SetSubDataImpl(uint32_t start, uint32_t count, const uint32_t* data) override;
|
||||
void MapReadAsyncImpl(uint32_t serial, uint32_t start, uint32_t count) override;
|
||||
void MapWriteAsyncImpl(uint32_t serial, uint32_t start, uint32_t count) override;
|
||||
void UnmapImpl() override;
|
||||
void TransitionUsageImpl(nxt::BufferUsageBit currentUsage,
|
||||
nxt::BufferUsageBit targetUsage) override;
|
||||
@@ -49,12 +51,12 @@ namespace backend { namespace vulkan {
|
||||
DeviceMemoryAllocation mMemoryAllocation;
|
||||
};
|
||||
|
||||
class MapReadRequestTracker {
|
||||
class MapRequestTracker {
|
||||
public:
|
||||
MapReadRequestTracker(Device* device);
|
||||
~MapReadRequestTracker();
|
||||
MapRequestTracker(Device* device);
|
||||
~MapRequestTracker();
|
||||
|
||||
void Track(Buffer* buffer, uint32_t mapSerial, const void* data);
|
||||
void Track(Buffer* buffer, uint32_t mapSerial, void* data, bool isWrite);
|
||||
void Tick(Serial finishedSerial);
|
||||
|
||||
private:
|
||||
@@ -63,7 +65,8 @@ namespace backend { namespace vulkan {
|
||||
struct Request {
|
||||
Ref<Buffer> buffer;
|
||||
uint32_t mapSerial;
|
||||
const void* data;
|
||||
void* data;
|
||||
bool isWrite;
|
||||
};
|
||||
SerialQueue<Request> mInflightRequests;
|
||||
};
|
||||
|
||||
@@ -142,7 +142,7 @@ namespace backend { namespace vulkan {
|
||||
|
||||
mBufferUploader = new BufferUploader(this);
|
||||
mDeleter = new FencedDeleter(this);
|
||||
mMapReadRequestTracker = new MapReadRequestTracker(this);
|
||||
mMapRequestTracker = new MapRequestTracker(this);
|
||||
mMemoryAllocator = new MemoryAllocator(this);
|
||||
}
|
||||
|
||||
@@ -181,8 +181,8 @@ namespace backend { namespace vulkan {
|
||||
delete mDeleter;
|
||||
mDeleter = nullptr;
|
||||
|
||||
delete mMapReadRequestTracker;
|
||||
mMapReadRequestTracker = nullptr;
|
||||
delete mMapRequestTracker;
|
||||
mMapRequestTracker = nullptr;
|
||||
|
||||
delete mMemoryAllocator;
|
||||
mMemoryAllocator = nullptr;
|
||||
@@ -267,7 +267,7 @@ namespace backend { namespace vulkan {
|
||||
CheckPassedFences();
|
||||
RecycleCompletedCommands();
|
||||
|
||||
mMapReadRequestTracker->Tick(mCompletedSerial);
|
||||
mMapRequestTracker->Tick(mCompletedSerial);
|
||||
mBufferUploader->Tick(mCompletedSerial);
|
||||
mMemoryAllocator->Tick(mCompletedSerial);
|
||||
|
||||
@@ -307,8 +307,8 @@ namespace backend { namespace vulkan {
|
||||
return mQueue;
|
||||
}
|
||||
|
||||
MapReadRequestTracker* Device::GetMapReadRequestTracker() const {
|
||||
return mMapReadRequestTracker;
|
||||
MapRequestTracker* Device::GetMapRequestTracker() const {
|
||||
return mMapRequestTracker;
|
||||
}
|
||||
|
||||
MemoryAllocator* Device::GetMemoryAllocator() const {
|
||||
|
||||
@@ -55,7 +55,7 @@ namespace backend { namespace vulkan {
|
||||
|
||||
class BufferUploader;
|
||||
class FencedDeleter;
|
||||
class MapReadRequestTracker;
|
||||
class MapRequestTracker;
|
||||
class MemoryAllocator;
|
||||
|
||||
struct VulkanBackendTraits {
|
||||
@@ -103,7 +103,7 @@ namespace backend { namespace vulkan {
|
||||
|
||||
BufferUploader* GetBufferUploader() const;
|
||||
FencedDeleter* GetFencedDeleter() const;
|
||||
MapReadRequestTracker* GetMapReadRequestTracker() const;
|
||||
MapRequestTracker* GetMapRequestTracker() const;
|
||||
MemoryAllocator* GetMemoryAllocator() const;
|
||||
|
||||
Serial GetSerial() const;
|
||||
@@ -170,7 +170,7 @@ namespace backend { namespace vulkan {
|
||||
|
||||
BufferUploader* mBufferUploader = nullptr;
|
||||
FencedDeleter* mDeleter = nullptr;
|
||||
MapReadRequestTracker* mMapReadRequestTracker = nullptr;
|
||||
MapRequestTracker* mMapRequestTracker = nullptr;
|
||||
MemoryAllocator* mMemoryAllocator = nullptr;
|
||||
|
||||
VkFence GetUnusedFence();
|
||||
|
||||
Reference in New Issue
Block a user