Skip to content

Commit 20d2dac

Browse files
ids1024Drakulix
authored andcommitted
renderer: Return a SyncPoint from blit; and use in blit_frame_result()
1 parent 7305bc7 commit 20d2dac

File tree

5 files changed

+41
-24
lines changed

5 files changed

+41
-24
lines changed

src/backend/drm/compositor/frame_result.rs

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -347,28 +347,33 @@ where
347347
}
348348

349349
// first do the potential blit
350-
if let Some((sync, mut dmabuf, geometry)) = primary_dmabuf {
350+
if let Some((primary_dmabuf_sync, mut dmabuf, geometry)) = primary_dmabuf {
351351
let blit_damage = damage
352352
.iter()
353353
.filter_map(|d| d.intersection(geometry))
354354
.collect::<Vec<_>>();
355355

356356
tracing::trace!("blitting frame with damage: {:#?}", blit_damage);
357357

358-
renderer.wait(&sync).map_err(BlitFrameResultError::Rendering)?;
358+
renderer
359+
.wait(&primary_dmabuf_sync)
360+
.map_err(BlitFrameResultError::Rendering)?;
359361
let fb = renderer
360362
.bind(&mut dmabuf)
361363
.map_err(BlitFrameResultError::Rendering)?;
362364
for rect in blit_damage {
363-
renderer
364-
.blit(
365-
&fb,
366-
framebuffer,
367-
rect,
368-
rect,
369-
crate::backend::renderer::TextureFilter::Linear,
370-
)
371-
.map_err(BlitFrameResultError::Rendering)?;
365+
// TODO: On Vulkan, may need to combine sync points instead of just using latest?
366+
sync = Some(
367+
renderer
368+
.blit(
369+
&fb,
370+
framebuffer,
371+
rect,
372+
rect,
373+
crate::backend::renderer::TextureFilter::Linear,
374+
)
375+
.map_err(BlitFrameResultError::Rendering)?,
376+
);
372377
}
373378
}
374379

src/backend/renderer/gles/mod.rs

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1702,7 +1702,7 @@ impl<'buffer> BlitFrame<GlesTarget<'buffer>> for GlesFrame<'_, 'buffer> {
17021702
self.target
17031703
.0
17041704
.make_current(&self.renderer.gl, &self.renderer.egl)?;
1705-
res
1705+
res.map(|_| ())
17061706
}
17071707

17081708
fn blit_from(
@@ -1716,7 +1716,7 @@ impl<'buffer> BlitFrame<GlesTarget<'buffer>> for GlesFrame<'_, 'buffer> {
17161716
self.target
17171717
.0
17181718
.make_current(&self.renderer.gl, &self.renderer.egl)?;
1719-
res
1719+
res.map(|_| ())
17201720
}
17211721
}
17221722

@@ -1730,7 +1730,7 @@ impl Blit for GlesRenderer {
17301730
src: Rectangle<i32, Physical>,
17311731
dst: Rectangle<i32, Physical>,
17321732
filter: TextureFilter,
1733-
) -> Result<(), GlesError> {
1733+
) -> Result<SyncPoint, GlesError> {
17341734
// glBlitFramebuffer is sadly only available for GLES 3.0 and higher
17351735
if self.gl_version < version::GLES_3_0 {
17361736
return Err(GlesError::GLVersionNotSupported(version::GLES_3_0));
@@ -1808,7 +1808,14 @@ impl Blit for GlesRenderer {
18081808
if errno == ffi::INVALID_OPERATION {
18091809
Err(GlesError::BlitError)
18101810
} else {
1811-
Ok(())
1811+
if let Some(sync_point) = self.export_sync_point() {
1812+
return Ok(sync_point);
1813+
}
1814+
1815+
unsafe {
1816+
self.gl.Finish();
1817+
}
1818+
Ok(SyncPoint::signaled())
18121819
}
18131820
}
18141821
}

src/backend/renderer/glow.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -548,7 +548,7 @@ impl Blit for GlowRenderer {
548548
src: Rectangle<i32, Physical>,
549549
dst: Rectangle<i32, Physical>,
550550
filter: TextureFilter,
551-
) -> Result<(), GlesError> {
551+
) -> Result<sync::SyncPoint, GlesError> {
552552
self.gl.blit(from, to, src, dst, filter)
553553
}
554554
}

src/backend/renderer/mod.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ pub mod element;
5959
pub mod damage;
6060

6161
pub mod sync;
62+
use sync::SyncPoint;
6263

6364
// Note: This doesn't fully work yet due to <https://github.com/rust-lang/rust/issues/67295>.
6465
// Use `--features renderer_test` when running doc tests manually.
@@ -342,7 +343,7 @@ pub trait Frame {
342343
/// Output transformation that is applied to this frame
343344
fn transformation(&self) -> Transform;
344345

345-
/// Wait for a [`SyncPoint`](sync::SyncPoint) to be signaled
346+
/// Wait for a [`SyncPoint`] to be signaled
346347
fn wait(&mut self, sync: &sync::SyncPoint) -> Result<(), Self::Error>;
347348

348349
/// Finish this [`Frame`] returning any error that may happen during any cleanup.
@@ -419,7 +420,7 @@ pub trait Renderer: RendererSuper {
419420
where
420421
'buffer: 'frame;
421422

422-
/// Wait for a [`SyncPoint`](sync::SyncPoint) to be signaled
423+
/// Wait for a [`SyncPoint`] to be signaled
423424
fn wait(&mut self, sync: &sync::SyncPoint) -> Result<(), Self::Error>;
424425

425426
/// Forcibly clean up the renderer internal texture cache
@@ -802,7 +803,7 @@ where
802803
src: Rectangle<i32, Physical>,
803804
dst: Rectangle<i32, Physical>,
804805
filter: TextureFilter,
805-
) -> Result<(), Self::Error>;
806+
) -> Result<SyncPoint, Self::Error>;
806807
}
807808

