11 Commits

2 changed files with 75 additions and 52 deletions

42
Cargo.lock generated
View File

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

View File

@@ -26,12 +26,12 @@ use smithay::backend::{
dmabuf::{Dmabuf, DmabufFlags},
Buffer,
},
renderer::ImportDma,
renderer::{gles, ImportDma},
};
use stardust_xr::{
scenegraph::ScenegraphError,
schemas::flex::{deserialize, serialize},
values::{BufferInfo, Transform},
values::{BufferColorspace, BufferInfo, Transform},
};
use std::{ffi::c_void, sync::Arc};
use stereokit::{
@@ -43,7 +43,7 @@ use tokio::sync::mpsc::{self, error::SendError};
lazy_static! {
pub(super) static ref ITEM_TYPE_INFO_CAMERA: TypeInfo = TypeInfo {
type_name: "camera",
aliased_local_signals: vec!["apply_preview_material", "set_proj_matrix"],
aliased_local_signals: vec!["apply_preview_material"],
aliased_local_methods: vec!["render"],
aliased_remote_signals: vec![],
ui: Default::default(),
@@ -62,8 +62,9 @@ pub struct CameraItem {
frame_info: Mutex<FrameInfo>,
sk_tex: OnceCell<Tex>,
sk_mat: OnceCell<Arc<Material>>,
render_requests_tx: mpsc::UnboundedSender<(Dmabuf, MethodResponseSender)>,
render_requests_rx: Mutex<mpsc::UnboundedReceiver<(Dmabuf, MethodResponseSender)>>,
render_requests_tx: mpsc::UnboundedSender<(Dmabuf, BufferColorspace, MethodResponseSender)>,
render_requests_rx:
Mutex<mpsc::UnboundedReceiver<(Dmabuf, BufferColorspace, MethodResponseSender)>>,
rendered_notifiers: Mutex<Vec<MethodResponseSender>>,
applied_preview_to: Registry<ModelPart>,
apply_preview_to: Registry<ModelPart>,
@@ -96,7 +97,6 @@ impl CameraItem {
"apply_preview_material",
CameraItem::apply_preview_material_flex,
);
node.add_local_signal("set_proj_matrix", CameraItem::set_proj_matrix_flex);
}
fn render_flex(
@@ -143,8 +143,10 @@ impl CameraItem {
}
let buffer_to_render = builder.build().unwrap();
if let Err(SendError((_dmabuf, sender))) =
camera.render_requests_tx.send((buffer_to_render, response))
if let Err(SendError((_dmabuf, _colorspace, sender))) =
camera
.render_requests_tx
.send((buffer_to_render, buffer_info.colorspace, response))
{
sender.send(Err(ScenegraphError::MethodError {
error: "Internal: sender broke????".to_string(),
@@ -178,26 +180,6 @@ impl CameraItem {
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> {
Ok(serialize(id)?.into())
}
@@ -256,7 +238,9 @@ impl CameraItem {
) {
let mut render_notifiers = self.rendered_notifiers.lock();
let mut render_requests_rx = self.render_requests_rx.lock();
while let Ok((buffer_to_render, render_response_sender)) = render_requests_rx.try_recv() {
while let Ok((buffer_to_render, colorspace, render_response_sender)) =
render_requests_rx.try_recv()
{
let imported_dmabuf = buffer_manager
.renderer
.import_dmabuf(&buffer_to_render, None);
@@ -270,13 +254,52 @@ impl CameraItem {
}
};
let sk_tex = sk.tex_create(TextureType::IMAGE_NO_MIPS, TextureFormat::RGBA32);
let texture_format;
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 {
sk.tex_set_surface(
&sk_tex,
smithay_tex.tex_id() as usize as *mut c_void,
TextureType::RENDER_TARGET,
smithay::backend::renderer::gles::ffi::SRGB8_ALPHA8.into(),
native_format.into(),
buffer_to_render.size().w,
buffer_to_render.size().h,
1,