1
0
Fork 0
forked from wry/wry

screencast: fix rendering of hw cursor on scaled/transformed outputs

This commit is contained in:
Julian Orth 2024-09-21 12:07:04 +02:00
parent 13f54ff2de
commit b861af9675
3 changed files with 16 additions and 7 deletions

View file

@ -333,12 +333,14 @@ impl JayScreencast {
&buffer.fb, &buffer.fb,
AcquireSync::Implicit, AcquireSync::Implicit,
ReleaseSync::Implicit, ReleaseSync::Implicit,
Transform::None,
on.global.pos.get(), on.global.pos.get(),
render_hardware_cursors, render_hardware_cursors,
x_off, x_off,
y_off, y_off,
size, size,
on.global.persistent.transform.get(), on.global.persistent.transform.get(),
on.global.persistent.scale.get(),
); );
match res { match res {
Ok(_) => { Ok(_) => {

View file

@ -937,20 +937,22 @@ impl State {
target: &Rc<dyn GfxFramebuffer>, target: &Rc<dyn GfxFramebuffer>,
target_acquire_sync: AcquireSync, target_acquire_sync: AcquireSync,
target_release_sync: ReleaseSync, target_release_sync: ReleaseSync,
target_transform: Transform,
position: Rect, position: Rect,
render_hardware_cursors: bool, render_hardware_cursors: bool,
x_off: i32, x_off: i32,
y_off: i32, y_off: i32,
size: Option<(i32, i32)>, size: Option<(i32, i32)>,
transform: Transform, transform: Transform,
scale: Scale,
) -> Result<Option<SyncFile>, GfxError> { ) -> Result<Option<SyncFile>, GfxError> {
let mut ops = vec![]; let mut ops = vec![];
let mut renderer = Renderer { let mut renderer = Renderer {
base: target.renderer_base(&mut ops, Scale::from_int(1), Transform::None), base: target.renderer_base(&mut ops, scale, target_transform),
state: self, state: self,
logical_extents: position.at_point(0, 0), logical_extents: position.at_point(0, 0),
pixel_extents: { pixel_extents: {
let (width, height) = target.logical_size(Transform::None); let (width, height) = target.logical_size(target_transform);
Rect::new_sized(0, 0, width, height).unwrap() Rect::new_sized(0, 0, width, height).unwrap()
}, },
}; };
@ -963,7 +965,7 @@ impl State {
y_off, y_off,
Some(sample_rect), Some(sample_rect),
size, size,
Scale::from_int(1), scale,
None, None,
resv.cloned(), resv.cloned(),
acquire_sync.clone(), acquire_sync.clone(),
@ -1013,14 +1015,14 @@ impl State {
stride: i32, stride: i32,
format: &'static Format, format: &'static Format,
transform: Transform, transform: Transform,
scale: Scale,
) -> Result<(), ShmScreencopyError> { ) -> Result<(), ShmScreencopyError> {
let (src_width, src_height) = src.size(); let (src_width, src_height) = src.size();
let mut needs_copy = capture.rect.x1() < x_off let mut needs_copy = capture.rect.x1() < x_off
|| capture.rect.x2() > x_off + src_width || capture.rect.x2() > x_off + src_width
|| capture.rect.y1() < y_off || capture.rect.y1() < y_off
|| capture.rect.y2() > y_off + src_height || capture.rect.y2() > y_off + src_height
|| self.have_hardware_cursor() || self.have_hardware_cursor();
|| transform != Transform::None;
if let Some((target_width, target_height)) = size { if let Some((target_width, target_height)) = size {
if (target_width, target_height) != (src_width, src_height) { if (target_width, target_height) != (src_width, src_height) {
needs_copy = true; needs_copy = true;
@ -1041,12 +1043,14 @@ impl State {
&fb, &fb,
AcquireSync::Unnecessary, AcquireSync::Unnecessary,
ReleaseSync::None, ReleaseSync::None,
transform,
position, position,
true, true,
x_off - capture.rect.x1(), x_off - capture.rect.x1(),
y_off - capture.rect.y1(), y_off - capture.rect.y1(),
size, size,
transform, transform,
scale,
) )
.map_err(ShmScreencopyError::CopyToTemporary)?; .map_err(ShmScreencopyError::CopyToTemporary)?;
mem.access(|mem| { mem.access(|mem| {

View file

@ -266,7 +266,8 @@ impl OutputNode {
mem, mem,
*stride, *stride,
wl_buffer.format, wl_buffer.format,
Transform::None, self.global.persistent.transform.get(),
self.global.persistent.scale.get(),
); );
if let Err(e) = res { if let Err(e) = res {
log::warn!("Could not perform shm screencopy: {}", ErrorFmt(e)); log::warn!("Could not perform shm screencopy: {}", ErrorFmt(e));
@ -291,12 +292,14 @@ impl OutputNode {
&fb, &fb,
AcquireSync::Implicit, AcquireSync::Implicit,
ReleaseSync::Implicit, ReleaseSync::Implicit,
self.global.persistent.transform.get(),
self.global.pos.get(), self.global.pos.get(),
render_hardware_cursors, render_hardware_cursors,
x_off - capture.rect.x1(), x_off - capture.rect.x1(),
y_off - capture.rect.y1(), y_off - capture.rect.y1(),
size, size,
Transform::None, self.global.persistent.transform.get(),
self.global.persistent.scale.get(),
); );
if let Err(e) = res { if let Err(e) = res {
log::warn!("Could not perform screencopy: {}", ErrorFmt(e)); log::warn!("Could not perform screencopy: {}", ErrorFmt(e));