1use 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
72trait_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 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 HTMLVideoElement: WebGPUHTMLVideoTrait<Self>,
131 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
149pub 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
157pub trait WebGPUPromiseCallbackTrait<D: DomTypes, S, T: Serialize + 'static + Send> {
159 fn callback_promise_dom_manipulation_task_source(&self, d: &S) -> GenericCallback<T>;
160}
161
162pub 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}