kms/surface: Fix transform used for blits
Use the same logic used `submit_buffer`. This fixes corruption in OBS when trying to capture a rotated output.
This commit is contained in:
parent
9cc68dcbcc
commit
3f74a22cca
1 changed files with 18 additions and 14 deletions
|
|
@ -1657,6 +1657,11 @@ fn send_screencopy_result<'a>(
|
||||||
let mut render_buffer;
|
let mut render_buffer;
|
||||||
let buffer = frame.buffer();
|
let buffer = frame.buffer();
|
||||||
let mut shm_buffer = false;
|
let mut shm_buffer = false;
|
||||||
|
let buffer_size = buffer_dimensions(&buffer).ok_or(RenderError::<
|
||||||
|
<GlMultiRenderer as RendererSuper>::Error,
|
||||||
|
>::Rendering(
|
||||||
|
MultiError::ImportFailed
|
||||||
|
))?;
|
||||||
let mut fb = if let Ok(dmabuf) = get_dmabuf(&buffer) {
|
let mut fb = if let Ok(dmabuf) = get_dmabuf(&buffer) {
|
||||||
dmabuf_clone = dmabuf.clone();
|
dmabuf_clone = dmabuf.clone();
|
||||||
Some(
|
Some(
|
||||||
|
|
@ -1666,10 +1671,6 @@ fn send_screencopy_result<'a>(
|
||||||
)
|
)
|
||||||
} else {
|
} else {
|
||||||
shm_buffer = true;
|
shm_buffer = true;
|
||||||
let size =
|
|
||||||
buffer_dimensions(&buffer).ok_or(RenderError::<
|
|
||||||
<GlMultiRenderer as RendererSuper>::Error,
|
|
||||||
>::Rendering(MultiError::ImportFailed))?;
|
|
||||||
let format = with_buffer_contents(&buffer, |_, _, data| shm_format_to_fourcc(data.format))
|
let format = with_buffer_contents(&buffer, |_, _, data| shm_format_to_fourcc(data.format))
|
||||||
.map_err(|_| OutputNoMode)? // eh, we have to do some error
|
.map_err(|_| OutputNoMode)? // eh, we have to do some error
|
||||||
.expect("We should be able to convert all hardcoded shm screencopy formats");
|
.expect("We should be able to convert all hardcoded shm screencopy formats");
|
||||||
|
|
@ -1682,8 +1683,9 @@ fn send_screencopy_result<'a>(
|
||||||
{
|
{
|
||||||
None
|
None
|
||||||
} else {
|
} else {
|
||||||
render_buffer = Offscreen::<GlesRenderbuffer>::create_buffer(renderer, format, size)
|
render_buffer =
|
||||||
.map_err(RenderError::<<GlMultiRenderer as RendererSuper>::Error>::Rendering)?;
|
Offscreen::<GlesRenderbuffer>::create_buffer(renderer, format, buffer_size)
|
||||||
|
.map_err(RenderError::<<GlMultiRenderer as RendererSuper>::Error>::Rendering)?;
|
||||||
Some(
|
Some(
|
||||||
renderer
|
renderer
|
||||||
.bind(&mut render_buffer)
|
.bind(&mut render_buffer)
|
||||||
|
|
@ -1716,14 +1718,16 @@ fn send_screencopy_result<'a>(
|
||||||
let adjusted = damage
|
let adjusted = damage
|
||||||
.iter()
|
.iter()
|
||||||
.copied()
|
.copied()
|
||||||
.map(|mut d| {
|
.map(|rect| {
|
||||||
d.size = d
|
let logical = rect.to_logical(1);
|
||||||
.size
|
logical
|
||||||
.to_logical(1)
|
.to_buffer(
|
||||||
.to_buffer(1, output_transform)
|
1,
|
||||||
.to_logical(1, Transform::Normal)
|
output_transform.invert(),
|
||||||
.to_physical(1);
|
&buffer_size.to_logical(1, output_transform),
|
||||||
d
|
)
|
||||||
|
.to_logical(1, Transform::Normal, &buffer_size)
|
||||||
|
.to_physical(1)
|
||||||
})
|
})
|
||||||
.collect::<Vec<_>>();
|
.collect::<Vec<_>>();
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue