From 8e0837b8ca16b003b67f7955c8a267f048aaa992 Mon Sep 17 00:00:00 2001 From: Charlton Rodda Date: Fri, 1 Dec 2023 12:10:00 +0000 Subject: [PATCH] Make d3d12 build by default if possible --- Cargo.toml | 7 ++++--- src/graphics/d3d12.rs | 2 +- src/graphics/mod.rs | 20 +++++++++----------- src/lib.rs | 39 ++++++++++++++++++++++++--------------- src/passthrough.rs | 4 ++-- src/resources.rs | 24 ++++++++++++------------ 6 files changed, 52 insertions(+), 44 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 6051a60..1eacc55 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -8,7 +8,7 @@ license = "MIT/Apache-2.0" [features] -default = ["vulkan"] +default = ["vulkan", "d3d12"] force-link = ["openxr/linked"] vulkan = ["wgpu-core/vulkan"] d3d12 = ["wgpu-core/dx12", "dep:winapi", "dep:d3d12"] @@ -22,11 +22,9 @@ ash = "0.37.3" bevy = "0.13" futures-lite = "2.0.1" mint = "0.5.9" -winapi = { version = "0.3.9", optional = true } wgpu = "0.19" wgpu-core = { version = "0.19" } wgpu-hal = "0.19" -d3d12 = { version = "0.19", features = ["libloading"], optional = true } eyre = "0.6.11" [target.'cfg(windows)'.dependencies] @@ -35,6 +33,9 @@ openxr = { git = "https://github.com/Ralith/openxrs", rev = "0177d2d", features "static", "mint", ] } +winapi = { version = "0.3.9", optional = true } +d3d12 = { version = "0.19", features = ["libloading"], optional = true } + [target.'cfg(all(target_family = "unix", not(target_arch = "wasm32")) )'.dependencies] openxr = { git = "https://github.com/Ralith/openxrs", rev = "0177d2d", features = [ "mint", diff --git a/src/graphics/d3d12.rs b/src/graphics/d3d12.rs index e162197..2340e15 100644 --- a/src/graphics/d3d12.rs +++ b/src/graphics/d3d12.rs @@ -23,7 +23,7 @@ use crate::resources::{ XrFrameWaiter, XrInstance, XrResolution, XrSession, XrSessionRunning, XrSwapchain, XrViews, }; -#[cfg(feature = "d3d12")] +#[cfg(all(feature = "d3d12", windows))] use crate::resources::D3D12OXrSessionSetupInfo; #[cfg(feature = "vulkan")] use crate::resources::VulkanOXrSessionSetupInfo; diff --git a/src/graphics/mod.rs b/src/graphics/mod.rs index 67bff10..c897604 100644 --- a/src/graphics/mod.rs +++ b/src/graphics/mod.rs @@ -1,6 +1,6 @@ pub mod extensions; -#[cfg(feature = "d3d12")] +#[cfg(all(feature = "d3d12", windows))] mod d3d12; #[cfg(feature = "vulkan")] mod vulkan; @@ -69,27 +69,25 @@ pub fn start_xr_session( XrViews, XrFrameState, )> { - #[cfg(feature = "vulkan")] - { - vulkan::start_xr_session( + match session_setup_data { + #[cfg(feature = "vulkan")] + OXrSessionSetupInfo::Vulkan(_) => vulkan::start_xr_session( window, session_setup_data, xr_instance, render_device, render_adapter, wgpu_instance, - ) - } - #[cfg(feature = "d3d12")] - { - d3d12::start_xr_session( + ), + #[cfg(all(feature = "d3d12", windows))] + OXrSessionSetupInfo::D3D12(_) => d3d12::start_xr_session( window, session_setup_data, xr_instance, render_device, render_adapter, wgpu_instance, - ) + ), } } pub fn initialize_xr_instance( @@ -134,7 +132,7 @@ pub fn initialize_xr_instance( app_info, ); } - #[cfg(feature = "d3d12")] + #[cfg(all(feature = "d3d12", windows))] Backend::D3D12 => { if !available_extensions.raw().khr_d3d12_enable { continue; diff --git a/src/lib.rs b/src/lib.rs index 80e2bff..fe1b93a 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -175,7 +175,7 @@ impl Plugin for OpenXrPlugin { pub enum Backend { #[cfg(feature = "vulkan")] Vulkan, - #[cfg(feature = "d3d12")] + #[cfg(all(feature = "d3d12", windows))] D3D12, } @@ -222,21 +222,30 @@ fn xr_skip_frame( environment_blend_mode: Res, ) { let swapchain: &Swapchain = &xr_swapchain; - let stream = match swapchain { + match swapchain { #[cfg(feature = "vulkan")] - Swapchain::Vulkan(swap) => &swap.stream, - #[cfg(feature = "d3d12")] - Swapchain::D3D12(swap) => &swap.stream, + Swapchain::Vulkan(swap) => &swap + .stream + .lock() + .unwrap() + .end( + xr_frame_state.predicted_display_time, + **environment_blend_mode, + &[], + ) + .unwrap(), + #[cfg(all(feature = "d3d12", windows))] + Swapchain::D3D12(swap) => &swap + .stream + .lock() + .unwrap() + .end( + xr_frame_state.predicted_display_time, + **environment_blend_mode, + &[], + ) + .unwrap(), }; - stream - .lock() - .unwrap() - .end( - xr_frame_state.predicted_display_time, - **environment_blend_mode, - &[], - ) - .unwrap(); } pub struct DefaultXrPlugins { @@ -252,7 +261,7 @@ impl Default for DefaultXrPlugins { backend_preference: vec![ #[cfg(feature = "vulkan")] Backend::Vulkan, - #[cfg(feature = "d3d12")] + #[cfg(all(feature = "d3d12", windows))] Backend::D3D12, ], reqeusted_extensions: default(), diff --git a/src/passthrough.rs b/src/passthrough.rs index 58d0205..c6d67c8 100644 --- a/src/passthrough.rs +++ b/src/passthrough.rs @@ -202,7 +202,7 @@ pub fn create_passthrough( XrSession::Vulkan(session) => { session.create_passthrough(xr::PassthroughFlagsFB::IS_RUNNING_AT_CREATION) } - #[cfg(feature = "d3d12")] + #[cfg(all(feature = "d3d12", windows))] XrSession::D3D12(session) => { session.create_passthrough(xr::PassthroughFlagsFB::IS_RUNNING_AT_CREATION) } @@ -212,7 +212,7 @@ pub fn create_passthrough( XrSession::Vulkan(session) => { session.create_passthrough_layer(&passthrough, flags, purpose) } - #[cfg(feature = "d3d12")] + #[cfg(all(feature = "d3d12", windows))] XrSession::D3D12(session) => session.create_passthrough_layer(&passthrough, flags, purpose), }?; Ok((passthrough, passthrough_layer)) diff --git a/src/resources.rs b/src/resources.rs index d005dca..1f1e2f9 100644 --- a/src/resources.rs +++ b/src/resources.rs @@ -14,7 +14,7 @@ use bevy::render::extract_component::ExtractComponent; use bevy::render::extract_resource::{ExtractResource, ExtractResourcePlugin}; use core::ptr; use openxr as xr; -#[cfg(feature = "d3d12")] +#[cfg(all(feature = "d3d12", windows))] use winapi::um::d3d12::{ID3D12CommandQueue, ID3D12Device}; xr_resource_wrapper!(XrInstance, xr::Instance); @@ -31,7 +31,7 @@ xr_no_clone_resource_wrapper!(XrFrameWaiter, xr::FrameWaiter); pub enum XrSession { #[cfg(feature = "vulkan")] Vulkan(xr::Session), - #[cfg(feature = "d3d12")] + #[cfg(all(feature = "d3d12", windows))] D3D12(xr::Session), } @@ -44,7 +44,7 @@ impl std::ops::Deref for XrSession { match self { #[cfg(feature = "vulkan")] XrSession::Vulkan(sess) => std::mem::transmute(sess), - #[cfg(feature = "d3d12")] + #[cfg(all(feature = "d3d12", windows))] XrSession::D3D12(sess) => std::mem::transmute(sess), } } @@ -60,7 +60,7 @@ pub struct VulkanOXrSessionSetupInfo { pub(crate) xr_system_id: xr::SystemId, } -#[cfg(feature = "d3d12")] +#[cfg(all(feature = "d3d12", windows))] pub struct D3D12OXrSessionSetupInfo { pub(crate) raw_device: *mut ID3D12Device, pub(crate) raw_queue: *mut ID3D12CommandQueue, @@ -70,7 +70,7 @@ pub struct D3D12OXrSessionSetupInfo { pub enum OXrSessionSetupInfo { #[cfg(feature = "vulkan")] Vulkan(VulkanOXrSessionSetupInfo), - #[cfg(feature = "d3d12")] + #[cfg(all(feature = "d3d12", windows))] D3D12(D3D12OXrSessionSetupInfo), } @@ -93,7 +93,7 @@ impl Plugin for XrResourcePlugin { pub enum Swapchain { #[cfg(feature = "vulkan")] Vulkan(SwapchainInner), - #[cfg(feature = "d3d12")] + #[cfg(all(feature = "d3d12", windows))] D3D12(SwapchainInner), } @@ -102,7 +102,7 @@ impl Swapchain { match self { #[cfg(feature = "vulkan")] Swapchain::Vulkan(swapchain) => swapchain.begin(), - #[cfg(feature = "d3d12")] + #[cfg(all(feature = "d3d12", windows))] Swapchain::D3D12(swapchain) => swapchain.begin(), } } @@ -111,7 +111,7 @@ impl Swapchain { match self { #[cfg(feature = "vulkan")] Swapchain::Vulkan(swapchain) => swapchain.get_render_views(), - #[cfg(feature = "d3d12")] + #[cfg(all(feature = "d3d12", windows))] Swapchain::D3D12(swapchain) => swapchain.get_render_views(), } } @@ -120,7 +120,7 @@ impl Swapchain { match self { #[cfg(feature = "vulkan")] Swapchain::Vulkan(swapchain) => swapchain.acquire_image(), - #[cfg(feature = "d3d12")] + #[cfg(all(feature = "d3d12", windows))] Swapchain::D3D12(swapchain) => swapchain.acquire_image(), } } @@ -129,7 +129,7 @@ impl Swapchain { match self { #[cfg(feature = "vulkan")] Swapchain::Vulkan(swapchain) => swapchain.wait_image(), - #[cfg(feature = "d3d12")] + #[cfg(all(feature = "d3d12", windows))] Swapchain::D3D12(swapchain) => swapchain.wait_image(), } } @@ -138,7 +138,7 @@ impl Swapchain { match self { #[cfg(feature = "vulkan")] Swapchain::Vulkan(swapchain) => swapchain.release_image(), - #[cfg(feature = "d3d12")] + #[cfg(all(feature = "d3d12", windows))] Swapchain::D3D12(swapchain) => swapchain.release_image(), } } @@ -162,7 +162,7 @@ impl Swapchain { environment_blend_mode, passthrough_layer, ), - #[cfg(feature = "d3d12")] + #[cfg(all(feature = "d3d12", windows))] Swapchain::D3D12(swapchain) => swapchain.end( predicted_display_time, views,