Skip to content

Commit 197404f

Browse files
committed
screencopy: Use "buffer age" of 1 for capture
The logic `age_for_buffer` used seems to be a misinterpretation of the protocol. The wording is a little unclear, but it seems tracking buffer age is the responsibility of the client, and the client is required to accumulate damage and pass it in `damage_buffer`. Our clients initially weren't doing that correctly. I updated xdg-desktop-portal-cosmic to use `damage_buffer` after testing on wlroots, and cosmic-workspaces was recently updated as well.
1 parent a4cd07e commit 197404f

File tree

3 files changed

+6
-49
lines changed

3 files changed

+6
-49
lines changed

src/backend/kms/surface/mod.rs

Lines changed: 2 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1345,13 +1345,6 @@ impl SurfaceThreadState {
13451345
(&session, frame, res),
13461346
now.into(),
13471347
) {
1348-
session
1349-
.user_data()
1350-
.get::<SessionData>()
1351-
.unwrap()
1352-
.lock()
1353-
.unwrap()
1354-
.reset();
13551348
tracing::warn!(?err, "Failed to screencopy");
13561349
}
13571350
}
@@ -1380,14 +1373,7 @@ impl SurfaceThreadState {
13801373
}
13811374
}
13821375
Err(err) => {
1383-
for (session, frame, _) in frames {
1384-
session
1385-
.user_data()
1386-
.get::<SessionData>()
1387-
.unwrap()
1388-
.lock()
1389-
.unwrap()
1390-
.reset();
1376+
for (_session, frame, _) in frames {
13911377
frame.fail(FailureReason::Unknown);
13921378
}
13931379
return Err(err).with_context(|| "Failed to submit result for display");
@@ -1613,7 +1599,7 @@ fn take_screencopy_frames(
16131599
// TODO re-use offscreen buffer to damage track screencopy to shm
16141600
0
16151601
} else {
1616-
damage_tracking.age_for_buffer(&buffer)
1602+
1
16171603
};
16181604

16191605
if !additional_damage.is_empty() {

src/wayland/handlers/screencopy/render.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -223,7 +223,7 @@ where
223223
// TODO re-use offscreen buffer to damage track screencopy to shm
224224
0
225225
} else {
226-
session_damage_tracking.age_for_buffer(&buffer)
226+
1
227227
};
228228
let mut fb = offscreen
229229
.as_mut()

src/wayland/handlers/screencopy/user_data.rs

Lines changed: 3 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,6 @@
1-
use std::{cell::RefCell, collections::HashMap, sync::Mutex};
1+
use std::{cell::RefCell, sync::Mutex};
22

3-
use smithay::{
4-
backend::renderer::{damage::OutputDamageTracker, utils::CommitCounter},
5-
output::Output,
6-
reexports::wayland_server::{protocol::wl_buffer::WlBuffer, Resource, Weak},
7-
};
3+
use smithay::{backend::renderer::damage::OutputDamageTracker, output::Output};
84

95
use crate::{
106
shell::{CosmicSurface, Workspace},
@@ -20,36 +16,11 @@ pub type SessionData = Mutex<SessionUserData>;
2016

2117
pub struct SessionUserData {
2218
pub dt: OutputDamageTracker,
23-
commit_counter: CommitCounter,
24-
buffer_age: HashMap<Weak<WlBuffer>, CommitCounter>,
2519
}
2620

2721
impl SessionUserData {
2822
pub fn new(tracker: OutputDamageTracker) -> SessionUserData {
29-
SessionUserData {
30-
dt: tracker,
31-
commit_counter: CommitCounter::default(),
32-
buffer_age: HashMap::new(),
33-
}
34-
}
35-
36-
pub fn age_for_buffer(&mut self, buffer: &WlBuffer) -> usize {
37-
self.buffer_age.retain(|k, _| k.upgrade().is_ok());
38-
39-
let weak = buffer.downgrade();
40-
let age = self
41-
.commit_counter
42-
.distance(self.buffer_age.get(&weak).copied())
43-
.unwrap_or(0);
44-
self.buffer_age.insert(weak, self.commit_counter);
45-
46-
self.commit_counter.increment();
47-
age
48-
}
49-
50-
pub fn reset(&mut self) {
51-
self.commit_counter = CommitCounter::default();
52-
self.buffer_age.clear();
23+
SessionUserData { dt: tracker }
5324
}
5425
}
5526

0 commit comments

Comments
 (0)