Compare commits
11 Commits
camera-ite
...
camera-ite
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c6bc1f3ee8 | ||
|
|
27d8eb5f51 | ||
|
|
2f575954e9 | ||
|
|
828a298476 | ||
|
|
9058592ce1 | ||
|
|
c96eb14235 | ||
|
|
6fc1bb2afa | ||
|
|
1ee485f3c5 | ||
|
|
9c62f4fd24 | ||
|
|
a1f07f9260 | ||
|
|
cd5fc51e98 |
42
Cargo.lock
generated
42
Cargo.lock
generated
@@ -133,9 +133,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "async-trait"
|
name = "async-trait"
|
||||||
version = "0.1.74"
|
version = "0.1.73"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "a66537f1bb974b254c98ed142ff995236e81b9d0fe4db0575f46612cb15eb0f9"
|
checksum = "bc00ceb34980c03614e35a3a4e218276a0a824e911d07651cd0d858a51e8c0f0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
"quote",
|
"quote",
|
||||||
@@ -261,9 +261,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "bitflags"
|
name = "bitflags"
|
||||||
version = "2.4.1"
|
version = "2.4.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07"
|
checksum = "b4682ae6287fcf752ecaabbfcc7b6f9b72aa33933dc23a554d853aea8eea8635"
|
||||||
|
|
||||||
[[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.1",
|
"bitflags 2.4.0",
|
||||||
"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.1",
|
"bitflags 2.4.0",
|
||||||
"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.1",
|
"bitflags 2.4.0",
|
||||||
"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.2"
|
version = "1.10.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "380b951a9c5e80ddfd6136919eef32310721aa4aacd4889a8d39124b026ab343"
|
checksum = "aaac441002f822bc9705a681810a4dd2963094b9ca0ddc41cb963a4c189189ea"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"aho-corasick",
|
"aho-corasick",
|
||||||
"memchr",
|
"memchr",
|
||||||
"regex-automata 0.4.3",
|
"regex-automata 0.4.2",
|
||||||
"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.3"
|
version = "0.4.2"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "5f804c7828047e88b2d32e2d7fe5a105da8ee3264f01902f796c8e067dc2483f"
|
checksum = "5011c7e263a695dc8ca064cddb722af1be54e517a280b12a5356f98366899e5d"
|
||||||
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.1",
|
"bitflags 2.4.0",
|
||||||
"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#fb1afbf63e58d15b715251cf0f608ef1c0de6e6d"
|
source = "git+https://github.com/smithay/smithay.git#4e41ab0694c1c43324cc217dcf2a203cd240c0dc"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"appendlist",
|
"appendlist",
|
||||||
"bitflags 2.4.1",
|
"bitflags 2.4.0",
|
||||||
"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#272f961be2c7e0369626ce70e56c266aefccef14"
|
source = "git+https://github.com/StardustXR/core.git?branch=camera-item#2689f608c1375799f2042d5d8a5f3efa76bf57ec"
|
||||||
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#272f961be2c7e0369626ce70e56c266aefccef14"
|
source = "git+https://github.com/StardustXR/core.git?branch=camera-item#2689f608c1375799f2042d5d8a5f3efa76bf57ec"
|
||||||
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.1",
|
"bitflags 2.4.0",
|
||||||
"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.1",
|
"bitflags 2.4.0",
|
||||||
"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.1",
|
"bitflags 2.4.0",
|
||||||
"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.1",
|
"bitflags 2.4.0",
|
||||||
"downcast-rs",
|
"downcast-rs",
|
||||||
"io-lifetimes",
|
"io-lifetimes",
|
||||||
"nix 0.26.4",
|
"nix 0.26.4",
|
||||||
|
|||||||
@@ -26,12 +26,12 @@ use smithay::backend::{
|
|||||||
dmabuf::{Dmabuf, DmabufFlags},
|
dmabuf::{Dmabuf, DmabufFlags},
|
||||||
Buffer,
|
Buffer,
|
||||||
},
|
},
|
||||||
renderer::ImportDma,
|
renderer::{gles, ImportDma},
|
||||||
};
|
};
|
||||||
use stardust_xr::{
|
use stardust_xr::{
|
||||||
scenegraph::ScenegraphError,
|
scenegraph::ScenegraphError,
|
||||||
schemas::flex::{deserialize, serialize},
|
schemas::flex::{deserialize, serialize},
|
||||||
values::{BufferInfo, Transform},
|
values::{BufferColorspace, 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", "set_proj_matrix"],
|
aliased_local_signals: vec!["apply_preview_material"],
|
||||||
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,8 +62,9 @@ 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, MethodResponseSender)>,
|
render_requests_tx: mpsc::UnboundedSender<(Dmabuf, BufferColorspace, MethodResponseSender)>,
|
||||||
render_requests_rx: Mutex<mpsc::UnboundedReceiver<(Dmabuf, MethodResponseSender)>>,
|
render_requests_rx:
|
||||||
|
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>,
|
||||||
@@ -96,7 +97,6 @@ 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,8 +143,10 @@ impl CameraItem {
|
|||||||
}
|
}
|
||||||
let buffer_to_render = builder.build().unwrap();
|
let buffer_to_render = builder.build().unwrap();
|
||||||
|
|
||||||
if let Err(SendError((_dmabuf, sender))) =
|
if let Err(SendError((_dmabuf, _colorspace, sender))) =
|
||||||
camera.render_requests_tx.send((buffer_to_render, response))
|
camera
|
||||||
|
.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(),
|
||||||
@@ -178,26 +180,6 @@ 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())
|
||||||
}
|
}
|
||||||
@@ -256,7 +238,9 @@ 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, 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
|
let imported_dmabuf = buffer_manager
|
||||||
.renderer
|
.renderer
|
||||||
.import_dmabuf(&buffer_to_render, None);
|
.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 {
|
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,
|
||||||
smithay::backend::renderer::gles::ffi::SRGB8_ALPHA8.into(),
|
native_format.into(),
|
||||||
buffer_to_render.size().w,
|
buffer_to_render.size().w,
|
||||||
buffer_to_render.size().h,
|
buffer_to_render.size().h,
|
||||||
1,
|
1,
|
||||||
|
|||||||
Reference in New Issue
Block a user