Skip to content

Commit db2d313

Browse files
committed
Fix ArrayBuffer creation in buffer mapping
1 parent b484836 commit db2d313

File tree

2 files changed

+10
-10
lines changed

2 files changed

+10
-10
lines changed

components/script/dom/gpubuffer.rs

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ use dom_struct::dom_struct;
1919
use js::jsapi::{Heap, JSObject};
2020
use js::jsval::UndefinedValue;
2121
use js::rust::jsapi_wrapped::{DetachArrayBuffer, IsPromiseObject, RejectPromise};
22-
use js::rust::MutableHandle;
2322
use js::typedarray::{ArrayBuffer, CreateWith};
2423
use std::cell::Cell;
2524
use std::ops::Range;
@@ -277,12 +276,10 @@ impl AsyncWGPUListener for GPUBuffer {
277276
fn handle_response(&self, response: WebGPUResponse, promise: &Rc<Promise>) {
278277
match response {
279278
WebGPUResponse::BufferMapAsync(bytes) => {
279+
let cx = self.global().get_cx();
280+
rooted!(in(*cx) let mut array_buffer = ptr::null_mut::<JSObject>());
280281
match unsafe {
281-
ArrayBuffer::create(
282-
*self.global().get_cx(),
283-
CreateWith::Slice(&bytes),
284-
MutableHandle::from_raw(self.mapping.handle_mut()),
285-
)
282+
ArrayBuffer::create(*cx, CreateWith::Slice(&bytes), array_buffer.handle_mut())
286283
} {
287284
Ok(_) => promise.resolve_native(&()),
288285
Err(()) => {
@@ -293,6 +290,7 @@ impl AsyncWGPUListener for GPUBuffer {
293290
promise.reject_error(Error::Operation);
294291
},
295292
}
293+
self.mapping.set(array_buffer.get());
296294
self.state.set(GPUBufferState::Mapped);
297295
},
298296
_ => {

components/script/dom/gpudevice.rs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -54,9 +54,8 @@ use crate::script_runtime::JSContext as SafeJSContext;
5454
use arrayvec::ArrayVec;
5555
use dom_struct::dom_struct;
5656
use js::jsapi::{Heap, JSObject};
57-
use js::rust::MutableHandle;
5857
use js::typedarray::{ArrayBuffer, CreateWith};
59-
use std::ptr::NonNull;
58+
use std::ptr::{self, NonNull};
6059
use webgpu::wgpu::binding_model::BufferBinding;
6160
use webgpu::{self, wgt, WebGPU, WebGPUBindings, WebGPURequest};
6261

@@ -182,14 +181,17 @@ impl GPUDeviceMethods for GPUDevice {
182181
let state;
183182
let mapping_range;
184183
if descriptor.mappedAtCreation {
184+
let cx = self.global().get_cx();
185+
rooted!(in(*cx) let mut array_buffer = ptr::null_mut::<JSObject>());
185186
unsafe {
186187
assert!(ArrayBuffer::create(
187-
*self.global().get_cx(),
188+
*cx,
188189
CreateWith::Length(descriptor.size as u32),
189-
MutableHandle::from_raw(mapping.handle_mut()),
190+
array_buffer.handle_mut(),
190191
)
191192
.is_ok());
192193
}
194+
mapping.set(array_buffer.get());
193195
state = GPUBufferState::MappedAtCreation;
194196
mapping_range = 0..descriptor.size;
195197
} else {

0 commit comments

Comments
 (0)