Make d3d12 build by default if possible

This commit is contained in:
Charlton Rodda
2023-12-01 12:10:00 +00:00
parent ff4ff6472a
commit 8e0837b8ca
6 changed files with 52 additions and 44 deletions

View File

@@ -8,7 +8,7 @@ license = "MIT/Apache-2.0"
[features] [features]
default = ["vulkan"] default = ["vulkan", "d3d12"]
force-link = ["openxr/linked"] force-link = ["openxr/linked"]
vulkan = ["wgpu-core/vulkan"] vulkan = ["wgpu-core/vulkan"]
d3d12 = ["wgpu-core/dx12", "dep:winapi", "dep:d3d12"] d3d12 = ["wgpu-core/dx12", "dep:winapi", "dep:d3d12"]
@@ -22,11 +22,9 @@ ash = "0.37.3"
bevy = "0.13" bevy = "0.13"
futures-lite = "2.0.1" futures-lite = "2.0.1"
mint = "0.5.9" mint = "0.5.9"
winapi = { version = "0.3.9", optional = true }
wgpu = "0.19" wgpu = "0.19"
wgpu-core = { version = "0.19" } wgpu-core = { version = "0.19" }
wgpu-hal = "0.19" wgpu-hal = "0.19"
d3d12 = { version = "0.19", features = ["libloading"], optional = true }
eyre = "0.6.11" eyre = "0.6.11"
[target.'cfg(windows)'.dependencies] [target.'cfg(windows)'.dependencies]
@@ -35,6 +33,9 @@ openxr = { git = "https://github.com/Ralith/openxrs", rev = "0177d2d", features
"static", "static",
"mint", "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] [target.'cfg(all(target_family = "unix", not(target_arch = "wasm32")) )'.dependencies]
openxr = { git = "https://github.com/Ralith/openxrs", rev = "0177d2d", features = [ openxr = { git = "https://github.com/Ralith/openxrs", rev = "0177d2d", features = [
"mint", "mint",

View File

@@ -23,7 +23,7 @@ use crate::resources::{
XrFrameWaiter, XrInstance, XrResolution, XrSession, XrSessionRunning, XrSwapchain, XrViews, XrFrameWaiter, XrInstance, XrResolution, XrSession, XrSessionRunning, XrSwapchain, XrViews,
}; };
#[cfg(feature = "d3d12")] #[cfg(all(feature = "d3d12", windows))]
use crate::resources::D3D12OXrSessionSetupInfo; use crate::resources::D3D12OXrSessionSetupInfo;
#[cfg(feature = "vulkan")] #[cfg(feature = "vulkan")]
use crate::resources::VulkanOXrSessionSetupInfo; use crate::resources::VulkanOXrSessionSetupInfo;

View File

@@ -1,6 +1,6 @@
pub mod extensions; pub mod extensions;
#[cfg(feature = "d3d12")] #[cfg(all(feature = "d3d12", windows))]
mod d3d12; mod d3d12;
#[cfg(feature = "vulkan")] #[cfg(feature = "vulkan")]
mod vulkan; mod vulkan;
@@ -69,27 +69,25 @@ pub fn start_xr_session(
XrViews, XrViews,
XrFrameState, XrFrameState,
)> { )> {
#[cfg(feature = "vulkan")] match session_setup_data {
{ #[cfg(feature = "vulkan")]
vulkan::start_xr_session( OXrSessionSetupInfo::Vulkan(_) => vulkan::start_xr_session(
window, window,
session_setup_data, session_setup_data,
xr_instance, xr_instance,
render_device, render_device,
render_adapter, render_adapter,
wgpu_instance, wgpu_instance,
) ),
} #[cfg(all(feature = "d3d12", windows))]
#[cfg(feature = "d3d12")] OXrSessionSetupInfo::D3D12(_) => d3d12::start_xr_session(
{
d3d12::start_xr_session(
window, window,
session_setup_data, session_setup_data,
xr_instance, xr_instance,
render_device, render_device,
render_adapter, render_adapter,
wgpu_instance, wgpu_instance,
) ),
} }
} }
pub fn initialize_xr_instance( pub fn initialize_xr_instance(
@@ -134,7 +132,7 @@ pub fn initialize_xr_instance(
app_info, app_info,
); );
} }
#[cfg(feature = "d3d12")] #[cfg(all(feature = "d3d12", windows))]
Backend::D3D12 => { Backend::D3D12 => {
if !available_extensions.raw().khr_d3d12_enable { if !available_extensions.raw().khr_d3d12_enable {
continue; continue;

View File

@@ -175,7 +175,7 @@ impl Plugin for OpenXrPlugin {
pub enum Backend { pub enum Backend {
#[cfg(feature = "vulkan")] #[cfg(feature = "vulkan")]
Vulkan, Vulkan,
#[cfg(feature = "d3d12")] #[cfg(all(feature = "d3d12", windows))]
D3D12, D3D12,
} }
@@ -222,21 +222,30 @@ fn xr_skip_frame(
environment_blend_mode: Res<XrEnvironmentBlendMode>, environment_blend_mode: Res<XrEnvironmentBlendMode>,
) { ) {
let swapchain: &Swapchain = &xr_swapchain; let swapchain: &Swapchain = &xr_swapchain;
let stream = match swapchain { match swapchain {
#[cfg(feature = "vulkan")] #[cfg(feature = "vulkan")]
Swapchain::Vulkan(swap) => &swap.stream, Swapchain::Vulkan(swap) => &swap
#[cfg(feature = "d3d12")] .stream
Swapchain::D3D12(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 { pub struct DefaultXrPlugins {
@@ -252,7 +261,7 @@ impl Default for DefaultXrPlugins {
backend_preference: vec![ backend_preference: vec![
#[cfg(feature = "vulkan")] #[cfg(feature = "vulkan")]
Backend::Vulkan, Backend::Vulkan,
#[cfg(feature = "d3d12")] #[cfg(all(feature = "d3d12", windows))]
Backend::D3D12, Backend::D3D12,
], ],
reqeusted_extensions: default(), reqeusted_extensions: default(),

View File

@@ -202,7 +202,7 @@ pub fn create_passthrough(
XrSession::Vulkan(session) => { XrSession::Vulkan(session) => {
session.create_passthrough(xr::PassthroughFlagsFB::IS_RUNNING_AT_CREATION) session.create_passthrough(xr::PassthroughFlagsFB::IS_RUNNING_AT_CREATION)
} }
#[cfg(feature = "d3d12")] #[cfg(all(feature = "d3d12", windows))]
XrSession::D3D12(session) => { XrSession::D3D12(session) => {
session.create_passthrough(xr::PassthroughFlagsFB::IS_RUNNING_AT_CREATION) session.create_passthrough(xr::PassthroughFlagsFB::IS_RUNNING_AT_CREATION)
} }
@@ -212,7 +212,7 @@ pub fn create_passthrough(
XrSession::Vulkan(session) => { XrSession::Vulkan(session) => {
session.create_passthrough_layer(&passthrough, flags, purpose) 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), XrSession::D3D12(session) => session.create_passthrough_layer(&passthrough, flags, purpose),
}?; }?;
Ok((passthrough, passthrough_layer)) Ok((passthrough, passthrough_layer))

View File

@@ -14,7 +14,7 @@ use bevy::render::extract_component::ExtractComponent;
use bevy::render::extract_resource::{ExtractResource, ExtractResourcePlugin}; use bevy::render::extract_resource::{ExtractResource, ExtractResourcePlugin};
use core::ptr; use core::ptr;
use openxr as xr; use openxr as xr;
#[cfg(feature = "d3d12")] #[cfg(all(feature = "d3d12", windows))]
use winapi::um::d3d12::{ID3D12CommandQueue, ID3D12Device}; use winapi::um::d3d12::{ID3D12CommandQueue, ID3D12Device};
xr_resource_wrapper!(XrInstance, xr::Instance); xr_resource_wrapper!(XrInstance, xr::Instance);
@@ -31,7 +31,7 @@ xr_no_clone_resource_wrapper!(XrFrameWaiter, xr::FrameWaiter);
pub enum XrSession { pub enum XrSession {
#[cfg(feature = "vulkan")] #[cfg(feature = "vulkan")]
Vulkan(xr::Session<xr::Vulkan>), Vulkan(xr::Session<xr::Vulkan>),
#[cfg(feature = "d3d12")] #[cfg(all(feature = "d3d12", windows))]
D3D12(xr::Session<xr::D3D12>), D3D12(xr::Session<xr::D3D12>),
} }
@@ -44,7 +44,7 @@ impl std::ops::Deref for XrSession {
match self { match self {
#[cfg(feature = "vulkan")] #[cfg(feature = "vulkan")]
XrSession::Vulkan(sess) => std::mem::transmute(sess), XrSession::Vulkan(sess) => std::mem::transmute(sess),
#[cfg(feature = "d3d12")] #[cfg(all(feature = "d3d12", windows))]
XrSession::D3D12(sess) => std::mem::transmute(sess), XrSession::D3D12(sess) => std::mem::transmute(sess),
} }
} }
@@ -60,7 +60,7 @@ pub struct VulkanOXrSessionSetupInfo {
pub(crate) xr_system_id: xr::SystemId, pub(crate) xr_system_id: xr::SystemId,
} }
#[cfg(feature = "d3d12")] #[cfg(all(feature = "d3d12", windows))]
pub struct D3D12OXrSessionSetupInfo { pub struct D3D12OXrSessionSetupInfo {
pub(crate) raw_device: *mut ID3D12Device, pub(crate) raw_device: *mut ID3D12Device,
pub(crate) raw_queue: *mut ID3D12CommandQueue, pub(crate) raw_queue: *mut ID3D12CommandQueue,
@@ -70,7 +70,7 @@ pub struct D3D12OXrSessionSetupInfo {
pub enum OXrSessionSetupInfo { pub enum OXrSessionSetupInfo {
#[cfg(feature = "vulkan")] #[cfg(feature = "vulkan")]
Vulkan(VulkanOXrSessionSetupInfo), Vulkan(VulkanOXrSessionSetupInfo),
#[cfg(feature = "d3d12")] #[cfg(all(feature = "d3d12", windows))]
D3D12(D3D12OXrSessionSetupInfo), D3D12(D3D12OXrSessionSetupInfo),
} }
@@ -93,7 +93,7 @@ impl Plugin for XrResourcePlugin {
pub enum Swapchain { pub enum Swapchain {
#[cfg(feature = "vulkan")] #[cfg(feature = "vulkan")]
Vulkan(SwapchainInner<xr::Vulkan>), Vulkan(SwapchainInner<xr::Vulkan>),
#[cfg(feature = "d3d12")] #[cfg(all(feature = "d3d12", windows))]
D3D12(SwapchainInner<xr::D3D12>), D3D12(SwapchainInner<xr::D3D12>),
} }
@@ -102,7 +102,7 @@ impl Swapchain {
match self { match self {
#[cfg(feature = "vulkan")] #[cfg(feature = "vulkan")]
Swapchain::Vulkan(swapchain) => swapchain.begin(), Swapchain::Vulkan(swapchain) => swapchain.begin(),
#[cfg(feature = "d3d12")] #[cfg(all(feature = "d3d12", windows))]
Swapchain::D3D12(swapchain) => swapchain.begin(), Swapchain::D3D12(swapchain) => swapchain.begin(),
} }
} }
@@ -111,7 +111,7 @@ impl Swapchain {
match self { match self {
#[cfg(feature = "vulkan")] #[cfg(feature = "vulkan")]
Swapchain::Vulkan(swapchain) => swapchain.get_render_views(), Swapchain::Vulkan(swapchain) => swapchain.get_render_views(),
#[cfg(feature = "d3d12")] #[cfg(all(feature = "d3d12", windows))]
Swapchain::D3D12(swapchain) => swapchain.get_render_views(), Swapchain::D3D12(swapchain) => swapchain.get_render_views(),
} }
} }
@@ -120,7 +120,7 @@ impl Swapchain {
match self { match self {
#[cfg(feature = "vulkan")] #[cfg(feature = "vulkan")]
Swapchain::Vulkan(swapchain) => swapchain.acquire_image(), Swapchain::Vulkan(swapchain) => swapchain.acquire_image(),
#[cfg(feature = "d3d12")] #[cfg(all(feature = "d3d12", windows))]
Swapchain::D3D12(swapchain) => swapchain.acquire_image(), Swapchain::D3D12(swapchain) => swapchain.acquire_image(),
} }
} }
@@ -129,7 +129,7 @@ impl Swapchain {
match self { match self {
#[cfg(feature = "vulkan")] #[cfg(feature = "vulkan")]
Swapchain::Vulkan(swapchain) => swapchain.wait_image(), Swapchain::Vulkan(swapchain) => swapchain.wait_image(),
#[cfg(feature = "d3d12")] #[cfg(all(feature = "d3d12", windows))]
Swapchain::D3D12(swapchain) => swapchain.wait_image(), Swapchain::D3D12(swapchain) => swapchain.wait_image(),
} }
} }
@@ -138,7 +138,7 @@ impl Swapchain {
match self { match self {
#[cfg(feature = "vulkan")] #[cfg(feature = "vulkan")]
Swapchain::Vulkan(swapchain) => swapchain.release_image(), Swapchain::Vulkan(swapchain) => swapchain.release_image(),
#[cfg(feature = "d3d12")] #[cfg(all(feature = "d3d12", windows))]
Swapchain::D3D12(swapchain) => swapchain.release_image(), Swapchain::D3D12(swapchain) => swapchain.release_image(),
} }
} }
@@ -162,7 +162,7 @@ impl Swapchain {
environment_blend_mode, environment_blend_mode,
passthrough_layer, passthrough_layer,
), ),
#[cfg(feature = "d3d12")] #[cfg(all(feature = "d3d12", windows))]
Swapchain::D3D12(swapchain) => swapchain.end( Swapchain::D3D12(swapchain) => swapchain.end(
predicted_display_time, predicted_display_time,
views, views,