1#![allow(clippy::too_many_arguments)]
7
8#[allow(unused_imports)]
9use std::borrow::Cow;
10#[allow(unused_imports)]
11use std::convert::TryInto;
12#[allow(unused_imports)]
13use crate::utils::RawFdContainer;
14#[allow(unused_imports)]
15use crate::x11_utils::{Request, RequestHeader, Serialize, TryParse, TryParseFd};
16use std::io::IoSlice;
17use crate::connection::RequestConnection;
18#[allow(unused_imports)]
19use crate::connection::Connection as X11Connection;
20#[allow(unused_imports)]
21use crate::cookie::{Cookie, CookieWithFds, VoidCookie};
22use crate::errors::ConnectionError;
23#[allow(unused_imports)]
24use crate::errors::ReplyOrIdError;
25#[allow(unused_imports)]
26use super::xproto;
27
28pub use x11rb_protocol::protocol::dri2::*;
29
30fn major_opcode<Conn: RequestConnection + ?Sized>(conn: &Conn) -> Result<u8, ConnectionError> {
32 let info = conn.extension_information(X11_EXTENSION_NAME)?;
33 let info = info.ok_or(ConnectionError::UnsupportedExtension)?;
34 Ok(info.major_opcode)
35}
36
37pub fn query_version<Conn>(conn: &Conn, major_version: u32, minor_version: u32) -> Result<Cookie<'_, Conn, QueryVersionReply>, ConnectionError>
38where
39 Conn: RequestConnection + ?Sized,
40{
41 let request0 = QueryVersionRequest {
42 major_version,
43 minor_version,
44 };
45 let (bytes, fds) = request0.serialize(major_opcode(conn)?);
46 let slices = [IoSlice::new(&bytes[0])];
47 assert_eq!(slices.len(), bytes.len());
48 conn.send_request_with_reply(&slices, fds)
49}
50
51pub fn connect<Conn>(conn: &Conn, window: xproto::Window, driver_type: DriverType) -> Result<Cookie<'_, Conn, ConnectReply>, ConnectionError>
52where
53 Conn: RequestConnection + ?Sized,
54{
55 let request0 = ConnectRequest {
56 window,
57 driver_type,
58 };
59 let (bytes, fds) = request0.serialize(major_opcode(conn)?);
60 let slices = [IoSlice::new(&bytes[0])];
61 assert_eq!(slices.len(), bytes.len());
62 conn.send_request_with_reply(&slices, fds)
63}
64
65pub fn authenticate<Conn>(conn: &Conn, window: xproto::Window, magic: u32) -> Result<Cookie<'_, Conn, AuthenticateReply>, ConnectionError>
66where
67 Conn: RequestConnection + ?Sized,
68{
69 let request0 = AuthenticateRequest {
70 window,
71 magic,
72 };
73 let (bytes, fds) = request0.serialize(major_opcode(conn)?);
74 let slices = [IoSlice::new(&bytes[0])];
75 assert_eq!(slices.len(), bytes.len());
76 conn.send_request_with_reply(&slices, fds)
77}
78
79pub fn create_drawable<Conn>(conn: &Conn, drawable: xproto::Drawable) -> Result<VoidCookie<'_, Conn>, ConnectionError>
80where
81 Conn: RequestConnection + ?Sized,
82{
83 let request0 = CreateDrawableRequest {
84 drawable,
85 };
86 let (bytes, fds) = request0.serialize(major_opcode(conn)?);
87 let slices = [IoSlice::new(&bytes[0])];
88 assert_eq!(slices.len(), bytes.len());
89 conn.send_request_without_reply(&slices, fds)
90}
91
92pub fn destroy_drawable<Conn>(conn: &Conn, drawable: xproto::Drawable) -> Result<VoidCookie<'_, Conn>, ConnectionError>
93where
94 Conn: RequestConnection + ?Sized,
95{
96 let request0 = DestroyDrawableRequest {
97 drawable,
98 };
99 let (bytes, fds) = request0.serialize(major_opcode(conn)?);
100 let slices = [IoSlice::new(&bytes[0])];
101 assert_eq!(slices.len(), bytes.len());
102 conn.send_request_without_reply(&slices, fds)
103}
104
105pub fn get_buffers<'c, 'input, Conn>(conn: &'c Conn, drawable: xproto::Drawable, count: u32, attachments: &'input [u32]) -> Result<Cookie<'c, Conn, GetBuffersReply>, ConnectionError>
106where
107 Conn: RequestConnection + ?Sized,
108{
109 let request0 = GetBuffersRequest {
110 drawable,
111 count,
112 attachments: Cow::Borrowed(attachments),
113 };
114 let (bytes, fds) = request0.serialize(major_opcode(conn)?);
115 let slices = [IoSlice::new(&bytes[0]), IoSlice::new(&bytes[1]), IoSlice::new(&bytes[2])];
116 assert_eq!(slices.len(), bytes.len());
117 conn.send_request_with_reply(&slices, fds)
118}
119
120pub fn copy_region<Conn>(conn: &Conn, drawable: xproto::Drawable, region: u32, dest: u32, src: u32) -> Result<Cookie<'_, Conn, CopyRegionReply>, ConnectionError>
121where
122 Conn: RequestConnection + ?Sized,
123{
124 let request0 = CopyRegionRequest {
125 drawable,
126 region,
127 dest,
128 src,
129 };
130 let (bytes, fds) = request0.serialize(major_opcode(conn)?);
131 let slices = [IoSlice::new(&bytes[0])];
132 assert_eq!(slices.len(), bytes.len());
133 conn.send_request_with_reply(&slices, fds)
134}
135
136pub fn get_buffers_with_format<'c, 'input, Conn>(conn: &'c Conn, drawable: xproto::Drawable, count: u32, attachments: &'input [AttachFormat]) -> Result<Cookie<'c, Conn, GetBuffersWithFormatReply>, ConnectionError>
137where
138 Conn: RequestConnection + ?Sized,
139{
140 let request0 = GetBuffersWithFormatRequest {
141 drawable,
142 count,
143 attachments: Cow::Borrowed(attachments),
144 };
145 let (bytes, fds) = request0.serialize(major_opcode(conn)?);
146 let slices = [IoSlice::new(&bytes[0]), IoSlice::new(&bytes[1]), IoSlice::new(&bytes[2])];
147 assert_eq!(slices.len(), bytes.len());
148 conn.send_request_with_reply(&slices, fds)
149}
150
151pub fn swap_buffers<Conn>(conn: &Conn, drawable: xproto::Drawable, target_msc_hi: u32, target_msc_lo: u32, divisor_hi: u32, divisor_lo: u32, remainder_hi: u32, remainder_lo: u32) -> Result<Cookie<'_, Conn, SwapBuffersReply>, ConnectionError>
152where
153 Conn: RequestConnection + ?Sized,
154{
155 let request0 = SwapBuffersRequest {
156 drawable,
157 target_msc_hi,
158 target_msc_lo,
159 divisor_hi,
160 divisor_lo,
161 remainder_hi,
162 remainder_lo,
163 };
164 let (bytes, fds) = request0.serialize(major_opcode(conn)?);
165 let slices = [IoSlice::new(&bytes[0])];
166 assert_eq!(slices.len(), bytes.len());
167 conn.send_request_with_reply(&slices, fds)
168}
169
170pub fn get_msc<Conn>(conn: &Conn, drawable: xproto::Drawable) -> Result<Cookie<'_, Conn, GetMSCReply>, ConnectionError>
171where
172 Conn: RequestConnection + ?Sized,
173{
174 let request0 = GetMSCRequest {
175 drawable,
176 };
177 let (bytes, fds) = request0.serialize(major_opcode(conn)?);
178 let slices = [IoSlice::new(&bytes[0])];
179 assert_eq!(slices.len(), bytes.len());
180 conn.send_request_with_reply(&slices, fds)
181}
182
183pub fn wait_msc<Conn>(conn: &Conn, drawable: xproto::Drawable, target_msc_hi: u32, target_msc_lo: u32, divisor_hi: u32, divisor_lo: u32, remainder_hi: u32, remainder_lo: u32) -> Result<Cookie<'_, Conn, WaitMSCReply>, ConnectionError>
184where
185 Conn: RequestConnection + ?Sized,
186{
187 let request0 = WaitMSCRequest {
188 drawable,
189 target_msc_hi,
190 target_msc_lo,
191 divisor_hi,
192 divisor_lo,
193 remainder_hi,
194 remainder_lo,
195 };
196 let (bytes, fds) = request0.serialize(major_opcode(conn)?);
197 let slices = [IoSlice::new(&bytes[0])];
198 assert_eq!(slices.len(), bytes.len());
199 conn.send_request_with_reply(&slices, fds)
200}
201
202pub fn wait_sbc<Conn>(conn: &Conn, drawable: xproto::Drawable, target_sbc_hi: u32, target_sbc_lo: u32) -> Result<Cookie<'_, Conn, WaitSBCReply>, ConnectionError>
203where
204 Conn: RequestConnection + ?Sized,
205{
206 let request0 = WaitSBCRequest {
207 drawable,
208 target_sbc_hi,
209 target_sbc_lo,
210 };
211 let (bytes, fds) = request0.serialize(major_opcode(conn)?);
212 let slices = [IoSlice::new(&bytes[0])];
213 assert_eq!(slices.len(), bytes.len());
214 conn.send_request_with_reply(&slices, fds)
215}
216
217pub fn swap_interval<Conn>(conn: &Conn, drawable: xproto::Drawable, interval: u32) -> Result<VoidCookie<'_, Conn>, ConnectionError>
218where
219 Conn: RequestConnection + ?Sized,
220{
221 let request0 = SwapIntervalRequest {
222 drawable,
223 interval,
224 };
225 let (bytes, fds) = request0.serialize(major_opcode(conn)?);
226 let slices = [IoSlice::new(&bytes[0])];
227 assert_eq!(slices.len(), bytes.len());
228 conn.send_request_without_reply(&slices, fds)
229}
230
231pub fn get_param<Conn>(conn: &Conn, drawable: xproto::Drawable, param: u32) -> Result<Cookie<'_, Conn, GetParamReply>, ConnectionError>
232where
233 Conn: RequestConnection + ?Sized,
234{
235 let request0 = GetParamRequest {
236 drawable,
237 param,
238 };
239 let (bytes, fds) = request0.serialize(major_opcode(conn)?);
240 let slices = [IoSlice::new(&bytes[0])];
241 assert_eq!(slices.len(), bytes.len());
242 conn.send_request_with_reply(&slices, fds)
243}
244
245pub trait ConnectionExt: RequestConnection {
247 fn dri2_query_version(&self, major_version: u32, minor_version: u32) -> Result<Cookie<'_, Self, QueryVersionReply>, ConnectionError>
248 {
249 query_version(self, major_version, minor_version)
250 }
251 fn dri2_connect(&self, window: xproto::Window, driver_type: DriverType) -> Result<Cookie<'_, Self, ConnectReply>, ConnectionError>
252 {
253 connect(self, window, driver_type)
254 }
255 fn dri2_authenticate(&self, window: xproto::Window, magic: u32) -> Result<Cookie<'_, Self, AuthenticateReply>, ConnectionError>
256 {
257 authenticate(self, window, magic)
258 }
259 fn dri2_create_drawable(&self, drawable: xproto::Drawable) -> Result<VoidCookie<'_, Self>, ConnectionError>
260 {
261 create_drawable(self, drawable)
262 }
263 fn dri2_destroy_drawable(&self, drawable: xproto::Drawable) -> Result<VoidCookie<'_, Self>, ConnectionError>
264 {
265 destroy_drawable(self, drawable)
266 }
267 fn dri2_get_buffers<'c, 'input>(&'c self, drawable: xproto::Drawable, count: u32, attachments: &'input [u32]) -> Result<Cookie<'c, Self, GetBuffersReply>, ConnectionError>
268 {
269 get_buffers(self, drawable, count, attachments)
270 }
271 fn dri2_copy_region(&self, drawable: xproto::Drawable, region: u32, dest: u32, src: u32) -> Result<Cookie<'_, Self, CopyRegionReply>, ConnectionError>
272 {
273 copy_region(self, drawable, region, dest, src)
274 }
275 fn dri2_get_buffers_with_format<'c, 'input>(&'c self, drawable: xproto::Drawable, count: u32, attachments: &'input [AttachFormat]) -> Result<Cookie<'c, Self, GetBuffersWithFormatReply>, ConnectionError>
276 {
277 get_buffers_with_format(self, drawable, count, attachments)
278 }
279 fn dri2_swap_buffers(&self, drawable: xproto::Drawable, target_msc_hi: u32, target_msc_lo: u32, divisor_hi: u32, divisor_lo: u32, remainder_hi: u32, remainder_lo: u32) -> Result<Cookie<'_, Self, SwapBuffersReply>, ConnectionError>
280 {
281 swap_buffers(self, drawable, target_msc_hi, target_msc_lo, divisor_hi, divisor_lo, remainder_hi, remainder_lo)
282 }
283 fn dri2_get_msc(&self, drawable: xproto::Drawable) -> Result<Cookie<'_, Self, GetMSCReply>, ConnectionError>
284 {
285 get_msc(self, drawable)
286 }
287 fn dri2_wait_msc(&self, drawable: xproto::Drawable, target_msc_hi: u32, target_msc_lo: u32, divisor_hi: u32, divisor_lo: u32, remainder_hi: u32, remainder_lo: u32) -> Result<Cookie<'_, Self, WaitMSCReply>, ConnectionError>
288 {
289 wait_msc(self, drawable, target_msc_hi, target_msc_lo, divisor_hi, divisor_lo, remainder_hi, remainder_lo)
290 }
291 fn dri2_wait_sbc(&self, drawable: xproto::Drawable, target_sbc_hi: u32, target_sbc_lo: u32) -> Result<Cookie<'_, Self, WaitSBCReply>, ConnectionError>
292 {
293 wait_sbc(self, drawable, target_sbc_hi, target_sbc_lo)
294 }
295 fn dri2_swap_interval(&self, drawable: xproto::Drawable, interval: u32) -> Result<VoidCookie<'_, Self>, ConnectionError>
296 {
297 swap_interval(self, drawable, interval)
298 }
299 fn dri2_get_param(&self, drawable: xproto::Drawable, param: u32) -> Result<Cookie<'_, Self, GetParamReply>, ConnectionError>
300 {
301 get_param(self, drawable, param)
302 }
303}
304
305impl<C: RequestConnection + ?Sized> ConnectionExt for C {}