From 5575e4f49f2cc406d63b992cb440f83709b7382b Mon Sep 17 00:00:00 2001 From: galister <22305755+galister@users.noreply.github.com> Date: Thu, 11 Jul 2024 19:17:41 +0900 Subject: [PATCH] fix: openxr swapchain banding --- src/backend/openxr/swapchain.rs | 9 +++++---- src/shaders/mod.rs | 25 ++++++++++++++++++++++++- src/state.rs | 6 +++--- 3 files changed, 32 insertions(+), 8 deletions(-) diff --git a/src/backend/openxr/swapchain.rs b/src/backend/openxr/swapchain.rs index 052b6d9..b73abfa 100644 --- a/src/backend/openxr/swapchain.rs +++ b/src/backend/openxr/swapchain.rs @@ -6,6 +6,7 @@ use openxr as xr; use smallvec::SmallVec; use vulkano::{ + format::Format, image::{sys::RawImage, view::ImageView, ImageCreateInfo, ImageUsage}, pipeline::graphics::color_blend::AttachmentBlend, Handle, @@ -23,7 +24,7 @@ pub(super) fn create_swapchain_render_data( let swapchain = xr.session.create_swapchain(&xr::SwapchainCreateInfo { create_flags: xr::SwapchainCreateFlags::EMPTY, usage_flags: xr::SwapchainUsageFlags::COLOR_ATTACHMENT | xr::SwapchainUsageFlags::SAMPLED, - format: graphics.native_format as _, + format: Format::R8G8B8A8_SRGB as _, sample_count: 1, width: extent[0], height: extent[1], @@ -37,8 +38,8 @@ pub(super) fn create_swapchain_render_data( }; let pipeline = graphics.create_pipeline_dynamic( shaders.get("vert_common").unwrap().clone(), // want panic - shaders.get("frag_srgb").unwrap().clone(), // want panic - graphics.native_format, + shaders.get("frag_swapchain").unwrap().clone(), // want panic + Format::R8G8B8A8_UNORM, Some(AttachmentBlend::alpha()), )?; @@ -53,7 +54,7 @@ pub(super) fn create_swapchain_render_data( graphics.device.clone(), vk_image, ImageCreateInfo { - format: graphics.native_format, + format: Format::R8G8B8A8_UNORM, // actually SRGB but we lie extent, usage: ImageUsage::COLOR_ATTACHMENT, ..Default::default() diff --git a/src/shaders/mod.rs b/src/shaders/mod.rs index 6e41acc..2d36739 100644 --- a/src/shaders/mod.rs +++ b/src/shaders/mod.rs @@ -97,7 +97,7 @@ pub mod frag_screen { // linear to srgb bvec4 cutoff = lessThan(out_color, vec4(0.0031308)); - vec4 higher = (pow(out_color, vec4(0.41666)) * vec4(1.055)) - vec4(0.055); + vec4 higher = (pow(out_color, vec4(0.4166667)) * vec4(1.055)) - vec4(0.055); vec4 lower = out_color*vec4(12.92); out_color = mix(higher, lower, cutoff); out_color.a = 1.0; @@ -135,3 +135,26 @@ pub mod frag_srgb { ", } } + +pub mod frag_swapchain { + vulkano_shaders::shader! { + ty: "fragment", + src: r"#version 310 es + precision highp float; + + layout (location = 0) in vec2 in_uv; + layout (location = 0) out vec4 out_color; + + layout (set = 0, binding = 0) uniform sampler2D in_texture; + layout (set = 1, binding = 0) uniform AlphaBlock { + uniform float alpha; + }; + + void main() + { + out_color = texture(in_texture, in_uv); + out_color.a = alpha; + } + ", + } +} diff --git a/src/state.rs b/src/state.rs index 2c3159e..2192d14 100644 --- a/src/state.rs +++ b/src/state.rs @@ -15,7 +15,7 @@ use crate::{ gui::font::FontCache, hid::HidProvider, overlays::toast::{DisplayMethod, ToastTopic}, - shaders::{frag_color, frag_glyph, frag_screen, frag_sprite, frag_srgb, vert_common}, + shaders::{frag_color, frag_glyph, frag_screen, frag_sprite, frag_swapchain, vert_common}, }; pub struct AppState { @@ -53,8 +53,8 @@ impl AppState { let shader = frag_screen::load(graphics.device.clone())?; shaders.insert("frag_screen", shader); - let shader = frag_srgb::load(graphics.device.clone())?; - shaders.insert("frag_srgb", shader); + let shader = frag_swapchain::load(graphics.device.clone())?; + shaders.insert("frag_swapchain", shader); } let session = AppSession::load();