From a3c6810b1850d5b8ce29af2f745058b94a39bb80 Mon Sep 17 00:00:00 2001 From: Zakor Date: Mon, 3 Feb 2020 17:25:01 +0100 Subject: Initial implementation of GPUQueue Added WebIDL bindings for `GPUQueue`. Implemented the `submit` function of `GPUQueue` and `defaultQueue` function of `GPUDevice`. --- components/script/dom/gpuqueue.rs | 73 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 components/script/dom/gpuqueue.rs (limited to 'components/script/dom/gpuqueue.rs') diff --git a/components/script/dom/gpuqueue.rs b/components/script/dom/gpuqueue.rs new file mode 100644 index 00000000000..dfa97402253 --- /dev/null +++ b/components/script/dom/gpuqueue.rs @@ -0,0 +1,73 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ + +use crate::dom::bindings::cell::DomRefCell; +use crate::dom::bindings::codegen::Bindings::GPUQueueBinding::{self, GPUQueueMethods}; +use crate::dom::bindings::reflector::{reflect_dom_object, Reflector}; +use crate::dom::bindings::root::DomRoot; +use crate::dom::bindings::str::DOMString; +use crate::dom::globalscope::GlobalScope; +use crate::dom::gpubuffer::GPUBufferState; +use crate::dom::gpucommandbuffer::GPUCommandBuffer; +use dom_struct::dom_struct; +use webgpu::{WebGPU, WebGPUQueue, WebGPURequest}; + +#[dom_struct] +pub struct GPUQueue { + reflector_: Reflector, + #[ignore_malloc_size_of = "defined in webgpu"] + channel: WebGPU, + label: DomRefCell>, + queue: WebGPUQueue, +} + +impl GPUQueue { + fn new_inherited(channel: WebGPU, queue: WebGPUQueue) -> GPUQueue { + GPUQueue { + channel, + reflector_: Reflector::new(), + label: DomRefCell::new(None), + queue, + } + } + + pub fn new(global: &GlobalScope, channel: WebGPU, queue: WebGPUQueue) -> DomRoot { + reflect_dom_object( + Box::new(GPUQueue::new_inherited(channel, queue)), + global, + GPUQueueBinding::Wrap, + ) + } +} + +impl GPUQueueMethods for GPUQueue { + /// https://gpuweb.github.io/gpuweb/#dom-gpuobjectbase-label + fn GetLabel(&self) -> Option { + self.label.borrow().clone() + } + + /// https://gpuweb.github.io/gpuweb/#dom-gpuobjectbase-label + fn SetLabel(&self, value: Option) { + *self.label.borrow_mut() = value; + } + + /// https://gpuweb.github.io/gpuweb/#dom-gpuqueue-submit + fn Submit(&self, command_buffers: Vec>) { + let valid = command_buffers.iter().all(|cb| { + cb.buffers().iter().all(|b| match *b.state() { + GPUBufferState::Unmapped => true, + _ => false, + }) + }); + if !valid { + // TODO: Generate error to the ErrorScope + return; + } + let buffer_ids = command_buffers.iter().map(|cb| cb.id().0).collect(); + self.channel + .0 + .send(WebGPURequest::Submit(self.queue.0, buffer_ids)) + .unwrap(); + } +} -- cgit v1.2.3 From 000a5d543d8780a73ace6477c0c8255b8d7a97f6 Mon Sep 17 00:00:00 2001 From: Istvan Miklos Date: Wed, 5 Feb 2020 11:32:52 +0100 Subject: Fixing some style related issues in WebGPU. Changed the Requests/Response from tuples to named struct variants and also sorted in alphabetical order. Replaced the ID generator functions from `globalscope` with a single function, which returns a `RefMut` and can call the appropriate method to generate resource IDs. --- components/script/dom/gpuqueue.rs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) (limited to 'components/script/dom/gpuqueue.rs') diff --git a/components/script/dom/gpuqueue.rs b/components/script/dom/gpuqueue.rs index dfa97402253..c257ec5ef09 100644 --- a/components/script/dom/gpuqueue.rs +++ b/components/script/dom/gpuqueue.rs @@ -64,10 +64,13 @@ impl GPUQueueMethods for GPUQueue { // TODO: Generate error to the ErrorScope return; } - let buffer_ids = command_buffers.iter().map(|cb| cb.id().0).collect(); + let command_buffers = command_buffers.iter().map(|cb| cb.id().0).collect(); self.channel .0 - .send(WebGPURequest::Submit(self.queue.0, buffer_ids)) + .send(WebGPURequest::Submit { + queue_id: self.queue.0, + command_buffers, + }) .unwrap(); } } -- cgit v1.2.3 From 3ea6d87bcc37167464e856949a4b9b77d0e9318a Mon Sep 17 00:00:00 2001 From: YUAN LYU Date: Fri, 20 Mar 2020 22:14:18 -0400 Subject: Add trait DomObjectWrap to provide WRAP function --- components/script/dom/gpuqueue.rs | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) (limited to 'components/script/dom/gpuqueue.rs') diff --git a/components/script/dom/gpuqueue.rs b/components/script/dom/gpuqueue.rs index c257ec5ef09..1b4ffa590f3 100644 --- a/components/script/dom/gpuqueue.rs +++ b/components/script/dom/gpuqueue.rs @@ -3,7 +3,7 @@ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ use crate::dom::bindings::cell::DomRefCell; -use crate::dom::bindings::codegen::Bindings::GPUQueueBinding::{self, GPUQueueMethods}; +use crate::dom::bindings::codegen::Bindings::GPUQueueBinding::GPUQueueMethods; use crate::dom::bindings::reflector::{reflect_dom_object, Reflector}; use crate::dom::bindings::root::DomRoot; use crate::dom::bindings::str::DOMString; @@ -33,11 +33,7 @@ impl GPUQueue { } pub fn new(global: &GlobalScope, channel: WebGPU, queue: WebGPUQueue) -> DomRoot { - reflect_dom_object( - Box::new(GPUQueue::new_inherited(channel, queue)), - global, - GPUQueueBinding::Wrap, - ) + reflect_dom_object(Box::new(GPUQueue::new_inherited(channel, queue)), global) } } -- cgit v1.2.3 From 3b5ede153d61c2c033326b5df2417e3757dba17b Mon Sep 17 00:00:00 2001 From: Kunal Mohan Date: Thu, 4 Jun 2020 01:19:13 +0530 Subject: Update wgpu-core and wgpu-types --- components/script/dom/gpuqueue.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'components/script/dom/gpuqueue.rs') diff --git a/components/script/dom/gpuqueue.rs b/components/script/dom/gpuqueue.rs index 1b4ffa590f3..5b533a8d32c 100644 --- a/components/script/dom/gpuqueue.rs +++ b/components/script/dom/gpuqueue.rs @@ -23,7 +23,7 @@ pub struct GPUQueue { } impl GPUQueue { - fn new_inherited(channel: WebGPU, queue: WebGPUQueue) -> GPUQueue { + fn new_inherited(channel: WebGPU, queue: WebGPUQueue) -> Self { GPUQueue { channel, reflector_: Reflector::new(), @@ -32,7 +32,7 @@ impl GPUQueue { } } - pub fn new(global: &GlobalScope, channel: WebGPU, queue: WebGPUQueue) -> DomRoot { + pub fn new(global: &GlobalScope, channel: WebGPU, queue: WebGPUQueue) -> DomRoot { reflect_dom_object(Box::new(GPUQueue::new_inherited(channel, queue)), global) } } -- cgit v1.2.3 From b74cea3a4698ca7e35a801b37b8b61479a46ede5 Mon Sep 17 00:00:00 2001 From: Kunal Mohan Date: Mon, 22 Jun 2020 19:52:02 +0530 Subject: Implement GPUBuffer.mapAsync and update wgpu-core --- components/script/dom/gpuqueue.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'components/script/dom/gpuqueue.rs') diff --git a/components/script/dom/gpuqueue.rs b/components/script/dom/gpuqueue.rs index 5b533a8d32c..fa79dc6fd44 100644 --- a/components/script/dom/gpuqueue.rs +++ b/components/script/dom/gpuqueue.rs @@ -51,7 +51,7 @@ impl GPUQueueMethods for GPUQueue { /// https://gpuweb.github.io/gpuweb/#dom-gpuqueue-submit fn Submit(&self, command_buffers: Vec>) { let valid = command_buffers.iter().all(|cb| { - cb.buffers().iter().all(|b| match *b.state() { + cb.buffers().iter().all(|b| match b.state() { GPUBufferState::Unmapped => true, _ => false, }) -- cgit v1.2.3 From fae66089fac0a08d609c567609c960844922878a Mon Sep 17 00:00:00 2001 From: Kunal Mohan Date: Sat, 4 Jul 2020 13:29:23 +0530 Subject: Implement GPUQueue.writeBuffer and GPUQueue.writeTexture --- components/script/dom/gpuqueue.rs | 114 +++++++++++++++++++++++++++++++++++++- 1 file changed, 112 insertions(+), 2 deletions(-) (limited to 'components/script/dom/gpuqueue.rs') diff --git a/components/script/dom/gpuqueue.rs b/components/script/dom/gpuqueue.rs index fa79dc6fd44..275d3144266 100644 --- a/components/script/dom/gpuqueue.rs +++ b/components/script/dom/gpuqueue.rs @@ -3,15 +3,24 @@ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ use crate::dom::bindings::cell::DomRefCell; +use crate::dom::bindings::codegen::Bindings::GPUBufferBinding::GPUSize64; use crate::dom::bindings::codegen::Bindings::GPUQueueBinding::GPUQueueMethods; +use crate::dom::bindings::codegen::Bindings::GPUTextureBinding::{ + GPUExtent3D, GPUOrigin3D, GPUTextureCopyView, GPUTextureDataLayout, +}; +use crate::dom::bindings::error::{Error, Fallible}; use crate::dom::bindings::reflector::{reflect_dom_object, Reflector}; use crate::dom::bindings::root::DomRoot; use crate::dom::bindings::str::DOMString; use crate::dom::globalscope::GlobalScope; -use crate::dom::gpubuffer::GPUBufferState; +use crate::dom::gpubuffer::{GPUBuffer, GPUBufferState}; use crate::dom::gpucommandbuffer::GPUCommandBuffer; +use crate::dom::gpudevice::{convert_texture_size_to_dict, convert_texture_size_to_wgt}; use dom_struct::dom_struct; -use webgpu::{WebGPU, WebGPUQueue, WebGPURequest}; +use ipc_channel::ipc::IpcSharedMemory; +use js::rust::CustomAutoRooterGuard; +use js::typedarray::ArrayBuffer; +use webgpu::{wgpu::command as wgpu_com, wgt, WebGPU, WebGPUQueue, WebGPURequest}; #[dom_struct] pub struct GPUQueue { @@ -69,4 +78,105 @@ impl GPUQueueMethods for GPUQueue { }) .unwrap(); } + + /// https://gpuweb.github.io/gpuweb/#dom-gpuqueue-writebuffer + #[allow(unsafe_code)] + fn WriteBuffer( + &self, + buffer: &GPUBuffer, + buffer_offset: GPUSize64, + data: CustomAutoRooterGuard, + data_offset: GPUSize64, + size: Option, + ) -> Fallible<()> { + let bytes = data.to_vec(); + let content_size = if let Some(s) = size { + s + } else { + bytes.len() as GPUSize64 - data_offset + }; + let valid = data_offset + content_size <= bytes.len() as u64 && + buffer.state() == GPUBufferState::Unmapped && + content_size % wgt::COPY_BUFFER_ALIGNMENT == 0 && + buffer_offset % wgt::COPY_BUFFER_ALIGNMENT == 0 && + buffer.is_valid(); + + if !valid { + return Err(Error::Operation); + } + + let final_data = IpcSharedMemory::from_bytes( + &bytes[data_offset as usize..(data_offset + content_size) as usize], + ); + if let Err(e) = self.channel.0.send(WebGPURequest::WriteBuffer { + queue_id: self.queue.0, + buffer_id: buffer.id().0, + buffer_offset, + data: final_data, + }) { + warn!("Failed to send WriteBuffer({:?}) ({})", buffer.id(), e); + return Err(Error::Operation); + } + + Ok(()) + } + + /// https://gpuweb.github.io/gpuweb/#dom-gpuqueue-writetexture + fn WriteTexture( + &self, + destination: &GPUTextureCopyView, + data: CustomAutoRooterGuard, + data_layout: &GPUTextureDataLayout, + size: GPUExtent3D, + ) -> Fallible<()> { + let bytes = data.to_vec(); + let valid = data_layout.offset <= data.len() as u64 && destination.texture.is_valid(); + + if !valid { + return Err(Error::Operation); + } + + let texture_cv = wgpu_com::TextureCopyView { + texture: destination.texture.id().0, + mip_level: destination.mipLevel, + origin: match destination.origin { + GPUOrigin3D::RangeEnforcedUnsignedLongSequence(ref v) => wgt::Origin3d { + x: v[0], + y: v[1], + z: v[2], + }, + GPUOrigin3D::GPUOrigin3DDict(ref d) => wgt::Origin3d { + x: d.x, + y: d.y, + z: d.z, + }, + }, + }; + + let texture_layout = wgt::TextureDataLayout { + offset: data_layout.offset as wgt::BufferAddress, + bytes_per_row: data_layout.bytesPerRow, + rows_per_image: data_layout.rowsPerImage, + }; + + let write_size = convert_texture_size_to_wgt(&convert_texture_size_to_dict(&size)); + let final_data = IpcSharedMemory::from_bytes(&bytes); + + if let Err(e) = self.channel.0.send(WebGPURequest::WriteTexture { + queue_id: self.queue.0, + texture_cv, + data_layout: texture_layout, + size: write_size, + data: final_data, + }) { + warn!( + "Failed to send WriteTexture({:?}) ({})", + destination.texture.id().0, + e + ); + return Err(Error::Operation); + } + + Ok(()) + } } -- cgit v1.2.3 From cdc0a75fe43a962caaeed5fdb15dbc3a4dc18c56 Mon Sep 17 00:00:00 2001 From: Kunal Mohan Date: Mon, 20 Jul 2020 20:10:41 +0530 Subject: Update GPUObjectBase webidl and cleanup valid flags --- components/script/dom/gpuqueue.rs | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) (limited to 'components/script/dom/gpuqueue.rs') diff --git a/components/script/dom/gpuqueue.rs b/components/script/dom/gpuqueue.rs index 275d3144266..c2632dfce1e 100644 --- a/components/script/dom/gpuqueue.rs +++ b/components/script/dom/gpuqueue.rs @@ -11,7 +11,7 @@ use crate::dom::bindings::codegen::Bindings::GPUTextureBinding::{ use crate::dom::bindings::error::{Error, Fallible}; use crate::dom::bindings::reflector::{reflect_dom_object, Reflector}; use crate::dom::bindings::root::DomRoot; -use crate::dom::bindings::str::DOMString; +use crate::dom::bindings::str::USVString; use crate::dom::globalscope::GlobalScope; use crate::dom::gpubuffer::{GPUBuffer, GPUBufferState}; use crate::dom::gpucommandbuffer::GPUCommandBuffer; @@ -27,7 +27,7 @@ pub struct GPUQueue { reflector_: Reflector, #[ignore_malloc_size_of = "defined in webgpu"] channel: WebGPU, - label: DomRefCell>, + label: DomRefCell>, queue: WebGPUQueue, } @@ -48,12 +48,12 @@ impl GPUQueue { impl GPUQueueMethods for GPUQueue { /// https://gpuweb.github.io/gpuweb/#dom-gpuobjectbase-label - fn GetLabel(&self) -> Option { + fn GetLabel(&self) -> Option { self.label.borrow().clone() } /// https://gpuweb.github.io/gpuweb/#dom-gpuobjectbase-label - fn SetLabel(&self, value: Option) { + fn SetLabel(&self, value: Option) { *self.label.borrow_mut() = value; } @@ -98,8 +98,7 @@ impl GPUQueueMethods for GPUQueue { let valid = data_offset + content_size <= bytes.len() as u64 && buffer.state() == GPUBufferState::Unmapped && content_size % wgt::COPY_BUFFER_ALIGNMENT == 0 && - buffer_offset % wgt::COPY_BUFFER_ALIGNMENT == 0 && - buffer.is_valid(); + buffer_offset % wgt::COPY_BUFFER_ALIGNMENT == 0; if !valid { return Err(Error::Operation); @@ -130,7 +129,7 @@ impl GPUQueueMethods for GPUQueue { size: GPUExtent3D, ) -> Fallible<()> { let bytes = data.to_vec(); - let valid = data_layout.offset <= data.len() as u64 && destination.texture.is_valid(); + let valid = data_layout.offset <= data.len() as u64; if !valid { return Err(Error::Operation); -- cgit v1.2.3 From 5285c07f1f00bba0a10b3a91d35b806d2bf73e93 Mon Sep 17 00:00:00 2001 From: Kunal Mohan Date: Tue, 21 Jul 2020 16:16:12 +0530 Subject: Implement GPUCommandEncoder.copy commands --- components/script/dom/gpuqueue.rs | 35 ++++++++--------------------------- 1 file changed, 8 insertions(+), 27 deletions(-) (limited to 'components/script/dom/gpuqueue.rs') diff --git a/components/script/dom/gpuqueue.rs b/components/script/dom/gpuqueue.rs index c2632dfce1e..e04471ebb34 100644 --- a/components/script/dom/gpuqueue.rs +++ b/components/script/dom/gpuqueue.rs @@ -4,10 +4,11 @@ use crate::dom::bindings::cell::DomRefCell; use crate::dom::bindings::codegen::Bindings::GPUBufferBinding::GPUSize64; -use crate::dom::bindings::codegen::Bindings::GPUQueueBinding::GPUQueueMethods; -use crate::dom::bindings::codegen::Bindings::GPUTextureBinding::{ - GPUExtent3D, GPUOrigin3D, GPUTextureCopyView, GPUTextureDataLayout, +use crate::dom::bindings::codegen::Bindings::GPUCommandEncoderBinding::{ + GPUTextureCopyView, GPUTextureDataLayout, }; +use crate::dom::bindings::codegen::Bindings::GPUQueueBinding::GPUQueueMethods; +use crate::dom::bindings::codegen::Bindings::GPUTextureBinding::GPUExtent3D; use crate::dom::bindings::error::{Error, Fallible}; use crate::dom::bindings::reflector::{reflect_dom_object, Reflector}; use crate::dom::bindings::root::DomRoot; @@ -15,12 +16,13 @@ use crate::dom::bindings::str::USVString; use crate::dom::globalscope::GlobalScope; use crate::dom::gpubuffer::{GPUBuffer, GPUBufferState}; use crate::dom::gpucommandbuffer::GPUCommandBuffer; +use crate::dom::gpucommandencoder::{convert_texture_cv, convert_texture_data_layout}; use crate::dom::gpudevice::{convert_texture_size_to_dict, convert_texture_size_to_wgt}; use dom_struct::dom_struct; use ipc_channel::ipc::IpcSharedMemory; use js::rust::CustomAutoRooterGuard; use js::typedarray::ArrayBuffer; -use webgpu::{wgpu::command as wgpu_com, wgt, WebGPU, WebGPUQueue, WebGPURequest}; +use webgpu::{wgt, WebGPU, WebGPUQueue, WebGPURequest}; #[dom_struct] pub struct GPUQueue { @@ -135,29 +137,8 @@ impl GPUQueueMethods for GPUQueue { return Err(Error::Operation); } - let texture_cv = wgpu_com::TextureCopyView { - texture: destination.texture.id().0, - mip_level: destination.mipLevel, - origin: match destination.origin { - GPUOrigin3D::RangeEnforcedUnsignedLongSequence(ref v) => wgt::Origin3d { - x: v[0], - y: v[1], - z: v[2], - }, - GPUOrigin3D::GPUOrigin3DDict(ref d) => wgt::Origin3d { - x: d.x, - y: d.y, - z: d.z, - }, - }, - }; - - let texture_layout = wgt::TextureDataLayout { - offset: data_layout.offset as wgt::BufferAddress, - bytes_per_row: data_layout.bytesPerRow, - rows_per_image: data_layout.rowsPerImage, - }; - + let texture_cv = convert_texture_cv(destination); + let texture_layout = convert_texture_data_layout(data_layout); let write_size = convert_texture_size_to_wgt(&convert_texture_size_to_dict(&size)); let final_data = IpcSharedMemory::from_bytes(&bytes); -- cgit v1.2.3 From 8cb5fad8286d87f2e852d870581d4f867afaf435 Mon Sep 17 00:00:00 2001 From: Kunal Mohan Date: Sat, 1 Aug 2020 16:32:37 +0530 Subject: Report errors from void returning operations --- components/script/dom/gpuqueue.rs | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) (limited to 'components/script/dom/gpuqueue.rs') diff --git a/components/script/dom/gpuqueue.rs b/components/script/dom/gpuqueue.rs index e04471ebb34..d5c742555c7 100644 --- a/components/script/dom/gpuqueue.rs +++ b/components/script/dom/gpuqueue.rs @@ -11,24 +11,25 @@ use crate::dom::bindings::codegen::Bindings::GPUQueueBinding::GPUQueueMethods; use crate::dom::bindings::codegen::Bindings::GPUTextureBinding::GPUExtent3D; use crate::dom::bindings::error::{Error, Fallible}; use crate::dom::bindings::reflector::{reflect_dom_object, Reflector}; -use crate::dom::bindings::root::DomRoot; +use crate::dom::bindings::root::{Dom, DomRoot}; use crate::dom::bindings::str::USVString; use crate::dom::globalscope::GlobalScope; use crate::dom::gpubuffer::{GPUBuffer, GPUBufferState}; use crate::dom::gpucommandbuffer::GPUCommandBuffer; use crate::dom::gpucommandencoder::{convert_texture_cv, convert_texture_data_layout}; -use crate::dom::gpudevice::{convert_texture_size_to_dict, convert_texture_size_to_wgt}; +use crate::dom::gpudevice::{convert_texture_size_to_dict, convert_texture_size_to_wgt, GPUDevice}; use dom_struct::dom_struct; use ipc_channel::ipc::IpcSharedMemory; use js::rust::CustomAutoRooterGuard; use js::typedarray::ArrayBuffer; -use webgpu::{wgt, WebGPU, WebGPUQueue, WebGPURequest}; +use webgpu::{identity::WebGPUOpResult, wgt, WebGPU, WebGPUQueue, WebGPURequest}; #[dom_struct] pub struct GPUQueue { reflector_: Reflector, #[ignore_malloc_size_of = "defined in webgpu"] channel: WebGPU, + device: DomRefCell>>, label: DomRefCell>, queue: WebGPUQueue, } @@ -38,6 +39,7 @@ impl GPUQueue { GPUQueue { channel, reflector_: Reflector::new(), + device: DomRefCell::new(None), label: DomRefCell::new(None), queue, } @@ -48,6 +50,12 @@ impl GPUQueue { } } +impl GPUQueue { + pub fn set_device(&self, device: &GPUDevice) { + *self.device.borrow_mut() = Some(Dom::from_ref(device)); + } +} + impl GPUQueueMethods for GPUQueue { /// https://gpuweb.github.io/gpuweb/#dom-gpuobjectbase-label fn GetLabel(&self) -> Option { @@ -67,8 +75,14 @@ impl GPUQueueMethods for GPUQueue { _ => false, }) }); + let scope_id = self.device.borrow().as_ref().unwrap().use_current_scope(); if !valid { - // TODO: Generate error to the ErrorScope + self.device.borrow().as_ref().unwrap().handle_server_msg( + scope_id, + WebGPUOpResult::ValidationError(String::from( + "Referenced GPUBuffer(s) are not Unmapped", + )), + ); return; } let command_buffers = command_buffers.iter().map(|cb| cb.id().0).collect(); @@ -76,6 +90,7 @@ impl GPUQueueMethods for GPUQueue { .0 .send(WebGPURequest::Submit { queue_id: self.queue.0, + scope_id, command_buffers, }) .unwrap(); @@ -111,6 +126,7 @@ impl GPUQueueMethods for GPUQueue { ); if let Err(e) = self.channel.0.send(WebGPURequest::WriteBuffer { queue_id: self.queue.0, + scope_id: self.device.borrow().as_ref().unwrap().use_current_scope(), buffer_id: buffer.id().0, buffer_offset, data: final_data, @@ -144,6 +160,7 @@ impl GPUQueueMethods for GPUQueue { if let Err(e) = self.channel.0.send(WebGPURequest::WriteTexture { queue_id: self.queue.0, + scope_id: self.device.borrow().as_ref().unwrap().use_current_scope(), texture_cv, data_layout: texture_layout, size: write_size, -- cgit v1.2.3 From ce6e09a3aa3b9ef20dcc8f1ff5712f7a2691aa27 Mon Sep 17 00:00:00 2001 From: Kunal Mohan Date: Mon, 3 Aug 2020 01:45:29 +0530 Subject: Change ErrorScopeId type to NonZeroU64 And extract it from WebGPURequest --- components/script/dom/gpuqueue.rs | 44 ++++++++++++++++++++++----------------- 1 file changed, 25 insertions(+), 19 deletions(-) (limited to 'components/script/dom/gpuqueue.rs') diff --git a/components/script/dom/gpuqueue.rs b/components/script/dom/gpuqueue.rs index d5c742555c7..e0a1fa2e7e8 100644 --- a/components/script/dom/gpuqueue.rs +++ b/components/script/dom/gpuqueue.rs @@ -88,11 +88,13 @@ impl GPUQueueMethods for GPUQueue { let command_buffers = command_buffers.iter().map(|cb| cb.id().0).collect(); self.channel .0 - .send(WebGPURequest::Submit { - queue_id: self.queue.0, + .send(( scope_id, - command_buffers, - }) + WebGPURequest::Submit { + queue_id: self.queue.0, + command_buffers, + }, + )) .unwrap(); } @@ -124,13 +126,15 @@ impl GPUQueueMethods for GPUQueue { let final_data = IpcSharedMemory::from_bytes( &bytes[data_offset as usize..(data_offset + content_size) as usize], ); - if let Err(e) = self.channel.0.send(WebGPURequest::WriteBuffer { - queue_id: self.queue.0, - scope_id: self.device.borrow().as_ref().unwrap().use_current_scope(), - buffer_id: buffer.id().0, - buffer_offset, - data: final_data, - }) { + if let Err(e) = self.channel.0.send(( + self.device.borrow().as_ref().unwrap().use_current_scope(), + WebGPURequest::WriteBuffer { + queue_id: self.queue.0, + buffer_id: buffer.id().0, + buffer_offset, + data: final_data, + }, + )) { warn!("Failed to send WriteBuffer({:?}) ({})", buffer.id(), e); return Err(Error::Operation); } @@ -158,14 +162,16 @@ impl GPUQueueMethods for GPUQueue { let write_size = convert_texture_size_to_wgt(&convert_texture_size_to_dict(&size)); let final_data = IpcSharedMemory::from_bytes(&bytes); - if let Err(e) = self.channel.0.send(WebGPURequest::WriteTexture { - queue_id: self.queue.0, - scope_id: self.device.borrow().as_ref().unwrap().use_current_scope(), - texture_cv, - data_layout: texture_layout, - size: write_size, - data: final_data, - }) { + if let Err(e) = self.channel.0.send(( + self.device.borrow().as_ref().unwrap().use_current_scope(), + WebGPURequest::WriteTexture { + queue_id: self.queue.0, + texture_cv, + data_layout: texture_layout, + size: write_size, + data: final_data, + }, + )) { warn!( "Failed to send WriteTexture({:?}) ({})", destination.texture.id().0, -- cgit v1.2.3 From 3661aa3d8c19d6e4e0c99e3d938e2cdd3d329b5d Mon Sep 17 00:00:00 2001 From: Kunal Mohan Date: Tue, 22 Sep 2020 11:49:34 +0530 Subject: Use Device limits and features provided by user Spec update --- components/script/dom/gpuqueue.rs | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) (limited to 'components/script/dom/gpuqueue.rs') diff --git a/components/script/dom/gpuqueue.rs b/components/script/dom/gpuqueue.rs index e0a1fa2e7e8..ca571371c8c 100644 --- a/components/script/dom/gpuqueue.rs +++ b/components/script/dom/gpuqueue.rs @@ -9,6 +9,7 @@ use crate::dom::bindings::codegen::Bindings::GPUCommandEncoderBinding::{ }; use crate::dom::bindings::codegen::Bindings::GPUQueueBinding::GPUQueueMethods; use crate::dom::bindings::codegen::Bindings::GPUTextureBinding::GPUExtent3D; +use crate::dom::bindings::codegen::UnionTypes::ArrayBufferViewOrArrayBuffer as BufferSource; use crate::dom::bindings::error::{Error, Fallible}; use crate::dom::bindings::reflector::{reflect_dom_object, Reflector}; use crate::dom::bindings::root::{Dom, DomRoot}; @@ -20,8 +21,6 @@ use crate::dom::gpucommandencoder::{convert_texture_cv, convert_texture_data_lay use crate::dom::gpudevice::{convert_texture_size_to_dict, convert_texture_size_to_wgt, GPUDevice}; use dom_struct::dom_struct; use ipc_channel::ipc::IpcSharedMemory; -use js::rust::CustomAutoRooterGuard; -use js::typedarray::ArrayBuffer; use webgpu::{identity::WebGPUOpResult, wgt, WebGPU, WebGPUQueue, WebGPURequest}; #[dom_struct] @@ -104,11 +103,14 @@ impl GPUQueueMethods for GPUQueue { &self, buffer: &GPUBuffer, buffer_offset: GPUSize64, - data: CustomAutoRooterGuard, + data: BufferSource, data_offset: GPUSize64, size: Option, ) -> Fallible<()> { - let bytes = data.to_vec(); + let bytes = match data { + BufferSource::ArrayBufferView(d) => d.to_vec(), + BufferSource::ArrayBuffer(d) => d.to_vec(), + }; let content_size = if let Some(s) = size { s } else { @@ -146,12 +148,15 @@ impl GPUQueueMethods for GPUQueue { fn WriteTexture( &self, destination: &GPUTextureCopyView, - data: CustomAutoRooterGuard, + data: BufferSource, data_layout: &GPUTextureDataLayout, size: GPUExtent3D, ) -> Fallible<()> { - let bytes = data.to_vec(); - let valid = data_layout.offset <= data.len() as u64; + let (bytes, len) = match data { + BufferSource::ArrayBufferView(d) => (d.to_vec(), d.len() as u64), + BufferSource::ArrayBuffer(d) => (d.to_vec(), d.len() as u64), + }; + let valid = data_layout.offset <= len; if !valid { return Err(Error::Operation); -- cgit v1.2.3