dawn.node: Detach buffer mappings on GPUBuffer.destroy.

Bug: dawn:1123
Change-Id: I662c60346a5c57030e932d636ea2f9d8519c5fc8
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/86142
Reviewed-by: Ben Clayton <bclayton@google.com>
Commit-Queue: Corentin Wallez <cwallez@chromium.org>
This commit is contained in:
Corentin Wallez 2022-04-08 14:58:25 +00:00 committed by Dawn LUCI CQ
parent 6d7c44caa3
commit f6bac0ca86
2 changed files with 20 additions and 9 deletions

View File

@ -139,23 +139,32 @@ namespace wgpu::binding {
} }
void GPUBuffer::unmap(Napi::Env env) { void GPUBuffer::unmap(Napi::Env env) {
buffer_.Unmap();
if (state_ != State::Destroyed && state_ != State::Unmapped) {
DetachMappings();
state_ = State::Unmapped;
}
}
void GPUBuffer::destroy(Napi::Env) {
if (state_ == State::Destroyed) { if (state_ == State::Destroyed) {
device_.InjectError(wgpu::ErrorType::Validation,
"unmap() called on a destroyed buffer");
return; return;
} }
if (state_ != State::Unmapped) {
DetachMappings();
}
buffer_.Destroy();
state_ = State::Destroyed;
}
void GPUBuffer::DetachMappings() {
for (auto& mapping : mapped_) { for (auto& mapping : mapped_) {
mapping.buffer.Value().Detach(); mapping.buffer.Value().Detach();
} }
mapped_.clear(); mapped_.clear();
buffer_.Unmap();
state_ = State::Unmapped;
}
void GPUBuffer::destroy(Napi::Env) {
buffer_.Destroy();
state_ = State::Destroyed;
} }
std::variant<std::string, interop::UndefinedType> GPUBuffer::getLabel(Napi::Env) { std::variant<std::string, interop::UndefinedType> GPUBuffer::getLabel(Napi::Env) {

View File

@ -55,6 +55,8 @@ namespace wgpu::binding {
void setLabel(Napi::Env, std::variant<std::string, interop::UndefinedType> value) override; void setLabel(Napi::Env, std::variant<std::string, interop::UndefinedType> value) override;
private: private:
void DetachMappings();
struct Mapping { struct Mapping {
uint64_t start; uint64_t start;
uint64_t end; uint64_t end;