diff --git a/src/backend/renderer/damage/mod.rs b/src/backend/renderer/damage/mod.rs index 28cba57d3643..45bea24465f8 100644 --- a/src/backend/renderer/damage/mod.rs +++ b/src/backend/renderer/damage/mod.rs @@ -79,6 +79,10 @@ //! # unimplemented!() //! # } //! # fn finish(self) -> Result { unimplemented!() } +//! # fn set_downscale_filter(&mut self, _filter: TextureFilter) {} +//! # fn set_upscale_filter(&mut self, _filter: TextureFilter) {} +//! # fn downscale_filter(&self) -> TextureFilter { unimplemented!() } +//! # fn upscale_filter(&self) -> TextureFilter { unimplemented!() } //! # } //! # //! # #[derive(Debug)] diff --git a/src/backend/renderer/element/memory.rs b/src/backend/renderer/element/memory.rs index 533f46333078..3a6574cbd799 100644 --- a/src/backend/renderer/element/memory.rs +++ b/src/backend/renderer/element/memory.rs @@ -75,6 +75,10 @@ //! # unimplemented!() //! # } //! # fn finish(self) -> Result { unimplemented!() } +//! # fn set_downscale_filter(&mut self, _filter: TextureFilter) {} +//! # fn set_upscale_filter(&mut self, _filter: TextureFilter) {} +//! # fn downscale_filter(&self) -> TextureFilter { unimplemented!() } +//! # fn upscale_filter(&self) -> TextureFilter { unimplemented!() } //! # } //! # //! # #[derive(Debug)] diff --git a/src/backend/renderer/element/mod.rs b/src/backend/renderer/element/mod.rs index a98bbdaaed83..957511f6c112 100644 --- a/src/backend/renderer/element/mod.rs +++ b/src/backend/renderer/element/mod.rs @@ -1292,6 +1292,10 @@ macro_rules! render_elements_internal { /// # unimplemented!() /// # } /// # fn finish(self) -> Result { unimplemented!() } +/// # fn set_downscale_filter(&mut self, _filter: TextureFilter) {} +/// # fn set_upscale_filter(&mut self, _filter: TextureFilter) {} +/// # fn downscale_filter(&self) -> TextureFilter { unimplemented!() } +/// # fn upscale_filter(&self) -> TextureFilter { unimplemented!() } /// # } /// # /// # #[derive(Debug)] diff --git a/src/backend/renderer/element/solid.rs b/src/backend/renderer/element/solid.rs index e15e70505cac..bc70aefb916a 100644 --- a/src/backend/renderer/element/solid.rs +++ b/src/backend/renderer/element/solid.rs @@ -62,6 +62,10 @@ //! # fn finish(self) -> Result { //! # unimplemented!() //! # } +//! # fn set_downscale_filter(&mut self, _filter: TextureFilter) {} +//! # fn set_upscale_filter(&mut self, _filter: TextureFilter) {} +//! # fn downscale_filter(&self) -> TextureFilter { unimplemented!() } +//! # fn upscale_filter(&self) -> TextureFilter { unimplemented!() } //! # } //! # //! # #[derive(Debug)] diff --git a/src/backend/renderer/element/surface.rs b/src/backend/renderer/element/surface.rs index e971d9b33fec..fedba76202b8 100644 --- a/src/backend/renderer/element/surface.rs +++ b/src/backend/renderer/element/surface.rs @@ -78,6 +78,10 @@ //! # unimplemented!() //! # } //! # fn finish(self) -> Result { unimplemented!() } +//! # fn set_downscale_filter(&mut self, _filter: TextureFilter) {} +//! # fn set_upscale_filter(&mut self, _filter: TextureFilter) {} +//! # fn downscale_filter(&self) -> TextureFilter { unimplemented!() } +//! # fn upscale_filter(&self) -> TextureFilter { unimplemented!() } //! # } //! # //! # #[derive(Debug)] diff --git a/src/backend/renderer/element/texture.rs b/src/backend/renderer/element/texture.rs index 928bd16c97c4..9bfcd0b7476a 100644 --- a/src/backend/renderer/element/texture.rs +++ b/src/backend/renderer/element/texture.rs @@ -93,6 +93,10 @@ //! # unimplemented!() //! # } //! # fn finish(self) -> Result { unimplemented!() } +//! # fn set_downscale_filter(&mut self, _filter: TextureFilter) {} +//! # fn set_upscale_filter(&mut self, _filter: TextureFilter) {} +//! # fn downscale_filter(&self) -> TextureFilter { unimplemented!() } +//! # fn upscale_filter(&self) -> TextureFilter { unimplemented!() } //! # } //! # //! # #[derive(Debug)] @@ -250,6 +254,10 @@ //! # unimplemented!() //! # } //! # fn finish(self) -> Result { unimplemented!() } +//! # fn set_downscale_filter(&mut self, _filter: TextureFilter) {} +//! # fn set_upscale_filter(&mut self, _filter: TextureFilter) {} +//! # fn downscale_filter(&self) -> TextureFilter { unimplemented!() } +//! # fn upscale_filter(&self) -> TextureFilter { unimplemented!() } //! # } //! # //! # #[derive(Debug)] diff --git a/src/backend/renderer/gles/mod.rs b/src/backend/renderer/gles/mod.rs index 3a37fc91fddd..37b8ec63409d 100644 --- a/src/backend/renderer/gles/mod.rs +++ b/src/backend/renderer/gles/mod.rs @@ -2529,6 +2529,22 @@ impl<'frame> Frame for GlesFrame<'frame> { fn wait(&mut self, sync: &SyncPoint) -> Result<(), Self::Error> { self.renderer.wait(sync) } + + fn set_downscale_filter(&mut self, filter: TextureFilter) { + self.renderer.min_filter = filter; + } + + fn set_upscale_filter(&mut self, filter: TextureFilter) { + self.renderer.max_filter = filter; + } + + fn downscale_filter(&self) -> TextureFilter { + self.renderer.min_filter + } + + fn upscale_filter(&self) -> TextureFilter { + self.renderer.max_filter + } } impl<'frame> GlesFrame<'frame> { diff --git a/src/backend/renderer/glow.rs b/src/backend/renderer/glow.rs index 37e62c5e3158..58d39b8109f8 100644 --- a/src/backend/renderer/glow.rs +++ b/src/backend/renderer/glow.rs @@ -315,6 +315,22 @@ impl<'frame> Frame for GlowFrame<'frame> { fn wait(&mut self, sync: &sync::SyncPoint) -> Result<(), Self::Error> { self.frame.as_mut().unwrap().wait(sync) } + + fn set_downscale_filter(&mut self, filter: TextureFilter) { + self.frame.as_mut().unwrap().set_downscale_filter(filter); + } + + fn set_upscale_filter(&mut self, filter: TextureFilter) { + self.frame.as_mut().unwrap().set_upscale_filter(filter); + } + + fn downscale_filter(&self) -> TextureFilter { + self.frame.as_ref().unwrap().downscale_filter() + } + + fn upscale_filter(&self) -> TextureFilter { + self.frame.as_ref().unwrap().upscale_filter() + } } impl<'frame> GlowFrame<'frame> { diff --git a/src/backend/renderer/mod.rs b/src/backend/renderer/mod.rs index 739e6ffc924e..fbfa55c1b826 100644 --- a/src/backend/renderer/mod.rs +++ b/src/backend/renderer/mod.rs @@ -242,6 +242,17 @@ pub trait Frame { /// Leaking might make the renderer return Errors and force it's recreation. /// Leaking may not cause otherwise undefined behavior and program execution will always continue normally. fn finish(self) -> Result; + + /// Set the filter method to be used when rendering a texture into a smaller area than its + /// size. + fn set_downscale_filter(&mut self, filter: TextureFilter); + /// Set the filter method to be used when rendering a texture into a larger area than its size. + fn set_upscale_filter(&mut self, filter: TextureFilter); + + /// Get the current downscale filter. + fn downscale_filter(&self) -> TextureFilter; + /// Get the current upscale filter. + fn upscale_filter(&self) -> TextureFilter; } bitflags::bitflags! { diff --git a/src/backend/renderer/multigpu/mod.rs b/src/backend/renderer/multigpu/mod.rs index 977bb65361db..fa758271ac2c 100644 --- a/src/backend/renderer/multigpu/mod.rs +++ b/src/backend/renderer/multigpu/mod.rs @@ -1556,6 +1556,22 @@ where fn wait(&mut self, sync: &sync::SyncPoint) -> Result<(), Self::Error> { self.frame.as_mut().unwrap().wait(sync).map_err(Error::Render) } + + fn set_downscale_filter(&mut self, filter: TextureFilter) { + self.frame.as_mut().unwrap().set_downscale_filter(filter); + } + + fn set_upscale_filter(&mut self, filter: TextureFilter) { + self.frame.as_mut().unwrap().set_upscale_filter(filter); + } + + fn downscale_filter(&self) -> TextureFilter { + self.frame.as_ref().unwrap().downscale_filter() + } + + fn upscale_filter(&self) -> TextureFilter { + self.frame.as_ref().unwrap().upscale_filter() + } } #[cfg(feature = "wayland_frontend")] diff --git a/src/backend/renderer/pixman/mod.rs b/src/backend/renderer/pixman/mod.rs index e692d9766398..fd7de31a43db 100644 --- a/src/backend/renderer/pixman/mod.rs +++ b/src/backend/renderer/pixman/mod.rs @@ -598,6 +598,22 @@ impl<'frame> Frame for PixmanFrame<'frame> { fn finish(mut self) -> Result { self.finish_internal() } + + fn set_downscale_filter(&mut self, filter: TextureFilter) { + self.renderer.downscale_filter = filter; + } + + fn set_upscale_filter(&mut self, filter: TextureFilter) { + self.renderer.upscale_filter = filter; + } + + fn downscale_filter(&self) -> TextureFilter { + self.renderer.downscale_filter + } + + fn upscale_filter(&self) -> TextureFilter { + self.renderer.upscale_filter + } } impl<'frame> PixmanFrame<'frame> { diff --git a/src/backend/renderer/test.rs b/src/backend/renderer/test.rs index 20af5bb733d7..3f1122c55d75 100644 --- a/src/backend/renderer/test.rs +++ b/src/backend/renderer/test.rs @@ -216,6 +216,15 @@ impl Frame for DummyFrame { fn finish(self) -> Result { Ok(SyncPoint::default()) } + + fn set_downscale_filter(&mut self, _filter: TextureFilter) {} + fn set_upscale_filter(&mut self, _filter: TextureFilter) {} + fn downscale_filter(&self) -> TextureFilter { + TextureFilter::Linear + } + fn upscale_filter(&self) -> TextureFilter { + TextureFilter::Linear + } } #[derive(Clone, Debug)]