11 Commits

2 changed files with 52 additions and 75 deletions

42
Cargo.lock generated
View File

@@ -133,9 +133,9 @@ dependencies = [
[[package]] [[package]]
name = "async-trait" name = "async-trait"
version = "0.1.73" version = "0.1.74"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bc00ceb34980c03614e35a3a4e218276a0a824e911d07651cd0d858a51e8c0f0" checksum = "a66537f1bb974b254c98ed142ff995236e81b9d0fe4db0575f46612cb15eb0f9"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
@@ -261,9 +261,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
[[package]] [[package]]
name = "bitflags" name = "bitflags"
version = "2.4.0" version = "2.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b4682ae6287fcf752ecaabbfcc7b6f9b72aa33933dc23a554d853aea8eea8635" checksum = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07"
[[package]] [[package]]
name = "bytemuck" name = "bytemuck"
@@ -303,7 +303,7 @@ version = "0.12.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7b50b5a44d59a98c55a9eeb518f39bf7499ba19fd98ee7d22618687f3f10adbf" checksum = "7b50b5a44d59a98c55a9eeb518f39bf7499ba19fd98ee7d22618687f3f10adbf"
dependencies = [ dependencies = [
"bitflags 2.4.0", "bitflags 2.4.1",
"log", "log",
"polling", "polling",
"rustix", "rustix",
@@ -597,7 +597,7 @@ version = "0.10.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "97fb1b703ffbc7ebd216eba7900008049a56ace55580ecb2ee7fa801e8d8be87" checksum = "97fb1b703ffbc7ebd216eba7900008049a56ace55580ecb2ee7fa801e8d8be87"
dependencies = [ dependencies = [
"bitflags 2.4.0", "bitflags 2.4.1",
"bytemuck", "bytemuck",
"drm-ffi", "drm-ffi",
"drm-fourcc", "drm-fourcc",
@@ -1303,7 +1303,7 @@ version = "0.27.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2eb04e9c688eff1c89d72b407f168cf79bb9e867a9d3323ed6c01519eb9cc053" checksum = "2eb04e9c688eff1c89d72b407f168cf79bb9e867a9d3323ed6c01519eb9cc053"
dependencies = [ dependencies = [
"bitflags 2.4.0", "bitflags 2.4.1",
"cfg-if", "cfg-if",
"libc", "libc",
"memoffset 0.9.0", "memoffset 0.9.0",
@@ -1756,13 +1756,13 @@ dependencies = [
[[package]] [[package]]
name = "regex" name = "regex"
version = "1.10.1" version = "1.10.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "aaac441002f822bc9705a681810a4dd2963094b9ca0ddc41cb963a4c189189ea" checksum = "380b951a9c5e80ddfd6136919eef32310721aa4aacd4889a8d39124b026ab343"
dependencies = [ dependencies = [
"aho-corasick", "aho-corasick",
"memchr", "memchr",
"regex-automata 0.4.2", "regex-automata 0.4.3",
"regex-syntax 0.8.2", "regex-syntax 0.8.2",
] ]
@@ -1777,9 +1777,9 @@ dependencies = [
[[package]] [[package]]
name = "regex-automata" name = "regex-automata"
version = "0.4.2" version = "0.4.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5011c7e263a695dc8ca064cddb722af1be54e517a280b12a5356f98366899e5d" checksum = "5f804c7828047e88b2d32e2d7fe5a105da8ee3264f01902f796c8e067dc2483f"
dependencies = [ dependencies = [
"aho-corasick", "aho-corasick",
"memchr", "memchr",
@@ -1825,7 +1825,7 @@ version = "0.38.19"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "745ecfa778e66b2b63c88a61cb36e0eea109e803b0b86bf9879fbc77c70e86ed" checksum = "745ecfa778e66b2b63c88a61cb36e0eea109e803b0b86bf9879fbc77c70e86ed"
dependencies = [ dependencies = [
"bitflags 2.4.0", "bitflags 2.4.1",
"errno", "errno",
"libc", "libc",
"linux-raw-sys", "linux-raw-sys",
@@ -1958,10 +1958,10 @@ checksum = "942b4a808e05215192e39f4ab80813e599068285906cc91aa64f923db842bd5a"
[[package]] [[package]]
name = "smithay" name = "smithay"
version = "0.3.0" version = "0.3.0"
source = "git+https://github.com/smithay/smithay.git#4e41ab0694c1c43324cc217dcf2a203cd240c0dc" source = "git+https://github.com/smithay/smithay.git#fb1afbf63e58d15b715251cf0f608ef1c0de6e6d"
dependencies = [ dependencies = [
"appendlist", "appendlist",
"bitflags 2.4.0", "bitflags 2.4.1",
"calloop", "calloop",
"cgmath", "cgmath",
"cursor-icon", "cursor-icon",
@@ -2016,7 +2016,7 @@ dependencies = [
[[package]] [[package]]
name = "stardust-xr" name = "stardust-xr"
version = "0.14.1" version = "0.14.1"
source = "git+https://github.com/StardustXR/core.git?branch=camera-item#2689f608c1375799f2042d5d8a5f3efa76bf57ec" source = "git+https://github.com/StardustXR/core.git?branch=camera-item#272f961be2c7e0369626ce70e56c266aefccef14"
dependencies = [ dependencies = [
"cluFlock", "cluFlock",
"color-rs", "color-rs",
@@ -2037,7 +2037,7 @@ dependencies = [
[[package]] [[package]]
name = "stardust-xr-schemas" name = "stardust-xr-schemas"
version = "1.5.3" version = "1.5.3"
source = "git+https://github.com/StardustXR/core.git?branch=camera-item#2689f608c1375799f2042d5d8a5f3efa76bf57ec" source = "git+https://github.com/StardustXR/core.git?branch=camera-item#272f961be2c7e0369626ce70e56c266aefccef14"
dependencies = [ dependencies = [
"flatbuffers", "flatbuffers",
"flexbuffers", "flexbuffers",
@@ -2498,7 +2498,7 @@ version = "0.31.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e253d7107ba913923dc253967f35e8561a3c65f914543e46843c88ddd729e21c" checksum = "e253d7107ba913923dc253967f35e8561a3c65f914543e46843c88ddd729e21c"
dependencies = [ dependencies = [
"bitflags 2.4.0", "bitflags 2.4.1",
"wayland-backend", "wayland-backend",
"wayland-scanner", "wayland-scanner",
"wayland-server", "wayland-server",
@@ -2510,7 +2510,7 @@ version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bfa5933740b200188c9b4c38601b8212e8c154d7de0d2cb171944e137a77de1e" checksum = "bfa5933740b200188c9b4c38601b8212e8c154d7de0d2cb171944e137a77de1e"
dependencies = [ dependencies = [
"bitflags 2.4.0", "bitflags 2.4.1",
"wayland-backend", "wayland-backend",
"wayland-protocols", "wayland-protocols",
"wayland-scanner", "wayland-scanner",
@@ -2523,7 +2523,7 @@ version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ad1f61b76b6c2d8742e10f9ba5c3737f6530b4c243132c2a2ccc8aa96fe25cd6" checksum = "ad1f61b76b6c2d8742e10f9ba5c3737f6530b4c243132c2a2ccc8aa96fe25cd6"
dependencies = [ dependencies = [
"bitflags 2.4.0", "bitflags 2.4.1",
"wayland-backend", "wayland-backend",
"wayland-protocols", "wayland-protocols",
"wayland-scanner", "wayland-scanner",
@@ -2547,7 +2547,7 @@ version = "0.31.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3f3f0c52a445936ca1184c98f1a69cf4ad9c9130788884531ef04428468cb1ce" checksum = "3f3f0c52a445936ca1184c98f1a69cf4ad9c9130788884531ef04428468cb1ce"
dependencies = [ dependencies = [
"bitflags 2.4.0", "bitflags 2.4.1",
"downcast-rs", "downcast-rs",
"io-lifetimes", "io-lifetimes",
"nix 0.26.4", "nix 0.26.4",

View File

@@ -26,12 +26,12 @@ use smithay::backend::{
dmabuf::{Dmabuf, DmabufFlags}, dmabuf::{Dmabuf, DmabufFlags},
Buffer, Buffer,
}, },
renderer::{gles, ImportDma}, renderer::ImportDma,
}; };
use stardust_xr::{ use stardust_xr::{
scenegraph::ScenegraphError, scenegraph::ScenegraphError,
schemas::flex::{deserialize, serialize}, schemas::flex::{deserialize, serialize},
values::{BufferColorspace, BufferInfo, Transform}, values::{BufferInfo, Transform},
}; };
use std::{ffi::c_void, sync::Arc}; use std::{ffi::c_void, sync::Arc};
use stereokit::{ use stereokit::{
@@ -43,7 +43,7 @@ use tokio::sync::mpsc::{self, error::SendError};
lazy_static! { lazy_static! {
pub(super) static ref ITEM_TYPE_INFO_CAMERA: TypeInfo = TypeInfo { pub(super) static ref ITEM_TYPE_INFO_CAMERA: TypeInfo = TypeInfo {
type_name: "camera", type_name: "camera",
aliased_local_signals: vec!["apply_preview_material"], aliased_local_signals: vec!["apply_preview_material", "set_proj_matrix"],
aliased_local_methods: vec!["render"], aliased_local_methods: vec!["render"],
aliased_remote_signals: vec![], aliased_remote_signals: vec![],
ui: Default::default(), ui: Default::default(),
@@ -62,9 +62,8 @@ pub struct CameraItem {
frame_info: Mutex<FrameInfo>, frame_info: Mutex<FrameInfo>,
sk_tex: OnceCell<Tex>, sk_tex: OnceCell<Tex>,
sk_mat: OnceCell<Arc<Material>>, sk_mat: OnceCell<Arc<Material>>,
render_requests_tx: mpsc::UnboundedSender<(Dmabuf, BufferColorspace, MethodResponseSender)>, render_requests_tx: mpsc::UnboundedSender<(Dmabuf, MethodResponseSender)>,
render_requests_rx: render_requests_rx: Mutex<mpsc::UnboundedReceiver<(Dmabuf, MethodResponseSender)>>,
Mutex<mpsc::UnboundedReceiver<(Dmabuf, BufferColorspace, MethodResponseSender)>>,
rendered_notifiers: Mutex<Vec<MethodResponseSender>>, rendered_notifiers: Mutex<Vec<MethodResponseSender>>,
applied_preview_to: Registry<ModelPart>, applied_preview_to: Registry<ModelPart>,
apply_preview_to: Registry<ModelPart>, apply_preview_to: Registry<ModelPart>,
@@ -97,6 +96,7 @@ impl CameraItem {
"apply_preview_material", "apply_preview_material",
CameraItem::apply_preview_material_flex, CameraItem::apply_preview_material_flex,
); );
node.add_local_signal("set_proj_matrix", CameraItem::set_proj_matrix_flex);
} }
fn render_flex( fn render_flex(
@@ -143,10 +143,8 @@ impl CameraItem {
} }
let buffer_to_render = builder.build().unwrap(); let buffer_to_render = builder.build().unwrap();
if let Err(SendError((_dmabuf, _colorspace, sender))) = if let Err(SendError((_dmabuf, sender))) =
camera camera.render_requests_tx.send((buffer_to_render, response))
.render_requests_tx
.send((buffer_to_render, buffer_info.colorspace, response))
{ {
sender.send(Err(ScenegraphError::MethodError { sender.send(Err(ScenegraphError::MethodError {
error: "Internal: sender broke????".to_string(), error: "Internal: sender broke????".to_string(),
@@ -180,6 +178,26 @@ impl CameraItem {
Ok(()) Ok(())
} }
fn set_proj_matrix_flex(
node: &Node,
_calling_client: Arc<Client>,
message: Message,
) -> Result<()> {
let Some(item) = node.item.get() else {
bail!("Item not found?")
};
let ItemType::Camera(camera) = &item.specialization else {
bail!("Wrong item type?")
};
let proj_matrix: RowMatrix4<f32> = deserialize(&message.data)?;
let mut frame_info = camera.frame_info.lock();
frame_info.proj_matrix = proj_matrix.into();
Ok(())
}
pub fn serialize_start_data(&self, id: &str) -> Result<Message> { pub fn serialize_start_data(&self, id: &str) -> Result<Message> {
Ok(serialize(id)?.into()) Ok(serialize(id)?.into())
} }
@@ -238,9 +256,7 @@ impl CameraItem {
) { ) {
let mut render_notifiers = self.rendered_notifiers.lock(); let mut render_notifiers = self.rendered_notifiers.lock();
let mut render_requests_rx = self.render_requests_rx.lock(); let mut render_requests_rx = self.render_requests_rx.lock();
while let Ok((buffer_to_render, colorspace, render_response_sender)) = while let Ok((buffer_to_render, render_response_sender)) = render_requests_rx.try_recv() {
render_requests_rx.try_recv()
{
let imported_dmabuf = buffer_manager let imported_dmabuf = buffer_manager
.renderer .renderer
.import_dmabuf(&buffer_to_render, None); .import_dmabuf(&buffer_to_render, None);
@@ -254,52 +270,13 @@ impl CameraItem {
} }
}; };
let texture_format; let sk_tex = sk.tex_create(TextureType::IMAGE_NO_MIPS, TextureFormat::RGBA32);
let native_format;
match colorspace {
BufferColorspace::SRGB => match buffer_to_render.format().code {
drm_fourcc::DrmFourcc::Argb8888 => {
texture_format = TextureFormat::RGBA32;
native_format = gles::ffi::SRGB8_ALPHA8;
}
drm_fourcc::DrmFourcc::Abgr8888 => {
texture_format = TextureFormat::BGRA32;
native_format = gles::ffi::SRGB8_ALPHA8;
}
_ => {
let _ = render_response_sender.send(Err(ScenegraphError::MethodError {
error: "Unsupported pixel format".to_string(),
}));
continue;
}
},
BufferColorspace::Linear => match buffer_to_render.format().code {
drm_fourcc::DrmFourcc::Argb8888 => {
texture_format = TextureFormat::RGBA32Linear;
native_format = gles::ffi::RGBA8;
}
drm_fourcc::DrmFourcc::Abgr8888 => {
texture_format = TextureFormat::BGRA32Linear;
native_format = gles::ffi::RGBA8;
}
_ => {
let _ = render_response_sender.send(Err(ScenegraphError::MethodError {
error: "Unsupported pixel format".to_string(),
}));
continue;
}
},
}
// TODO: This doesn't seem to care about the texture format, it seems to always output with sRGB.
let sk_tex = sk.tex_create(TextureType::IMAGE_NO_MIPS, texture_format);
unsafe { unsafe {
sk.tex_set_surface( sk.tex_set_surface(
&sk_tex, &sk_tex,
smithay_tex.tex_id() as usize as *mut c_void, smithay_tex.tex_id() as usize as *mut c_void,
TextureType::RENDER_TARGET, TextureType::RENDER_TARGET,
native_format.into(), smithay::backend::renderer::gles::ffi::SRGB8_ALPHA8.into(),
buffer_to_render.size().w, buffer_to_render.size().w,
buffer_to_render.size().h, buffer_to_render.size().h,
1, 1,