1
+ #[ cfg( feature = "backend_drm" ) ]
2
+ use crate :: wayland:: drm_syncobj:: { DrmSyncPoint , DrmSyncobjCachedState } ;
1
3
use crate :: {
2
4
backend:: renderer:: { buffer_dimensions, buffer_has_alpha, element:: RenderElement , ImportAll , Renderer } ,
3
5
utils:: { Buffer as BufferCoord , Coordinate , Logical , Physical , Point , Rectangle , Scale , Size , Transform } ,
@@ -56,12 +58,24 @@ unsafe impl Send for RendererSurfaceState {}
56
58
unsafe impl Sync for RendererSurfaceState { }
57
59
58
60
#[ derive( Debug ) ]
59
- struct InnerBuffer ( WlBuffer ) ;
61
+ struct InnerBuffer {
62
+ buffer : WlBuffer ,
63
+ #[ cfg( feature = "backend_drm" ) ]
64
+ acquire_point : Option < DrmSyncPoint > ,
65
+ #[ cfg( feature = "backend_drm" ) ]
66
+ release_point : Option < DrmSyncPoint > ,
67
+ }
60
68
61
69
impl Drop for InnerBuffer {
62
70
#[ inline]
63
71
fn drop ( & mut self ) {
64
- self . 0 . release ( ) ;
72
+ self . buffer . release ( ) ;
73
+ #[ cfg( feature = "backend_drm" ) ]
74
+ if let Some ( release_point) = & self . release_point {
75
+ if let Err ( err) = release_point. signal ( ) {
76
+ tracing:: error!( "Failed to signal syncobj release point: {}" , err) ;
77
+ }
78
+ }
65
79
}
66
80
}
67
81
@@ -71,12 +85,11 @@ pub struct Buffer {
71
85
inner : Arc < InnerBuffer > ,
72
86
}
73
87
74
- impl From < WlBuffer > for Buffer {
75
- #[ inline]
76
- fn from ( buffer : WlBuffer ) -> Self {
77
- Buffer {
78
- inner : Arc :: new ( InnerBuffer ( buffer) ) ,
79
- }
88
+ impl Buffer {
89
+ #[ cfg( feature = "backend_drm" ) ]
90
+ #[ allow( dead_code) ]
91
+ pub ( crate ) fn acquire_point ( & self ) -> Option < & DrmSyncPoint > {
92
+ self . inner . acquire_point . as_ref ( )
80
93
}
81
94
}
82
95
@@ -85,29 +98,34 @@ impl std::ops::Deref for Buffer {
85
98
86
99
#[ inline]
87
100
fn deref ( & self ) -> & Self :: Target {
88
- & self . inner . 0
101
+ & self . inner . buffer
89
102
}
90
103
}
91
104
92
105
impl PartialEq < WlBuffer > for Buffer {
93
106
#[ inline]
94
107
fn eq ( & self , other : & WlBuffer ) -> bool {
95
- self . inner . 0 == * other
108
+ self . inner . buffer == * other
96
109
}
97
110
}
98
111
99
112
impl PartialEq < WlBuffer > for & Buffer {
100
113
#[ inline]
101
114
fn eq ( & self , other : & WlBuffer ) -> bool {
102
- self . inner . 0 == * other
115
+ self . inner . buffer == * other
103
116
}
104
117
}
105
118
106
119
impl RendererSurfaceState {
107
120
#[ profiling:: function]
108
121
pub ( crate ) fn update_buffer ( & mut self , states : & SurfaceData ) {
109
- let mut attrs_state = states. cached_state . get :: < SurfaceAttributes > ( ) ;
110
- let attrs = attrs_state. current ( ) ;
122
+ #[ cfg( feature = "backend_drm" ) ]
123
+ let mut guard = states. cached_state . get :: < DrmSyncobjCachedState > ( ) ;
124
+ #[ cfg( feature = "backend_drm" ) ]
125
+ let syncobj_state = guard. current ( ) ;
126
+
127
+ let mut guard = states. cached_state . get :: < SurfaceAttributes > ( ) ;
128
+ let attrs = guard. current ( ) ;
111
129
self . buffer_delta = attrs. buffer_delta . take ( ) ;
112
130
113
131
if let Some ( delta) = self . buffer_delta {
@@ -129,7 +147,15 @@ impl RendererSurfaceState {
129
147
self . buffer_transform = attrs. buffer_transform . into ( ) ;
130
148
131
149
if !self . buffer . as_ref ( ) . map_or ( false , |b| b == buffer) {
132
- self . buffer = Some ( Buffer :: from ( buffer) ) ;
150
+ self . buffer = Some ( Buffer {
151
+ inner : Arc :: new ( InnerBuffer {
152
+ buffer,
153
+ #[ cfg( feature = "backend_drm" ) ]
154
+ acquire_point : syncobj_state. acquire_point . take ( ) ,
155
+ #[ cfg( feature = "backend_drm" ) ]
156
+ release_point : syncobj_state. release_point . take ( ) ,
157
+ } ) ,
158
+ } ) ;
133
159
}
134
160
135
161
self . textures . clear ( ) ;
0 commit comments