[emscripten] Fix missing external ref in CreateBuffer
(No-Try because this only affects Emdawnwebgpu and all the tests passed
except for one bot that is having trouble.)
No-Try: true
Fixed: 429140223
Change-Id: I4d6457066637c36b263d57a9104706a5b1e04fbc
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/255556
Reviewed-by: Loko Kung <lokokung@google.com>
Commit-Queue: Kai Ninomiya <kainino@chromium.org>
diff --git a/src/emdawnwebgpu/tests/SpotTests.cpp b/src/emdawnwebgpu/tests/SpotTests.cpp
index 59e7a16..7866cb4 100644
--- a/src/emdawnwebgpu/tests/SpotTests.cpp
+++ b/src/emdawnwebgpu/tests/SpotTests.cpp
@@ -117,4 +117,21 @@
}
}
+TEST_F(SpotTests, ExternalRefCount) {
+ wgpu::BufferDescriptor bufferDesc{
+ .usage = wgpu::BufferUsage::MapRead, .size = 16, .mappedAtCreation = true};
+
+ wgpu::Buffer buffer = device.CreateBuffer(&bufferDesc);
+ ASSERT_TRUE(buffer);
+ EXPECT_EQ(buffer.GetMapState(), wgpu::BufferMapState::Mapped);
+ {
+ // Add and then release an extra external ref.
+ wgpu::Buffer tmp = buffer;
+ }
+
+ // Make sure the device wasn't implicitly destroyed (because we thought
+ // the last external ref was dropped).
+ EXPECT_EQ(buffer.GetMapState(), wgpu::BufferMapState::Mapped);
+}
+
} // namespace
diff --git a/third_party/emdawnwebgpu/pkg/webgpu/src/webgpu.cpp b/third_party/emdawnwebgpu/pkg/webgpu/src/webgpu.cpp
index 19edd14..d483e49 100644
--- a/third_party/emdawnwebgpu/pkg/webgpu/src/webgpu.cpp
+++ b/third_party/emdawnwebgpu/pkg/webgpu/src/webgpu.cpp
@@ -1986,12 +1986,12 @@
WGPUBuffer wgpuDeviceCreateBuffer(WGPUDevice device,
const WGPUBufferDescriptor* descriptor) {
- WGPUBuffer buffer = new WGPUBufferImpl(device, descriptor->mappedAtCreation);
- if (!emwgpuDeviceCreateBuffer(device, descriptor, buffer)) {
- delete buffer;
+ Ref<WGPUBufferImpl> buffer =
+ AcquireRef(new WGPUBufferImpl(device, descriptor->mappedAtCreation));
+ if (!emwgpuDeviceCreateBuffer(device, descriptor, buffer.Get())) {
return nullptr;
}
- return buffer;
+ return ReturnToAPI(std::move(buffer));
}
WGPUFuture wgpuDeviceCreateComputePipelineAsync(