xref: /netbsd-src/external/mit/xorg/lib/libxcb/files/dri3.c (revision fea83ee4938f6f630ec4626dba8d28098c73f0cc)
1 /*
2  * This file generated automatically from dri3.xml by c_client.py.
3  * Edit at your peril.
4  */
5 
6 #ifdef HAVE_CONFIG_H
7 #include "config.h"
8 #endif
9 #include <stdlib.h>
10 #include <string.h>
11 #include <assert.h>
12 #include <stddef.h>  /* for offsetof() */
13 #include "xcbext.h"
14 #include "dri3.h"
15 
16 #define ALIGNOF(type) offsetof(struct { char dummy; type member; }, member)
17 #include "xproto.h"
18 
19 xcb_extension_t xcb_dri3_id = { "DRI3", 0 };
20 
21 void
xcb_dri3_syncobj_next(xcb_dri3_syncobj_iterator_t * i)22 xcb_dri3_syncobj_next (xcb_dri3_syncobj_iterator_t *i)
23 {
24     --i->rem;
25     ++i->data;
26     i->index += sizeof(xcb_dri3_syncobj_t);
27 }
28 
29 xcb_generic_iterator_t
xcb_dri3_syncobj_end(xcb_dri3_syncobj_iterator_t i)30 xcb_dri3_syncobj_end (xcb_dri3_syncobj_iterator_t i)
31 {
32     xcb_generic_iterator_t ret;
33     ret.data = i.data + i.rem;
34     ret.index = i.index + ((char *) ret.data - (char *) i.data);
35     ret.rem = 0;
36     return ret;
37 }
38 
39 xcb_dri3_query_version_cookie_t
xcb_dri3_query_version(xcb_connection_t * c,uint32_t major_version,uint32_t minor_version)40 xcb_dri3_query_version (xcb_connection_t *c,
41                         uint32_t          major_version,
42                         uint32_t          minor_version)
43 {
44     static const xcb_protocol_request_t xcb_req = {
45         .count = 2,
46         .ext = &xcb_dri3_id,
47         .opcode = XCB_DRI3_QUERY_VERSION,
48         .isvoid = 0
49     };
50 
51     struct iovec xcb_parts[4];
52     xcb_dri3_query_version_cookie_t xcb_ret;
53     xcb_dri3_query_version_request_t xcb_out;
54 
55     xcb_out.major_version = major_version;
56     xcb_out.minor_version = minor_version;
57 
58     xcb_parts[2].iov_base = (char *) &xcb_out;
59     xcb_parts[2].iov_len = sizeof(xcb_out);
60     xcb_parts[3].iov_base = 0;
61     xcb_parts[3].iov_len = -xcb_parts[2].iov_len & 3;
62 
63     xcb_ret.sequence = xcb_send_request(c, XCB_REQUEST_CHECKED, xcb_parts + 2, &xcb_req);
64     return xcb_ret;
65 }
66 
67 xcb_dri3_query_version_cookie_t
xcb_dri3_query_version_unchecked(xcb_connection_t * c,uint32_t major_version,uint32_t minor_version)68 xcb_dri3_query_version_unchecked (xcb_connection_t *c,
69                                   uint32_t          major_version,
70                                   uint32_t          minor_version)
71 {
72     static const xcb_protocol_request_t xcb_req = {
73         .count = 2,
74         .ext = &xcb_dri3_id,
75         .opcode = XCB_DRI3_QUERY_VERSION,
76         .isvoid = 0
77     };
78 
79     struct iovec xcb_parts[4];
80     xcb_dri3_query_version_cookie_t xcb_ret;
81     xcb_dri3_query_version_request_t xcb_out;
82 
83     xcb_out.major_version = major_version;
84     xcb_out.minor_version = minor_version;
85 
86     xcb_parts[2].iov_base = (char *) &xcb_out;
87     xcb_parts[2].iov_len = sizeof(xcb_out);
88     xcb_parts[3].iov_base = 0;
89     xcb_parts[3].iov_len = -xcb_parts[2].iov_len & 3;
90 
91     xcb_ret.sequence = xcb_send_request(c, 0, xcb_parts + 2, &xcb_req);
92     return xcb_ret;
93 }
94 
95 xcb_dri3_query_version_reply_t *
xcb_dri3_query_version_reply(xcb_connection_t * c,xcb_dri3_query_version_cookie_t cookie,xcb_generic_error_t ** e)96 xcb_dri3_query_version_reply (xcb_connection_t                 *c,
97                               xcb_dri3_query_version_cookie_t   cookie  /**< */,
98                               xcb_generic_error_t             **e)
99 {
100     return (xcb_dri3_query_version_reply_t *) xcb_wait_for_reply(c, cookie.sequence, e);
101 }
102 
103 xcb_dri3_open_cookie_t
xcb_dri3_open(xcb_connection_t * c,xcb_drawable_t drawable,uint32_t provider)104 xcb_dri3_open (xcb_connection_t *c,
105                xcb_drawable_t    drawable,
106                uint32_t          provider)
107 {
108     static const xcb_protocol_request_t xcb_req = {
109         .count = 2,
110         .ext = &xcb_dri3_id,
111         .opcode = XCB_DRI3_OPEN,
112         .isvoid = 0
113     };
114 
115     struct iovec xcb_parts[4];
116     xcb_dri3_open_cookie_t xcb_ret;
117     xcb_dri3_open_request_t xcb_out;
118 
119     xcb_out.drawable = drawable;
120     xcb_out.provider = provider;
121 
122     xcb_parts[2].iov_base = (char *) &xcb_out;
123     xcb_parts[2].iov_len = sizeof(xcb_out);
124     xcb_parts[3].iov_base = 0;
125     xcb_parts[3].iov_len = -xcb_parts[2].iov_len & 3;
126 
127     xcb_ret.sequence = xcb_send_request(c, XCB_REQUEST_CHECKED|XCB_REQUEST_REPLY_FDS, xcb_parts + 2, &xcb_req);
128     return xcb_ret;
129 }
130 
131 xcb_dri3_open_cookie_t
xcb_dri3_open_unchecked(xcb_connection_t * c,xcb_drawable_t drawable,uint32_t provider)132 xcb_dri3_open_unchecked (xcb_connection_t *c,
133                          xcb_drawable_t    drawable,
134                          uint32_t          provider)
135 {
136     static const xcb_protocol_request_t xcb_req = {
137         .count = 2,
138         .ext = &xcb_dri3_id,
139         .opcode = XCB_DRI3_OPEN,
140         .isvoid = 0
141     };
142 
143     struct iovec xcb_parts[4];
144     xcb_dri3_open_cookie_t xcb_ret;
145     xcb_dri3_open_request_t xcb_out;
146 
147     xcb_out.drawable = drawable;
148     xcb_out.provider = provider;
149 
150     xcb_parts[2].iov_base = (char *) &xcb_out;
151     xcb_parts[2].iov_len = sizeof(xcb_out);
152     xcb_parts[3].iov_base = 0;
153     xcb_parts[3].iov_len = -xcb_parts[2].iov_len & 3;
154 
155     xcb_ret.sequence = xcb_send_request(c, XCB_REQUEST_REPLY_FDS, xcb_parts + 2, &xcb_req);
156     return xcb_ret;
157 }
158 
159 xcb_dri3_open_reply_t *
xcb_dri3_open_reply(xcb_connection_t * c,xcb_dri3_open_cookie_t cookie,xcb_generic_error_t ** e)160 xcb_dri3_open_reply (xcb_connection_t        *c,
161                      xcb_dri3_open_cookie_t   cookie  /**< */,
162                      xcb_generic_error_t    **e)
163 {
164     return (xcb_dri3_open_reply_t *) xcb_wait_for_reply(c, cookie.sequence, e);
165 }
166 
167 int *
xcb_dri3_open_reply_fds(xcb_connection_t * c,xcb_dri3_open_reply_t * reply)168 xcb_dri3_open_reply_fds (xcb_connection_t       *c  /**< */,
169                          xcb_dri3_open_reply_t  *reply)
170 {
171     return xcb_get_reply_fds(c, reply, sizeof(xcb_dri3_open_reply_t) + 4 * reply->length);
172 }
173 
174 xcb_void_cookie_t
xcb_dri3_pixmap_from_buffer_checked(xcb_connection_t * c,xcb_pixmap_t pixmap,xcb_drawable_t drawable,uint32_t size,uint16_t width,uint16_t height,uint16_t stride,uint8_t depth,uint8_t bpp,int32_t pixmap_fd)175 xcb_dri3_pixmap_from_buffer_checked (xcb_connection_t *c,
176                                      xcb_pixmap_t      pixmap,
177                                      xcb_drawable_t    drawable,
178                                      uint32_t          size,
179                                      uint16_t          width,
180                                      uint16_t          height,
181                                      uint16_t          stride,
182                                      uint8_t           depth,
183                                      uint8_t           bpp,
184                                      int32_t           pixmap_fd)
185 {
186     static const xcb_protocol_request_t xcb_req = {
187         .count = 2,
188         .ext = &xcb_dri3_id,
189         .opcode = XCB_DRI3_PIXMAP_FROM_BUFFER,
190         .isvoid = 1
191     };
192 
193     struct iovec xcb_parts[4];
194     xcb_void_cookie_t xcb_ret;
195     xcb_dri3_pixmap_from_buffer_request_t xcb_out;
196     int fds[1];
197     int fd_index = 0;
198 
199     xcb_out.pixmap = pixmap;
200     xcb_out.drawable = drawable;
201     xcb_out.size = size;
202     xcb_out.width = width;
203     xcb_out.height = height;
204     xcb_out.stride = stride;
205     xcb_out.depth = depth;
206     xcb_out.bpp = bpp;
207 
208     xcb_parts[2].iov_base = (char *) &xcb_out;
209     xcb_parts[2].iov_len = sizeof(xcb_out);
210     xcb_parts[3].iov_base = 0;
211     xcb_parts[3].iov_len = -xcb_parts[2].iov_len & 3;
212 
213     fds[fd_index++] = pixmap_fd;
214     xcb_ret.sequence = xcb_send_request_with_fds(c, XCB_REQUEST_CHECKED, xcb_parts + 2, &xcb_req, 1, fds);
215     return xcb_ret;
216 }
217 
218 xcb_void_cookie_t
xcb_dri3_pixmap_from_buffer(xcb_connection_t * c,xcb_pixmap_t pixmap,xcb_drawable_t drawable,uint32_t size,uint16_t width,uint16_t height,uint16_t stride,uint8_t depth,uint8_t bpp,int32_t pixmap_fd)219 xcb_dri3_pixmap_from_buffer (xcb_connection_t *c,
220                              xcb_pixmap_t      pixmap,
221                              xcb_drawable_t    drawable,
222                              uint32_t          size,
223                              uint16_t          width,
224                              uint16_t          height,
225                              uint16_t          stride,
226                              uint8_t           depth,
227                              uint8_t           bpp,
228                              int32_t           pixmap_fd)
229 {
230     static const xcb_protocol_request_t xcb_req = {
231         .count = 2,
232         .ext = &xcb_dri3_id,
233         .opcode = XCB_DRI3_PIXMAP_FROM_BUFFER,
234         .isvoid = 1
235     };
236 
237     struct iovec xcb_parts[4];
238     xcb_void_cookie_t xcb_ret;
239     xcb_dri3_pixmap_from_buffer_request_t xcb_out;
240     int fds[1];
241     int fd_index = 0;
242 
243     xcb_out.pixmap = pixmap;
244     xcb_out.drawable = drawable;
245     xcb_out.size = size;
246     xcb_out.width = width;
247     xcb_out.height = height;
248     xcb_out.stride = stride;
249     xcb_out.depth = depth;
250     xcb_out.bpp = bpp;
251 
252     xcb_parts[2].iov_base = (char *) &xcb_out;
253     xcb_parts[2].iov_len = sizeof(xcb_out);
254     xcb_parts[3].iov_base = 0;
255     xcb_parts[3].iov_len = -xcb_parts[2].iov_len & 3;
256 
257     fds[fd_index++] = pixmap_fd;
258     xcb_ret.sequence = xcb_send_request_with_fds(c, 0, xcb_parts + 2, &xcb_req, 1, fds);
259     return xcb_ret;
260 }
261 
262 xcb_dri3_buffer_from_pixmap_cookie_t
xcb_dri3_buffer_from_pixmap(xcb_connection_t * c,xcb_pixmap_t pixmap)263 xcb_dri3_buffer_from_pixmap (xcb_connection_t *c,
264                              xcb_pixmap_t      pixmap)
265 {
266     static const xcb_protocol_request_t xcb_req = {
267         .count = 2,
268         .ext = &xcb_dri3_id,
269         .opcode = XCB_DRI3_BUFFER_FROM_PIXMAP,
270         .isvoid = 0
271     };
272 
273     struct iovec xcb_parts[4];
274     xcb_dri3_buffer_from_pixmap_cookie_t xcb_ret;
275     xcb_dri3_buffer_from_pixmap_request_t xcb_out;
276 
277     xcb_out.pixmap = pixmap;
278 
279     xcb_parts[2].iov_base = (char *) &xcb_out;
280     xcb_parts[2].iov_len = sizeof(xcb_out);
281     xcb_parts[3].iov_base = 0;
282     xcb_parts[3].iov_len = -xcb_parts[2].iov_len & 3;
283 
284     xcb_ret.sequence = xcb_send_request(c, XCB_REQUEST_CHECKED|XCB_REQUEST_REPLY_FDS, xcb_parts + 2, &xcb_req);
285     return xcb_ret;
286 }
287 
288 xcb_dri3_buffer_from_pixmap_cookie_t
xcb_dri3_buffer_from_pixmap_unchecked(xcb_connection_t * c,xcb_pixmap_t pixmap)289 xcb_dri3_buffer_from_pixmap_unchecked (xcb_connection_t *c,
290                                        xcb_pixmap_t      pixmap)
291 {
292     static const xcb_protocol_request_t xcb_req = {
293         .count = 2,
294         .ext = &xcb_dri3_id,
295         .opcode = XCB_DRI3_BUFFER_FROM_PIXMAP,
296         .isvoid = 0
297     };
298 
299     struct iovec xcb_parts[4];
300     xcb_dri3_buffer_from_pixmap_cookie_t xcb_ret;
301     xcb_dri3_buffer_from_pixmap_request_t xcb_out;
302 
303     xcb_out.pixmap = pixmap;
304 
305     xcb_parts[2].iov_base = (char *) &xcb_out;
306     xcb_parts[2].iov_len = sizeof(xcb_out);
307     xcb_parts[3].iov_base = 0;
308     xcb_parts[3].iov_len = -xcb_parts[2].iov_len & 3;
309 
310     xcb_ret.sequence = xcb_send_request(c, XCB_REQUEST_REPLY_FDS, xcb_parts + 2, &xcb_req);
311     return xcb_ret;
312 }
313 
314 xcb_dri3_buffer_from_pixmap_reply_t *
xcb_dri3_buffer_from_pixmap_reply(xcb_connection_t * c,xcb_dri3_buffer_from_pixmap_cookie_t cookie,xcb_generic_error_t ** e)315 xcb_dri3_buffer_from_pixmap_reply (xcb_connection_t                      *c,
316                                    xcb_dri3_buffer_from_pixmap_cookie_t   cookie  /**< */,
317                                    xcb_generic_error_t                  **e)
318 {
319     return (xcb_dri3_buffer_from_pixmap_reply_t *) xcb_wait_for_reply(c, cookie.sequence, e);
320 }
321 
322 int *
xcb_dri3_buffer_from_pixmap_reply_fds(xcb_connection_t * c,xcb_dri3_buffer_from_pixmap_reply_t * reply)323 xcb_dri3_buffer_from_pixmap_reply_fds (xcb_connection_t                     *c  /**< */,
324                                        xcb_dri3_buffer_from_pixmap_reply_t  *reply)
325 {
326     return xcb_get_reply_fds(c, reply, sizeof(xcb_dri3_buffer_from_pixmap_reply_t) + 4 * reply->length);
327 }
328 
329 xcb_void_cookie_t
xcb_dri3_fence_from_fd_checked(xcb_connection_t * c,xcb_drawable_t drawable,uint32_t fence,uint8_t initially_triggered,int32_t fence_fd)330 xcb_dri3_fence_from_fd_checked (xcb_connection_t *c,
331                                 xcb_drawable_t    drawable,
332                                 uint32_t          fence,
333                                 uint8_t           initially_triggered,
334                                 int32_t           fence_fd)
335 {
336     static const xcb_protocol_request_t xcb_req = {
337         .count = 2,
338         .ext = &xcb_dri3_id,
339         .opcode = XCB_DRI3_FENCE_FROM_FD,
340         .isvoid = 1
341     };
342 
343     struct iovec xcb_parts[4];
344     xcb_void_cookie_t xcb_ret;
345     xcb_dri3_fence_from_fd_request_t xcb_out;
346     int fds[1];
347     int fd_index = 0;
348 
349     xcb_out.drawable = drawable;
350     xcb_out.fence = fence;
351     xcb_out.initially_triggered = initially_triggered;
352     memset(xcb_out.pad0, 0, 3);
353 
354     xcb_parts[2].iov_base = (char *) &xcb_out;
355     xcb_parts[2].iov_len = sizeof(xcb_out);
356     xcb_parts[3].iov_base = 0;
357     xcb_parts[3].iov_len = -xcb_parts[2].iov_len & 3;
358 
359     fds[fd_index++] = fence_fd;
360     xcb_ret.sequence = xcb_send_request_with_fds(c, XCB_REQUEST_CHECKED, xcb_parts + 2, &xcb_req, 1, fds);
361     return xcb_ret;
362 }
363 
364 xcb_void_cookie_t
xcb_dri3_fence_from_fd(xcb_connection_t * c,xcb_drawable_t drawable,uint32_t fence,uint8_t initially_triggered,int32_t fence_fd)365 xcb_dri3_fence_from_fd (xcb_connection_t *c,
366                         xcb_drawable_t    drawable,
367                         uint32_t          fence,
368                         uint8_t           initially_triggered,
369                         int32_t           fence_fd)
370 {
371     static const xcb_protocol_request_t xcb_req = {
372         .count = 2,
373         .ext = &xcb_dri3_id,
374         .opcode = XCB_DRI3_FENCE_FROM_FD,
375         .isvoid = 1
376     };
377 
378     struct iovec xcb_parts[4];
379     xcb_void_cookie_t xcb_ret;
380     xcb_dri3_fence_from_fd_request_t xcb_out;
381     int fds[1];
382     int fd_index = 0;
383 
384     xcb_out.drawable = drawable;
385     xcb_out.fence = fence;
386     xcb_out.initially_triggered = initially_triggered;
387     memset(xcb_out.pad0, 0, 3);
388 
389     xcb_parts[2].iov_base = (char *) &xcb_out;
390     xcb_parts[2].iov_len = sizeof(xcb_out);
391     xcb_parts[3].iov_base = 0;
392     xcb_parts[3].iov_len = -xcb_parts[2].iov_len & 3;
393 
394     fds[fd_index++] = fence_fd;
395     xcb_ret.sequence = xcb_send_request_with_fds(c, 0, xcb_parts + 2, &xcb_req, 1, fds);
396     return xcb_ret;
397 }
398 
399 xcb_dri3_fd_from_fence_cookie_t
xcb_dri3_fd_from_fence(xcb_connection_t * c,xcb_drawable_t drawable,uint32_t fence)400 xcb_dri3_fd_from_fence (xcb_connection_t *c,
401                         xcb_drawable_t    drawable,
402                         uint32_t          fence)
403 {
404     static const xcb_protocol_request_t xcb_req = {
405         .count = 2,
406         .ext = &xcb_dri3_id,
407         .opcode = XCB_DRI3_FD_FROM_FENCE,
408         .isvoid = 0
409     };
410 
411     struct iovec xcb_parts[4];
412     xcb_dri3_fd_from_fence_cookie_t xcb_ret;
413     xcb_dri3_fd_from_fence_request_t xcb_out;
414 
415     xcb_out.drawable = drawable;
416     xcb_out.fence = fence;
417 
418     xcb_parts[2].iov_base = (char *) &xcb_out;
419     xcb_parts[2].iov_len = sizeof(xcb_out);
420     xcb_parts[3].iov_base = 0;
421     xcb_parts[3].iov_len = -xcb_parts[2].iov_len & 3;
422 
423     xcb_ret.sequence = xcb_send_request(c, XCB_REQUEST_CHECKED|XCB_REQUEST_REPLY_FDS, xcb_parts + 2, &xcb_req);
424     return xcb_ret;
425 }
426 
427 xcb_dri3_fd_from_fence_cookie_t
xcb_dri3_fd_from_fence_unchecked(xcb_connection_t * c,xcb_drawable_t drawable,uint32_t fence)428 xcb_dri3_fd_from_fence_unchecked (xcb_connection_t *c,
429                                   xcb_drawable_t    drawable,
430                                   uint32_t          fence)
431 {
432     static const xcb_protocol_request_t xcb_req = {
433         .count = 2,
434         .ext = &xcb_dri3_id,
435         .opcode = XCB_DRI3_FD_FROM_FENCE,
436         .isvoid = 0
437     };
438 
439     struct iovec xcb_parts[4];
440     xcb_dri3_fd_from_fence_cookie_t xcb_ret;
441     xcb_dri3_fd_from_fence_request_t xcb_out;
442 
443     xcb_out.drawable = drawable;
444     xcb_out.fence = fence;
445 
446     xcb_parts[2].iov_base = (char *) &xcb_out;
447     xcb_parts[2].iov_len = sizeof(xcb_out);
448     xcb_parts[3].iov_base = 0;
449     xcb_parts[3].iov_len = -xcb_parts[2].iov_len & 3;
450 
451     xcb_ret.sequence = xcb_send_request(c, XCB_REQUEST_REPLY_FDS, xcb_parts + 2, &xcb_req);
452     return xcb_ret;
453 }
454 
455 xcb_dri3_fd_from_fence_reply_t *
xcb_dri3_fd_from_fence_reply(xcb_connection_t * c,xcb_dri3_fd_from_fence_cookie_t cookie,xcb_generic_error_t ** e)456 xcb_dri3_fd_from_fence_reply (xcb_connection_t                 *c,
457                               xcb_dri3_fd_from_fence_cookie_t   cookie  /**< */,
458                               xcb_generic_error_t             **e)
459 {
460     return (xcb_dri3_fd_from_fence_reply_t *) xcb_wait_for_reply(c, cookie.sequence, e);
461 }
462 
463 int *
xcb_dri3_fd_from_fence_reply_fds(xcb_connection_t * c,xcb_dri3_fd_from_fence_reply_t * reply)464 xcb_dri3_fd_from_fence_reply_fds (xcb_connection_t                *c  /**< */,
465                                   xcb_dri3_fd_from_fence_reply_t  *reply)
466 {
467     return xcb_get_reply_fds(c, reply, sizeof(xcb_dri3_fd_from_fence_reply_t) + 4 * reply->length);
468 }
469 
470 int
xcb_dri3_get_supported_modifiers_sizeof(const void * _buffer)471 xcb_dri3_get_supported_modifiers_sizeof (const void  *_buffer)
472 {
473     char *xcb_tmp = (char *)_buffer;
474     const xcb_dri3_get_supported_modifiers_reply_t *_aux = (xcb_dri3_get_supported_modifiers_reply_t *)_buffer;
475     unsigned int xcb_buffer_len = 0;
476     unsigned int xcb_block_len = 0;
477     unsigned int xcb_pad = 0;
478     unsigned int xcb_align_to = 0;
479 
480 
481     xcb_block_len += sizeof(xcb_dri3_get_supported_modifiers_reply_t);
482     xcb_tmp += xcb_block_len;
483     xcb_buffer_len += xcb_block_len;
484     xcb_block_len = 0;
485     /* window_modifiers */
486     xcb_block_len += _aux->num_window_modifiers * sizeof(uint64_t);
487     xcb_tmp += xcb_block_len;
488     xcb_align_to = ALIGNOF(uint64_t);
489     /* insert padding */
490     xcb_pad = -xcb_block_len & (xcb_align_to - 1);
491     xcb_buffer_len += xcb_block_len + xcb_pad;
492     if (0 != xcb_pad) {
493         xcb_tmp += xcb_pad;
494         xcb_pad = 0;
495     }
496     xcb_block_len = 0;
497     /* screen_modifiers */
498     xcb_block_len += _aux->num_screen_modifiers * sizeof(uint64_t);
499     xcb_tmp += xcb_block_len;
500     xcb_align_to = ALIGNOF(uint64_t);
501     /* insert padding */
502     xcb_pad = -xcb_block_len & (xcb_align_to - 1);
503     xcb_buffer_len += xcb_block_len + xcb_pad;
504     if (0 != xcb_pad) {
505         xcb_tmp += xcb_pad;
506         xcb_pad = 0;
507     }
508     xcb_block_len = 0;
509 
510     return xcb_buffer_len;
511 }
512 
513 xcb_dri3_get_supported_modifiers_cookie_t
xcb_dri3_get_supported_modifiers(xcb_connection_t * c,uint32_t window,uint8_t depth,uint8_t bpp)514 xcb_dri3_get_supported_modifiers (xcb_connection_t *c,
515                                   uint32_t          window,
516                                   uint8_t           depth,
517                                   uint8_t           bpp)
518 {
519     static const xcb_protocol_request_t xcb_req = {
520         .count = 2,
521         .ext = &xcb_dri3_id,
522         .opcode = XCB_DRI3_GET_SUPPORTED_MODIFIERS,
523         .isvoid = 0
524     };
525 
526     struct iovec xcb_parts[4];
527     xcb_dri3_get_supported_modifiers_cookie_t xcb_ret;
528     xcb_dri3_get_supported_modifiers_request_t xcb_out;
529 
530     xcb_out.window = window;
531     xcb_out.depth = depth;
532     xcb_out.bpp = bpp;
533     memset(xcb_out.pad0, 0, 2);
534 
535     xcb_parts[2].iov_base = (char *) &xcb_out;
536     xcb_parts[2].iov_len = sizeof(xcb_out);
537     xcb_parts[3].iov_base = 0;
538     xcb_parts[3].iov_len = -xcb_parts[2].iov_len & 3;
539 
540     xcb_ret.sequence = xcb_send_request(c, XCB_REQUEST_CHECKED, xcb_parts + 2, &xcb_req);
541     return xcb_ret;
542 }
543 
544 xcb_dri3_get_supported_modifiers_cookie_t
xcb_dri3_get_supported_modifiers_unchecked(xcb_connection_t * c,uint32_t window,uint8_t depth,uint8_t bpp)545 xcb_dri3_get_supported_modifiers_unchecked (xcb_connection_t *c,
546                                             uint32_t          window,
547                                             uint8_t           depth,
548                                             uint8_t           bpp)
549 {
550     static const xcb_protocol_request_t xcb_req = {
551         .count = 2,
552         .ext = &xcb_dri3_id,
553         .opcode = XCB_DRI3_GET_SUPPORTED_MODIFIERS,
554         .isvoid = 0
555     };
556 
557     struct iovec xcb_parts[4];
558     xcb_dri3_get_supported_modifiers_cookie_t xcb_ret;
559     xcb_dri3_get_supported_modifiers_request_t xcb_out;
560 
561     xcb_out.window = window;
562     xcb_out.depth = depth;
563     xcb_out.bpp = bpp;
564     memset(xcb_out.pad0, 0, 2);
565 
566     xcb_parts[2].iov_base = (char *) &xcb_out;
567     xcb_parts[2].iov_len = sizeof(xcb_out);
568     xcb_parts[3].iov_base = 0;
569     xcb_parts[3].iov_len = -xcb_parts[2].iov_len & 3;
570 
571     xcb_ret.sequence = xcb_send_request(c, 0, xcb_parts + 2, &xcb_req);
572     return xcb_ret;
573 }
574 
575 uint64_t *
xcb_dri3_get_supported_modifiers_window_modifiers(const xcb_dri3_get_supported_modifiers_reply_t * R)576 xcb_dri3_get_supported_modifiers_window_modifiers (const xcb_dri3_get_supported_modifiers_reply_t *R)
577 {
578     return (uint64_t *) (R + 1);
579 }
580 
581 int
xcb_dri3_get_supported_modifiers_window_modifiers_length(const xcb_dri3_get_supported_modifiers_reply_t * R)582 xcb_dri3_get_supported_modifiers_window_modifiers_length (const xcb_dri3_get_supported_modifiers_reply_t *R)
583 {
584     return R->num_window_modifiers;
585 }
586 
587 xcb_generic_iterator_t
xcb_dri3_get_supported_modifiers_window_modifiers_end(const xcb_dri3_get_supported_modifiers_reply_t * R)588 xcb_dri3_get_supported_modifiers_window_modifiers_end (const xcb_dri3_get_supported_modifiers_reply_t *R)
589 {
590     xcb_generic_iterator_t i;
591     i.data = ((uint64_t *) (R + 1)) + (R->num_window_modifiers);
592     i.rem = 0;
593     i.index = (char *) i.data - (char *) R;
594     return i;
595 }
596 
597 uint64_t *
xcb_dri3_get_supported_modifiers_screen_modifiers(const xcb_dri3_get_supported_modifiers_reply_t * R)598 xcb_dri3_get_supported_modifiers_screen_modifiers (const xcb_dri3_get_supported_modifiers_reply_t *R)
599 {
600     xcb_generic_iterator_t prev = xcb_dri3_get_supported_modifiers_window_modifiers_end(R);
601     return (uint64_t *) ((char *) prev.data + XCB_TYPE_PAD(uint64_t, prev.index) + 0);
602 }
603 
604 int
xcb_dri3_get_supported_modifiers_screen_modifiers_length(const xcb_dri3_get_supported_modifiers_reply_t * R)605 xcb_dri3_get_supported_modifiers_screen_modifiers_length (const xcb_dri3_get_supported_modifiers_reply_t *R)
606 {
607     return R->num_screen_modifiers;
608 }
609 
610 xcb_generic_iterator_t
xcb_dri3_get_supported_modifiers_screen_modifiers_end(const xcb_dri3_get_supported_modifiers_reply_t * R)611 xcb_dri3_get_supported_modifiers_screen_modifiers_end (const xcb_dri3_get_supported_modifiers_reply_t *R)
612 {
613     xcb_generic_iterator_t i;
614     xcb_generic_iterator_t prev = xcb_dri3_get_supported_modifiers_window_modifiers_end(R);
615     i.data = ((uint64_t *) ((char*) prev.data + XCB_TYPE_PAD(uint64_t, prev.index))) + (R->num_screen_modifiers);
616     i.rem = 0;
617     i.index = (char *) i.data - (char *) R;
618     return i;
619 }
620 
621 xcb_dri3_get_supported_modifiers_reply_t *
xcb_dri3_get_supported_modifiers_reply(xcb_connection_t * c,xcb_dri3_get_supported_modifiers_cookie_t cookie,xcb_generic_error_t ** e)622 xcb_dri3_get_supported_modifiers_reply (xcb_connection_t                           *c,
623                                         xcb_dri3_get_supported_modifiers_cookie_t   cookie  /**< */,
624                                         xcb_generic_error_t                       **e)
625 {
626     return (xcb_dri3_get_supported_modifiers_reply_t *) xcb_wait_for_reply(c, cookie.sequence, e);
627 }
628 
629 xcb_void_cookie_t
xcb_dri3_pixmap_from_buffers_checked(xcb_connection_t * c,xcb_pixmap_t pixmap,xcb_window_t window,uint8_t num_buffers,uint16_t width,uint16_t height,uint32_t stride0,uint32_t offset0,uint32_t stride1,uint32_t offset1,uint32_t stride2,uint32_t offset2,uint32_t stride3,uint32_t offset3,uint8_t depth,uint8_t bpp,uint64_t modifier,const int32_t * buffers)630 xcb_dri3_pixmap_from_buffers_checked (xcb_connection_t *c,
631                                       xcb_pixmap_t      pixmap,
632                                       xcb_window_t      window,
633                                       uint8_t           num_buffers,
634                                       uint16_t          width,
635                                       uint16_t          height,
636                                       uint32_t          stride0,
637                                       uint32_t          offset0,
638                                       uint32_t          stride1,
639                                       uint32_t          offset1,
640                                       uint32_t          stride2,
641                                       uint32_t          offset2,
642                                       uint32_t          stride3,
643                                       uint32_t          offset3,
644                                       uint8_t           depth,
645                                       uint8_t           bpp,
646                                       uint64_t          modifier,
647                                       const int32_t    *buffers)
648 {
649     static const xcb_protocol_request_t xcb_req = {
650         .count = 2,
651         .ext = &xcb_dri3_id,
652         .opcode = XCB_DRI3_PIXMAP_FROM_BUFFERS,
653         .isvoid = 1
654     };
655 
656     struct iovec xcb_parts[4];
657     xcb_void_cookie_t xcb_ret;
658     xcb_dri3_pixmap_from_buffers_request_t xcb_out;
659     unsigned int i;
660     int fds[num_buffers];
661     int fd_index = 0;
662 
663     xcb_out.pixmap = pixmap;
664     xcb_out.window = window;
665     xcb_out.num_buffers = num_buffers;
666     memset(xcb_out.pad0, 0, 3);
667     xcb_out.width = width;
668     xcb_out.height = height;
669     xcb_out.stride0 = stride0;
670     xcb_out.offset0 = offset0;
671     xcb_out.stride1 = stride1;
672     xcb_out.offset1 = offset1;
673     xcb_out.stride2 = stride2;
674     xcb_out.offset2 = offset2;
675     xcb_out.stride3 = stride3;
676     xcb_out.offset3 = offset3;
677     xcb_out.depth = depth;
678     xcb_out.bpp = bpp;
679     memset(xcb_out.pad1, 0, 2);
680     xcb_out.modifier = modifier;
681 
682     xcb_parts[2].iov_base = (char *) &xcb_out;
683     xcb_parts[2].iov_len = sizeof(xcb_out);
684     xcb_parts[3].iov_base = 0;
685     xcb_parts[3].iov_len = -xcb_parts[2].iov_len & 3;
686 
687     for (i = 0; i < num_buffers; i++)
688         fds[fd_index++] = buffers[i];
689     xcb_ret.sequence = xcb_send_request_with_fds(c, XCB_REQUEST_CHECKED, xcb_parts + 2, &xcb_req, num_buffers, fds);
690     return xcb_ret;
691 }
692 
693 xcb_void_cookie_t
xcb_dri3_pixmap_from_buffers(xcb_connection_t * c,xcb_pixmap_t pixmap,xcb_window_t window,uint8_t num_buffers,uint16_t width,uint16_t height,uint32_t stride0,uint32_t offset0,uint32_t stride1,uint32_t offset1,uint32_t stride2,uint32_t offset2,uint32_t stride3,uint32_t offset3,uint8_t depth,uint8_t bpp,uint64_t modifier,const int32_t * buffers)694 xcb_dri3_pixmap_from_buffers (xcb_connection_t *c,
695                               xcb_pixmap_t      pixmap,
696                               xcb_window_t      window,
697                               uint8_t           num_buffers,
698                               uint16_t          width,
699                               uint16_t          height,
700                               uint32_t          stride0,
701                               uint32_t          offset0,
702                               uint32_t          stride1,
703                               uint32_t          offset1,
704                               uint32_t          stride2,
705                               uint32_t          offset2,
706                               uint32_t          stride3,
707                               uint32_t          offset3,
708                               uint8_t           depth,
709                               uint8_t           bpp,
710                               uint64_t          modifier,
711                               const int32_t    *buffers)
712 {
713     static const xcb_protocol_request_t xcb_req = {
714         .count = 2,
715         .ext = &xcb_dri3_id,
716         .opcode = XCB_DRI3_PIXMAP_FROM_BUFFERS,
717         .isvoid = 1
718     };
719 
720     struct iovec xcb_parts[4];
721     xcb_void_cookie_t xcb_ret;
722     xcb_dri3_pixmap_from_buffers_request_t xcb_out;
723     unsigned int i;
724     int fds[num_buffers];
725     int fd_index = 0;
726 
727     xcb_out.pixmap = pixmap;
728     xcb_out.window = window;
729     xcb_out.num_buffers = num_buffers;
730     memset(xcb_out.pad0, 0, 3);
731     xcb_out.width = width;
732     xcb_out.height = height;
733     xcb_out.stride0 = stride0;
734     xcb_out.offset0 = offset0;
735     xcb_out.stride1 = stride1;
736     xcb_out.offset1 = offset1;
737     xcb_out.stride2 = stride2;
738     xcb_out.offset2 = offset2;
739     xcb_out.stride3 = stride3;
740     xcb_out.offset3 = offset3;
741     xcb_out.depth = depth;
742     xcb_out.bpp = bpp;
743     memset(xcb_out.pad1, 0, 2);
744     xcb_out.modifier = modifier;
745 
746     xcb_parts[2].iov_base = (char *) &xcb_out;
747     xcb_parts[2].iov_len = sizeof(xcb_out);
748     xcb_parts[3].iov_base = 0;
749     xcb_parts[3].iov_len = -xcb_parts[2].iov_len & 3;
750 
751     for (i = 0; i < num_buffers; i++)
752         fds[fd_index++] = buffers[i];
753     xcb_ret.sequence = xcb_send_request_with_fds(c, 0, xcb_parts + 2, &xcb_req, num_buffers, fds);
754     return xcb_ret;
755 }
756 
757 int
xcb_dri3_buffers_from_pixmap_sizeof(const void * _buffer,int32_t buffers)758 xcb_dri3_buffers_from_pixmap_sizeof (const void  *_buffer,
759                                      int32_t      buffers)
760 {
761     char *xcb_tmp = (char *)_buffer;
762     const xcb_dri3_buffers_from_pixmap_reply_t *_aux = (xcb_dri3_buffers_from_pixmap_reply_t *)_buffer;
763     unsigned int xcb_buffer_len = 0;
764     unsigned int xcb_block_len = 0;
765     unsigned int xcb_pad = 0;
766     unsigned int xcb_align_to = 0;
767 
768 
769     xcb_block_len += sizeof(xcb_dri3_buffers_from_pixmap_reply_t);
770     xcb_tmp += xcb_block_len;
771     xcb_buffer_len += xcb_block_len;
772     xcb_block_len = 0;
773     /* strides */
774     xcb_block_len += _aux->nfd * sizeof(uint32_t);
775     xcb_tmp += xcb_block_len;
776     xcb_align_to = ALIGNOF(uint32_t);
777     /* insert padding */
778     xcb_pad = -xcb_block_len & (xcb_align_to - 1);
779     xcb_buffer_len += xcb_block_len + xcb_pad;
780     if (0 != xcb_pad) {
781         xcb_tmp += xcb_pad;
782         xcb_pad = 0;
783     }
784     xcb_block_len = 0;
785     /* offsets */
786     xcb_block_len += _aux->nfd * sizeof(uint32_t);
787     xcb_tmp += xcb_block_len;
788     xcb_align_to = ALIGNOF(uint32_t);
789     /* insert padding */
790     xcb_pad = -xcb_block_len & (xcb_align_to - 1);
791     xcb_buffer_len += xcb_block_len + xcb_pad;
792     if (0 != xcb_pad) {
793         xcb_tmp += xcb_pad;
794         xcb_pad = 0;
795     }
796     xcb_block_len = 0;
797 
798     return xcb_buffer_len;
799 }
800 
801 xcb_dri3_buffers_from_pixmap_cookie_t
xcb_dri3_buffers_from_pixmap(xcb_connection_t * c,xcb_pixmap_t pixmap)802 xcb_dri3_buffers_from_pixmap (xcb_connection_t *c,
803                               xcb_pixmap_t      pixmap)
804 {
805     static const xcb_protocol_request_t xcb_req = {
806         .count = 2,
807         .ext = &xcb_dri3_id,
808         .opcode = XCB_DRI3_BUFFERS_FROM_PIXMAP,
809         .isvoid = 0
810     };
811 
812     struct iovec xcb_parts[4];
813     xcb_dri3_buffers_from_pixmap_cookie_t xcb_ret;
814     xcb_dri3_buffers_from_pixmap_request_t xcb_out;
815 
816     xcb_out.pixmap = pixmap;
817 
818     xcb_parts[2].iov_base = (char *) &xcb_out;
819     xcb_parts[2].iov_len = sizeof(xcb_out);
820     xcb_parts[3].iov_base = 0;
821     xcb_parts[3].iov_len = -xcb_parts[2].iov_len & 3;
822 
823     xcb_ret.sequence = xcb_send_request(c, XCB_REQUEST_CHECKED|XCB_REQUEST_REPLY_FDS, xcb_parts + 2, &xcb_req);
824     return xcb_ret;
825 }
826 
827 xcb_dri3_buffers_from_pixmap_cookie_t
xcb_dri3_buffers_from_pixmap_unchecked(xcb_connection_t * c,xcb_pixmap_t pixmap)828 xcb_dri3_buffers_from_pixmap_unchecked (xcb_connection_t *c,
829                                         xcb_pixmap_t      pixmap)
830 {
831     static const xcb_protocol_request_t xcb_req = {
832         .count = 2,
833         .ext = &xcb_dri3_id,
834         .opcode = XCB_DRI3_BUFFERS_FROM_PIXMAP,
835         .isvoid = 0
836     };
837 
838     struct iovec xcb_parts[4];
839     xcb_dri3_buffers_from_pixmap_cookie_t xcb_ret;
840     xcb_dri3_buffers_from_pixmap_request_t xcb_out;
841 
842     xcb_out.pixmap = pixmap;
843 
844     xcb_parts[2].iov_base = (char *) &xcb_out;
845     xcb_parts[2].iov_len = sizeof(xcb_out);
846     xcb_parts[3].iov_base = 0;
847     xcb_parts[3].iov_len = -xcb_parts[2].iov_len & 3;
848 
849     xcb_ret.sequence = xcb_send_request(c, XCB_REQUEST_REPLY_FDS, xcb_parts + 2, &xcb_req);
850     return xcb_ret;
851 }
852 
853 uint32_t *
xcb_dri3_buffers_from_pixmap_strides(const xcb_dri3_buffers_from_pixmap_reply_t * R)854 xcb_dri3_buffers_from_pixmap_strides (const xcb_dri3_buffers_from_pixmap_reply_t *R)
855 {
856     return (uint32_t *) (R + 1);
857 }
858 
859 int
xcb_dri3_buffers_from_pixmap_strides_length(const xcb_dri3_buffers_from_pixmap_reply_t * R)860 xcb_dri3_buffers_from_pixmap_strides_length (const xcb_dri3_buffers_from_pixmap_reply_t *R)
861 {
862     return R->nfd;
863 }
864 
865 xcb_generic_iterator_t
xcb_dri3_buffers_from_pixmap_strides_end(const xcb_dri3_buffers_from_pixmap_reply_t * R)866 xcb_dri3_buffers_from_pixmap_strides_end (const xcb_dri3_buffers_from_pixmap_reply_t *R)
867 {
868     xcb_generic_iterator_t i;
869     i.data = ((uint32_t *) (R + 1)) + (R->nfd);
870     i.rem = 0;
871     i.index = (char *) i.data - (char *) R;
872     return i;
873 }
874 
875 uint32_t *
xcb_dri3_buffers_from_pixmap_offsets(const xcb_dri3_buffers_from_pixmap_reply_t * R)876 xcb_dri3_buffers_from_pixmap_offsets (const xcb_dri3_buffers_from_pixmap_reply_t *R)
877 {
878     xcb_generic_iterator_t prev = xcb_dri3_buffers_from_pixmap_strides_end(R);
879     return (uint32_t *) ((char *) prev.data + XCB_TYPE_PAD(uint32_t, prev.index) + 0);
880 }
881 
882 int
xcb_dri3_buffers_from_pixmap_offsets_length(const xcb_dri3_buffers_from_pixmap_reply_t * R)883 xcb_dri3_buffers_from_pixmap_offsets_length (const xcb_dri3_buffers_from_pixmap_reply_t *R)
884 {
885     return R->nfd;
886 }
887 
888 xcb_generic_iterator_t
xcb_dri3_buffers_from_pixmap_offsets_end(const xcb_dri3_buffers_from_pixmap_reply_t * R)889 xcb_dri3_buffers_from_pixmap_offsets_end (const xcb_dri3_buffers_from_pixmap_reply_t *R)
890 {
891     xcb_generic_iterator_t i;
892     xcb_generic_iterator_t prev = xcb_dri3_buffers_from_pixmap_strides_end(R);
893     i.data = ((uint32_t *) ((char*) prev.data + XCB_TYPE_PAD(uint32_t, prev.index))) + (R->nfd);
894     i.rem = 0;
895     i.index = (char *) i.data - (char *) R;
896     return i;
897 }
898 
899 int32_t *
xcb_dri3_buffers_from_pixmap_buffers(const xcb_dri3_buffers_from_pixmap_reply_t * R)900 xcb_dri3_buffers_from_pixmap_buffers (const xcb_dri3_buffers_from_pixmap_reply_t *R)
901 {
902     xcb_generic_iterator_t prev = xcb_dri3_buffers_from_pixmap_offsets_end(R);
903     return (int32_t *) ((char *) prev.data + XCB_TYPE_PAD(int32_t, prev.index) + 0);
904 }
905 
906 int
xcb_dri3_buffers_from_pixmap_buffers_length(const xcb_dri3_buffers_from_pixmap_reply_t * R)907 xcb_dri3_buffers_from_pixmap_buffers_length (const xcb_dri3_buffers_from_pixmap_reply_t *R)
908 {
909     return R->nfd;
910 }
911 
912 xcb_generic_iterator_t
xcb_dri3_buffers_from_pixmap_buffers_end(const xcb_dri3_buffers_from_pixmap_reply_t * R)913 xcb_dri3_buffers_from_pixmap_buffers_end (const xcb_dri3_buffers_from_pixmap_reply_t *R)
914 {
915     xcb_generic_iterator_t i;
916     xcb_generic_iterator_t prev = xcb_dri3_buffers_from_pixmap_offsets_end(R);
917     i.data = ((int32_t *) ((char*) prev.data + XCB_TYPE_PAD(int32_t, prev.index))) + (R->nfd);
918     i.rem = 0;
919     i.index = (char *) i.data - (char *) R;
920     return i;
921 }
922 
923 xcb_dri3_buffers_from_pixmap_reply_t *
xcb_dri3_buffers_from_pixmap_reply(xcb_connection_t * c,xcb_dri3_buffers_from_pixmap_cookie_t cookie,xcb_generic_error_t ** e)924 xcb_dri3_buffers_from_pixmap_reply (xcb_connection_t                       *c,
925                                     xcb_dri3_buffers_from_pixmap_cookie_t   cookie  /**< */,
926                                     xcb_generic_error_t                   **e)
927 {
928     return (xcb_dri3_buffers_from_pixmap_reply_t *) xcb_wait_for_reply(c, cookie.sequence, e);
929 }
930 
931 int *
xcb_dri3_buffers_from_pixmap_reply_fds(xcb_connection_t * c,xcb_dri3_buffers_from_pixmap_reply_t * reply)932 xcb_dri3_buffers_from_pixmap_reply_fds (xcb_connection_t                      *c  /**< */,
933                                         xcb_dri3_buffers_from_pixmap_reply_t  *reply)
934 {
935     return xcb_get_reply_fds(c, reply, sizeof(xcb_dri3_buffers_from_pixmap_reply_t) + 4 * reply->length);
936 }
937 
938 xcb_void_cookie_t
xcb_dri3_set_drm_device_in_use_checked(xcb_connection_t * c,xcb_window_t window,uint32_t drmMajor,uint32_t drmMinor)939 xcb_dri3_set_drm_device_in_use_checked (xcb_connection_t *c,
940                                         xcb_window_t      window,
941                                         uint32_t          drmMajor,
942                                         uint32_t          drmMinor)
943 {
944     static const xcb_protocol_request_t xcb_req = {
945         .count = 2,
946         .ext = &xcb_dri3_id,
947         .opcode = XCB_DRI3_SET_DRM_DEVICE_IN_USE,
948         .isvoid = 1
949     };
950 
951     struct iovec xcb_parts[4];
952     xcb_void_cookie_t xcb_ret;
953     xcb_dri3_set_drm_device_in_use_request_t xcb_out;
954 
955     xcb_out.window = window;
956     xcb_out.drmMajor = drmMajor;
957     xcb_out.drmMinor = drmMinor;
958 
959     xcb_parts[2].iov_base = (char *) &xcb_out;
960     xcb_parts[2].iov_len = sizeof(xcb_out);
961     xcb_parts[3].iov_base = 0;
962     xcb_parts[3].iov_len = -xcb_parts[2].iov_len & 3;
963 
964     xcb_ret.sequence = xcb_send_request(c, XCB_REQUEST_CHECKED, xcb_parts + 2, &xcb_req);
965     return xcb_ret;
966 }
967 
968 xcb_void_cookie_t
xcb_dri3_set_drm_device_in_use(xcb_connection_t * c,xcb_window_t window,uint32_t drmMajor,uint32_t drmMinor)969 xcb_dri3_set_drm_device_in_use (xcb_connection_t *c,
970                                 xcb_window_t      window,
971                                 uint32_t          drmMajor,
972                                 uint32_t          drmMinor)
973 {
974     static const xcb_protocol_request_t xcb_req = {
975         .count = 2,
976         .ext = &xcb_dri3_id,
977         .opcode = XCB_DRI3_SET_DRM_DEVICE_IN_USE,
978         .isvoid = 1
979     };
980 
981     struct iovec xcb_parts[4];
982     xcb_void_cookie_t xcb_ret;
983     xcb_dri3_set_drm_device_in_use_request_t xcb_out;
984 
985     xcb_out.window = window;
986     xcb_out.drmMajor = drmMajor;
987     xcb_out.drmMinor = drmMinor;
988 
989     xcb_parts[2].iov_base = (char *) &xcb_out;
990     xcb_parts[2].iov_len = sizeof(xcb_out);
991     xcb_parts[3].iov_base = 0;
992     xcb_parts[3].iov_len = -xcb_parts[2].iov_len & 3;
993 
994     xcb_ret.sequence = xcb_send_request(c, 0, xcb_parts + 2, &xcb_req);
995     return xcb_ret;
996 }
997 
998 xcb_void_cookie_t
xcb_dri3_import_syncobj_checked(xcb_connection_t * c,xcb_dri3_syncobj_t syncobj,xcb_drawable_t drawable,int32_t syncobj_fd)999 xcb_dri3_import_syncobj_checked (xcb_connection_t   *c,
1000                                  xcb_dri3_syncobj_t  syncobj,
1001                                  xcb_drawable_t      drawable,
1002                                  int32_t             syncobj_fd)
1003 {
1004     static const xcb_protocol_request_t xcb_req = {
1005         .count = 2,
1006         .ext = &xcb_dri3_id,
1007         .opcode = XCB_DRI3_IMPORT_SYNCOBJ,
1008         .isvoid = 1
1009     };
1010 
1011     struct iovec xcb_parts[4];
1012     xcb_void_cookie_t xcb_ret;
1013     xcb_dri3_import_syncobj_request_t xcb_out;
1014     int fds[1];
1015     int fd_index = 0;
1016 
1017     xcb_out.syncobj = syncobj;
1018     xcb_out.drawable = drawable;
1019 
1020     xcb_parts[2].iov_base = (char *) &xcb_out;
1021     xcb_parts[2].iov_len = sizeof(xcb_out);
1022     xcb_parts[3].iov_base = 0;
1023     xcb_parts[3].iov_len = -xcb_parts[2].iov_len & 3;
1024 
1025     fds[fd_index++] = syncobj_fd;
1026     xcb_ret.sequence = xcb_send_request_with_fds(c, XCB_REQUEST_CHECKED, xcb_parts + 2, &xcb_req, 1, fds);
1027     return xcb_ret;
1028 }
1029 
1030 xcb_void_cookie_t
xcb_dri3_import_syncobj(xcb_connection_t * c,xcb_dri3_syncobj_t syncobj,xcb_drawable_t drawable,int32_t syncobj_fd)1031 xcb_dri3_import_syncobj (xcb_connection_t   *c,
1032                          xcb_dri3_syncobj_t  syncobj,
1033                          xcb_drawable_t      drawable,
1034                          int32_t             syncobj_fd)
1035 {
1036     static const xcb_protocol_request_t xcb_req = {
1037         .count = 2,
1038         .ext = &xcb_dri3_id,
1039         .opcode = XCB_DRI3_IMPORT_SYNCOBJ,
1040         .isvoid = 1
1041     };
1042 
1043     struct iovec xcb_parts[4];
1044     xcb_void_cookie_t xcb_ret;
1045     xcb_dri3_import_syncobj_request_t xcb_out;
1046     int fds[1];
1047     int fd_index = 0;
1048 
1049     xcb_out.syncobj = syncobj;
1050     xcb_out.drawable = drawable;
1051 
1052     xcb_parts[2].iov_base = (char *) &xcb_out;
1053     xcb_parts[2].iov_len = sizeof(xcb_out);
1054     xcb_parts[3].iov_base = 0;
1055     xcb_parts[3].iov_len = -xcb_parts[2].iov_len & 3;
1056 
1057     fds[fd_index++] = syncobj_fd;
1058     xcb_ret.sequence = xcb_send_request_with_fds(c, 0, xcb_parts + 2, &xcb_req, 1, fds);
1059     return xcb_ret;
1060 }
1061 
1062 xcb_void_cookie_t
xcb_dri3_free_syncobj_checked(xcb_connection_t * c,xcb_dri3_syncobj_t syncobj)1063 xcb_dri3_free_syncobj_checked (xcb_connection_t   *c,
1064                                xcb_dri3_syncobj_t  syncobj)
1065 {
1066     static const xcb_protocol_request_t xcb_req = {
1067         .count = 2,
1068         .ext = &xcb_dri3_id,
1069         .opcode = XCB_DRI3_FREE_SYNCOBJ,
1070         .isvoid = 1
1071     };
1072 
1073     struct iovec xcb_parts[4];
1074     xcb_void_cookie_t xcb_ret;
1075     xcb_dri3_free_syncobj_request_t xcb_out;
1076 
1077     xcb_out.syncobj = syncobj;
1078 
1079     xcb_parts[2].iov_base = (char *) &xcb_out;
1080     xcb_parts[2].iov_len = sizeof(xcb_out);
1081     xcb_parts[3].iov_base = 0;
1082     xcb_parts[3].iov_len = -xcb_parts[2].iov_len & 3;
1083 
1084     xcb_ret.sequence = xcb_send_request(c, XCB_REQUEST_CHECKED, xcb_parts + 2, &xcb_req);
1085     return xcb_ret;
1086 }
1087 
1088 xcb_void_cookie_t
xcb_dri3_free_syncobj(xcb_connection_t * c,xcb_dri3_syncobj_t syncobj)1089 xcb_dri3_free_syncobj (xcb_connection_t   *c,
1090                        xcb_dri3_syncobj_t  syncobj)
1091 {
1092     static const xcb_protocol_request_t xcb_req = {
1093         .count = 2,
1094         .ext = &xcb_dri3_id,
1095         .opcode = XCB_DRI3_FREE_SYNCOBJ,
1096         .isvoid = 1
1097     };
1098 
1099     struct iovec xcb_parts[4];
1100     xcb_void_cookie_t xcb_ret;
1101     xcb_dri3_free_syncobj_request_t xcb_out;
1102 
1103     xcb_out.syncobj = syncobj;
1104 
1105     xcb_parts[2].iov_base = (char *) &xcb_out;
1106     xcb_parts[2].iov_len = sizeof(xcb_out);
1107     xcb_parts[3].iov_base = 0;
1108     xcb_parts[3].iov_len = -xcb_parts[2].iov_len & 3;
1109 
1110     xcb_ret.sequence = xcb_send_request(c, 0, xcb_parts + 2, &xcb_req);
1111     return xcb_ret;
1112 }
1113 
1114