uidev: query surface format + color space from gpu

This commit is contained in:
galister
2026-01-28 11:25:06 +09:00
parent 2c60196ead
commit 32c8b7ae62
2 changed files with 31 additions and 21 deletions

View File

@@ -1,25 +1,25 @@
use glam::{Vec2, vec2}; use glam::{vec2, Vec2};
use std::sync::Arc; use std::sync::Arc;
use testbed::{Testbed, testbed_any::TestbedAny}; use testbed::{testbed_any::TestbedAny, Testbed};
use tracing_subscriber::EnvFilter;
use tracing_subscriber::filter::LevelFilter; use tracing_subscriber::filter::LevelFilter;
use tracing_subscriber::layer::SubscriberExt; use tracing_subscriber::layer::SubscriberExt;
use tracing_subscriber::util::SubscriberInitExt; use tracing_subscriber::util::SubscriberInitExt;
use tracing_subscriber::EnvFilter;
use vulkan::init_window; use vulkan::init_window;
use vulkano::{ use vulkano::{
Validated, VulkanError,
command_buffer::CommandBufferUsage, command_buffer::CommandBufferUsage,
format::Format, format::Format,
image::{ImageUsage, view::ImageView}, image::{view::ImageView, ImageUsage},
swapchain::{ swapchain::{
CompositeAlpha, PresentMode, Surface, SurfaceInfo, Swapchain, SwapchainCreateInfo, acquire_next_image, ColorSpace, CompositeAlpha, PresentMode, Surface, SurfaceInfo, Swapchain,
SwapchainPresentInfo, acquire_next_image, SwapchainCreateInfo, SwapchainPresentInfo,
}, },
sync::GpuFuture, sync::GpuFuture,
Validated, VulkanError,
}; };
use wgui::{ use wgui::{
event::{MouseButtonIndex, MouseDownEvent, MouseMotionEvent, MouseUpEvent, MouseWheelEvent}, event::{MouseButtonIndex, MouseDownEvent, MouseMotionEvent, MouseUpEvent, MouseWheelEvent},
gfx::{WGfx, cmd::WGfxClearMode}, gfx::{cmd::WGfxClearMode, WGfx},
renderer_vk::{self}, renderer_vk::{self},
}; };
use winit::{ use winit::{
@@ -32,7 +32,7 @@ use wlx_common::{audio, timestep::Timestep};
use crate::{ use crate::{
rate_limiter::RateLimiter, rate_limiter::RateLimiter,
testbed::{ testbed::{
TestbedUpdateParams, testbed_dashboard::TestbedDashboard, testbed_generic::TestbedGeneric, testbed_dashboard::TestbedDashboard, testbed_generic::TestbedGeneric, TestbedUpdateParams,
}, },
}; };
@@ -74,13 +74,18 @@ fn load_testbed(audio_sample_player: &mut audio::SamplePlayer) -> anyhow::Result
fn main() -> Result<(), Box<dyn std::error::Error>> { fn main() -> Result<(), Box<dyn std::error::Error>> {
init_logging(); init_logging();
let (gfx, event_loop, window, surface) = let (gfx, event_loop, window, surface, color_space) =
init_window("[-/=]: gui scale, F10: debug draw, F11: print tree")?; init_window("[-/=]: gui scale, F10: debug draw, F11: print tree")?;
let inner_size = window.inner_size(); let inner_size = window.inner_size();
let mut swapchain_size = [inner_size.width, inner_size.height]; let mut swapchain_size = [inner_size.width, inner_size.height];
let mut swapchain_create_info = let mut swapchain_create_info = swapchain_create_info(
swapchain_create_info(&gfx, gfx.surface_format, surface.clone(), swapchain_size); &gfx,
gfx.surface_format,
color_space,
surface.clone(),
swapchain_size,
);
let (mut swapchain, mut images) = { let (mut swapchain, mut images) = {
let (swapchain, images) = Swapchain::new( let (swapchain, images) = Swapchain::new(
@@ -400,6 +405,7 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
fn swapchain_create_info( fn swapchain_create_info(
graphics: &WGfx, graphics: &WGfx,
format: Format, format: Format,
color_space: ColorSpace,
surface: Arc<Surface>, surface: Arc<Surface>,
extent: [u32; 2], extent: [u32; 2],
) -> SwapchainCreateInfo { ) -> SwapchainCreateInfo {
@@ -453,6 +459,7 @@ fn swapchain_create_info(
image_format: format, image_format: format,
image_extent: extent, image_extent: extent,
image_usage: ImageUsage::COLOR_ATTACHMENT, image_usage: ImageUsage::COLOR_ATTACHMENT,
image_color_space: color_space,
composite_alpha, composite_alpha,
..Default::default() ..Default::default()
} }

View File

@@ -1,10 +1,12 @@
use anyhow::Context;
use std::sync::{Arc, OnceLock}; use std::sync::{Arc, OnceLock};
use vulkano::{ use vulkano::{
device::{ device::{
Device, DeviceCreateInfo, DeviceExtensions, DeviceFeatures, Queue, QueueCreateInfo, QueueFlags,
physical::{PhysicalDevice, PhysicalDeviceType}, physical::{PhysicalDevice, PhysicalDeviceType},
Device, DeviceCreateInfo, DeviceExtensions, DeviceFeatures, Queue, QueueCreateInfo, QueueFlags,
}, },
instance::{Instance, InstanceCreateInfo}, instance::{Instance, InstanceCreateInfo},
swapchain::ColorSpace,
}; };
use wgui::gfx::WGfx; use wgui::gfx::WGfx;
@@ -21,6 +23,7 @@ pub fn init_window(
winit::event_loop::EventLoop<()>, winit::event_loop::EventLoop<()>,
Arc<winit::window::Window>, Arc<winit::window::Window>,
Arc<vulkano::swapchain::Surface>, Arc<vulkano::swapchain::Surface>,
ColorSpace,
)> { )> {
use vulkano::{instance::InstanceCreateFlags, swapchain::Surface}; use vulkano::{instance::InstanceCreateFlags, swapchain::Surface};
use winit::{event_loop::EventLoop, window::Window}; use winit::{event_loop::EventLoop, window::Window};
@@ -90,6 +93,12 @@ pub fn init_window(
log::info!("img_filter_cubic!"); log::info!("img_filter_cubic!");
} }
let (format, color_space) = physical_device
.surface_formats(&surface, vulkano::swapchain::SurfaceInfo::default())?
.into_iter()
.next()
.context("Could not read surface formats for PhysicalDevice")?;
let (device, queues) = Device::new( let (device, queues) = Device::new(
physical_device, physical_device,
DeviceCreateInfo { DeviceCreateInfo {
@@ -113,14 +122,8 @@ pub fn init_window(
let (queue_gfx, queue_xfer, _) = unwrap_queues(queues.collect()); let (queue_gfx, queue_xfer, _) = unwrap_queues(queues.collect());
let me = WGfx::new_from_raw( let me = WGfx::new_from_raw(instance, device, queue_gfx, queue_xfer, format);
instance, Ok((me, event_loop, window, surface, color_space))
device,
queue_gfx,
queue_xfer,
vulkano::format::Format::R8G8B8A8_SRGB,
);
Ok((me, event_loop, window, surface))
} }
#[derive(Debug)] #[derive(Debug)]