mirror of
https://github.com/servo/servo.git
synced 2025-08-07 06:25:32 +01:00
Implement mapReadAsync function of GPUBuffer
Implemented the `mapReadAsync` and fixed the `unmap` functions of `GPUBuffer`. Added `mapped` internal slot for tracking the ArrayBuffer/Promise. Added more states to the `GPUBufferState` enum.
This commit is contained in:
parent
92f5b36f49
commit
2df4d9fce4
5 changed files with 253 additions and 62 deletions
|
@ -46,7 +46,7 @@ use webgpu::wgpu::binding_model::{
|
|||
ShaderStage,
|
||||
};
|
||||
use webgpu::wgpu::resource::{BufferDescriptor, BufferUsage};
|
||||
use webgpu::{WebGPU, WebGPUBuffer, WebGPUDevice, WebGPUQueue, WebGPURequest};
|
||||
use webgpu::{WebGPU, WebGPUDevice, WebGPUQueue, WebGPURequest};
|
||||
|
||||
#[dom_struct]
|
||||
pub struct GPUDevice {
|
||||
|
@ -106,38 +106,6 @@ impl GPUDevice {
|
|||
}
|
||||
|
||||
impl GPUDevice {
|
||||
unsafe fn resolve_create_buffer_mapped(
|
||||
&self,
|
||||
cx: SafeJSContext,
|
||||
gpu_buffer: WebGPUBuffer,
|
||||
array_buffer: Vec<u8>,
|
||||
descriptor: BufferDescriptor,
|
||||
valid: bool,
|
||||
) -> Vec<JSVal> {
|
||||
rooted!(in(*cx) let mut js_array_buffer = ptr::null_mut::<JSObject>());
|
||||
let mut out = Vec::new();
|
||||
assert!(ArrayBuffer::create(
|
||||
*cx,
|
||||
CreateWith::Slice(array_buffer.as_slice()),
|
||||
js_array_buffer.handle_mut(),
|
||||
)
|
||||
.is_ok());
|
||||
|
||||
let buff = GPUBuffer::new(
|
||||
&self.global(),
|
||||
self.channel.clone(),
|
||||
gpu_buffer,
|
||||
self.device,
|
||||
GPUBufferState::Mapped,
|
||||
descriptor.size,
|
||||
descriptor.usage.bits(),
|
||||
valid,
|
||||
);
|
||||
out.push(ObjectValue(buff.reflector().get_jsobject().get()));
|
||||
out.push(ObjectValue(js_array_buffer.get()));
|
||||
out
|
||||
}
|
||||
|
||||
fn validate_buffer_descriptor(
|
||||
&self,
|
||||
descriptor: &GPUBufferDescriptor,
|
||||
|
@ -223,6 +191,7 @@ impl GPUDeviceMethods for GPUDevice {
|
|||
descriptor.size,
|
||||
descriptor.usage,
|
||||
valid,
|
||||
RootedTraceableBox::new(Heap::default()),
|
||||
)
|
||||
}
|
||||
|
||||
|
@ -245,11 +214,33 @@ impl GPUDeviceMethods for GPUDevice {
|
|||
))
|
||||
.expect("Failed to create WebGPU buffer");
|
||||
|
||||
let (buffer, array_buffer) = receiver.recv().unwrap();
|
||||
|
||||
rooted!(in(*cx) let mut js_array_buffer = ptr::null_mut::<JSObject>());
|
||||
unsafe {
|
||||
self.resolve_create_buffer_mapped(cx, buffer, array_buffer, wgpu_descriptor, valid)
|
||||
assert!(ArrayBuffer::create(
|
||||
*cx,
|
||||
CreateWith::Length(descriptor.size as u32),
|
||||
js_array_buffer.handle_mut(),
|
||||
)
|
||||
.is_ok());
|
||||
}
|
||||
|
||||
let buffer = receiver.recv().unwrap();
|
||||
let buff = GPUBuffer::new(
|
||||
&self.global(),
|
||||
self.channel.clone(),
|
||||
buffer,
|
||||
self.device,
|
||||
GPUBufferState::MappedForWriting,
|
||||
wgpu_descriptor.size,
|
||||
wgpu_descriptor.usage.bits(),
|
||||
valid,
|
||||
RootedTraceableBox::from_box(Heap::boxed(js_array_buffer.get())),
|
||||
);
|
||||
|
||||
vec![
|
||||
ObjectValue(buff.reflector().get_jsobject().get()),
|
||||
ObjectValue(js_array_buffer.get()),
|
||||
]
|
||||
}
|
||||
|
||||
/// https://gpuweb.github.io/gpuweb/#GPUDevice-createBindGroupLayout
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue