commit eddc0104842a4c4405df314c9d2ef1cffa9b5f8a Author: awtterpip Date: Sun Aug 13 18:55:02 2023 -0500 started implementing openxr stuff diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4fffb2f --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +/target +/Cargo.lock diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..da9809c --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,13 @@ +[package] +name = "bevy_openxr" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +bevy = { path = "../bevy", default-features = false, features = ["bevy_render"] } +openxr = "0.17.1" +wgpu = "0.16.0" +wgpu-core = "0.16.0" +wgpu-hal = "0.16.0" diff --git a/src/graphics/mod.rs b/src/graphics/mod.rs new file mode 100644 index 0000000..05cd015 --- /dev/null +++ b/src/graphics/mod.rs @@ -0,0 +1 @@ +mod vulkan; \ No newline at end of file diff --git a/src/graphics/vulkan.rs b/src/graphics/vulkan.rs new file mode 100644 index 0000000..e2e59b5 --- /dev/null +++ b/src/graphics/vulkan.rs @@ -0,0 +1,13 @@ +use bevy::render::renderer::{RenderAdapter, RenderAdapterInfo, RenderQueue, RenderDevice}; +use bevy::render::settings::WgpuSettings; +use openxr::Entry; +use wgpu::Instance; + +/// Initializes the renderer by retrieving and preparing the GPU instance, device and queue +/// for the specified backend. +pub fn initialize_renderer( + options: &WgpuSettings, + entry: &Entry, +) -> (RenderDevice, RenderQueue, RenderAdapterInfo, RenderAdapter, Instance) { + todo!() +} \ No newline at end of file diff --git a/src/lib.rs b/src/lib.rs new file mode 100644 index 0000000..31d231d --- /dev/null +++ b/src/lib.rs @@ -0,0 +1,54 @@ +use std::sync::{Arc, Mutex}; + +use bevy::ecs::system::SystemState; +use bevy::prelude::*; +use bevy::render::settings::WgpuSettings; +use bevy::render::FutureRendererResources; +use bevy::window::{PrimaryWindow, RawHandleWrapper}; +use state::XrState; + +mod graphics; +mod state; +mod swapchain; + +pub struct OpenXrPlugin { + pub wgpu_settings: WgpuSettings, +} + +#[derive(Resource)] +struct FutureXrResources ( + Arc< + Mutex< + Option< + XrState + > + > + > +); + +impl Plugin for OpenXrPlugin { + fn build(&self, app: &mut App) { + if let Some(backends) = self.wgpu_settings.backends { + let future_renderer_resources_wrapper = Arc::new(Mutex::new(None)); + let future_xr_resources_wrapper = Arc::new(Mutex::new(None)); + app.insert_resource(FutureRendererResources( + future_renderer_resources_wrapper.clone(), + )); + + app.insert_resource(FutureXrResources( + future_xr_resources_wrapper.clone(), + )); + + let mut system_state: SystemState>> = + SystemState::new(&mut app.world); + let primary_window = system_state.get(&app.world).get_single().ok().cloned(); + + let settings = self.wgpu_settings.clone(); + bevy::tasks::IoTaskPool::get() + .spawn_local(async move { + + }) + .detach(); + } + } +} diff --git a/src/state.rs b/src/state.rs new file mode 100644 index 0000000..b2d287e --- /dev/null +++ b/src/state.rs @@ -0,0 +1,67 @@ +use std::sync::atomic::AtomicBool; +use std::sync::Mutex; + +use bevy::prelude::*; +use openxr as xr; +use xr::Result as XrResult; + +#[derive(Resource)] +pub struct XrState { + instance: xr::Instance, + session: xr::Session, + session_running: AtomicBool, + event_buffer: xr::EventDataBuffer, + views: Vec, + graphics: XrGraphics, +} + +enum XrGraphics { + Vulkan(Mutex>) +} + +impl XrGraphics { + fn begin(&self) -> XrResult { + match self { + XrGraphics::Vulkan(inner) => inner.lock().unwrap().begin(), + } + } +} + +struct XrGraphicsInner { + wait: xr::FrameWaiter, + stream: xr::FrameStream, + swapchain: xr::Swapchain, + blend_mode: xr::EnvironmentBlendMode, + resolution: Extent2D, + buffers: Vec, +} + +impl XrGraphicsInner { + fn begin(&mut self) -> XrResult { + let frame_state = self.wait.wait()?; + self.stream.begin()?; + Ok(frame_state) + } + + fn get_render_view(&mut self, layer: u32) -> wgpu::TextureView { + let image_index = self.swapchain.acquire_image().unwrap(); + self.swapchain.wait_image(xr::Duration::INFINITE).unwrap(); + + let texture = &self.buffers[image_index as usize]; + + texture.create_view(&wgpu::TextureViewDescriptor { + dimension: Some(wgpu::TextureViewDimension::D2), + array_layer_count: Some(1), + base_array_layer: layer, + ..Default::default() + }) + } +} + +struct Extent2D { + width: u32, + height: u32, +} + +unsafe impl Sync for XrState {} +unsafe impl Send for XrState {} \ No newline at end of file diff --git a/src/swapchain.rs b/src/swapchain.rs new file mode 100644 index 0000000..7138fb4 --- /dev/null +++ b/src/swapchain.rs @@ -0,0 +1,11 @@ +use std::sync::Mutex; + +use bevy::prelude::*; +use openxr as xr; + + + +struct Extent2D { + width: u32, + height: u32, +} \ No newline at end of file