@@ -21,14 +21,19 @@ pub const CROSS_DOMAIN_CMD_WRITE: u8 = 7;
21
21
pub const CROSS_DOMAIN_CMD_FUTEX_NEW : u8 = 8 ;
22
22
pub const CROSS_DOMAIN_CMD_FUTEX_SIGNAL : u8 = 9 ;
23
23
pub const CROSS_DOMAIN_CMD_FUTEX_DESTROY : u8 = 10 ;
24
+ pub const CROSS_DOMAIN_CMD_READ_EVENTFD_NEW : u8 = 11 ;
25
+ pub const CROSS_DOMAIN_CMD_READ_EVENTFD_DESTROY : u8 = 12 ;
24
26
25
27
/// Channel types (must match rutabaga channel types)
26
28
pub const CROSS_DOMAIN_CHANNEL_TYPE_WAYLAND : u32 = 0x0001 ;
27
29
pub const CROSS_DOMAIN_CHANNEL_TYPE_CAMERA : u32 = 0x0002 ;
30
+ pub const CROSS_DOMAIN_CHANNEL_TYPE_PW : u32 = 0x0010 ;
28
31
pub const CROSS_DOMAIN_CHANNEL_TYPE_X11 : u32 = 0x0011 ;
29
32
30
33
/// The maximum number of identifiers (value inspired by wp_linux_dmabuf)
31
34
pub const CROSS_DOMAIN_MAX_IDENTIFIERS : usize = 4 ;
35
+ /// As above, but inspired by sommelier
36
+ pub const CROSS_DOMAIN_MAX_IDENTIFIERS_V2 : usize = 28 ;
32
37
33
38
/// virtgpu memory resource ID. Also works with non-blob memory resources, despite the name.
34
39
pub const CROSS_DOMAIN_ID_TYPE_VIRTGPU_BLOB : u32 = 1 ;
@@ -42,6 +47,7 @@ pub const CROSS_DOMAIN_ID_TYPE_READ_PIPE: u32 = 3;
42
47
pub const CROSS_DOMAIN_ID_TYPE_WRITE_PIPE : u32 = 4 ;
43
48
44
49
pub const CROSS_DOMAIN_ID_TYPE_SHM : u32 = 5 ;
50
+ pub const CROSS_DOMAIN_ID_TYPE_EVENTFD : u32 = 6 ;
45
51
46
52
/// No ring
47
53
pub const CROSS_DOMAIN_RING_NONE : u32 = 0xffffffff ;
@@ -86,11 +92,33 @@ pub struct CrossDomainHeader {
86
92
87
93
#[ repr( C ) ]
88
94
#[ derive( Copy , Clone , Default , AsBytes , FromBytes ) ]
89
- pub struct CrossDomainInit {
95
+ pub struct CrossDomainInitV1 {
90
96
pub hdr : CrossDomainHeader ,
91
97
pub query_ring_id : u32 ,
92
98
pub channel_ring_id : u32 ,
93
99
pub channel_type : u32 ,
100
+ pub protocol_version : u32 ,
101
+ }
102
+
103
+ #[ repr( C ) ]
104
+ #[ derive( Copy , Clone , Default , AsBytes , FromBytes ) ]
105
+ pub struct CrossDomainInitV0 {
106
+ pub hdr : CrossDomainHeader ,
107
+ pub query_ring_id : u32 ,
108
+ pub channel_ring_id : u32 ,
109
+ pub channel_type : u32 ,
110
+ }
111
+
112
+ impl CrossDomainInitV0 {
113
+ pub ( crate ) fn upgrade ( & self ) -> CrossDomainInitV1 {
114
+ CrossDomainInitV1 {
115
+ hdr : self . hdr ,
116
+ query_ring_id : self . query_ring_id ,
117
+ channel_ring_id : self . channel_ring_id ,
118
+ channel_type : self . channel_type ,
119
+ protocol_version : 0 ,
120
+ }
121
+ }
94
122
}
95
123
96
124
#[ repr( C ) ]
@@ -103,6 +131,14 @@ pub struct CrossDomainGetImageRequirements {
103
131
pub flags : u32 ,
104
132
}
105
133
134
+ pub trait CrossDomainSendReceiveBase : Copy + Clone + Default + AsBytes + FromBytes {
135
+ const MAX_IDENTIFIERS : usize ;
136
+ fn hdr_mut ( & mut self ) -> & mut CrossDomainHeader ;
137
+ fn num_identifiers_mut ( & mut self ) -> & mut u32 ;
138
+ fn opaque_data_size_mut ( & mut self ) -> & mut u32 ;
139
+ fn iter_over_identifiers ( & mut self ) -> impl Iterator < Item = ( & mut u32 , & mut u32 , & mut u32 ) > ;
140
+ }
141
+
106
142
#[ repr( C ) ]
107
143
#[ derive( Copy , Clone , Default , AsBytes , FromBytes ) ]
108
144
pub struct CrossDomainSendReceive {
@@ -114,6 +150,57 @@ pub struct CrossDomainSendReceive {
114
150
pub identifier_sizes : [ u32 ; CROSS_DOMAIN_MAX_IDENTIFIERS ] ,
115
151
// Data of size "opaque data size follows"
116
152
}
153
+ impl CrossDomainSendReceiveBase for CrossDomainSendReceive {
154
+ const MAX_IDENTIFIERS : usize = CROSS_DOMAIN_MAX_IDENTIFIERS ;
155
+ fn hdr_mut ( & mut self ) -> & mut CrossDomainHeader {
156
+ & mut self . hdr
157
+ }
158
+ fn num_identifiers_mut ( & mut self ) -> & mut u32 {
159
+ & mut self . num_identifiers
160
+ }
161
+ fn opaque_data_size_mut ( & mut self ) -> & mut u32 {
162
+ & mut self . opaque_data_size
163
+ }
164
+ fn iter_over_identifiers ( & mut self ) -> impl Iterator < Item = ( & mut u32 , & mut u32 , & mut u32 ) > {
165
+ self . identifiers
166
+ . iter_mut ( )
167
+ . zip ( self . identifier_types . iter_mut ( ) )
168
+ . zip ( self . identifier_sizes . iter_mut ( ) )
169
+ . map ( |( ( i, it) , is) | ( i, it, is) )
170
+ }
171
+ }
172
+
173
+ #[ repr( C ) ]
174
+ #[ derive( Copy , Clone , Default , AsBytes , FromBytes ) ]
175
+ pub struct CrossDomainSendReceiveV2 {
176
+ pub hdr : CrossDomainHeader ,
177
+ pub num_identifiers : u32 ,
178
+ pub opaque_data_size : u32 ,
179
+ pub identifiers : [ u32 ; CROSS_DOMAIN_MAX_IDENTIFIERS_V2 ] ,
180
+ pub identifier_types : [ u32 ; CROSS_DOMAIN_MAX_IDENTIFIERS_V2 ] ,
181
+ pub identifier_sizes : [ u32 ; CROSS_DOMAIN_MAX_IDENTIFIERS_V2 ] ,
182
+ // Data of size "opaque data size follows"
183
+ }
184
+
185
+ impl CrossDomainSendReceiveBase for CrossDomainSendReceiveV2 {
186
+ const MAX_IDENTIFIERS : usize = CROSS_DOMAIN_MAX_IDENTIFIERS_V2 ;
187
+ fn hdr_mut ( & mut self ) -> & mut CrossDomainHeader {
188
+ & mut self . hdr
189
+ }
190
+ fn num_identifiers_mut ( & mut self ) -> & mut u32 {
191
+ & mut self . num_identifiers
192
+ }
193
+ fn opaque_data_size_mut ( & mut self ) -> & mut u32 {
194
+ & mut self . opaque_data_size
195
+ }
196
+ fn iter_over_identifiers ( & mut self ) -> impl Iterator < Item = ( & mut u32 , & mut u32 , & mut u32 ) > {
197
+ self . identifiers
198
+ . iter_mut ( )
199
+ . zip ( self . identifier_types . iter_mut ( ) )
200
+ . zip ( self . identifier_sizes . iter_mut ( ) )
201
+ . map ( |( ( i, it) , is) | ( i, it, is) )
202
+ }
203
+ }
117
204
118
205
#[ repr( C ) ]
119
206
#[ derive( Copy , Clone , Default , AsBytes , FromBytes ) ]
@@ -151,3 +238,11 @@ pub struct CrossDomainFutexDestroy {
151
238
pub id : u32 ,
152
239
pub pad : u32 ,
153
240
}
241
+
242
+ #[ repr( C ) ]
243
+ #[ derive( Copy , Clone , Default , AsBytes , FromBytes ) ]
244
+ pub struct CrossDomainReadEventfdNew {
245
+ pub hdr : CrossDomainHeader ,
246
+ pub id : u32 ,
247
+ pub pad : u32 ,
248
+ }
0 commit comments