Skip to content

Commit 8e51c71

Browse files
authored
Merge pull request #769 from mahkoh/jorth/fence
vulkan: use sync objects if possible
2 parents 19edb3e + 3d3132f commit 8e51c71

39 files changed

+1314
-434
lines changed

src/backend.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ use {
99
drm_feedback::DrmFeedback,
1010
fixed::Fixed,
1111
format::Format,
12-
gfx_api::{GfxApi, GfxFramebuffer, SyncFile},
12+
gfx_api::{FdSync, GfxApi, GfxFramebuffer},
1313
ifs::{
1414
wl_output::OutputId,
1515
wl_seat::{
@@ -186,7 +186,7 @@ pub trait HardwareCursorUpdate {
186186
fn set_enabled(&mut self, enabled: bool);
187187
fn get_buffer(&self) -> Rc<dyn GfxFramebuffer>;
188188
fn set_position(&mut self, x: i32, y: i32);
189-
fn swap_buffer(&mut self, sync_file: Option<SyncFile>);
189+
fn swap_buffer(&mut self, sync: Option<FdSync>);
190190
fn size(&self) -> (i32, i32);
191191
}
192192

src/backends/metal/allocator.rs

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@ use {
1111
},
1212
format::Format,
1313
gfx_api::{
14-
AcquireSync, GfxBlendBuffer, GfxError, GfxFormat, GfxFramebuffer, GfxTexture,
15-
GfxWriteModifier, ReleaseSync, SyncFile, needs_render_usage,
14+
AcquireSync, FdSync, GfxBlendBuffer, GfxError, GfxFormat, GfxFramebuffer, GfxTexture,
15+
GfxWriteModifier, ReleaseSync, needs_render_usage,
1616
},
1717
rect::{DamageQueue, Rect, Region},
1818
udmabuf::{Udmabuf, UdmabufError},
@@ -120,15 +120,15 @@ pub enum RenderBufferError {
120120

121121
#[derive(Default)]
122122
pub struct RenderBufferCopy {
123-
pub render_block: Option<SyncFile>,
124-
pub present_block: Option<SyncFile>,
123+
pub render_block: Option<FdSync>,
124+
pub present_block: Option<FdSync>,
125125
}
126126

127127
impl RenderBufferCopy {
128-
pub fn for_both(sf: Option<SyncFile>) -> Self {
128+
pub fn for_both(sync: Option<FdSync>) -> Self {
129129
Self {
130-
render_block: sf.clone(),
131-
present_block: sf,
130+
render_block: sync.clone(),
131+
present_block: sync,
132132
}
133133
}
134134
}
@@ -138,12 +138,12 @@ impl RenderBuffer {
138138
&self,
139139
cd: &Rc<ColorDescription>,
140140
region: Option<&Region>,
141-
sync_file: Option<SyncFile>,
141+
sync: Option<FdSync>,
142142
) -> Result<RenderBufferCopy, RenderBufferError> {
143143
match &self.prime {
144144
RenderBufferPrime::None => Ok(RenderBufferCopy {
145145
render_block: None,
146-
present_block: sync_file,
146+
present_block: sync,
147147
}),
148148
RenderBufferPrime::Sampling {
149149
dev_render_tex,
@@ -157,7 +157,7 @@ impl RenderBuffer {
157157
dev_render_tex,
158158
cd,
159159
None,
160-
AcquireSync::from_sync_file(sync_file),
160+
AcquireSync::from_fd_sync(sync),
161161
ReleaseSync::None,
162162
0,
163163
0,
@@ -175,7 +175,7 @@ impl RenderBuffer {
175175
..
176176
} => {
177177
let render_block = render_copy
178-
.execute(sync_file.as_ref(), region)
178+
.execute(sync.as_ref(), region)
179179
.map_err(RenderBufferError::CopyRenderToUdmabuf)?;
180180
let present_block = dev_copy
181181
.execute(render_block.as_ref(), region)
@@ -189,7 +189,7 @@ impl RenderBuffer {
189189
| RenderBufferPrime::CopyDirectPush {
190190
render_copy: copy, ..
191191
} => copy
192-
.execute(sync_file.as_ref(), region)
192+
.execute(sync.as_ref(), region)
193193
.map_err(RenderBufferError::CopyRenderToDev)
194194
.map(RenderBufferCopy::for_both),
195195
}
@@ -201,8 +201,8 @@ impl RenderBuffer {
201201
self.damage_queue.damage(&[rect]);
202202
}
203203

204-
pub fn clear(&self, cd: &Rc<ColorDescription>) -> Result<Option<SyncFile>, RenderBufferError> {
205-
let sync_file = match &self.prime {
204+
pub fn clear(&self, cd: &Rc<ColorDescription>) -> Result<Option<FdSync>, RenderBufferError> {
205+
let sync = match &self.prime {
206206
RenderBufferPrime::None => {
207207
self.render
208208
.fb
@@ -222,14 +222,14 @@ impl RenderBuffer {
222222
self.copy_to_dev(cd, None, sf)?.present_block
223223
}
224224
};
225-
Ok(sync_file)
225+
Ok(sync)
226226
}
227227

228228
pub fn copy_to_new(
229229
&self,
230230
new: &Self,
231231
cd: &Rc<ColorDescription>,
232-
) -> Result<Option<SyncFile>, RenderBufferError> {
232+
) -> Result<Option<FdSync>, RenderBufferError> {
233233
let old = self;
234234

235235
if (old.width, old.height) != (new.width, new.height) {

src/backends/metal/present.rs

Lines changed: 15 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -240,13 +240,8 @@ impl MetalConnector {
240240
// current PresentFb if present_fb is None, potentially mutating the fb that is
241241
// currently being scanned out, which would render such a wait absurd.
242242
self.perform_screencopies(&present_fb, &node, &cd);
243-
if let Some(sync_file) = self.cursor_sync_file.take()
244-
&& let Err(e) = self.state.ring.readable(&sync_file).await
245-
{
246-
log::error!(
247-
"Could not wait for cursor sync file to complete: {}",
248-
ErrorFmt(e)
249-
);
243+
if let Some(sync) = self.cursor_sync.take() {
244+
sync.signaled(&self.state.ring, "cursor").await;
250245
}
251246
self.await_present_fb(present_fb.as_mut(), PresentFbWait::Scanout)
252247
.await;
@@ -353,19 +348,14 @@ impl MetalConnector {
353348
W::Render => &mut fb.copy.render_block,
354349
W::Scanout => &mut fb.copy.present_block,
355350
};
356-
let Some(sync_file) = field.take() else {
351+
let Some(sync) = field.take() else {
357352
return;
358353
};
359-
if let Err(e) = self.state.ring.readable(&sync_file).await {
360-
let name = match wait {
361-
W::Render => "render",
362-
W::Scanout => "scanout",
363-
};
364-
log::error!(
365-
"Could not wait for primary {name} sync file to complete: {}",
366-
ErrorFmt(e),
367-
);
368-
}
354+
let name = match wait {
355+
W::Render => "render",
356+
W::Scanout => "scanout",
357+
};
358+
sync.signaled(&self.state.ring, name).await;
369359
}
370360

371361
fn try_async_flip(&self) -> bool {
@@ -554,13 +544,13 @@ impl MetalConnector {
554544
self.state.present_hardware_cursor(node, &mut c);
555545
let swap_buffers = c.cursor_swap_buffer.is_some();
556546
self.cursor_swap_buffer.set(swap_buffers);
557-
if let Some(sf) = c.cursor_swap_buffer.take() {
558-
let sf = c
547+
if let Some(sync) = c.cursor_swap_buffer.take() {
548+
let sync = c
559549
.cursor_buffer
560-
.copy_to_dev(cd, None, sf)
550+
.copy_to_dev(cd, None, sync)
561551
.map_err(MetalError::CopyToDev)?
562552
.present_block;
563-
self.cursor_sync_file.set(sf);
553+
self.cursor_sync.set(sync);
564554
}
565555
let mut cursor_changed = false;
566556
cursor_changed |= self.cursor_enabled.replace(c.cursor_enabled) != c.cursor_enabled;
@@ -886,13 +876,13 @@ impl MetalConnector {
886876
tex = buffer.render.tex.clone();
887877
}
888878
Some(dsd) => {
889-
let sf = match &dsd.acquire_sync {
879+
let sync = match &dsd.acquire_sync {
890880
AcquireSync::None => None,
891881
AcquireSync::Implicit => None,
892-
AcquireSync::SyncFile { sync_file } => Some(sync_file.clone()),
882+
AcquireSync::FdSync(sync) => Some(sync.clone()),
893883
AcquireSync::Unnecessary => None,
894884
};
895-
copy = RenderBufferCopy::for_both(sf);
885+
copy = RenderBufferCopy::for_both(sync);
896886
fb = dsd.fb.clone();
897887
tex = dsd.tex.clone();
898888
}

src/backends/metal/transaction.rs

Lines changed: 5 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -242,7 +242,7 @@ impl MetalDeviceTransaction {
242242
let mut unused_crtcs = BinarySearchMap::<_, _, SIZE>::new();
243243
let mut unused_planes = BinarySearchMap::<_, _, SIZE>::new();
244244
let mut crtc_planes = BinarySearchMap::<_, _, SIZE>::new();
245-
let mut sync_files = vec![];
245+
let mut syncs = vec![];
246246
let slf = &mut self.common;
247247
for (_, crtc) in &mut slf.crtcs {
248248
crtc_planes.insert(crtc.obj.id, CrtcPlanes::default());
@@ -615,7 +615,7 @@ impl MetalDeviceTransaction {
615615
new_buffer.clear(&cd)
616616
};
617617
match res {
618-
Ok(sf) => sync_files.extend(sf),
618+
Ok(sf) => syncs.extend(sf),
619619
Err(e) => {
620620
log::warn!("Could not clear new buffer: {}", ErrorFmt(e));
621621
}
@@ -653,7 +653,7 @@ impl MetalDeviceTransaction {
653653
match res {
654654
Ok(sf) => {
655655
buffer.locked.set(true);
656-
sync_files.extend(sf);
656+
syncs.extend(sf);
657657
}
658658
Err(e) => {
659659
log::error!(
@@ -753,19 +753,8 @@ impl MetalDeviceTransaction {
753753
plane.new = DrmPlaneState::default();
754754
}
755755
}
756-
for sf in sync_files {
757-
let mut pollfd = c::pollfd {
758-
fd: sf.0.raw(),
759-
events: c::POLLIN,
760-
revents: 0,
761-
};
762-
let res = uapi::poll(slice::from_mut(&mut pollfd), -1);
763-
if let Err(e) = res {
764-
log::warn!(
765-
"Could not wait for sync file to become readable: {}",
766-
ErrorFmt(e)
767-
);
768-
}
756+
for sync in syncs {
757+
sync.signaled_blocking("transaction");
769758
}
770759
Ok(MetalDeviceTransactionWithDrmState {
771760
common: self.common,

src/backends/metal/video.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ use {
2626
drm_feedback::DrmFeedback,
2727
edid::{CtaDataBlock, Descriptor, EdidExtension},
2828
format::{Format, XRGB8888},
29-
gfx_api::{GfxApi, GfxContext, GfxFramebuffer, SyncFile},
29+
gfx_api::{FdSync, GfxApi, GfxContext, GfxFramebuffer},
3030
ifs::{
3131
wl_output::OutputId,
3232
wp_presentation_feedback::{KIND_HW_COMPLETION, KIND_VSYNC, KIND_ZERO_COPY},
@@ -534,7 +534,7 @@ pub struct MetalConnector {
534534
pub cursor_enabled: Cell<bool>,
535535
pub cursor_buffers: CloneCell<Option<Rc<[RenderBuffer; 2]>>>,
536536
pub cursor_swap_buffer: Cell<bool>,
537-
pub cursor_sync_file: CloneCell<Option<SyncFile>>,
537+
pub cursor_sync: CloneCell<Option<FdSync>>,
538538

539539
pub drm_feedback: CloneCell<Option<Rc<DrmFeedback>>>,
540540
pub scanout_buffers: RefCell<AHashMap<DmaBufId, DirectScanoutCache>>,
@@ -565,7 +565,7 @@ pub struct MetalHardwareCursor {
565565
}
566566

567567
pub struct MetalHardwareCursorChange<'a> {
568-
pub cursor_swap_buffer: Option<Option<SyncFile>>,
568+
pub cursor_swap_buffer: Option<Option<FdSync>>,
569569
pub cursor_enabled: bool,
570570
pub cursor_x: i32,
571571
pub cursor_y: i32,
@@ -603,8 +603,8 @@ impl HardwareCursorUpdate for MetalHardwareCursorChange<'_> {
603603
self.cursor_y = y;
604604
}
605605

606-
fn swap_buffer(&mut self, sync_file: Option<SyncFile>) {
607-
self.cursor_swap_buffer = Some(sync_file);
606+
fn swap_buffer(&mut self, sync: Option<FdSync>) {
607+
self.cursor_swap_buffer = Some(sync);
608608
}
609609

610610
fn size(&self) -> (i32, i32) {
@@ -1127,7 +1127,7 @@ fn create_connector(
11271127
cursor_changed: Cell::new(false),
11281128
cursor_damage: Cell::new(false),
11291129
cursor_swap_buffer: Cell::new(false),
1130-
cursor_sync_file: Default::default(),
1130+
cursor_sync: Default::default(),
11311131
drm_feedback: Default::default(),
11321132
scanout_buffers: Default::default(),
11331133
active_framebuffer: Default::default(),

src/cli/screenshot.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ use {
22
crate::{
33
allocator::{Allocator, AllocatorError, BufferUsage, MappedBuffer},
44
cli::{GlobalArgs, ScreenshotArgs, ScreenshotFormat},
5+
eventfd_cache::EventfdCache,
56
format::XRGB8888,
67
gfx_apis,
78
tools::tool_client::{Handle, ToolClient, with_tool_client},
@@ -109,7 +110,8 @@ async fn run(screenshot: Rc<Screenshot>) {
109110
}
110111
};
111112
let format = screenshot.args.format;
112-
let data = match buf_to_bytes(drm_dev.as_ref(), &buf, format) {
113+
let eventfd_cache = EventfdCache::new(&tc.ring, &tc.eng);
114+
let data = match buf_to_bytes(&eventfd_cache, drm_dev.as_ref(), &buf, format) {
113115
Ok(d) => d,
114116
Err(e) => fatal!("{}", ErrorFmt(e)),
115117
};
@@ -159,6 +161,7 @@ fn map(
159161
}
160162

161163
pub fn buf_to_bytes(
164+
eventfd_cache: &Rc<EventfdCache>,
162165
drm_dev: Option<&Rc<OwnedFd>>,
163166
buf: &DmaBuf,
164167
format: ScreenshotFormat,
@@ -174,7 +177,7 @@ pub fn buf_to_bytes(
174177
.map_err(ScreenshotError::CreateGbmDevice)
175178
});
176179
let vulkan = Box::new(move || {
177-
gfx_apis::create_vulkan_allocator(&drm()?)
180+
gfx_apis::create_vulkan_allocator(&drm()?, eventfd_cache)
178181
.map_err(ScreenshotError::CreateVulkanAllocator)
179182
});
180183
allocators.push(vulkan);

src/compositor.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ use {
2626
damage::{DamageVisualizer, visualize_damage},
2727
dbus::Dbus,
2828
ei::ei_client::EiClients,
29+
eventfd_cache::EventfdCache,
2930
forker,
3031
format::XRGB8888,
3132
gfx_api::GfxApi,
@@ -213,6 +214,7 @@ fn start_compositor2(
213214
let cpu_worker = Rc::new(CpuWorker::new(&ring, &engine)?);
214215
let color_manager = ColorManager::new();
215216
let crit_ids = Rc::new(CritMatcherIds::default());
217+
let eventfd_cache = EventfdCache::new(&ring, &engine);
216218
let state = Rc::new(State {
217219
kb_ctx,
218220
backend: CloneCell::new(Rc::new(DummyBackend)),
@@ -372,8 +374,9 @@ fn start_compositor2(
372374
outputs_without_hc: Default::default(),
373375
udmabuf: Default::default(),
374376
gfx_ctx_changed: Default::default(),
375-
copy_device_registry: Rc::new(CopyDeviceRegistry::new(&ring, &engine)),
377+
copy_device_registry: Rc::new(CopyDeviceRegistry::new(&ring, &engine, &eventfd_cache)),
376378
supports_presentation_feedback: Default::default(),
379+
eventfd_cache,
377380
});
378381
state.tracker.register(ClientId::from_raw(0));
379382
create_dummy_output(&state);

0 commit comments

Comments
 (0)