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