building webgpu with rust - fosdem · 2020. 2. 18. · developers want to have rich content running...
TRANSCRIPT
![Page 1: Building WebGPU with Rust - FOSDEM · 2020. 2. 18. · Developers want to have rich content running portably on the Web and Native Each native platform has a preferred API Some of](https://reader033.vdocument.in/reader033/viewer/2022051900/5feed85dad143571c25696c8/html5/thumbnails/1.jpg)
Building WebGPU with Rust
Fosdem, 2th Feb 2020
Dzmitry Malyshau @kvark(Mozilla / Graphics Engineer)
![Page 2: Building WebGPU with Rust - FOSDEM · 2020. 2. 18. · Developers want to have rich content running portably on the Web and Native Each native platform has a preferred API Some of](https://reader033.vdocument.in/reader033/viewer/2022051900/5feed85dad143571c25696c8/html5/thumbnails/2.jpg)
1. WebGPU: Why and What?2. Example in Rust3. Architecture4. Rust features used5. Wrap-up6. (bonus level) Browsers
Agenda
![Page 3: Building WebGPU with Rust - FOSDEM · 2020. 2. 18. · Developers want to have rich content running portably on the Web and Native Each native platform has a preferred API Some of](https://reader033.vdocument.in/reader033/viewer/2022051900/5feed85dad143571c25696c8/html5/thumbnails/3.jpg)
Can we make this simpler?
Screenshot from RDR2 trailer, PS4
![Page 4: Building WebGPU with Rust - FOSDEM · 2020. 2. 18. · Developers want to have rich content running portably on the Web and Native Each native platform has a preferred API Some of](https://reader033.vdocument.in/reader033/viewer/2022051900/5feed85dad143571c25696c8/html5/thumbnails/4.jpg)
● Developers want to have rich content running portably on the Web and Native● Each native platform has a preferred API● Some of them are best fit for engines, not applications● The only path to reach most platforms is OpenGL/WebGL
○ Applications quickly become CPU-limited○ No multi-threading is possible○ Getting access to modern GPU features portably is hard, e.g. compute shaders are not always
supported
Situation
![Page 5: Building WebGPU with Rust - FOSDEM · 2020. 2. 18. · Developers want to have rich content running portably on the Web and Native Each native platform has a preferred API Some of](https://reader033.vdocument.in/reader033/viewer/2022051900/5feed85dad143571c25696c8/html5/thumbnails/5.jpg)
OpenGLRender like it’s 1992
![Page 6: Building WebGPU with Rust - FOSDEM · 2020. 2. 18. · Developers want to have rich content running portably on the Web and Native Each native platform has a preferred API Some of](https://reader033.vdocument.in/reader033/viewer/2022051900/5feed85dad143571c25696c8/html5/thumbnails/6.jpg)
Future of OpenGL?
● Apple -> deprecates OpenGL in 2018, there is no WebGL 2.0 support yet● Microsoft -> not supporting OpenGL (or Vulkan) in UWP● IHVs focus on Vulkan and DX12 drivers● WebGL ends up translating to Dx11 (via Angle) on Windows by major browsers
![Page 7: Building WebGPU with Rust - FOSDEM · 2020. 2. 18. · Developers want to have rich content running portably on the Web and Native Each native platform has a preferred API Some of](https://reader033.vdocument.in/reader033/viewer/2022051900/5feed85dad143571c25696c8/html5/thumbnails/7.jpg)
OptionGL: technical issues● Changing a state can cause the driver to recompile the shader, internally
○ Causes 100ms freezes during the experience...○ Missing concept of pipelines
● Challenging to optimize for mobile○ Rendering tile management is critical for power-efficiency but handled implicitly○ Missing concept of render passes
● Challenging to take advantage of more threads○ Purely single-threaded, becomes a CPU bottleneck○ Missing concept of command buffers
● Tricky data transfers○ Dx11 doesn’t have buffer to texture copies
● Given that WebGL2 is not universally supported, even basic things like sampler objects are not fully available to developers
![Page 8: Building WebGPU with Rust - FOSDEM · 2020. 2. 18. · Developers want to have rich content running portably on the Web and Native Each native platform has a preferred API Some of](https://reader033.vdocument.in/reader033/viewer/2022051900/5feed85dad143571c25696c8/html5/thumbnails/8.jpg)
OpenGL: evolutionGPU all the things!
![Page 9: Building WebGPU with Rust - FOSDEM · 2020. 2. 18. · Developers want to have rich content running portably on the Web and Native Each native platform has a preferred API Some of](https://reader033.vdocument.in/reader033/viewer/2022051900/5feed85dad143571c25696c8/html5/thumbnails/9.jpg)
Who started WebGPU?
Quiz^
hint: not Apple
![Page 10: Building WebGPU with Rust - FOSDEM · 2020. 2. 18. · Developers want to have rich content running portably on the Web and Native Each native platform has a preferred API Some of](https://reader033.vdocument.in/reader033/viewer/2022051900/5feed85dad143571c25696c8/html5/thumbnails/10.jpg)
Khronos Vancouver F2F
3D Portability/WebGL-Next
![Page 11: Building WebGPU with Rust - FOSDEM · 2020. 2. 18. · Developers want to have rich content running portably on the Web and Native Each native platform has a preferred API Some of](https://reader033.vdocument.in/reader033/viewer/2022051900/5feed85dad143571c25696c8/html5/thumbnails/11.jpg)
11
2016 H2: experiments by browser vendors
2017 Feb: formation of
W3C group
2017 Jun: agreement on the
binding model
2018 Apr: agreement on the implicit barriers
2019 Sep:Gecko implementation start
2018 Sep:wgpu project kick-off
1
2
34
5
6
History
![Page 12: Building WebGPU with Rust - FOSDEM · 2020. 2. 18. · Developers want to have rich content running portably on the Web and Native Each native platform has a preferred API Some of](https://reader033.vdocument.in/reader033/viewer/2022051900/5feed85dad143571c25696c8/html5/thumbnails/12.jpg)
What is WebGPU?
![Page 14: Building WebGPU with Rust - FOSDEM · 2020. 2. 18. · Developers want to have rich content running portably on the Web and Native Each native platform has a preferred API Some of](https://reader033.vdocument.in/reader033/viewer/2022051900/5feed85dad143571c25696c8/html5/thumbnails/14.jpg)
Design Constraints
performanceportabilitysecurity usability
![Page 15: Building WebGPU with Rust - FOSDEM · 2020. 2. 18. · Developers want to have rich content running portably on the Web and Native Each native platform has a preferred API Some of](https://reader033.vdocument.in/reader033/viewer/2022051900/5feed85dad143571c25696c8/html5/thumbnails/15.jpg)
Early (native) benchmarks by Google
![Page 16: Building WebGPU with Rust - FOSDEM · 2020. 2. 18. · Developers want to have rich content running portably on the Web and Native Each native platform has a preferred API Some of](https://reader033.vdocument.in/reader033/viewer/2022051900/5feed85dad143571c25696c8/html5/thumbnails/16.jpg)
Early (web) benchmarks by Safari team
![Page 17: Building WebGPU with Rust - FOSDEM · 2020. 2. 18. · Developers want to have rich content running portably on the Web and Native Each native platform has a preferred API Some of](https://reader033.vdocument.in/reader033/viewer/2022051900/5feed85dad143571c25696c8/html5/thumbnails/17.jpg)
Example: device initializationlet adapter = wgpu::Adapter::request(
&wgpu::RequestAdapterOptions { power_preference: wgpu::PowerPreference::Default },
wgpu::BackendBit::PRIMARY,
).unwrap();
let (device, queue) = adapter.request_device(&wgpu::DeviceDescriptor {
extensions: wgpu::Extensions { anisotropic_filtering: false },
limits: wgpu::Limits::default(),
});
![Page 18: Building WebGPU with Rust - FOSDEM · 2020. 2. 18. · Developers want to have rich content running portably on the Web and Native Each native platform has a preferred API Some of](https://reader033.vdocument.in/reader033/viewer/2022051900/5feed85dad143571c25696c8/html5/thumbnails/18.jpg)
Example: swap chain initializationlet surface = wgpu::Surface::create(&window);
let swap_chain_desc = wgpu::SwapChainDescriptor {
usage: wgpu::TextureUsage::OUTPUT_ATTACHMENT,
format: wgpu::TextureFormat::Bgra8UnormSrgb,
width: size.width,
height: size.height,
present_mode: wgpu::PresentMode::Vsync,
};
let mut swap_chain = device.create_swap_chain(&surface, &swap_chain_desc);
![Page 19: Building WebGPU with Rust - FOSDEM · 2020. 2. 18. · Developers want to have rich content running portably on the Web and Native Each native platform has a preferred API Some of](https://reader033.vdocument.in/reader033/viewer/2022051900/5feed85dad143571c25696c8/html5/thumbnails/19.jpg)
Example: uploading vertex datalet vertex_buf = device.create_buffer_with_data(vertex_data.as_bytes(), wgpu::BufferUsage::VERTEX);
let vb_desc = wgpu::VertexBufferDescriptor {
stride: vertex_size as wgpu::BufferAddress,
step_mode: wgpu::InputStepMode::Vertex,
attributes: &[
wgpu::VertexAttributeDescriptor { format: wgpu::VertexFormat::Float4, offset: 0, shader_location: 0 },
wgpu::VertexAttributeDescriptor { format: wgpu::VertexFormat::Float2, offset: 4 * 4, shader_location: 1 },
],
};
![Page 20: Building WebGPU with Rust - FOSDEM · 2020. 2. 18. · Developers want to have rich content running portably on the Web and Native Each native platform has a preferred API Some of](https://reader033.vdocument.in/reader033/viewer/2022051900/5feed85dad143571c25696c8/html5/thumbnails/20.jpg)
Is WebGPU an explicit API?
Quiz ^
hint: what is explicit?
![Page 21: Building WebGPU with Rust - FOSDEM · 2020. 2. 18. · Developers want to have rich content running portably on the Web and Native Each native platform has a preferred API Some of](https://reader033.vdocument.in/reader033/viewer/2022051900/5feed85dad143571c25696c8/html5/thumbnails/21.jpg)
Mozilla Confidential
texture = device.createTexture({..});
WebGPU:
Feat: implicit memory
Metal could be close to either
Vulkan:image = vkCreateImage();reqs = vkGetImageMemoryRequirements();memType = findMemoryType();memory = vkAllocateMemory(memType);vkBindImageMemory(image, memory);
![Page 22: Building WebGPU with Rust - FOSDEM · 2020. 2. 18. · Developers want to have rich content running portably on the Web and Native Each native platform has a preferred API Some of](https://reader033.vdocument.in/reader033/viewer/2022051900/5feed85dad143571c25696c8/html5/thumbnails/22.jpg)
![Page 23: Building WebGPU with Rust - FOSDEM · 2020. 2. 18. · Developers want to have rich content running portably on the Web and Native Each native platform has a preferred API Some of](https://reader033.vdocument.in/reader033/viewer/2022051900/5feed85dad143571c25696c8/html5/thumbnails/23.jpg)
Example: declaring shader datalet bind_group_layout = device.create_bind_group_layout(&wgpu::BindGroupLayoutDescriptor {
bindings: &[
wgpu::BindGroupLayoutBinding {
binding: 0,
visibility: wgpu::ShaderStage::VERTEX,
ty: wgpu::BindingType::UniformBuffer { dynamic: false },
},
],
});
let pipeline_layout = device.create_pipeline_layout(&wgpu::PipelineLayoutDescriptor {
bind_group_layouts: &[&bind_group_layout],
});
![Page 24: Building WebGPU with Rust - FOSDEM · 2020. 2. 18. · Developers want to have rich content running portably on the Web and Native Each native platform has a preferred API Some of](https://reader033.vdocument.in/reader033/viewer/2022051900/5feed85dad143571c25696c8/html5/thumbnails/24.jpg)
Example: instantiating shader datalet bind_group = device.create_bind_group(&wgpu::BindGroupDescriptor {
layout: &bind_group_layout,
bindings: &[
wgpu::Binding {
binding: 0,
resource: wgpu::BindingResource::Buffer {
buffer: &uniform_buf,
range: 0 .. 64,
},
},
],
});
![Page 25: Building WebGPU with Rust - FOSDEM · 2020. 2. 18. · Developers want to have rich content running portably on the Web and Native Each native platform has a preferred API Some of](https://reader033.vdocument.in/reader033/viewer/2022051900/5feed85dad143571c25696c8/html5/thumbnails/25.jpg)
Feat: binding groups of resources
Bind Group 0
ShadersBind Group 1 Bind Group 2 Bind Group 3
Render Target 0
Render Target 1
Vert
ex b
uffer
0
Vert
ex b
uffer
1
Storage buffer
Sampled texture
Uniform buffer
Sampler
![Page 26: Building WebGPU with Rust - FOSDEM · 2020. 2. 18. · Developers want to have rich content running portably on the Web and Native Each native platform has a preferred API Some of](https://reader033.vdocument.in/reader033/viewer/2022051900/5feed85dad143571c25696c8/html5/thumbnails/26.jpg)
Example: creating the pipelinelet pipeline = device.create_render_pipeline(&wgpu::RenderPipelineDescriptor {
layout: &pipeline_layout,
vertex_stage: wgpu::ProgrammableStageDescriptor { module: &vs_module, entry_point: "main" },
fragment_stage: Some(wgpu::ProgrammableStageDescriptor { module: &fs_module, entry_point: "main" }),
rasterization_state: Some(wgpu::RasterizationStateDescriptor { front_face: wgpu::FrontFace::Ccw, cull_mode: wgpu::CullMode::Back }),
primitive_topology: wgpu::PrimitiveTopology::TriangleList,
color_states: &[wgpu::ColorStateDescriptor { format: sc_desc.format, … }],
index_format: wgpu::IndexFormat::Uint16,
vertex_buffers: &[wgpu::VertexBufferDescriptor {
stride: vertex_size as wgpu::BufferAddress,
step_mode: wgpu::InputStepMode::Vertex,
attributes: &[
wgpu::VertexAttributeDescriptor { format: wgpu::VertexFormat::Float4, offset: 0, shader_location: 0 },
],
}],
});
![Page 27: Building WebGPU with Rust - FOSDEM · 2020. 2. 18. · Developers want to have rich content running portably on the Web and Native Each native platform has a preferred API Some of](https://reader033.vdocument.in/reader033/viewer/2022051900/5feed85dad143571c25696c8/html5/thumbnails/27.jpg)
Example: renderinglet mut rpass = encoder.begin_render_pass(&wgpu::RenderPassDescriptor {
color_attachments: &[wgpu::RenderPassColorAttachmentDescriptor {
attachment: &frame.view,
resolve_target: None,
load_op: wgpu::LoadOp::Clear,
store_op: wgpu::StoreOp::Store,
clear_color: wgpu::Color { r: 0.1, g: 0.2, b: 0.3, a: 1.0 },
}],
depth_stencil_attachment: None,
});
rpass.set_pipeline(&self.pipeline);
rpass.set_bind_group(0, &self.bind_group, &[]);
rpass.set_index_buffer(&self.index_buf, 0);
rpass.set_vertex_buffers(0, &[(&self.vertex_buf, 0)]);
rpass.draw_indexed(0 .. self.index_count as u32, 0, 0 .. 1);
![Page 28: Building WebGPU with Rust - FOSDEM · 2020. 2. 18. · Developers want to have rich content running portably on the Web and Native Each native platform has a preferred API Some of](https://reader033.vdocument.in/reader033/viewer/2022051900/5feed85dad143571c25696c8/html5/thumbnails/28.jpg)
Tile
Tile
Tile
On-chip tile memory
Feat: render passes
![Page 29: Building WebGPU with Rust - FOSDEM · 2020. 2. 18. · Developers want to have rich content running portably on the Web and Native Each native platform has a preferred API Some of](https://reader033.vdocument.in/reader033/viewer/2022051900/5feed85dad143571c25696c8/html5/thumbnails/29.jpg)
Feat: multi-threadingCommand Buffer 1 (recorded on thread A)
● Render pass○ setBindGroup○ setVertexBuffers○ draw○ setIndexBuffer○ drawIndexed
Command Buffer 2 (recorded on thread B)● Compute pass
○ setBindGroup○ dispatch
Submission (on thread C)● Command buffer 1● Command buffer 2
![Page 30: Building WebGPU with Rust - FOSDEM · 2020. 2. 18. · Developers want to have rich content running portably on the Web and Native Each native platform has a preferred API Some of](https://reader033.vdocument.in/reader033/viewer/2022051900/5feed85dad143571c25696c8/html5/thumbnails/30.jpg)
Example: work submissionlet mut encoder = device.create_command_encoder(
&wgpu::CommandEncoderDescriptor::default()
);
// record some passes here
let command_buffer = encoder.finish();
queue.submit(&[command_buffer]);
![Page 31: Building WebGPU with Rust - FOSDEM · 2020. 2. 18. · Developers want to have rich content running portably on the Web and Native Each native platform has a preferred API Some of](https://reader033.vdocument.in/reader033/viewer/2022051900/5feed85dad143571c25696c8/html5/thumbnails/31.jpg)
Mozilla Confidential
RenderPass-A {..}
Copy()
RenderPass-B {..}
ComputePass-C {..}
Command stream:
Tracking resource usageFeat: implicit barriers
Space for optimization
Texture usage
OUTPUT_ATTACHMENT
COPY_SRC
SAMPLED
STORAGE
Buffer usage
STORAGE_READ
COPY_DST
VERTEX + UNIFORM
STORAGE
![Page 32: Building WebGPU with Rust - FOSDEM · 2020. 2. 18. · Developers want to have rich content running portably on the Web and Native Each native platform has a preferred API Some of](https://reader033.vdocument.in/reader033/viewer/2022051900/5feed85dad143571c25696c8/html5/thumbnails/32.jpg)
Is WSL the chosen shading language?
Quiz^
hint: what is WSL?
![Page 33: Building WebGPU with Rust - FOSDEM · 2020. 2. 18. · Developers want to have rich content running portably on the Web and Native Each native platform has a preferred API Some of](https://reader033.vdocument.in/reader033/viewer/2022051900/5feed85dad143571c25696c8/html5/thumbnails/33.jpg)
API: missing pieces● Shading language● Multi-queue● Better data transfers
![Page 34: Building WebGPU with Rust - FOSDEM · 2020. 2. 18. · Developers want to have rich content running portably on the Web and Native Each native platform has a preferred API Some of](https://reader033.vdocument.in/reader033/viewer/2022051900/5feed85dad143571c25696c8/html5/thumbnails/34.jpg)
Is WebGPU only for the Web?
Quiz:
hint: what is explicit?
![Page 35: Building WebGPU with Rust - FOSDEM · 2020. 2. 18. · Developers want to have rich content running portably on the Web and Native Each native platform has a preferred API Some of](https://reader033.vdocument.in/reader033/viewer/2022051900/5feed85dad143571c25696c8/html5/thumbnails/35.jpg)
Demo time!
![Page 36: Building WebGPU with Rust - FOSDEM · 2020. 2. 18. · Developers want to have rich content running portably on the Web and Native Each native platform has a preferred API Some of](https://reader033.vdocument.in/reader033/viewer/2022051900/5feed85dad143571c25696c8/html5/thumbnails/36.jpg)
Graphics Abstraction
![Page 37: Building WebGPU with Rust - FOSDEM · 2020. 2. 18. · Developers want to have rich content running portably on the Web and Native Each native platform has a preferred API Some of](https://reader033.vdocument.in/reader033/viewer/2022051900/5feed85dad143571c25696c8/html5/thumbnails/37.jpg)
Problem: contagious genericsstruct Game<B: hal::Backend> {
sound: Sound,
physics: Physics,
renderer: Renderer<B>,
}
![Page 38: Building WebGPU with Rust - FOSDEM · 2020. 2. 18. · Developers want to have rich content running portably on the Web and Native Each native platform has a preferred API Some of](https://reader033.vdocument.in/reader033/viewer/2022051900/5feed85dad143571c25696c8/html5/thumbnails/38.jpg)
Solution: backend polymorphismImpl Context {
pub fn device_create_buffer<B: GfxBackend>(&self, ...) { … }
}
#[no_mangle]
pub extern "C" fn wgpu_server_device_create_buffer(
global: &Global, self_id: id::DeviceId, desc: &core::resource::BufferDescriptor, new_id: id::BufferId
) {
gfx_select!(self_id => global.device_create_buffer(self_id, desc, new_id));
}
![Page 39: Building WebGPU with Rust - FOSDEM · 2020. 2. 18. · Developers want to have rich content running portably on the Web and Native Each native platform has a preferred API Some of](https://reader033.vdocument.in/reader033/viewer/2022051900/5feed85dad143571c25696c8/html5/thumbnails/39.jpg)
Vulkan backend
Identifiers and object storage
Index (32 bits) Epoch (29 bits) Backend (3 bits)
buffer[0]
buffer[1]
buffer[2]
buffer[3]
buffer[4]
epoch
![Page 40: Building WebGPU with Rust - FOSDEM · 2020. 2. 18. · Developers want to have rich content running portably on the Web and Native Each native platform has a preferred API Some of](https://reader033.vdocument.in/reader033/viewer/2022051900/5feed85dad143571c25696c8/html5/thumbnails/40.jpg)
Usage trackerTracker
Index (32 bits)
Epoch
Ref Count
State
State
Subresource Usage
![Page 41: Building WebGPU with Rust - FOSDEM · 2020. 2. 18. · Developers want to have rich content running portably on the Web and Native Each native platform has a preferred API Some of](https://reader033.vdocument.in/reader033/viewer/2022051900/5feed85dad143571c25696c8/html5/thumbnails/41.jpg)
Usage tracking: sync scopes
Command Buffer Command Buffer
Render pass Compute pass
Draw 1 Draw 2 Dispatch Dispatch Copy Copy
barriers barriers barriers
Old -> Expected -> New
![Page 42: Building WebGPU with Rust - FOSDEM · 2020. 2. 18. · Developers want to have rich content running portably on the Web and Native Each native platform has a preferred API Some of](https://reader033.vdocument.in/reader033/viewer/2022051900/5feed85dad143571c25696c8/html5/thumbnails/42.jpg)
Usage tracking: merging
Bind Group
Render Pass
Command Buffer
Device
Union
Replace Compute
![Page 43: Building WebGPU with Rust - FOSDEM · 2020. 2. 18. · Developers want to have rich content running portably on the Web and Native Each native platform has a preferred API Some of](https://reader033.vdocument.in/reader033/viewer/2022051900/5feed85dad143571c25696c8/html5/thumbnails/43.jpg)
Usage tracking: sub-resources
mip0
mip1
mip2mip3
SAMPLED OUTPUT_ATTACHMENT COPY_SRC
0 2 3 51 4Array layers
![Page 44: Building WebGPU with Rust - FOSDEM · 2020. 2. 18. · Developers want to have rich content running portably on the Web and Native Each native platform has a preferred API Some of](https://reader033.vdocument.in/reader033/viewer/2022051900/5feed85dad143571c25696c8/html5/thumbnails/44.jpg)
Usage tracking: simple solution
pub struct Unit<U> {
first: Option<U>,
last: U,
}
![Page 45: Building WebGPU with Rust - FOSDEM · 2020. 2. 18. · Developers want to have rich content running portably on the Web and Native Each native platform has a preferred API Some of](https://reader033.vdocument.in/reader033/viewer/2022051900/5feed85dad143571c25696c8/html5/thumbnails/45.jpg)
Lifetime tracking
Resource
Command buffer tracker
Bind group
UserDevice
Submission 1
Submission 2
Submission 3
GPU in flight
Lastused
![Page 46: Building WebGPU with Rust - FOSDEM · 2020. 2. 18. · Developers want to have rich content running portably on the Web and Native Each native platform has a preferred API Some of](https://reader033.vdocument.in/reader033/viewer/2022051900/5feed85dad143571c25696c8/html5/thumbnails/46.jpg)
Wgpu-rs: project structure
wgpu-rs wgpu-native
wgpu-core
web-sys Emscripten
Dawn
![Page 47: Building WebGPU with Rust - FOSDEM · 2020. 2. 18. · Developers want to have rich content running portably on the Web and Native Each native platform has a preferred API Some of](https://reader033.vdocument.in/reader033/viewer/2022051900/5feed85dad143571c25696c8/html5/thumbnails/47.jpg)
Wgpu-rs: enumspub enum BindingType { UniformBuffer { dynamic: bool }, StorageBuffer { dynamic: bool, readonly: bool }, Sampler, SampledTexture {
multisampled: bool,dimension: TextureViewDimension,
}, StorageTexture { dimension: TextureViewDimension },}
![Page 48: Building WebGPU with Rust - FOSDEM · 2020. 2. 18. · Developers want to have rich content running portably on the Web and Native Each native platform has a preferred API Some of](https://reader033.vdocument.in/reader033/viewer/2022051900/5feed85dad143571c25696c8/html5/thumbnails/48.jpg)
Wgpu-rs: Pass Resources
impl<'a> RenderPass<'a> { pub fn set_index_buffer(
&mut self,buffer: &'a Buffer,offset: BufferAddress
) {...}}
![Page 49: Building WebGPU with Rust - FOSDEM · 2020. 2. 18. · Developers want to have rich content running portably on the Web and Native Each native platform has a preferred API Some of](https://reader033.vdocument.in/reader033/viewer/2022051900/5feed85dad143571c25696c8/html5/thumbnails/49.jpg)
Wgpu-rs: Exlusive Encodingpub struct CommandEncoder {
id: wgc::id::CommandEncoderId,
_p: std::marker::PhantomData<*const u8>,
}
pub struct ComputePass<'a> {
id: wgc::id::ComputePassId,
_parent: &'a mut CommandEncoder,
}
![Page 50: Building WebGPU with Rust - FOSDEM · 2020. 2. 18. · Developers want to have rich content running portably on the Web and Native Each native platform has a preferred API Some of](https://reader033.vdocument.in/reader033/viewer/2022051900/5feed85dad143571c25696c8/html5/thumbnails/50.jpg)
Wgpu-rs: Borrowing● Borrow all the things! (resource, swapchain, etc)
● C bindings with &borrowing
![Page 51: Building WebGPU with Rust - FOSDEM · 2020. 2. 18. · Developers want to have rich content running portably on the Web and Native Each native platform has a preferred API Some of](https://reader033.vdocument.in/reader033/viewer/2022051900/5feed85dad143571c25696c8/html5/thumbnails/51.jpg)
Wgpu: Lock Orderlet mut token = Token::root();
let (device_guard, mut token) =
hub.devices.read(&mut token);
hub.pipeline_layouts
.register_identity(id_in, layout, &mut token)
![Page 52: Building WebGPU with Rust - FOSDEM · 2020. 2. 18. · Developers want to have rich content running portably on the Web and Native Each native platform has a preferred API Some of](https://reader033.vdocument.in/reader033/viewer/2022051900/5feed85dad143571c25696c8/html5/thumbnails/52.jpg)
Wgpu: Ecosystem● Parking_lot● Gfx/Rendy● VecMap/SmallVec/ArrayVec● Cbindgen (for ffi)● Winit (for examples)● etc
![Page 53: Building WebGPU with Rust - FOSDEM · 2020. 2. 18. · Developers want to have rich content running portably on the Web and Native Each native platform has a preferred API Some of](https://reader033.vdocument.in/reader033/viewer/2022051900/5feed85dad143571c25696c8/html5/thumbnails/53.jpg)
The Bad● Passing slices in the C API● Generics aren’t always good (compile time, contagious, usability)
![Page 54: Building WebGPU with Rust - FOSDEM · 2020. 2. 18. · Developers want to have rich content running portably on the Web and Native Each native platform has a preferred API Some of](https://reader033.vdocument.in/reader033/viewer/2022051900/5feed85dad143571c25696c8/html5/thumbnails/54.jpg)
Future work
Web Target
Error handling
OpenGL backend
Optimization
![Page 55: Building WebGPU with Rust - FOSDEM · 2020. 2. 18. · Developers want to have rich content running portably on the Web and Native Each native platform has a preferred API Some of](https://reader033.vdocument.in/reader033/viewer/2022051900/5feed85dad143571c25696c8/html5/thumbnails/55.jpg)
Links● https://github.com/gpuweb/gpuweb - upstream spec
● https://github.com/gfx-rs/wgpu - our implementation in Rust
● https://github.com/gfx-rs/wgpu-rs - Rust API wrapper and examples
● https://dawn.googlesource.com/dawn - Google’s implementation
● https://github.com/webgpu-native/webgpu-headers - shared headers
● https://archive.fosdem.org/2018/schedule/event/rust_vulkan_gfx_rs/ - Fosdem talk (2018)
![Page 56: Building WebGPU with Rust - FOSDEM · 2020. 2. 18. · Developers want to have rich content running portably on the Web and Native Each native platform has a preferred API Some of](https://reader033.vdocument.in/reader033/viewer/2022051900/5feed85dad143571c25696c8/html5/thumbnails/56.jpg)
Bonus: Browser Achitecture
![Page 57: Building WebGPU with Rust - FOSDEM · 2020. 2. 18. · Developers want to have rich content running portably on the Web and Native Each native platform has a preferred API Some of](https://reader033.vdocument.in/reader033/viewer/2022051900/5feed85dad143571c25696c8/html5/thumbnails/57.jpg)
Content process
GPU process
WebGPUbindings
wgpu-core
IPDL
wgpu-remote Overview
![Page 58: Building WebGPU with Rust - FOSDEM · 2020. 2. 18. · Developers want to have rich content running portably on the Web and Native Each native platform has a preferred API Some of](https://reader033.vdocument.in/reader033/viewer/2022051900/5feed85dad143571c25696c8/html5/thumbnails/58.jpg)
As-if synchronous
javascript
Wgpu client
Wgpu server
Device Desc
DeviceID
DescBufferID
Buffer Memory
erro
r
Buffer creation
![Page 59: Building WebGPU with Rust - FOSDEM · 2020. 2. 18. · Developers want to have rich content running portably on the Web and Native Each native platform has a preferred API Some of](https://reader033.vdocument.in/reader033/viewer/2022051900/5feed85dad143571c25696c8/html5/thumbnails/59.jpg)
javascript
Content process
GPU process
Pass command list
erro
r
setBindGroup setVertexBuffers draw
Resource dependencies
Poke
vkCmdBindDescriptorSets
vkCmdBindVertexBuffers
vkCmdDraw
Peek
Pass recording
![Page 60: Building WebGPU with Rust - FOSDEM · 2020. 2. 18. · Developers want to have rich content running portably on the Web and Native Each native platform has a preferred API Some of](https://reader033.vdocument.in/reader033/viewer/2022051900/5feed85dad143571c25696c8/html5/thumbnails/60.jpg)
![Page 61: Building WebGPU with Rust - FOSDEM · 2020. 2. 18. · Developers want to have rich content running portably on the Web and Native Each native platform has a preferred API Some of](https://reader033.vdocument.in/reader033/viewer/2022051900/5feed85dad143571c25696c8/html5/thumbnails/61.jpg)
● (contributions)
● (reviews)
●
● (feedback)
Thank You!