[rs] Get skybox working

This commit is contained in:
Joshua Groves
2020-04-05 23:20:49 -02:30
committed by Josh Groves
parent 49ef627bb0
commit c7dc1f6140
9 changed files with 69 additions and 38 deletions

View File

@@ -151,10 +151,12 @@ web-sys = { version = "0.3.36", features = [
"GpuSwapChain",
"GpuSwapChainDescriptor",
"GpuTexture",
"GpuTextureAspect",
"GpuTextureCopyView",
"GpuTextureDescriptor",
"GpuTextureDimension",
"GpuTextureFormat",
"GpuTextureViewDescriptor",
"GpuTextureViewDimension",
"GpuTextureView",
"GpuVertexAttributeDescriptor",

View File

@@ -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::<Uniforms>() 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::<Uniform>()),
) {
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,
});

Binary file not shown.

Binary file not shown.

View File

@@ -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) {

View File

@@ -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) {

View File

@@ -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,
}
}