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 } ,
@@ -50,12 +52,24 @@ pub struct RendererSurfaceState {
50
52
}
51
53
52
54
#[ derive( Debug ) ]
53
- struct InnerBuffer ( WlBuffer ) ;
55
+ struct InnerBuffer {
56
+ buffer : WlBuffer ,
57
+ #[ cfg( feature = "backend_drm" ) ]
58
+ acquire_point : Option < DrmSyncPoint > ,
59
+ #[ cfg( feature = "backend_drm" ) ]
60
+ release_point : Option < DrmSyncPoint > ,
61
+ }
54
62
55
63
impl Drop for InnerBuffer {
56
64
#[ inline]
57
65
fn drop ( & mut self ) {
58
- self . 0 . release ( ) ;
66
+ self . buffer . release ( ) ;
67
+ #[ cfg( feature = "backend_drm" ) ]
68
+ if let Some ( release_point) = & self . release_point {
69
+ if let Err ( err) = release_point. signal ( ) {
70
+ tracing:: error!( "Failed to signal syncobj release point: {}" , err) ;
71
+ }
72
+ }
59
73
}
60
74
}
61
75
@@ -65,12 +79,11 @@ pub struct Buffer {
65
79
inner : Arc < InnerBuffer > ,
66
80
}
67
81
68
- impl From < WlBuffer > for Buffer {
69
- #[ inline]
70
- fn from ( buffer : WlBuffer ) -> Self {
71
- Buffer {
72
- inner : Arc :: new ( InnerBuffer ( buffer) ) ,
73
- }
82
+ impl Buffer {
83
+ #[ cfg( feature = "backend_drm" ) ]
84
+ #[ allow( dead_code) ]
85
+ pub ( crate ) fn acquire_point ( & self ) -> Option < & DrmSyncPoint > {
86
+ self . inner . acquire_point . as_ref ( )
74
87
}
75
88
}
76
89
@@ -79,27 +92,30 @@ impl std::ops::Deref for Buffer {
79
92
80
93
#[ inline]
81
94
fn deref ( & self ) -> & Self :: Target {
82
- & self . inner . 0
95
+ & self . inner . buffer
83
96
}
84
97
}
85
98
86
99
impl PartialEq < WlBuffer > for Buffer {
87
100
#[ inline]
88
101
fn eq ( & self , other : & WlBuffer ) -> bool {
89
- self . inner . 0 == * other
102
+ self . inner . buffer == * other
90
103
}
91
104
}
92
105
93
106
impl PartialEq < WlBuffer > for & Buffer {
94
107
#[ inline]
95
108
fn eq ( & self , other : & WlBuffer ) -> bool {
96
- self . inner . 0 == * other
109
+ self . inner . buffer == * other
97
110
}
98
111
}
99
112
100
113
impl RendererSurfaceState {
101
114
#[ profiling:: function]
102
115
pub ( crate ) fn update_buffer ( & mut self , states : & SurfaceData ) {
116
+ #[ cfg( feature = "backend_drm" ) ]
117
+ let mut syncobj_state = states. cached_state . current :: < DrmSyncobjCachedState > ( ) ;
118
+
103
119
let mut attrs = states. cached_state . current :: < SurfaceAttributes > ( ) ;
104
120
self . buffer_delta = attrs. buffer_delta . take ( ) ;
105
121
@@ -122,7 +138,15 @@ impl RendererSurfaceState {
122
138
self . buffer_transform = attrs. buffer_transform . into ( ) ;
123
139
124
140
if !self . buffer . as_ref ( ) . map_or ( false , |b| b == buffer) {
125
- self . buffer = Some ( Buffer :: from ( buffer) ) ;
141
+ self . buffer = Some ( Buffer {
142
+ inner : Arc :: new ( InnerBuffer {
143
+ buffer,
144
+ #[ cfg( feature = "backend_drm" ) ]
145
+ acquire_point : syncobj_state. acquire_point . take ( ) ,
146
+ #[ cfg( feature = "backend_drm" ) ]
147
+ release_point : syncobj_state. release_point . take ( ) ,
148
+ } ) ,
149
+ } ) ;
126
150
}
127
151
128
152
self . textures . clear ( ) ;
0 commit comments