Implement MapWrite except in the wire.

Also this MapWrite doesn't zero out memory yet.
This commit is contained in:
Corentin Wallez
2018-03-20 20:56:39 -04:00
committed by Corentin Wallez
parent 8565e0056a
commit cc0a54dbdb
25 changed files with 521 additions and 102 deletions

View File

@@ -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);
}

View File

@@ -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;
};

View File

@@ -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 {

View File

@@ -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();