aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/gpushadermodule.rs
diff options
context:
space:
mode:
Diffstat (limited to 'components/script/dom/gpushadermodule.rs')
-rw-r--r--components/script/dom/gpushadermodule.rs41
1 files changed, 40 insertions, 1 deletions
diff --git a/components/script/dom/gpushadermodule.rs b/components/script/dom/gpushadermodule.rs
index f7af6360673..f245765b36a 100644
--- a/components/script/dom/gpushadermodule.rs
+++ b/components/script/dom/gpushadermodule.rs
@@ -10,12 +10,18 @@ use webgpu::{WebGPU, WebGPURequest, WebGPUResponse, WebGPUShaderModule};
use super::gpu::AsyncWGPUListener;
use super::gpucompilationinfo::GPUCompilationInfo;
use super::promise::Promise;
+use super::types::GPUDevice;
use crate::dom::bindings::cell::DomRefCell;
-use crate::dom::bindings::codegen::Bindings::WebGPUBinding::GPUShaderModuleMethods;
+use crate::dom::bindings::codegen::Bindings::WebGPUBinding::{
+ GPUShaderModuleDescriptor, GPUShaderModuleMethods,
+};
use crate::dom::bindings::reflector::{reflect_dom_object, DomObject, Reflector};
use crate::dom::bindings::root::DomRoot;
use crate::dom::bindings::str::USVString;
+use crate::dom::bindings::trace::RootedTraceableBox;
use crate::dom::globalscope::GlobalScope;
+use crate::dom::gpu::response_async;
+use crate::realms::InRealm;
#[dom_struct]
pub struct GPUShaderModule {
@@ -69,6 +75,39 @@ impl GPUShaderModule {
pub fn id(&self) -> WebGPUShaderModule {
self.shader_module
}
+
+ /// <https://gpuweb.github.io/gpuweb/#dom-gpudevice-createshadermodule>
+ pub fn create(
+ device: &GPUDevice,
+ descriptor: RootedTraceableBox<GPUShaderModuleDescriptor>,
+ comp: InRealm,
+ ) -> DomRoot<GPUShaderModule> {
+ let program_id = device
+ .global()
+ .wgpu_id_hub()
+ .create_shader_module_id(device.id().0.backend());
+ let promise = Promise::new_in_current_realm(comp);
+ let shader_module = GPUShaderModule::new(
+ &device.global(),
+ device.channel().clone(),
+ WebGPUShaderModule(program_id),
+ descriptor.parent.label.clone(),
+ promise.clone(),
+ );
+ let sender = response_async(&promise, &*shader_module);
+ device
+ .channel()
+ .0
+ .send(WebGPURequest::CreateShaderModule {
+ device_id: device.id().0,
+ program_id,
+ program: descriptor.code.0.clone(),
+ label: None,
+ sender,
+ })
+ .expect("Failed to create WebGPU ShaderModule");
+ shader_module
+ }
}
impl GPUShaderModuleMethods for GPUShaderModule {