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]
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",

View File

@@ -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;

View File

@@ -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,
)> {
match session_setup_data {
#[cfg(feature = "vulkan")]
{
vulkan::start_xr_session(
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;

View File

@@ -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,13 +222,10 @@ fn xr_skip_frame(
environment_blend_mode: Res<XrEnvironmentBlendMode>,
) {
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,
};
stream
Swapchain::Vulkan(swap) => &swap
.stream
.lock()
.unwrap()
.end(
@@ -236,7 +233,19 @@ fn xr_skip_frame(
**environment_blend_mode,
&[],
)
.unwrap();
.unwrap(),
#[cfg(all(feature = "d3d12", windows))]
Swapchain::D3D12(swap) => &swap
.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(),

View File

@@ -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))

View File

@@ -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<xr::Vulkan>),
#[cfg(feature = "d3d12")]
#[cfg(all(feature = "d3d12", windows))]
D3D12(xr::Session<xr::D3D12>),
}
@@ -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<xr::Vulkan>),
#[cfg(feature = "d3d12")]
#[cfg(all(feature = "d3d12", windows))]
D3D12(SwapchainInner<xr::D3D12>),
}
@@ -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,