add extra trace logs, mirrors to support MainThreadWlxCapture

This commit is contained in:
galister
2025-12-22 14:21:18 +09:00
parent e6cb608bbf
commit b9513c3c36
9 changed files with 43 additions and 9 deletions

View File

@@ -47,12 +47,14 @@ use crate::frame::Transform;
use crate::frame::WlxFrame; use crate::frame::WlxFrame;
use crate::frame::{DmabufFrame, FramePlane, MemFdFrame, MemPtrFrame}; use crate::frame::{DmabufFrame, FramePlane, MemFdFrame, MemPtrFrame};
#[derive(Debug, Clone)]
pub struct PipewireStream { pub struct PipewireStream {
pub node_id: u32, pub node_id: u32,
pub position: Option<(i32, i32)>, pub position: Option<(i32, i32)>,
pub size: Option<(i32, i32)>, pub size: Option<(i32, i32)>,
} }
#[derive(Debug, Clone)]
pub struct PipewireSelectScreenResult { pub struct PipewireSelectScreenResult {
pub streams: Vec<PipewireStream>, pub streams: Vec<PipewireStream>,
pub restore_token: Option<String>, pub restore_token: Option<String>,
@@ -279,6 +281,7 @@ where
U: Any, U: Any,
R: Any, R: Any,
{ {
log::debug!("{}: pipewire main_loop start", &name);
let main_loop = MainLoop::new(None)?; let main_loop = MainLoop::new(None)?;
let context = Context::new(&main_loop)?; let context = Context::new(&main_loop)?;
let core = context.connect(None)?; let core = context.connect(None)?;

View File

@@ -238,6 +238,7 @@ pub fn openxr_run(show_by_default: bool, headless: bool) -> Result<(), BackendEr
if !session_running { if !session_running {
std::thread::sleep(Duration::from_millis(100)); std::thread::sleep(Duration::from_millis(100));
log::trace!("session not running: continue");
continue 'main_loop; continue 'main_loop;
} }
@@ -387,10 +388,12 @@ pub fn openxr_run(show_by_default: bool, headless: bool) -> Result<(), BackendEr
for o in overlays.values_mut() { for o in overlays.values_mut() {
o.data.cur_visible = false; o.data.cur_visible = false;
let Some(alpha) = o.config.active_state.as_ref().map(|x| x.alpha) else { let Some(alpha) = o.config.active_state.as_ref().map(|x| x.alpha) else {
log::trace!("{}: hidden, skip render", o.config.name);
continue; continue;
}; };
if !o.data.init { if !o.data.init {
log::trace!("{}: init", o.config.name);
o.init(&mut app)?; o.init(&mut app)?;
o.data.init = true; o.data.init = true;
} }
@@ -400,8 +403,10 @@ pub fn openxr_run(show_by_default: bool, headless: bool) -> Result<(), BackendEr
ShouldRender::Can => (o.data.last_alpha - alpha).abs() > f32::EPSILON, ShouldRender::Can => (o.data.last_alpha - alpha).abs() > f32::EPSILON,
ShouldRender::Unable => false, //try show old image if exists ShouldRender::Unable => false, //try show old image if exists
}; };
log::trace!("{}: should_render returned: {should_render}", o.config.name);
if should_render { if should_render {
log::trace!("{}: render new frame", o.config.name);
let meta = o.config.backend.frame_meta().unwrap(); // want panic let meta = o.config.backend.frame_meta().unwrap(); // want panic
let wsi = o.ensure_swapchain_acquire(&app, &xr_state, meta.extent)?; let wsi = o.ensure_swapchain_acquire(&app, &xr_state, meta.extent)?;
let tgt = RenderTarget { views: wsi.views }; let tgt = RenderTarget { views: wsi.views };
@@ -410,7 +415,10 @@ pub fn openxr_run(show_by_default: bool, headless: bool) -> Result<(), BackendEr
o.data.last_alpha = alpha; o.data.last_alpha = alpha;
futures.execute_results(rdr.end()?)?; futures.execute_results(rdr.end()?)?;
} else if o.data.swapchain.is_none() { } else if o.data.swapchain.is_none() {
log::trace!("{}: not showing due to missing swapchain", o.config.name);
continue; continue;
} else {
log::trace!("{}: showing stale frame", o.config.name);
} }
o.data.cur_visible = true; o.data.cur_visible = true;
} }

View File

@@ -174,11 +174,14 @@ pub(super) fn setup_custom_button<S: 'static>(
return Ok(EventResult::Pass); return Ok(EventResult::Pass);
} }
let name = crate::overlays::mirror::new_mirror_name(); let name = crate::overlays::screen::mirror::new_mirror_name();
app.tasks.enqueue(TaskType::Overlay(OverlayTask::Create( app.tasks.enqueue(TaskType::Overlay(OverlayTask::Create(
OverlaySelector::Name(name.clone()), OverlaySelector::Name(name.clone()),
Box::new(move |app| { Box::new(move |app| {
Some(crate::overlays::mirror::new_mirror(name, &app.session)) Some(crate::overlays::screen::mirror::new_mirror(
name,
&app.session,
))
}), }),
))); )));
Ok(EventResult::Consumed) Ok(EventResult::Consumed)

