diff options
author | Zakor <gyula.zakor@h-lab.eu> | 2020-02-03 17:25:01 +0100 |
---|---|---|
committer | Istvan Miklos <istvan.miklos@h-lab.eu> | 2020-02-13 14:37:25 +0100 |
commit | a3c6810b1850d5b8ce29af2f745058b94a39bb80 (patch) | |
tree | 0daf3fc9302386ef29d9066200faf381b61444b0 /components/script/dom/gpucommandbuffer.rs | |
parent | 0790c856d5c376a0839347a3f0d4e4f7b07779c6 (diff) | |
download | servo-a3c6810b1850d5b8ce29af2f745058b94a39bb80.tar.gz servo-a3c6810b1850d5b8ce29af2f745058b94a39bb80.zip |
Initial implementation of GPUQueue
Added WebIDL bindings for `GPUQueue`.
Implemented the `submit` function of `GPUQueue` and `defaultQueue` function of `GPUDevice`.
Diffstat (limited to 'components/script/dom/gpucommandbuffer.rs')
-rw-r--r-- | components/script/dom/gpucommandbuffer.rs | 38 |
1 files changed, 35 insertions, 3 deletions
diff --git a/components/script/dom/gpucommandbuffer.rs b/components/script/dom/gpucommandbuffer.rs index 5cc4c926547..24cd781c092 100644 --- a/components/script/dom/gpucommandbuffer.rs +++ b/components/script/dom/gpucommandbuffer.rs @@ -2,17 +2,28 @@ * 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::cell::{DomRefCell, Ref}; use crate::dom::bindings::codegen::Bindings::GPUCommandBufferBinding::{ self, GPUCommandBufferMethods, }; use crate::dom::bindings::reflector::{reflect_dom_object, Reflector}; +use crate::dom::bindings::root::Dom; use crate::dom::bindings::root::DomRoot; use crate::dom::bindings::str::DOMString; use crate::dom::globalscope::GlobalScope; +use crate::dom::gpubuffer::GPUBuffer; use dom_struct::dom_struct; +use std::collections::HashSet; +use std::hash::{Hash, Hasher}; use webgpu::{WebGPU, WebGPUCommandBuffer}; +impl Eq for DomRoot<GPUBuffer> {} +impl Hash for DomRoot<GPUBuffer> { + fn hash<H: Hasher>(&self, state: &mut H) { + self.id().hash(state); + } +} + #[dom_struct] pub struct GPUCommandBuffer { reflector_: Reflector, @@ -20,15 +31,21 @@ pub struct GPUCommandBuffer { channel: WebGPU, label: DomRefCell<Option<DOMString>>, command_buffer: WebGPUCommandBuffer, + buffers: DomRefCell<HashSet<Dom<GPUBuffer>>>, } impl GPUCommandBuffer { - pub fn new_inherited(channel: WebGPU, command_buffer: WebGPUCommandBuffer) -> GPUCommandBuffer { + fn new_inherited( + channel: WebGPU, + command_buffer: WebGPUCommandBuffer, + buffers: HashSet<DomRoot<GPUBuffer>>, + ) -> GPUCommandBuffer { GPUCommandBuffer { channel, reflector_: Reflector::new(), label: DomRefCell::new(None), command_buffer, + buffers: DomRefCell::new(buffers.into_iter().map(|b| Dom::from_ref(&*b)).collect()), } } @@ -36,15 +53,30 @@ impl GPUCommandBuffer { global: &GlobalScope, channel: WebGPU, command_buffer: WebGPUCommandBuffer, + buffers: HashSet<DomRoot<GPUBuffer>>, ) -> DomRoot<GPUCommandBuffer> { reflect_dom_object( - Box::new(GPUCommandBuffer::new_inherited(channel, command_buffer)), + Box::new(GPUCommandBuffer::new_inherited( + channel, + command_buffer, + buffers, + )), global, GPUCommandBufferBinding::Wrap, ) } } +impl GPUCommandBuffer { + pub fn id(&self) -> WebGPUCommandBuffer { + self.command_buffer + } + + pub fn buffers(&self) -> Ref<HashSet<Dom<GPUBuffer>>> { + self.buffers.borrow() + } +} + impl GPUCommandBufferMethods for GPUCommandBuffer { /// https://gpuweb.github.io/gpuweb/#dom-gpuobjectbase-label fn GetLabel(&self) -> Option<DOMString> { |