aboutsummaryrefslogtreecommitdiff
path: root/src/render_helpers
diff options
context:
space:
mode:
authorIvan Molodetskikh <yalterz@gmail.com>2025-03-01 09:45:57 +0300
committerIvan Molodetskikh <yalterz@gmail.com>2025-03-10 07:59:14 +0300
commitb351f6ff220560d96a260d8dd3ad794000923481 (patch)
treef2bd1a777fe9f932fea2cfeba3677cbb39b634eb /src/render_helpers
parent12817a682d666e81e30b5a723d6419baf74cdb1c (diff)
downloadniri-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.rs21
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))
}
}