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, 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
68trait_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 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 HTMLVideoElement: WebGPUHTMLVideoTrait<Self>,
123 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
139pub 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}