[emscripten] CreateBuffer: return nullptr on RangeError
This makes emdawnwebgpu match the behavior of JS and Dawn Wire (and Dawn
Native after the corresponding fix).
No-Try: true
Bug: 42241190
Change-Id: If1ff7db995e73e6d32cbbc0cbc3911a95225f43d
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/230474
Reviewed-by: Loko Kung <lokokung@google.com>
Commit-Queue: Kai Ninomiya <kainino@chromium.org>
diff --git a/src/emdawnwebgpu/BUILD.gn b/src/emdawnwebgpu/BUILD.gn
index 4f0b4c9..c36e58b 100644
--- a/src/emdawnwebgpu/BUILD.gn
+++ b/src/emdawnwebgpu/BUILD.gn
@@ -177,7 +177,7 @@
sources = get_target_outputs(":emdawnwebgpu_headers_gen") +
[ "../../third_party/emdawnwebgpu/webgpu.cpp" ]
inputs = [
- # FIXME: Changing these files still doesn't cause a relink. Why?
+ # TODO(crbug.com/371024051): Changing these files doesn't seem to trigger a relink. Why?
"../../third_party/emdawnwebgpu/library_webgpu.js",
]
}
diff --git a/third_party/emdawnwebgpu/library_webgpu.js b/third_party/emdawnwebgpu/library_webgpu.js
index a121f57..5a86163 100644
--- a/third_party/emdawnwebgpu/library_webgpu.js
+++ b/third_party/emdawnwebgpu/library_webgpu.js
@@ -963,7 +963,6 @@
return data;
},
- emwgpuBufferWriteMappedRange__deps: ['$warnOnce'],
emwgpuBufferWriteMappedRange__sig: 'ipppp',
emwgpuBufferWriteMappedRange: (bufferPtr, offset, data, size) => {
var buffer = WebGPU.getJsObject(bufferPtr);
@@ -980,7 +979,6 @@
return {{{ gpu.Status.Success }}};
},
- emwgpuBufferReadMappedRange__deps: ['$warnOnce'],
emwgpuBufferReadMappedRange__sig: 'ipppp',
emwgpuBufferReadMappedRange: (bufferPtr, offset, data, size) => {
var buffer = WebGPU.getJsObject(bufferPtr);
@@ -1525,10 +1523,23 @@
};
var device = WebGPU.getJsObject(devicePtr);
- WebGPU.Internals.jsObjectInsert(bufferPtr, device.createBuffer(desc));
+ var buffer;
+ try {
+ buffer = device.createBuffer(desc);
+ } catch (ex) {
+ // The only exception should be RangeError if mapping at creation ran out of memory.
+ {{{ gpu.makeCheck('ex instanceof RangeError') }}}
+ {{{ gpu.makeCheck('mappedAtCreation') }}}
+#if ASSERTIONS
+ err('createBuffer threw:', ex);
+#endif
+ return false;
+ }
+ WebGPU.Internals.jsObjectInsert(bufferPtr, buffer);
if (mappedAtCreation) {
WebGPU.Internals.bufferOnUnmaps[bufferPtr] = [];
}
+ return true;
},
wgpuDeviceCreateCommandEncoder__deps: ['emwgpuCreateCommandEncoder'],
diff --git a/third_party/emdawnwebgpu/webgpu.cpp b/third_party/emdawnwebgpu/webgpu.cpp
index 23f0a80..b0beed3 100644
--- a/third_party/emdawnwebgpu/webgpu.cpp
+++ b/third_party/emdawnwebgpu/webgpu.cpp
@@ -54,9 +54,10 @@
// Device functions, i.e. creation functions to create JS backing objects given
// a pre-allocated handle, and destruction implementations.
-void emwgpuDeviceCreateBuffer(WGPUDevice device,
- const WGPUBufferDescriptor* descriptor,
- WGPUBuffer buffer);
+[[nodiscard]] bool emwgpuDeviceCreateBuffer(
+ WGPUDevice device,
+ const WGPUBufferDescriptor* descriptor,
+ WGPUBuffer buffer);
void emwgpuDeviceCreateShaderModule(
WGPUDevice device,
const WGPUShaderModuleDescriptor* descriptor,
@@ -150,7 +151,7 @@
public:
static constexpr bool HasExternalRefCount = false;
- explicit RefCounted(ImportedFromJSTag tag) : mIsImportedFromJS(true) {}
+ explicit RefCounted(ImportedFromJSTag) : mIsImportedFromJS(true) {}
RefCounted() = default;
void AddRef() {
@@ -1797,7 +1798,10 @@
WGPUBuffer wgpuDeviceCreateBuffer(WGPUDevice device,
const WGPUBufferDescriptor* descriptor) {
WGPUBuffer buffer = new WGPUBufferImpl(device, descriptor->mappedAtCreation);
- emwgpuDeviceCreateBuffer(device, descriptor, buffer);
+ if (!emwgpuDeviceCreateBuffer(device, descriptor, buffer)) {
+ delete buffer;
+ return nullptr;
+ }
return buffer;
}