diff options
| author | Ivan Molodetskikh <yalterz@gmail.com> | 2025-03-01 09:45:57 +0300 |
|---|---|---|
| committer | Ivan Molodetskikh <yalterz@gmail.com> | 2025-03-10 07:59:14 +0300 |
| commit | b351f6ff220560d96a260d8dd3ad794000923481 (patch) | |
| tree | f2bd1a777fe9f932fea2cfeba3677cbb39b634eb /src/render_helpers | |
| parent | 12817a682d666e81e30b5a723d6419baf74cdb1c (diff) | |
| download | niri-b351f6ff220560d96a260d8dd3ad794000923481.tar.gz niri-b351f6ff220560d96a260d8dd3ad794000923481.tar.bz2 niri-b351f6ff220560d96a260d8dd3ad794000923481.zip | |
Keep track of RenderElementStates in offscreens
This both avoids sending frame callbacks to surfaces invisible on the offscreen
(fixing Firefox with subsurface compositing in the process), and fixes
searching for split popups during the resize animation.
Diffstat (limited to 'src/render_helpers')
| -rw-r--r-- | src/render_helpers/offscreen.rs | 21 |
1 files changed, 18 insertions, 3 deletions
diff --git a/src/render_helpers/offscreen.rs b/src/render_helpers/offscreen.rs index 62c123ea..71959404 100644 --- a/src/render_helpers/offscreen.rs +++ b/src/render_helpers/offscreen.rs @@ -4,7 +4,9 @@ use anyhow::Context as _; use smithay::backend::allocator::Fourcc; use smithay::backend::renderer::damage::OutputDamageTracker; use smithay::backend::renderer::element::utils::{Relocate, RelocateRenderElement}; -use smithay::backend::renderer::element::{Element, Id, Kind, RenderElement, UnderlyingStorage}; +use smithay::backend::renderer::element::{ + Element, Id, Kind, RenderElement, RenderElementStates, UnderlyingStorage, +}; use smithay::backend::renderer::gles::{GlesError, GlesFrame, GlesRenderer, GlesTexture}; use smithay::backend::renderer::sync::SyncPoint; use smithay::backend::renderer::utils::{ @@ -57,13 +59,21 @@ pub struct OffscreenRenderElement { kind: Kind, } +#[derive(Debug)] +pub struct OffscreenData { + /// Id of the offscreen element. + pub id: Id, + /// States for the render into the offscreen buffer. + pub states: RenderElementStates, +} + impl OffscreenBuffer { pub fn render( &self, renderer: &mut GlesRenderer, scale: Scale<f64>, elements: &[impl RenderElement<GlesRenderer>], - ) -> anyhow::Result<(OffscreenRenderElement, SyncPoint)> { + ) -> anyhow::Result<(OffscreenRenderElement, SyncPoint, OffscreenData)> { let _span = tracy_client::span!("OffscreenBuffer::render"); let geo = encompassing_geo(scale, elements.iter()); @@ -179,7 +189,12 @@ impl OffscreenBuffer { kind: Kind::Unspecified, }; - Ok((elem, res.sync)) + let data = OffscreenData { + id: self.id.clone(), + states: res.states, + }; + + Ok((elem, res.sync, data)) } } |
