mirror of
https://github.com/encounter/dawn-cmake.git
synced 2025-12-13 23:26:24 +00:00
Add Buffer::MapReadAsync state-tracking
This commit is contained in:
committed by
Corentin Wallez
parent
f45bdb89c6
commit
b1c19eeb4f
@@ -30,6 +30,12 @@ namespace backend {
|
||||
currentUsage(builder->currentUsage) {
|
||||
}
|
||||
|
||||
BufferBase::~BufferBase() {
|
||||
if (mapped) {
|
||||
CallMapReadCallback(mapReadSerial, NXT_BUFFER_MAP_READ_STATUS_UNKNOWN, nullptr);
|
||||
}
|
||||
}
|
||||
|
||||
BufferViewBuilder* BufferBase::CreateBufferViewBuilder() {
|
||||
return new BufferViewBuilder(device, this);
|
||||
}
|
||||
@@ -50,6 +56,13 @@ namespace backend {
|
||||
return currentUsage;
|
||||
}
|
||||
|
||||
void BufferBase::CallMapReadCallback(uint32_t serial, nxtBufferMapReadStatus status, const void* pointer) {
|
||||
if (mapReadCallback && serial == mapReadSerial) {
|
||||
mapReadCallback(status, pointer, mapReadUserdata);
|
||||
mapReadCallback = nullptr;
|
||||
}
|
||||
}
|
||||
|
||||
void BufferBase::SetSubData(uint32_t start, uint32_t count, const uint32_t* data) {
|
||||
if ((start + count) * sizeof(uint32_t) > GetSize()) {
|
||||
device->HandleError("Buffer subdata out of range");
|
||||
@@ -64,6 +77,46 @@ namespace backend {
|
||||
SetSubDataImpl(start, count, data);
|
||||
}
|
||||
|
||||
void BufferBase::MapReadAsync(uint32_t start, uint32_t size, nxtBufferMapReadCallback callback, nxtCallbackUserdata userdata) {
|
||||
if (start + size > GetSize()) {
|
||||
device->HandleError("Buffer map read out of range");
|
||||
callback(NXT_BUFFER_MAP_READ_STATUS_ERROR, nullptr, userdata);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!(currentUsage & nxt::BufferUsageBit::MapRead)) {
|
||||
device->HandleError("Buffer needs the map read usage bit");
|
||||
callback(NXT_BUFFER_MAP_READ_STATUS_ERROR, nullptr, userdata);
|
||||
return;
|
||||
}
|
||||
|
||||
if (mapped) {
|
||||
device->HandleError("Buffer already mapped");
|
||||
callback(NXT_BUFFER_MAP_READ_STATUS_ERROR, nullptr, userdata);
|
||||
return;
|
||||
}
|
||||
|
||||
// TODO(cwallez@chromium.org): what to do on wraparound? Could cause crashes.
|
||||
mapReadSerial ++;
|
||||
mapReadCallback = callback;
|
||||
mapReadUserdata = userdata;
|
||||
MapReadAsyncImpl(mapReadSerial, start, size);
|
||||
mapped = true;
|
||||
}
|
||||
|
||||
void BufferBase::Unmap() {
|
||||
if (!mapped) {
|
||||
device->HandleError("Buffer wasn't mapped");
|
||||
return;
|
||||
}
|
||||
|
||||
// A map request can only be called once, so this will fire only if the request wasn't
|
||||
// completed before the Unmap
|
||||
CallMapReadCallback(mapReadSerial, NXT_BUFFER_MAP_READ_STATUS_UNKNOWN, nullptr);
|
||||
UnmapImpl();
|
||||
mapped = false;
|
||||
}
|
||||
|
||||
bool BufferBase::IsFrozen() const {
|
||||
return frozen;
|
||||
}
|
||||
@@ -86,7 +139,7 @@ namespace backend {
|
||||
}
|
||||
|
||||
bool BufferBase::IsTransitionPossible(nxt::BufferUsageBit usage) const {
|
||||
if (frozen) {
|
||||
if (frozen || mapped) {
|
||||
return false;
|
||||
}
|
||||
return IsUsagePossible(allowedUsage, usage);
|
||||
@@ -138,6 +191,7 @@ namespace backend {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
// TODO(cwallez@chromium.org) disallow using MapRead with anything else than TransferDst
|
||||
return device->CreateBuffer(this);
|
||||
}
|
||||
|
||||
|
||||
@@ -26,6 +26,7 @@ namespace backend {
|
||||
class BufferBase : public RefCounted {
|
||||
public:
|
||||
BufferBase(BufferBuilder* builder);
|
||||
~BufferBase();
|
||||
|
||||
uint32_t GetSize() const;
|
||||
nxt::BufferUsageBit GetAllowedUsage() const;
|
||||
@@ -41,17 +42,30 @@ namespace backend {
|
||||
// NXT API
|
||||
BufferViewBuilder* CreateBufferViewBuilder();
|
||||
void SetSubData(uint32_t start, uint32_t count, const uint32_t* data);
|
||||
void MapReadAsync(uint32_t start, uint32_t size, nxtBufferMapReadCallback callback, nxtCallbackUserdata userdata);
|
||||
void Unmap();
|
||||
void TransitionUsage(nxt::BufferUsageBit usage);
|
||||
void FreezeUsage(nxt::BufferUsageBit usage);
|
||||
|
||||
protected:
|
||||
void CallMapReadCallback(uint32_t serial, nxtBufferMapReadStatus status, const void* pointer);
|
||||
|
||||
private:
|
||||
virtual void SetSubDataImpl(uint32_t start, uint32_t count, const uint32_t* data) = 0;
|
||||
virtual void MapReadAsyncImpl(uint32_t serial, uint32_t start, uint32_t size) = 0;
|
||||
virtual void UnmapImpl() = 0;
|
||||
|
||||
DeviceBase* device;
|
||||
uint32_t size;
|
||||
nxt::BufferUsageBit allowedUsage = nxt::BufferUsageBit::None;
|
||||
nxt::BufferUsageBit currentUsage = nxt::BufferUsageBit::None;
|
||||
|
||||
nxtBufferMapReadCallback mapReadCallback = nullptr;
|
||||
nxtCallbackUserdata mapReadUserdata = 0;
|
||||
uint32_t mapReadSerial = 0;
|
||||
|
||||
bool frozen = false;
|
||||
bool mapped = false;
|
||||
};
|
||||
|
||||
class BufferBuilder : public Builder<BufferBase> {
|
||||
|
||||
@@ -148,6 +148,14 @@ namespace d3d12 {
|
||||
void Buffer::SetSubDataImpl(uint32_t start, uint32_t count, const uint32_t* data) {
|
||||
}
|
||||
|
||||
void Buffer::MapReadAsyncImpl(uint32_t serial, uint32_t start, uint32_t count) {
|
||||
// TODO(cwallez@chromium.org): Implement Map Read for the null backend
|
||||
}
|
||||
|
||||
void Buffer::UnmapImpl() {
|
||||
// TODO(cwallez@chromium.org): Implement Map Read for the null backend
|
||||
}
|
||||
|
||||
// BufferView
|
||||
|
||||
BufferView::BufferView(Device* device, BufferViewBuilder* builder)
|
||||
|
||||
@@ -141,6 +141,8 @@ namespace d3d12 {
|
||||
|
||||
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 UnmapImpl() override;
|
||||
|
||||
Device* device;
|
||||
};
|
||||
|
||||
@@ -158,6 +158,8 @@ namespace metal {
|
||||
|
||||
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 UnmapImpl() override;
|
||||
|
||||
Device* device;
|
||||
std::mutex mutex;
|
||||
|
||||
@@ -225,6 +225,14 @@ namespace metal {
|
||||
[mtlBuffer didModifyRange:NSMakeRange(start * sizeof(uint32_t), count * sizeof(uint32_t))];
|
||||
}
|
||||
|
||||
void Buffer::MapReadAsyncImpl(uint32_t serial, uint32_t start, uint32_t count) {
|
||||
// TODO(cwallez@chromium.org): Implement Map Read for the metal backend
|
||||
}
|
||||
|
||||
void Buffer::UnmapImpl() {
|
||||
// TODO(cwallez@chromium.org): Implement Map Read for the metal backend
|
||||
}
|
||||
|
||||
// BufferView
|
||||
|
||||
BufferView::BufferView(Device* device, BufferViewBuilder* builder)
|
||||
|
||||
@@ -107,6 +107,14 @@ namespace null {
|
||||
void Buffer::SetSubDataImpl(uint32_t start, uint32_t count, const uint32_t* data) {
|
||||
}
|
||||
|
||||
void Buffer::MapReadAsyncImpl(uint32_t serial, uint32_t start, uint32_t count) {
|
||||
// TODO(cwallez@chromium.org): Implement Map Read for the null backend
|
||||
}
|
||||
|
||||
void Buffer::UnmapImpl() {
|
||||
// TODO(cwallez@chromium.org): Implement Map Read for the null backend
|
||||
}
|
||||
|
||||
// Queue
|
||||
|
||||
Queue::Queue(QueueBuilder* builder)
|
||||
|
||||
@@ -112,6 +112,8 @@ namespace null {
|
||||
|
||||
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 UnmapImpl() override;
|
||||
};
|
||||
|
||||
class Queue : public QueueBase {
|
||||
|
||||
@@ -133,6 +133,14 @@ namespace opengl {
|
||||
glBufferSubData(GL_ARRAY_BUFFER, start * sizeof(uint32_t), count * sizeof(uint32_t), data);
|
||||
}
|
||||
|
||||
void Buffer::MapReadAsyncImpl(uint32_t serial, uint32_t start, uint32_t count) {
|
||||
// TODO(cwallez@chromium.org): Implement Map Read for the GL backend
|
||||
}
|
||||
|
||||
void Buffer::UnmapImpl() {
|
||||
// TODO(cwallez@chromium.org): Implement Map Read for the GL backend
|
||||
}
|
||||
|
||||
// BufferView
|
||||
|
||||
BufferView::BufferView(Device* device, BufferViewBuilder* builder)
|
||||
|
||||
@@ -124,6 +124,8 @@ namespace opengl {
|
||||
|
||||
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 UnmapImpl() override;
|
||||
|
||||
Device* device;
|
||||
GLuint buffer = 0;
|
||||
|
||||
Reference in New Issue
Block a user