View File

@@ -2,8 +2,6 @@ pub mod anchor;
pub mod custom; pub mod custom;
pub mod edit; pub mod edit;
pub mod keyboard; pub mod keyboard;
#[cfg(feature = "wayland")]
pub mod mirror;
pub mod screen; pub mod screen;
pub mod toast; pub mod toast;
pub mod watch; pub mod watch;

View File

@@ -215,6 +215,7 @@ impl OverlayBackend for ScreenBackend {
Ok(ShouldRender::Can) Ok(ShouldRender::Can)
} }
} else { } else {
log::trace!("{}: backend ready, but no image received.", self.name);
Ok(ShouldRender::Unable) Ok(ShouldRender::Unable)
} }
} }

View File

@@ -8,7 +8,10 @@ use std::{
use futures::{Future, FutureExt}; use futures::{Future, FutureExt};
use glam::{Affine2, Affine3A, Quat, Vec3, vec3}; use glam::{Affine2, Affine3A, Quat, Vec3, vec3};
use wlx_capture::pipewire::{PipewireCapture, PipewireSelectScreenResult, pipewire_select_screen}; use wlx_capture::{
WlxCapture,
pipewire::{PipewireCapture, PipewireSelectScreenResult, pipewire_select_screen},
};
use wlx_common::{ use wlx_common::{
overlays::{BackendAttrib, BackendAttribValue}, overlays::{BackendAttrib, BackendAttribValue},
windowing::OverlayWindowState, windowing::OverlayWindowState,
@@ -19,6 +22,7 @@ use crate::{
input::{HoverResult, PointerHit}, input::{HoverResult, PointerHit},
task::{OverlayTask, TaskType}, task::{OverlayTask, TaskType},
}, },
overlays::screen::capture::{MainThreadWlxCapture, new_wlx_capture},
state::{AppSession, AppState}, state::{AppSession, AppState},
subsystem::hid::WheelDelta, subsystem::hid::WheelDelta,
windowing::{ windowing::{
@@ -31,7 +35,7 @@ use crate::{
}, },
}; };
use super::screen::backend::ScreenBackend; use super::backend::ScreenBackend;
type PinnedSelectorFuture = core::pin::Pin< type PinnedSelectorFuture = core::pin::Pin<
Box<dyn Future<Output = Result<PipewireSelectScreenResult, wlx_capture::pipewire::AshpdError>>>, Box<dyn Future<Output = Result<PipewireSelectScreenResult, wlx_capture::pipewire::AshpdError>>>,
>; >;
@@ -76,13 +80,21 @@ impl OverlayBackend for MirrorBackend {
match maybe_pw_result { match maybe_pw_result {
Ok(pw_result) => { Ok(pw_result) => {
log::debug!(
"{}: PipeWire result streams: {:?}",
self.name,
&pw_result.streams
);
let node_id = pw_result.streams.first().unwrap().node_id; // streams guaranteed to have at least one element let node_id = pw_result.streams.first().unwrap().node_id; // streams guaranteed to have at least one element
log::info!("{}: PipeWire node selected: {}", self.name.clone(), node_id); log::info!("{}: PipeWire node selected: {}", self.name, node_id);
let capture = PipewireCapture::new(self.name.clone(), node_id); let capture = new_wlx_capture!(
app.gfx_extras.queue_capture,
PipewireCapture::new(self.name.clone(), node_id)
);
self.renderer = Some(ScreenBackend::new_raw( self.renderer = Some(ScreenBackend::new_raw(
self.name.clone(), self.name.clone(),
app.xr_backend, app.xr_backend,
Box::new(capture), capture,
)); ));
app.tasks.enqueue(TaskType::Overlay(OverlayTask::Modify( app.tasks.enqueue(TaskType::Overlay(OverlayTask::Modify(
OverlaySelector::Name(self.name.clone()), OverlaySelector::Name(self.name.clone()),

View File

@@ -15,6 +15,8 @@ use crate::{
pub mod backend; pub mod backend;
mod capture; mod capture;
#[cfg(feature = "wayland")]
pub mod mirror;
#[cfg(feature = "pipewire")] #[cfg(feature = "pipewire")]
pub mod pw; pub mod pw;
#[cfg(feature = "wayland")] #[cfg(feature = "wayland")]

View File

@@ -42,6 +42,12 @@ impl ScreenBackend {
false, false,
)?; )?;
log::debug!(
"{}: PipeWire result streams: {:?}",
output.name,
&select_screen_result.streams
);
let node_id = select_screen_result.streams.first().unwrap().node_id; // streams guaranteed to have at least one element let node_id = select_screen_result.streams.first().unwrap().node_id; // streams guaranteed to have at least one element
let capture = new_wlx_capture!( let capture = new_wlx_capture!(

View File

@@ -27,6 +27,7 @@ pub struct FrameMeta {
pub clear: WGfxClearMode, pub clear: WGfxClearMode,
} }
#[derive(Debug, Clone, Copy)]
pub enum ShouldRender { pub enum ShouldRender {
/// The overlay is dirty and needs to be rendered. /// The overlay is dirty and needs to be rendered.
Should, Should,