Skip to main content

script_webgpu/
traits.rs

1/* This Source Code Form is subject to the terms of the Mozilla Public
2 * License, v. 2.0. If a copy of the MPL was not distributed with this
3 * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
4
5use std::cell::Ref;
6use std::rc::Rc;
7use std::sync::Arc;
8
9use euclid::default::Size2D;
10use js::context::NoGC;
11use pixels::Snapshot;
12use script_bindings::DomTypes;
13use script_bindings::callback::{CallbackContainer, HasCallbackHolder, RootedCallback};
14use script_bindings::error::{Error, Fallible};
15use script_bindings::reflector::{DomGlobalGeneric, DomObject};
16use script_bindings::tasks::TaskOnce;
17use serde_core::Serialize;
18use servo_base::generic_channel::GenericCallback;
19use servo_url::MutableOrigin;
20use webgpu_traits::{
21    BufferAccessError, Mapping, ShaderCompilationInfo, WebGPUAdapterResponse,
22    WebGPUComputePipelineResponse, WebGPUDeviceResponse, WebGPUPoppedErrorScopeResponse,
23    WebGPURenderPipelineResponse,
24};
25
26use crate::gpu::GPU;
27use crate::gpuadapter::GPUAdapter;
28use crate::gpuadapterinfo::GPUAdapterInfo;
29use crate::gpubindgroup::GPUBindGroup;
30use crate::gpubindgrouplayout::GPUBindGroupLayout;
31use crate::gpubuffer::GPUBuffer;
32use crate::gpubufferusage::GPUBufferUsage;
33use crate::gpucolorwrite::GPUColorWrite;
34use crate::gpucommandbuffer::GPUCommandBuffer;
35use crate::gpucommandencoder::GPUCommandEncoder;
36use crate::gpucompilationinfo::GPUCompilationInfo;
37use crate::gpucompilationmessage::GPUCompilationMessage;
38use crate::gpucomputepassencoder::GPUComputePassEncoder;
39use crate::gpucomputepipeline::GPUComputePipeline;
40use crate::gpudevice::GPUDevice;
41use crate::gpudevicelostinfo::GPUDeviceLostInfo;
42use crate::gpuerror::GPUError;
43use crate::gpuexternaltexture::GPUExternalTexture;
44use crate::gpuinternalerror::GPUInternalError;
45use crate::gpumapmode::GPUMapMode;
46use crate::gpuoutofmemoryerror::GPUOutOfMemoryError;
47use crate::gpupipelineerror::GPUPipelineError;
48use crate::gpupipelinelayout::GPUPipelineLayout;
49use crate::gpuqueryset::GPUQuerySet;
50use crate::gpuqueue::GPUQueue;
51use crate::gpurenderbundle::GPURenderBundle;
52use crate::gpurenderbundleencoder::GPURenderBundleEncoder;
53use crate::gpurenderpassencoder::GPURenderPassEncoder;
54use crate::gpurenderpipeline::GPURenderPipeline;
55use crate::gpusampler::GPUSampler;
56use crate::gpushadermodule::GPUShaderModule;
57use crate::gpushaderstage::GPUShaderStage;
58use crate::gpusupportedfeatures::GPUSupportedFeatures;
59use crate::gpusupportedlimits::GPUSupportedLimits;
60use crate::gputexture::GPUTexture;
61use crate::gputextureusage::GPUTextureUsage;
62use crate::gputextureview::GPUTextureView;
63use crate::gpuuncapturederrorevent::GPUUncapturedErrorEvent;
64use crate::gpuvalidationerror::GPUValidationError;
65use crate::identityhub::IdentityHub;
66use crate::wgsllanguagefeatures::WGSLLanguageFeatures;
67
68// This trait enforces the equivalence of all local types with the types in DomTypes.
69trait_set::trait_set! {
70pub trait Equivalence = DomTypes<
71    GPU = GPU<Self>,
72        GPUAdapter = GPUAdapter<Self>,
73        GPUAdapterInfo = GPUAdapterInfo<Self>,
74        GPUBindGroup = GPUBindGroup<Self>,
75        GPUBindGroupLayout = GPUBindGroupLayout<Self>,
76        GPUBuffer = GPUBuffer<Self>,
77        GPUBufferUsage = GPUBufferUsage<Self>,
78        GPUColorWrite = GPUColorWrite<Self>,
79        GPUCommandBuffer = GPUCommandBuffer<Self>,
80        GPUCommandEncoder = GPUCommandEncoder<Self>,
81        GPUCompilationInfo = GPUCompilationInfo<Self>,
82        GPUCompilationMessage = GPUCompilationMessage<Self>,
83        GPUComputePassEncoder = GPUComputePassEncoder<Self>,
84        GPUComputePipeline = GPUComputePipeline<Self>,
85        GPUDevice = GPUDevice<Self>,
86        GPUDeviceLostInfo = GPUDeviceLostInfo<Self>,
87        GPUError = GPUError<Self>,
88        GPUExternalTexture = GPUExternalTexture<Self>,
89        GPUInternalError = GPUInternalError<Self>,
90        GPUMapMode = GPUMapMode<Self>,
91        GPUOutOfMemoryError = GPUOutOfMemoryError<Self>,
92        GPUPipelineError = GPUPipelineError<Self>,
93        GPUPipelineLayout = GPUPipelineLayout<Self>,
94        GPUQueue = GPUQueue<Self>,
95        GPUQuerySet = GPUQuerySet<Self>,
96        GPURenderBundle = GPURenderBundle<Self>,
97        GPURenderBundleEncoder = GPURenderBundleEncoder<Self>,
98        GPURenderPassEncoder = GPURenderPassEncoder<Self>,
99        GPURenderPipeline = GPURenderPipeline<Self>,
100        GPUSampler = GPUSampler<Self>,
101        GPUShaderModule = GPUShaderModule<Self>,
102        GPUShaderStage = GPUShaderStage<Self>,
103        GPUSupportedFeatures = GPUSupportedFeatures<Self>,
104        GPUSupportedLimits = GPUSupportedLimits<Self>,
105        GPUTexture = GPUTexture<Self>,
106        GPUTextureUsage = GPUTextureUsage<Self>,
107        GPUTextureView = GPUTextureView<Self>,
108        GPUUncapturedErrorEvent = GPUUncapturedErrorEvent<Self>,
109        GPUValidationError = GPUValidationError<Self>,
110        WGSLLanguageFeatures = WGSLLanguageFeatures<Self>,
111        // End of Equivalence
112        GPU: DomGlobalGeneric<Self>,
113        GPUAdapter: DomGlobalGeneric<Self>,
114        GPUComputePipeline: DomGlobalGeneric<Self>,
115        GPUCommandEncoder: DomGlobalGeneric<Self>,
116        GPUDevice: DomGlobalGeneric<Self>,
117        GPURenderBundleEncoder: DomGlobalGeneric<Self>,
118        GPURenderPipeline: DomGlobalGeneric<Self>,
119        GPUQueue: DomGlobalGeneric<Self>,
120        GPUTexture: DomGlobalGeneric<Self>,
121        // Other bounds
122        HTMLVideoElement: WebGPUHTMLVideoTrait<Self>,
123        // General Bounds
124        GlobalScope: WebGPUGlobalTrait<Self>,
125        EventTarget: EventTargetTrait<Self>>;
126
127    pub trait WebGPUPromise<D: DomTypes> =
128        WebGPUPromiseCallbackTrait<D, GPU<D>, WebGPUAdapterResponse>
129        + WebGPUPromiseCallbackTrait<D, GPUAdapter<D>, WebGPUDeviceResponse>
130        + WebGPUPromiseCallbackTrait<D, GPUBuffer<D>, Result<Mapping, BufferAccessError>>
131        + WebGPUPromiseCallbackTrait<D, GPUDevice<D>, WebGPUPoppedErrorScopeResponse>
132        + WebGPUPromiseCallbackTrait<D, GPUDevice<D>, WebGPUComputePipelineResponse>
133        + WebGPUPromiseCallbackTrait<D, GPUDevice<D>, WebGPURenderPipelineResponse>
134        + WebGPUPromiseCallbackTrait<D, GPUQueue<D>, ()>
135        + WebGPUPromiseCallbackTrait<D, GPUShaderModule<D>, Option<ShaderCompilationInfo>>
136;
137}
138
139/// Trait for sending Promise callbacks
140pub trait WebGPUPromiseCallbackTrait<D: DomTypes, S, T: Serialize + 'static + Send> {
141    fn callback_promise_dom_manipulation_task_source(&self, d: &S) -> GenericCallback<T>;
142}
143
144pub trait WebGPUGlobalTrait<D: DomTypes>: Sized + DomObject {
145    fn global_wgpu_id_hub(&self) -> Arc<IdentityHub>;
146    fn queue_webgpu_task_source(&self, task: impl TaskOnce + 'static);
147    fn add_webgpu_device(&self, device: &GPUDevice<D>);
148}
149
150#[expect(clippy::type_complexity)]
151pub trait WebGPUHTMLVideoTrait<D: DomTypes>: OriginIsCleanTrait {
152    fn planar_video_for_webgpu(
153        &self,
154        device: &GPUDevice<D>,
155    ) -> Fallible<(
156        Size2D<u32>,
157        Option<Rc<crate::gpuexternaltexture::PlanarTexture<D>>>,
158    )>;
159    fn is_usable(&self) -> bool;
160    fn get_current_frame_data(&self) -> Option<Snapshot>;
161}
162
163pub trait EventTargetTrait<D: DomTypes> {
164    fn new_inherited() -> D::EventTarget;
165    fn get_event_handler_common<T: CallbackContainer>(
166        &self,
167        cx: &mut js::context::JSContext,
168        ty: &str,
169    ) -> Option<RootedCallback<T>>;
170    fn set_event_handler_common<T: HasCallbackHolder>(
171        &self,
172        cx: &mut js::context::JSContext,
173        ty: &str,
174        listener: Option<RootedCallback<T>>,
175    );
176}
177
178pub trait OriginIsCleanTrait {
179    fn origin_is_clean(&self) -> bool;
180}
181
182pub trait ImageBitmapTrait: OriginIsCleanTrait {
183    fn bitmap_data(&self) -> Ref<'_, Option<Snapshot>>;
184}
185
186pub trait ImageDataTrait {
187    fn is_detached(&self, cx: &mut js::context::JSContext) -> bool;
188    fn get_snapshot(&self, no_gc: &NoGC) -> Snapshot;
189}
190
191pub trait HtmlImageElementTrait {
192    fn is_usable(&self) -> Result<bool, Error>;
193    fn get_raster_image_data(&self) -> Option<Snapshot>;
194    fn same_origin(&self, origin: &MutableOrigin) -> bool;
195}
196
197pub trait OffscreenCanvasTrait: OriginIsCleanTrait {
198    fn get_image_data(&self) -> Option<Snapshot>;
199}
200
201pub trait HtmlCanvasElementTrait: OriginIsCleanTrait {
202    fn is_valid(&self) -> bool;
203    fn get_image_data(&self) -> Option<Snapshot>;
204}