diff --git a/Cargo.toml b/Cargo.toml index 13ff8118bb..5ae3444b50 100644 --- a/Cargo.toml +++ b/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/examples/skybox/main.rs b/examples/skybox/main.rs index aeb010029b..4359b20969 100644 --- a/examples/skybox/main.rs +++ b/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/examples/skybox/skybox_frag.glsl b/examples/skybox/shader.frag similarity index 100% rename from examples/skybox/skybox_frag.glsl rename to examples/skybox/shader.frag diff --git a/examples/skybox/shader.frag.spv b/examples/skybox/shader.frag.spv new file mode 100644 index 0000000000..65ab23b9ad Binary files /dev/null and b/examples/skybox/shader.frag.spv differ diff --git a/examples/skybox/skybox_vert.glsl b/examples/skybox/shader.vert similarity index 100% rename from examples/skybox/skybox_vert.glsl rename to examples/skybox/shader.vert diff --git a/examples/skybox/shader.vert.spv b/examples/skybox/shader.vert.spv new file mode 100644 index 0000000000..5b10601f1f Binary files /dev/null and b/examples/skybox/shader.vert.spv differ diff --git a/src/backend/native.rs b/src/backend/native.rs index 775c14df2d..7c64ff738d 100644 --- a/src/backend/native.rs +++ b/src/backend/native.rs @@ -4,7 +4,7 @@ use crate::{ backend::native_gpu_future, BindGroupDescriptor, BindGroupLayoutDescriptor, BindingResource, BindingType, BufferDescriptor, CommandEncoderDescriptor, ComputePipelineDescriptor, PipelineLayoutDescriptor, RenderPipelineDescriptor, SamplerDescriptor, TextureDescriptor, - TextureViewDimension, + TextureViewDescriptor, TextureViewDimension, }; use arrayvec::ArrayVec; @@ -710,8 +710,11 @@ pub(crate) fn render_pass_end_pass(render_pass: &RenderPassEncoderId) { } } -pub(crate) fn texture_create_default_view(texture: &TextureId) -> 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/src/backend/web.rs b/src/backend/web.rs index 2e03329694..290463e2f0 100644 --- a/src/backend/web.rs +++ b/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/src/lib.rs b/src/lib.rs index ed0cdbe571..00c89dcbb3 100644 --- a/src/lib.rs +++ b/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, } }