render/blur: Fix transformed outputs

This commit is contained in:
Victoria Brekenfeld 2026-05-22 16:09:53 +02:00 committed by Victoria Brekenfeld
parent b890f7b0fa
commit 58938ef8ee

View file

@ -482,23 +482,30 @@ fn blit_from_active_fb(
to_texture: &mut GlesTexture, to_texture: &mut GlesTexture,
) -> Result<SyncPoint, GlesError> { ) -> Result<SyncPoint, GlesError> {
if transform != Transform::Normal { if transform != Transform::Normal {
let dst = dst
.to_logical(1)
.to_buffer(1, transform, &frame.output_size().to_logical(1));
let tex_size = to_texture let tex_size = to_texture
.size() .size()
.to_logical(1, Transform::Normal) .to_logical(1, Transform::Normal)
.to_physical(1); .to_physical(1);
let mut renderer = frame.renderer(); let mut renderer = frame.renderer();
let mut tmp_texture = renderer.as_mut().create_buffer( let mut tmp_texture = renderer
Fourcc::Abgr8888, .as_mut()
dst.size.to_logical(1).to_buffer(1, Transform::Normal), .create_buffer(Fourcc::Abgr8888, dst.size)?;
)?;
let mut fb_tmp = renderer.as_mut().bind(&mut tmp_texture)?; let mut fb_tmp = renderer.as_mut().bind(&mut tmp_texture)?;
let mut fb = renderer.as_mut().bind(to_texture)?; let mut fb = renderer.as_mut().bind(to_texture)?;
std::mem::drop(renderer); std::mem::drop(renderer);
// TODO: Why does blit not take buffer coordinates?
let dst_phys = Rectangle::<_, Physical>::new(
Point::new(dst.loc.x, dst.loc.y),
dst.size.to_logical(1, Transform::Normal).to_physical(1),
);
let sync = frame.blit_to( let sync = frame.blit_to(
&mut fb_tmp, &mut fb_tmp,
dst, dst_phys,
Rectangle::from_size(dst.size), Rectangle::from_size(dst_phys.size),
TextureFilter::Linear, TextureFilter::Linear,
)?; )?;
std::mem::drop(fb_tmp); std::mem::drop(fb_tmp);
@ -511,18 +518,13 @@ fn blit_from_active_fb(
Frame::render_texture_from_to( Frame::render_texture_from_to(
&mut frame, &mut frame,
&tmp_texture, &tmp_texture,
Rectangle::from_size( Rectangle::from_size(dst.size.to_f64()),
dst.size
.to_logical(1)
.to_buffer(1, Transform::Normal)
.to_f64(),
),
src.to_logical(1., Transform::Normal, &src.size) src.to_logical(1., Transform::Normal, &src.size)
.to_physical(1.) .to_physical(1.)
.to_i32_round(), .to_i32_round(),
&[Rectangle::from_size(dst.size)], &[Rectangle::from_size(dst_phys.size)],
&[Rectangle::from_size(dst.size)], &[Rectangle::from_size(dst_phys.size)],
transform, transform.invert(),
1.0, 1.0,
)?; )?;
std::mem::drop(tmp_texture); std::mem::drop(tmp_texture);