From c7dc1f61407bfa054f38eb23b3f7d6e8ebd15801 Mon Sep 17 00:00:00 2001 From: Joshua Groves Date: Sun, 5 Apr 2020 23:20:49 -0230 Subject: [PATCH] [rs] Get skybox working --- wgpu/Cargo.toml | 2 + wgpu/examples/skybox/main.rs | 22 +++---- .../skybox/{skybox_frag.glsl => shader.frag} | 0 wgpu/examples/skybox/shader.frag.spv | Bin 0 -> 684 bytes .../skybox/{skybox_vert.glsl => shader.vert} | 0 wgpu/examples/skybox/shader.vert.spv | Bin 0 -> 2076 bytes wgpu/src/backend/native.rs | 9 ++- wgpu/src/backend/web.rs | 58 ++++++++++++++---- wgpu/src/lib.rs | 16 +++-- 9 files changed, 69 insertions(+), 38 deletions(-) rename wgpu/examples/skybox/{skybox_frag.glsl => shader.frag} (100%) create mode 100644 wgpu/examples/skybox/shader.frag.spv rename wgpu/examples/skybox/{skybox_vert.glsl => shader.vert} (100%) create mode 100644 wgpu/examples/skybox/shader.vert.spv diff --git a/wgpu/Cargo.toml b/wgpu/Cargo.toml index 13ff8118bb..5ae3444b50 100644 --- a/wgpu/Cargo.toml +++ b/wgpu/Cargo.toml @@ -151,10 +151,12 @@ web-sys = { version = "0.3.36", features = [ "GpuSwapChain", "GpuSwapChainDescriptor", "GpuTexture", + "GpuTextureAspect", "GpuTextureCopyView", "GpuTextureDescriptor", "GpuTextureDimension", "GpuTextureFormat", + "GpuTextureViewDescriptor", "GpuTextureViewDimension", "GpuTextureView", "GpuVertexAttributeDescriptor", diff --git a/wgpu/examples/skybox/main.rs b/wgpu/examples/skybox/main.rs index aeb010029b..4359b20969 100644 --- a/wgpu/examples/skybox/main.rs +++ b/wgpu/examples/skybox/main.rs @@ -32,7 +32,7 @@ fn buffer_from_uniforms( uniforms: &Uniforms, usage: wgpu::BufferUsage, ) -> wgpu::Buffer { - let uniform_buf = device.create_buffer_mapped(&wgpu::BufferDescriptor { + let mut uniform_buf = device.create_buffer_mapped(&wgpu::BufferDescriptor { size: std::mem::size_of::() as u64, usage, label: None, @@ -40,7 +40,7 @@ fn buffer_from_uniforms( // FIXME: Align and use `LayoutVerified` for (u, slot) in uniforms.iter().zip( uniform_buf - .data + .data() .chunks_exact_mut(std::mem::size_of::()), ) { slot.copy_from_slice(bytemuck::cast_slice(AsRef::<[[f32; 4]; 4]>::as_ref(u))); @@ -82,16 +82,12 @@ impl framework::Example for Skybox { }); // Create the render pipeline - let vs_bytes = framework::load_glsl( - include_str!("skybox_vert.glsl"), - framework::ShaderStage::Vertex, - ); - let fs_bytes = framework::load_glsl( - include_str!("skybox_frag.glsl"), - framework::ShaderStage::Fragment, - ); - let vs_module = device.create_shader_module(&vs_bytes); - let fs_module = device.create_shader_module(&fs_bytes); + let vs_bytes = include_bytes!("shader.vert.spv"); + let fs_bytes = include_bytes!("shader.frag.spv"); + let vs_module = device + .create_shader_module(&wgpu::read_spirv(std::io::Cursor::new(&vs_bytes[..])).unwrap()); + let fs_module = device + .create_shader_module(&wgpu::read_spirv(std::io::Cursor::new(&fs_bytes[..])).unwrap()); let aspect = sc_desc.width as f32 / sc_desc.height as f32; let uniforms = Self::generate_uniforms(aspect); @@ -148,7 +144,7 @@ impl framework::Example for Skybox { mag_filter: wgpu::FilterMode::Nearest, min_filter: wgpu::FilterMode::Linear, mipmap_filter: wgpu::FilterMode::Nearest, - lod_min_clamp: -100.0, + lod_min_clamp: 0.0, lod_max_clamp: 100.0, compare: wgpu::CompareFunction::Undefined, }); diff --git a/wgpu/examples/skybox/skybox_frag.glsl b/wgpu/examples/skybox/shader.frag similarity index 100% rename from wgpu/examples/skybox/skybox_frag.glsl rename to wgpu/examples/skybox/shader.frag diff --git a/wgpu/examples/skybox/shader.frag.spv b/wgpu/examples/skybox/shader.frag.spv new file mode 100644 index 0000000000000000000000000000000000000000..65ab23b9adf8b6282447b16eb5467515562ce877 GIT binary patch literal 684 zcmY+BO-q7N5QQhd%hJr!EC{W=w5SN8HZI(>i)txG1wm${`2+h^ZGxWXeUMFu9K9EBwJuWzoqlj&pkA=f@)&T-(lz3XkMgj~da>U;4|?O*@dx#Mtb?b6-si*9X!y=uZj(Iu$K?{A+2D3Y zDf;t12Lg`RK8FeV!yT}*Tes(OU2NT1t-HsfUmaGylWdb}8r%zTZK8?ZUB&L#=C?%l zwd616*j?pXY`sQSpS~!U`EfpvJ<91d(b_}oUY}XCH?xvVP9F zO5QYyeT~rW61Th+HK|}%ZgAY*z3N02Aj2M)^q@f$LrfvycD)E=M;1!v8 zQ)-Nf@3Xsu8&C6gX5N`OXJ*bRNqN29(F@7CzR45WQb`A#4eGeR7iD6*sSA|)(50<)Y&=D%ezUOS_OUP zB~QaWW%x&t--!36_RitEP7>p}iWJqg=bt2{!F&3^v+%XrK@_w?u{|-*nK2)P(SGpR zC(eA#L%vEgIIafms2(2q=e~UEJ8d@4eawkjvTB+j^X(O;g>Bi^cOka_&B6F>b!ECP z+g-`zQD-&}o7l2od2p6jQ!V)Efm$Xd#|4(zrNoSFW;vGH>{m&3>Sr0p8E{DBI0G)9 z;n3lDN7TZ8#0}{iSrSJK`iL}7vM5|v20dVtThuo%7Y@wG#&=0z&5DKREVwL&727AS zC{QnZT~2lQmDJ{*@Y~+kq&xTJo7uyOy>4fX$R-AG9)61*mF`@*Y_T_F!DVC3cQfVj z+dlNqJ TextureViewId { - wgn::wgpu_texture_create_view(*texture, None) +pub(crate) fn texture_create_view( + texture: &TextureId, + desc: Option<&TextureViewDescriptor>, +) -> TextureViewId { + wgn::wgpu_texture_create_view(*texture, desc) } pub(crate) fn swap_chain_present(swap_chain: &SwapChainId) { diff --git a/wgpu/src/backend/web.rs b/wgpu/src/backend/web.rs index 2e03329694..290463e2f0 100644 --- a/wgpu/src/backend/web.rs +++ b/wgpu/src/backend/web.rs @@ -2,7 +2,7 @@ use crate::{ BindGroupDescriptor, BindGroupLayoutDescriptor, BindingResource, BindingType, BufferDescriptor, CommandEncoderDescriptor, ComputePipelineDescriptor, PipelineLayoutDescriptor, ProgrammableStageDescriptor, RenderPipelineDescriptor, SamplerDescriptor, TextureDescriptor, - TextureViewDimension, + TextureViewDescriptor, TextureViewDimension, }; use std::ops::Range; @@ -91,7 +91,6 @@ pub(crate) fn create_bind_group_layout( desc: &BindGroupLayoutDescriptor, ) -> BindGroupLayoutId { use web_sys::GpuBindingType as bt; - use web_sys::GpuTextureViewDimension as tvd; let mapped_bindings = desc .bindings @@ -127,15 +126,10 @@ pub(crate) fn create_bind_group_layout( let mapped_view_dimension = match bind.ty { BindingType::SampledTexture { dimension, .. } - | BindingType::StorageTexture { dimension, .. } => match dimension { - TextureViewDimension::D1 => tvd::N1d, - TextureViewDimension::D2 => tvd::N2d, - TextureViewDimension::D2Array => tvd::N2dArray, - TextureViewDimension::Cube => tvd::Cube, - TextureViewDimension::CubeArray => tvd::CubeArray, - TextureViewDimension::D3 => tvd::N3d, - }, - _ => tvd::N2d, + | BindingType::StorageTexture { dimension, .. } => { + map_texture_view_dimension(dimension) + } + _ => web_sys::GpuTextureViewDimension::N2d, }; let mut mapped_binding = web_sys::GpuBindGroupLayoutBinding::new( @@ -491,6 +485,20 @@ fn map_texture_dimension(texture_dimension: wgt::TextureDimension) -> web_sys::G } } +fn map_texture_view_dimension( + texture_view_dimension: wgt::TextureViewDimension, +) -> web_sys::GpuTextureViewDimension { + use web_sys::GpuTextureViewDimension as tvd; + match texture_view_dimension { + TextureViewDimension::D1 => tvd::N1d, + TextureViewDimension::D2 => tvd::N2d, + TextureViewDimension::D2Array => tvd::N2dArray, + TextureViewDimension::Cube => tvd::Cube, + TextureViewDimension::CubeArray => tvd::CubeArray, + TextureViewDimension::D3 => tvd::N3d, + } +} + fn map_buffer_copy_view(view: crate::BufferCopyView<'_>) -> web_sys::GpuBufferCopyView { let mut mapped = web_sys::GpuBufferCopyView::new(&view.buffer.id, view.rows_per_image, view.bytes_per_row); @@ -506,6 +514,14 @@ fn map_texture_copy_view<'a>(view: crate::TextureCopyView<'a>) -> web_sys::GpuTe mapped } +fn map_texture_aspect(aspect: wgt::TextureAspect) -> web_sys::GpuTextureAspect { + match aspect { + wgt::TextureAspect::All => web_sys::GpuTextureAspect::All, + wgt::TextureAspect::StencilOnly => web_sys::GpuTextureAspect::StencilOnly, + wgt::TextureAspect::DepthOnly => web_sys::GpuTextureAspect::DepthOnly, + } +} + fn map_filter_mode(mode: wgt::FilterMode) -> web_sys::GpuFilterMode { match mode { wgt::FilterMode::Nearest => web_sys::GpuFilterMode::Nearest, @@ -1007,8 +1023,24 @@ pub(crate) fn render_pass_end_pass(render_pass: &RenderPassEncoderId) { render_pass.end_pass(); } -pub(crate) fn texture_create_default_view(texture: &TextureId) -> TextureViewId { - texture.create_view() +pub(crate) fn texture_create_view( + texture: &TextureId, + desc: Option<&TextureViewDescriptor>, +) -> TextureViewId { + match desc { + Some(d) => { + let mut mapped_desc = web_sys::GpuTextureViewDescriptor::new(); + mapped_desc.array_layer_count(d.array_layer_count); + mapped_desc.aspect(map_texture_aspect(d.aspect)); + mapped_desc.base_array_layer(d.base_array_layer); + mapped_desc.base_mip_level(d.base_mip_level); + mapped_desc.dimension(map_texture_view_dimension(d.dimension)); + mapped_desc.format(map_texture_format(d.format)); + mapped_desc.mip_level_count(d.level_count); + texture.create_view_with_descriptor(&mapped_desc) + } + None => texture.create_view(), + } } pub(crate) fn swap_chain_present(_swap_chain: &SwapChainId) { diff --git a/wgpu/src/lib.rs b/wgpu/src/lib.rs index ed0cdbe571..00c89dcbb3 100644 --- a/wgpu/src/lib.rs +++ b/wgpu/src/lib.rs @@ -828,20 +828,18 @@ impl Drop for Buffer { */ impl Texture { - /* - /// Creates a view of this texture. - pub fn create_view(&self, desc: &TextureViewDescriptor) -> TextureView { - TextureView { - id: wgn::wgpu_texture_create_view(self.id, Some(desc)), - owned: true, - } + /// Creates a view of this texture. + pub fn create_view(&self, desc: &TextureViewDescriptor) -> TextureView { + TextureView { + id: backend::texture_create_view(&self.id, Some(desc)), + owned: true, } - */ + } /// Creates a default view of this whole texture. pub fn create_default_view(&self) -> TextureView { TextureView { - id: backend::texture_create_default_view(&self.id), + id: backend::texture_create_view(&self.id, None), owned: true, } }