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