aboutsummaryrefslogtreecommitdiffstats
path: root/components/webgpu/lib.rs
diff options
context:
space:
mode:
Diffstat (limited to 'components/webgpu/lib.rs')
-rw-r--r--components/webgpu/lib.rs60
1 files changed, 46 insertions, 14 deletions
diff --git a/components/webgpu/lib.rs b/components/webgpu/lib.rs
index 58b2c427d99..66394086159 100644
--- a/components/webgpu/lib.rs
+++ b/components/webgpu/lib.rs
@@ -19,6 +19,7 @@ use msg::constellation_msg::PipelineId;
use serde::{Deserialize, Serialize};
use servo_config::pref;
use smallvec::SmallVec;
+use std::borrow::Cow;
use std::collections::HashMap;
use std::ffi::CString;
use std::ptr;
@@ -32,7 +33,7 @@ use webrender_traits::{
};
use wgpu::{
binding_model::BindGroupDescriptor,
- command::{BufferCopyView, ComputePass, RenderPass, TextureCopyView},
+ command::{BufferCopyView, ComputePass, RenderBundleEncoder, RenderPass, TextureCopyView},
device::HostMap,
id,
instance::RequestAdapterOptions,
@@ -54,6 +55,7 @@ pub enum WebGPUResponse {
device_id: WebGPUDevice,
queue_id: WebGPUQueue,
_descriptor: wgt::DeviceDescriptor,
+ label: Option<String>,
},
BufferMapAsync(IpcSharedMemory),
}
@@ -61,7 +63,7 @@ pub enum WebGPUResponse {
pub type WebGPUResponseResult = Result<WebGPUResponse, String>;
#[derive(Debug, Deserialize, Serialize)]
-pub enum WebGPURequest<'a> {
+pub enum WebGPURequest {
BufferMapAsync {
sender: IpcSender<WebGPUResponseResult>,
buffer_id: id::BufferId,
@@ -105,13 +107,13 @@ pub enum WebGPURequest<'a> {
// TODO: Consider using NonZeroU64 to reduce enum size
scope_id: Option<u64>,
bind_group_id: id::BindGroupId,
- descriptor: BindGroupDescriptor<'a>,
+ descriptor: BindGroupDescriptor<'static>,
},
CreateBindGroupLayout {
device_id: id::DeviceId,
scope_id: Option<u64>,
bind_group_layout_id: id::BindGroupLayoutId,
- descriptor: wgt::BindGroupLayoutDescriptor<'a>,
+ descriptor: wgt::BindGroupLayoutDescriptor<'static>,
},
CreateBuffer {
device_id: id::DeviceId,
@@ -129,20 +131,20 @@ pub enum WebGPURequest<'a> {
device_id: id::DeviceId,
scope_id: Option<u64>,
compute_pipeline_id: id::ComputePipelineId,
- descriptor: ComputePipelineDescriptor<'a>,
+ descriptor: ComputePipelineDescriptor<'static>,
},
CreateContext(IpcSender<webrender_api::ExternalImageId>),
CreatePipelineLayout {
device_id: id::DeviceId,
scope_id: Option<u64>,
pipeline_layout_id: id::PipelineLayoutId,
- descriptor: wgt::PipelineLayoutDescriptor<'a, id::BindGroupLayoutId>,
+ descriptor: wgt::PipelineLayoutDescriptor<'static, id::BindGroupLayoutId>,
},
CreateRenderPipeline {
device_id: id::DeviceId,
scope_id: Option<u64>,
render_pipeline_id: id::RenderPipelineId,
- descriptor: RenderPipelineDescriptor<'a>,
+ descriptor: RenderPipelineDescriptor<'static>,
},
CreateSampler {
device_id: id::DeviceId,
@@ -180,6 +182,11 @@ pub enum WebGPURequest<'a> {
DestroyTexture(id::TextureId),
Exit(IpcSender<()>),
FreeDevice(id::DeviceId),
+ RenderBundleEncoderFinish {
+ render_bundle_encoder: RenderBundleEncoder,
+ descriptor: wgt::RenderBundleDescriptor<Option<String>>,
+ render_bundle_id: id::RenderBundleId,
+ },
RequestAdapter {
sender: IpcSender<WebGPUResponseResult>,
options: RequestAdapterOptions,
@@ -191,6 +198,7 @@ pub enum WebGPURequest<'a> {
descriptor: wgt::DeviceDescriptor,
device_id: id::DeviceId,
pipeline_id: PipelineId,
+ label: Option<String>,
},
RunComputePass {
command_encoder_id: id::CommandEncoderId,
@@ -245,7 +253,7 @@ struct BufferMapInfo<'a, T> {
}
#[derive(Clone, Debug, Deserialize, Serialize)]
-pub struct WebGPU(pub IpcSender<WebGPURequest<'static>>);
+pub struct WebGPU(pub IpcSender<WebGPURequest>);
impl WebGPU {
pub fn new(
@@ -309,8 +317,8 @@ impl WebGPU {
}
struct WGPU<'a> {
- receiver: IpcReceiver<WebGPURequest<'static>>,
- sender: IpcSender<WebGPURequest<'static>>,
+ receiver: IpcReceiver<WebGPURequest>,
+ sender: IpcSender<WebGPURequest>,
script_sender: IpcSender<WebGPUMsg>,
global: wgpu::hub::Global<IdentityRecyclerFactory>,
adapters: Vec<WebGPUAdapter>,
@@ -320,7 +328,7 @@ struct WGPU<'a> {
// Buffers with pending mapping
buffer_maps: HashMap<id::BufferId, Rc<BufferMapInfo<'a, WebGPUResponseResult>>>,
// Presentation Buffers with pending mapping
- present_buffer_maps: HashMap<id::BufferId, Rc<BufferMapInfo<'a, WebGPURequest<'static>>>>,
+ present_buffer_maps: HashMap<id::BufferId, Rc<BufferMapInfo<'a, WebGPURequest>>>,
webrender_api: webrender_api::RenderApi,
webrender_document: webrender_api::DocumentId,
external_images: Arc<Mutex<WebrenderExternalImageRegistry>>,
@@ -330,8 +338,8 @@ struct WGPU<'a> {
impl<'a> WGPU<'a> {
fn new(
- receiver: IpcReceiver<WebGPURequest<'static>>,
- sender: IpcSender<WebGPURequest<'static>>,
+ receiver: IpcReceiver<WebGPURequest>,
+ sender: IpcSender<WebGPURequest>,
script_sender: IpcSender<WebGPUMsg>,
webrender_api_sender: webrender_api::RenderApiSender,
webrender_document: webrender_api::DocumentId,
@@ -626,7 +634,8 @@ impl<'a> WGPU<'a> {
program,
} => {
let global = &self.global;
- let source = wgpu_core::pipeline::ShaderModuleSource::SpirV(&program);
+ let source =
+ wgpu_core::pipeline::ShaderModuleSource::SpirV(Cow::Owned(program));
let _ = gfx_select!(program_id =>
global.device_create_shader_module(device_id, source, program_id));
},
@@ -766,6 +775,26 @@ impl<'a> WGPU<'a> {
warn!("Unable to send CleanDevice({:?}) ({:?})", device_id, e);
}
},
+ WebGPURequest::RenderBundleEncoderFinish {
+ render_bundle_encoder,
+ descriptor,
+ render_bundle_id,
+ } => {
+ let global = &self.global;
+ let st;
+ let label = match descriptor.label {
+ Some(ref s) => {
+ st = CString::new(s.as_bytes()).unwrap();
+ st.as_ptr()
+ },
+ None => ptr::null(),
+ };
+ let _ = gfx_select!(render_bundle_id => global.render_bundle_encoder_finish(
+ render_bundle_encoder,
+ &descriptor.map_label(|_| label),
+ render_bundle_id
+ ));
+ },
WebGPURequest::RequestAdapter {
sender,
options,
@@ -809,6 +838,7 @@ impl<'a> WGPU<'a> {
descriptor,
device_id,
pipeline_id,
+ label,
} => {
let global = &self.global;
let result = gfx_select!(device_id => global.adapter_request_device(
@@ -828,6 +858,7 @@ impl<'a> WGPU<'a> {
device_id: device,
queue_id: queue,
_descriptor: descriptor,
+ label,
})) {
warn!(
"Failed to send response to WebGPURequest::RequestDevice ({})",
@@ -1136,6 +1167,7 @@ webgpu_resource!(WebGPUComputePipeline, id::ComputePipelineId);
webgpu_resource!(WebGPUDevice, id::DeviceId);
webgpu_resource!(WebGPUPipelineLayout, id::PipelineLayoutId);
webgpu_resource!(WebGPUQueue, id::QueueId);
+webgpu_resource!(WebGPURenderBundle, id::RenderBundleId);
webgpu_resource!(WebGPURenderPipeline, id::RenderPipelineId);
webgpu_resource!(WebGPUSampler, id::SamplerId);
webgpu_resource!(WebGPUShaderModule, id::ShaderModuleId);