808809
/// Trait for frames supporting blitting contents from/to the current framebuffer to/from another.

src/backend/renderer/multigpu/mod.rs

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2863,11 +2863,13 @@ where
28632863
let MultiFramebufferInternal::Target(ref mut to_fb) = &mut to.0 else {
28642864
unreachable!()
28652865
};
2866-
target
2866+
let sync = target
28672867
.device
28682868
.renderer_mut()
28692869
.blit(target.framebuffer, to_fb, src, dst, filter)
2870-
.map_err(Error::Target)
2870+
.map_err(Error::Target)?;
2871+
target.device.renderer_mut().wait(&sync).map_err(Error::Target)?;
2872+
Ok(())
28712873
} else {
28722874
let MultiFramebufferInternal::Render(ref mut to_fb) = &mut to.0 else {
28732875
unreachable!()
@@ -2894,11 +2896,13 @@ where
28942896
let MultiFramebufferInternal::Target(ref from_fb) = &from.0 else {
28952897
unreachable!()
28962898
};
2897-
target
2899+
let sync = target
28982900
.device
28992901
.renderer_mut()
29002902
.blit(from_fb, target.framebuffer, src, dst, filter)
2901-
.map_err(Error::Target)
2903+
.map_err(Error::Target)?;
2904+
target.device.renderer_mut().wait(&sync).map_err(Error::Target)?;
2905+
Ok(())
29022906
} else {
29032907
let MultiFramebufferInternal::Render(ref from_fb) = &from.0 else {
29042908
unreachable!()
@@ -2935,7 +2939,7 @@ where
29352939
src: Rectangle<i32, Physical>,
29362940
dst: Rectangle<i32, Physical>,
29372941
filter: TextureFilter,
2938-
) -> Result<(), <Self as RendererSuper>::Error> {
2942+
) -> Result<SyncPoint, <Self as RendererSuper>::Error> {
29392943
if let Some(target) = self.target.as_mut() {
29402944
let MultiFramebufferInternal::Target(ref from_fb) = &from.0 else {
29412945
unreachable!()

0 commit comments

Comments
 (0)