servo/components/shared/webgpu/messages/recv.rs
Martin Robinson 0d693114ad
webgpu: Add a webgpu_traits crate (#36320)
This breaks the `script_traits` dependency  on `webgpu`. In general, the
`traits` crates shouldn't depend on Servo non-`traits` crates. This is
necessary to move "script to constellation" messages to the
`constellation_traits` crate, making it the entire API for talking to
the
constellation. This will break a circular dependency when that happens.

Testing: Successfully building is enough of a test for this one as
it is mainly moving types around.

Signed-off-by: Martin Robinson <mrobinson@igalia.com>

Signed-off-by: Martin Robinson <mrobinson@igalia.com>
2025-04-04 08:06:07 +00:00

338 lines
11 KiB
Rust

/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
//! IPC messages that are received in the WebGPU thread
//! (usually from the ScriptThread, and more specifically from DOM objects)
use arrayvec::ArrayVec;
use base::id::PipelineId;
use ipc_channel::ipc::{IpcSender, IpcSharedMemory};
use serde::{Deserialize, Serialize};
use webrender_api::ImageKey;
use webrender_api::units::DeviceIntSize;
use wgpu_core::Label;
use wgpu_core::binding_model::{
BindGroupDescriptor, BindGroupLayoutDescriptor, PipelineLayoutDescriptor,
};
use wgpu_core::command::{
RenderBundleDescriptor, RenderBundleEncoder, RenderPassColorAttachment,
RenderPassDepthStencilAttachment, TexelCopyBufferInfo, TexelCopyTextureInfo,
};
use wgpu_core::device::HostMap;
pub use wgpu_core::id::markers::{
ComputePassEncoder as ComputePass, RenderPassEncoder as RenderPass,
};
use wgpu_core::id::{
AdapterId, BindGroupId, BindGroupLayoutId, BufferId, CommandBufferId, CommandEncoderId,
ComputePassEncoderId, ComputePipelineId, DeviceId, PipelineLayoutId, QuerySetId, QueueId,
RenderBundleId, RenderPassEncoderId, RenderPipelineId, SamplerId, ShaderModuleId, TextureId,
TextureViewId,
};
pub use wgpu_core::id::{
ComputePassEncoderId as ComputePassId, RenderPassEncoderId as RenderPassId,
};
use wgpu_core::instance::RequestAdapterOptions;
use wgpu_core::pipeline::{ComputePipelineDescriptor, RenderPipelineDescriptor};
use wgpu_core::resource::{
BufferAccessError, BufferDescriptor, SamplerDescriptor, TextureDescriptor,
TextureViewDescriptor,
};
use wgpu_types::{
BufferAddress, CommandBufferDescriptor, CommandEncoderDescriptor, DeviceDescriptor, Extent3d,
TexelCopyBufferLayout,
};
use crate::{
ContextConfiguration, Error, ErrorFilter, Mapping, PRESENTATION_BUFFER_COUNT, RenderCommand,
ShaderCompilationInfo, WebGPUAdapter, WebGPUAdapterResponse, WebGPUComputePipelineResponse,
WebGPUContextId, WebGPUDeviceResponse, WebGPUPoppedErrorScopeResponse,
WebGPURenderPipelineResponse,
};
#[derive(Debug, Deserialize, Serialize)]
pub enum WebGPURequest {
BufferMapAsync {
sender: IpcSender<Result<Mapping, BufferAccessError>>,
buffer_id: BufferId,
device_id: DeviceId,
host_map: HostMap,
offset: u64,
size: Option<u64>,
},
CommandEncoderFinish {
command_encoder_id: CommandEncoderId,
device_id: DeviceId,
desc: CommandBufferDescriptor<Label<'static>>,
},
CopyBufferToBuffer {
command_encoder_id: CommandEncoderId,
source_id: BufferId,
source_offset: BufferAddress,
destination_id: BufferId,
destination_offset: BufferAddress,
size: BufferAddress,
},
CopyBufferToTexture {
command_encoder_id: CommandEncoderId,
source: TexelCopyBufferInfo,
destination: TexelCopyTextureInfo,
copy_size: Extent3d,
},
CopyTextureToBuffer {
command_encoder_id: CommandEncoderId,
source: TexelCopyTextureInfo,
destination: TexelCopyBufferInfo,
copy_size: Extent3d,
},
CopyTextureToTexture {
command_encoder_id: CommandEncoderId,
source: TexelCopyTextureInfo,
destination: TexelCopyTextureInfo,
copy_size: Extent3d,
},
CreateBindGroup {
device_id: DeviceId,
bind_group_id: BindGroupId,
descriptor: BindGroupDescriptor<'static>,
},
CreateBindGroupLayout {
device_id: DeviceId,
bind_group_layout_id: BindGroupLayoutId,
descriptor: Option<BindGroupLayoutDescriptor<'static>>,
},
CreateBuffer {
device_id: DeviceId,
buffer_id: BufferId,
descriptor: BufferDescriptor<'static>,
},
CreateCommandEncoder {
device_id: DeviceId,
command_encoder_id: CommandEncoderId,
desc: CommandEncoderDescriptor<Label<'static>>,
},
CreateComputePipeline {
device_id: DeviceId,
compute_pipeline_id: ComputePipelineId,
descriptor: ComputePipelineDescriptor<'static>,
implicit_ids: Option<(PipelineLayoutId, Vec<BindGroupLayoutId>)>,
/// present only on ASYNC versions
async_sender: Option<IpcSender<WebGPUComputePipelineResponse>>,
},
CreatePipelineLayout {
device_id: DeviceId,
pipeline_layout_id: PipelineLayoutId,
descriptor: PipelineLayoutDescriptor<'static>,
},
CreateRenderPipeline {
device_id: DeviceId,
render_pipeline_id: RenderPipelineId,
descriptor: RenderPipelineDescriptor<'static>,
implicit_ids: Option<(PipelineLayoutId, Vec<BindGroupLayoutId>)>,
/// present only on ASYNC versions
async_sender: Option<IpcSender<WebGPURenderPipelineResponse>>,
},
CreateSampler {
device_id: DeviceId,
sampler_id: SamplerId,
descriptor: SamplerDescriptor<'static>,
},
CreateShaderModule {
device_id: DeviceId,
program_id: ShaderModuleId,
program: String,
label: Option<String>,
sender: IpcSender<Option<ShaderCompilationInfo>>,
},
/// Creates context
CreateContext {
buffer_ids: ArrayVec<BufferId, PRESENTATION_BUFFER_COUNT>,
size: DeviceIntSize,
sender: IpcSender<(WebGPUContextId, ImageKey)>,
},
/// Recreates swapchain (if needed)
UpdateContext {
context_id: WebGPUContextId,
size: DeviceIntSize,
configuration: Option<ContextConfiguration>,
},
/// Reads texture to swapchains buffer and maps it
SwapChainPresent {
context_id: WebGPUContextId,
texture_id: TextureId,
encoder_id: CommandEncoderId,
},
/// Obtains image from latest presentation buffer (same as wr update)
GetImage {
context_id: WebGPUContextId,
sender: IpcSender<IpcSharedMemory>,
},
ValidateTextureDescriptor {
device_id: DeviceId,
texture_id: TextureId,
descriptor: TextureDescriptor<'static>,
},
DestroyContext {
context_id: WebGPUContextId,
},
CreateTexture {
device_id: DeviceId,
texture_id: TextureId,
descriptor: TextureDescriptor<'static>,
},
CreateTextureView {
texture_id: TextureId,
texture_view_id: TextureViewId,
device_id: DeviceId,
descriptor: Option<TextureViewDescriptor<'static>>,
},
DestroyBuffer(BufferId),
DestroyDevice(DeviceId),
DestroyTexture(TextureId),
DropTexture(TextureId),
DropAdapter(AdapterId),
DropDevice(DeviceId),
DropBuffer(BufferId),
DropPipelineLayout(PipelineLayoutId),
DropComputePipeline(ComputePipelineId),
DropRenderPipeline(RenderPipelineId),
DropBindGroup(BindGroupId),
DropBindGroupLayout(BindGroupLayoutId),
DropCommandBuffer(CommandBufferId),
DropTextureView(TextureViewId),
DropSampler(SamplerId),
DropShaderModule(ShaderModuleId),
DropRenderBundle(RenderBundleId),
DropQuerySet(QuerySetId),
DropComputePass(ComputePassEncoderId),
DropRenderPass(RenderPassEncoderId),
Exit(IpcSender<()>),
RenderBundleEncoderFinish {
render_bundle_encoder: RenderBundleEncoder,
descriptor: RenderBundleDescriptor<'static>,
render_bundle_id: RenderBundleId,
device_id: DeviceId,
},
RequestAdapter {
sender: IpcSender<WebGPUAdapterResponse>,
options: RequestAdapterOptions,
adapter_id: AdapterId,
},
RequestDevice {
sender: IpcSender<WebGPUDeviceResponse>,
adapter_id: WebGPUAdapter,
descriptor: DeviceDescriptor<Option<String>>,
device_id: DeviceId,
queue_id: QueueId,
pipeline_id: PipelineId,
},
// Compute Pass
BeginComputePass {
command_encoder_id: CommandEncoderId,
compute_pass_id: ComputePassId,
label: Label<'static>,
device_id: DeviceId,
},
ComputePassSetPipeline {
compute_pass_id: ComputePassId,
pipeline_id: ComputePipelineId,
device_id: DeviceId,
},
ComputePassSetBindGroup {
compute_pass_id: ComputePassId,
index: u32,
bind_group_id: BindGroupId,
offsets: Vec<u32>,
device_id: DeviceId,
},
ComputePassDispatchWorkgroups {
compute_pass_id: ComputePassId,
x: u32,
y: u32,
z: u32,
device_id: DeviceId,
},
ComputePassDispatchWorkgroupsIndirect {
compute_pass_id: ComputePassId,
buffer_id: BufferId,
offset: u64,
device_id: DeviceId,
},
EndComputePass {
compute_pass_id: ComputePassId,
device_id: DeviceId,
command_encoder_id: CommandEncoderId,
},
// Render Pass
BeginRenderPass {
command_encoder_id: CommandEncoderId,
render_pass_id: RenderPassId,
label: Label<'static>,
color_attachments: Vec<Option<RenderPassColorAttachment>>,
depth_stencil_attachment: Option<RenderPassDepthStencilAttachment>,
device_id: DeviceId,
},
RenderPassCommand {
render_pass_id: RenderPassId,
render_command: RenderCommand,
device_id: DeviceId,
},
EndRenderPass {
render_pass_id: RenderPassId,
device_id: DeviceId,
command_encoder_id: CommandEncoderId,
},
Submit {
device_id: DeviceId,
queue_id: QueueId,
command_buffers: Vec<CommandBufferId>,
},
UnmapBuffer {
buffer_id: BufferId,
/// Return back mapping for writeback
mapping: Option<Mapping>,
},
WriteBuffer {
device_id: DeviceId,
queue_id: QueueId,
buffer_id: BufferId,
buffer_offset: u64,
data: IpcSharedMemory,
},
WriteTexture {
device_id: DeviceId,
queue_id: QueueId,
texture_cv: TexelCopyTextureInfo,
data_layout: TexelCopyBufferLayout,
size: Extent3d,
data: IpcSharedMemory,
},
QueueOnSubmittedWorkDone {
sender: IpcSender<()>,
queue_id: QueueId,
},
PushErrorScope {
device_id: DeviceId,
filter: ErrorFilter,
},
DispatchError {
device_id: DeviceId,
error: Error,
},
PopErrorScope {
device_id: DeviceId,
sender: IpcSender<WebGPUPoppedErrorScopeResponse>,
},
ComputeGetBindGroupLayout {
device_id: DeviceId,
pipeline_id: ComputePipelineId,
index: u32,
id: BindGroupLayoutId,
},
RenderGetBindGroupLayout {
device_id: DeviceId,
pipeline_id: RenderPipelineId,
index: u32,
id: BindGroupLayoutId,
},
}