diff --git a/wayvr/src/backend/openxr/skybox.rs b/wayvr/src/backend/openxr/skybox.rs index 1ca0c072..2d0215e2 100644 --- a/wayvr/src/backend/openxr/skybox.rs +++ b/wayvr/src/backend/openxr/skybox.rs @@ -24,7 +24,7 @@ use super::{ }; pub(super) struct Skybox { - view: Arc, + view: Option>, sky: Option, grid: Option, grid_pose: xr::Posef, @@ -73,14 +73,12 @@ impl Skybox { "".into() }; - if maybe_image.is_none() { - let p = include_bytes!("../../res/table_mountain_2.dds"); - maybe_image = Some(command_buffer.upload_image_dds(p.as_slice())?); - } - - command_buffer.build_and_execute_now()?; - - let view = ImageView::new_default(maybe_image.unwrap())?; // safe unwrap + let view = if let Some(image) = maybe_image { + command_buffer.build_and_execute_now()?; + Some(ImageView::new_default(image)?) + } else { + None + }; let grid_color_scale_bias_khr = xr .instance @@ -125,7 +123,12 @@ impl Skybox { } let opts = SwapchainOpts::new().immutable(); - let extent = self.view.extent_u32arr(); + let extent = self + .view + .as_ref() + .map(|v| v.extent_u32arr()) + .unwrap_or([4096, 4096]); + let mut swapchain = create_swapchain(xr, app.gfx.clone(), extent, 1, opts)?; let tgt = swapchain .acquire_wait_image()? @@ -133,23 +136,42 @@ impl Skybox { .into_iter() .next() .unwrap(); - let pipeline = app.gfx.create_pipeline( - app.gfx_extras.shaders.get("vert_quad").unwrap(), // want panic - app.gfx_extras.shaders.get("frag_srgb").unwrap(), // want panic - WPipelineCreateInfo::new(app.gfx.surface_format), - )?; - let set0 = pipeline.uniform_sampler(0, self.view.clone(), app.gfx.texture_filter)?; - let set1 = pipeline.uniform_buffer_upload(1, vec![1f32])?; - let pass = pipeline.create_pass( - tgt.extent_f32(), - [0.0, 0.0], - app.gfx_extras.quad_verts.clone(), - 0..4, - 0..1, - vec![set0, set1], - &Default::default(), - )?; + let pass = if let Some(view) = self.view.as_ref() { + let pipeline = app.gfx.create_pipeline( + app.gfx_extras.shaders.get("vert_quad").unwrap(), // want panic + app.gfx_extras.shaders.get("frag_srgb").unwrap(), // want panic + WPipelineCreateInfo::new(app.gfx.surface_format), + )?; + + let set0 = pipeline.uniform_sampler(0, view.clone(), app.gfx.texture_filter)?; + let set1 = pipeline.uniform_buffer_upload(1, vec![1f32])?; + pipeline.create_pass( + tgt.extent_f32(), + [0.0, 0.0], + app.gfx_extras.quad_verts.clone(), + 0..4, + 0..1, + vec![set0, set1], + &Default::default(), + )? + } else { + let pipeline = app.gfx.create_pipeline( + app.gfx_extras.shaders.get("vert_quad").unwrap(), // want panic + app.gfx_extras.shaders.get("frag_sky").unwrap(), // want panic + WPipelineCreateInfo::new(app.gfx.surface_format), + )?; + + pipeline.create_pass( + tgt.extent_f32(), + [0.0, 0.0], + app.gfx_extras.quad_verts.clone(), + 0..4, + 0..1, + vec![], + &Default::default(), + )? + }; let mut cmd_buffer = app .gfx diff --git a/wayvr/src/graphics/mod.rs b/wayvr/src/graphics/mod.rs index 52ffa913..5c1573ba 100644 --- a/wayvr/src/graphics/mod.rs +++ b/wayvr/src/graphics/mod.rs @@ -21,7 +21,7 @@ use wgui::gfx::WGfx; use vulkano::instance::InstanceCreateFlags; use wlx_capture::DrmFormat; -use crate::shaders::{frag_color, frag_grid, frag_screen, frag_srgb, vert_quad}; +use crate::shaders::{frag_color, frag_grid, frag_screen, frag_sky, frag_srgb, vert_quad}; #[cfg(feature = "openxr")] use {ash::vk, std::os::raw::c_void}; @@ -74,6 +74,9 @@ impl WGfxExtras { let shader = frag_srgb::load(gfx.device.clone())?; shaders.insert("frag_srgb", shader); + let shader = frag_sky::load(gfx.device.clone())?; + shaders.insert("frag_sky", shader); + let shader = frag_grid::load(gfx.device.clone())?; shaders.insert("frag_grid", shader); diff --git a/wayvr/src/shaders/mod.rs b/wayvr/src/shaders/mod.rs index 86e9f5c4..d7c986a3 100644 --- a/wayvr/src/shaders/mod.rs +++ b/wayvr/src/shaders/mod.rs @@ -32,3 +32,10 @@ pub mod frag_srgb { path: "src/shaders/srgb.frag", } } + +pub mod frag_sky { + vulkano_shaders::shader! { + ty: "fragment", + path: "src/shaders/sky.frag", + } +}