glxcmdsswap.c revision f7df2e56
1/*
2 * SGI FREE SOFTWARE LICENSE B (Version 2.0, Sept. 18, 2008)
3 * Copyright (C) 1991-2000 Silicon Graphics, Inc. All Rights Reserved.
4 *
5 * Permission is hereby granted, free of charge, to any person obtaining a
6 * copy of this software and associated documentation files (the "Software"),
7 * to deal in the Software without restriction, including without limitation
8 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
9 * and/or sell copies of the Software, and to permit persons to whom the
10 * Software is furnished to do so, subject to the following conditions:
11 *
12 * The above copyright notice including the dates of first publication and
13 * either this permission notice or a reference to
14 * http://oss.sgi.com/projects/FreeB/
15 * shall be included in all copies or substantial portions of the Software.
16 *
17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
18 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
20 * SILICON GRAPHICS, INC. BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
21 * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
22 * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
23 * SOFTWARE.
24 *
25 * Except as contained in this notice, the name of Silicon Graphics, Inc.
26 * shall not be used in advertising or otherwise to promote the sale, use or
27 * other dealings in this Software without prior written authorization from
28 * Silicon Graphics, Inc.
29 */
30
31#ifdef HAVE_DIX_CONFIG_H
32#include <dix-config.h>
33#endif
34
35#include <string.h>
36#include "glxserver.h"
37#include "glxutil.h"
38#include <GL/glxtokens.h>
39#include <unpack.h>
40#include <pixmapstr.h>
41#include <windowstr.h>
42#include "glxext.h"
43#include "indirect_dispatch.h"
44#include "indirect_table.h"
45#include "indirect_util.h"
46
47/************************************************************************/
48
49/*
50** Byteswapping versions of GLX commands.  In most cases they just swap
51** the incoming arguments and then call the unswapped routine.  For commands
52** that have replies, a separate swapping routine for the reply is provided;
53** it is called at the end of the unswapped routine.
54*/
55
56int
57__glXDispSwap_CreateContext(__GLXclientState * cl, GLbyte * pc)
58{
59    ClientPtr client = cl->client;
60    xGLXCreateContextReq *req = (xGLXCreateContextReq *) pc;
61
62    __GLX_DECLARE_SWAP_VARIABLES;
63
64    REQUEST_SIZE_MATCH(xGLXCreateContextReq);
65
66    __GLX_SWAP_SHORT(&req->length);
67    __GLX_SWAP_INT(&req->context);
68    __GLX_SWAP_INT(&req->visual);
69    __GLX_SWAP_INT(&req->screen);
70    __GLX_SWAP_INT(&req->shareList);
71
72    return __glXDisp_CreateContext(cl, pc);
73}
74
75int
76__glXDispSwap_CreateNewContext(__GLXclientState * cl, GLbyte * pc)
77{
78    ClientPtr client = cl->client;
79    xGLXCreateNewContextReq *req = (xGLXCreateNewContextReq *) pc;
80
81    __GLX_DECLARE_SWAP_VARIABLES;
82
83    REQUEST_SIZE_MATCH(xGLXCreateNewContextReq);
84
85    __GLX_SWAP_SHORT(&req->length);
86    __GLX_SWAP_INT(&req->context);
87    __GLX_SWAP_INT(&req->fbconfig);
88    __GLX_SWAP_INT(&req->screen);
89    __GLX_SWAP_INT(&req->renderType);
90    __GLX_SWAP_INT(&req->shareList);
91
92    return __glXDisp_CreateNewContext(cl, pc);
93}
94
95int
96__glXDispSwap_CreateContextWithConfigSGIX(__GLXclientState * cl, GLbyte * pc)
97{
98    ClientPtr client = cl->client;
99    xGLXCreateContextWithConfigSGIXReq *req =
100        (xGLXCreateContextWithConfigSGIXReq *) pc;
101    __GLX_DECLARE_SWAP_VARIABLES;
102
103    REQUEST_SIZE_MATCH(xGLXCreateContextWithConfigSGIXReq);
104
105    __GLX_SWAP_SHORT(&req->length);
106    __GLX_SWAP_INT(&req->context);
107    __GLX_SWAP_INT(&req->fbconfig);
108    __GLX_SWAP_INT(&req->screen);
109    __GLX_SWAP_INT(&req->renderType);
110    __GLX_SWAP_INT(&req->shareList);
111
112    return __glXDisp_CreateContextWithConfigSGIX(cl, pc);
113}
114
115int
116__glXDispSwap_DestroyContext(__GLXclientState * cl, GLbyte * pc)
117{
118    ClientPtr client = cl->client;
119    xGLXDestroyContextReq *req = (xGLXDestroyContextReq *) pc;
120
121    __GLX_DECLARE_SWAP_VARIABLES;
122
123    REQUEST_SIZE_MATCH(xGLXDestroyContextReq);
124
125    __GLX_SWAP_SHORT(&req->length);
126    __GLX_SWAP_INT(&req->context);
127
128    return __glXDisp_DestroyContext(cl, pc);
129}
130
131int
132__glXDispSwap_MakeCurrent(__GLXclientState * cl, GLbyte * pc)
133{
134    ClientPtr client = cl->client;
135    xGLXMakeCurrentReq *req = (xGLXMakeCurrentReq *) pc;
136
137    __GLX_DECLARE_SWAP_VARIABLES;
138
139    REQUEST_SIZE_MATCH(xGLXMakeCurrentReq);
140
141    __GLX_SWAP_SHORT(&req->length);
142    __GLX_SWAP_INT(&req->drawable);
143    __GLX_SWAP_INT(&req->context);
144    __GLX_SWAP_INT(&req->oldContextTag);
145
146    return __glXDisp_MakeCurrent(cl, pc);
147}
148
149int
150__glXDispSwap_MakeContextCurrent(__GLXclientState * cl, GLbyte * pc)
151{
152    ClientPtr client = cl->client;
153    xGLXMakeContextCurrentReq *req = (xGLXMakeContextCurrentReq *) pc;
154
155    __GLX_DECLARE_SWAP_VARIABLES;
156
157    REQUEST_SIZE_MATCH(xGLXMakeContextCurrentReq);
158
159    __GLX_SWAP_SHORT(&req->length);
160    __GLX_SWAP_INT(&req->drawable);
161    __GLX_SWAP_INT(&req->readdrawable);
162    __GLX_SWAP_INT(&req->context);
163    __GLX_SWAP_INT(&req->oldContextTag);
164
165    return __glXDisp_MakeContextCurrent(cl, pc);
166}
167
168int
169__glXDispSwap_MakeCurrentReadSGI(__GLXclientState * cl, GLbyte * pc)
170{
171    ClientPtr client = cl->client;
172    xGLXMakeCurrentReadSGIReq *req = (xGLXMakeCurrentReadSGIReq *) pc;
173
174    __GLX_DECLARE_SWAP_VARIABLES;
175
176    REQUEST_SIZE_MATCH(xGLXMakeCurrentReadSGIReq);
177
178    __GLX_SWAP_SHORT(&req->length);
179    __GLX_SWAP_INT(&req->drawable);
180    __GLX_SWAP_INT(&req->readable);
181    __GLX_SWAP_INT(&req->context);
182    __GLX_SWAP_INT(&req->oldContextTag);
183
184    return __glXDisp_MakeCurrentReadSGI(cl, pc);
185}
186
187int
188__glXDispSwap_IsDirect(__GLXclientState * cl, GLbyte * pc)
189{
190    ClientPtr client = cl->client;
191    xGLXIsDirectReq *req = (xGLXIsDirectReq *) pc;
192
193    __GLX_DECLARE_SWAP_VARIABLES;
194
195    REQUEST_SIZE_MATCH(xGLXIsDirectReq);
196
197    __GLX_SWAP_SHORT(&req->length);
198    __GLX_SWAP_INT(&req->context);
199
200    return __glXDisp_IsDirect(cl, pc);
201}
202
203int
204__glXDispSwap_QueryVersion(__GLXclientState * cl, GLbyte * pc)
205{
206    ClientPtr client = cl->client;
207    xGLXQueryVersionReq *req = (xGLXQueryVersionReq *) pc;
208
209    __GLX_DECLARE_SWAP_VARIABLES;
210
211    REQUEST_SIZE_MATCH(xGLXQueryVersionReq);
212
213    __GLX_SWAP_SHORT(&req->length);
214    __GLX_SWAP_INT(&req->majorVersion);
215    __GLX_SWAP_INT(&req->minorVersion);
216
217    return __glXDisp_QueryVersion(cl, pc);
218}
219
220int
221__glXDispSwap_WaitGL(__GLXclientState * cl, GLbyte * pc)
222{
223    ClientPtr client = cl->client;
224    xGLXWaitGLReq *req = (xGLXWaitGLReq *) pc;
225
226    __GLX_DECLARE_SWAP_VARIABLES;
227
228    REQUEST_SIZE_MATCH(xGLXWaitGLReq);
229
230    __GLX_SWAP_SHORT(&req->length);
231    __GLX_SWAP_INT(&req->contextTag);
232
233    return __glXDisp_WaitGL(cl, pc);
234}
235
236int
237__glXDispSwap_WaitX(__GLXclientState * cl, GLbyte * pc)
238{
239    ClientPtr client = cl->client;
240    xGLXWaitXReq *req = (xGLXWaitXReq *) pc;
241
242    __GLX_DECLARE_SWAP_VARIABLES;
243
244    REQUEST_SIZE_MATCH(xGLXWaitXReq);
245
246    __GLX_SWAP_SHORT(&req->length);
247    __GLX_SWAP_INT(&req->contextTag);
248
249    return __glXDisp_WaitX(cl, pc);
250}
251
252int
253__glXDispSwap_CopyContext(__GLXclientState * cl, GLbyte * pc)
254{
255    ClientPtr client = cl->client;
256    xGLXCopyContextReq *req = (xGLXCopyContextReq *) pc;
257
258    __GLX_DECLARE_SWAP_VARIABLES;
259
260    REQUEST_SIZE_MATCH(xGLXCopyContextReq);
261
262    __GLX_SWAP_SHORT(&req->length);
263    __GLX_SWAP_INT(&req->source);
264    __GLX_SWAP_INT(&req->dest);
265    __GLX_SWAP_INT(&req->mask);
266
267    return __glXDisp_CopyContext(cl, pc);
268}
269
270int
271__glXDispSwap_GetVisualConfigs(__GLXclientState * cl, GLbyte * pc)
272{
273    ClientPtr client = cl->client;
274    xGLXGetVisualConfigsReq *req = (xGLXGetVisualConfigsReq *) pc;
275
276    __GLX_DECLARE_SWAP_VARIABLES;
277
278    REQUEST_SIZE_MATCH(xGLXGetVisualConfigsReq);
279
280    __GLX_SWAP_INT(&req->screen);
281    return __glXDisp_GetVisualConfigs(cl, pc);
282}
283
284int
285__glXDispSwap_GetFBConfigs(__GLXclientState * cl, GLbyte * pc)
286{
287    ClientPtr client = cl->client;
288    xGLXGetFBConfigsReq *req = (xGLXGetFBConfigsReq *) pc;
289
290    __GLX_DECLARE_SWAP_VARIABLES;
291
292    REQUEST_SIZE_MATCH(xGLXGetFBConfigsReq);
293
294    __GLX_SWAP_INT(&req->screen);
295    return __glXDisp_GetFBConfigs(cl, pc);
296}
297
298int
299__glXDispSwap_GetFBConfigsSGIX(__GLXclientState * cl, GLbyte * pc)
300{
301    ClientPtr client = cl->client;
302    xGLXGetFBConfigsSGIXReq *req = (xGLXGetFBConfigsSGIXReq *) pc;
303
304    __GLX_DECLARE_SWAP_VARIABLES;
305
306    REQUEST_AT_LEAST_SIZE(xGLXGetFBConfigsSGIXReq);
307
308    __GLX_SWAP_INT(&req->screen);
309    return __glXDisp_GetFBConfigsSGIX(cl, pc);
310}
311
312int
313__glXDispSwap_CreateGLXPixmap(__GLXclientState * cl, GLbyte * pc)
314{
315    ClientPtr client = cl->client;
316    xGLXCreateGLXPixmapReq *req = (xGLXCreateGLXPixmapReq *) pc;
317
318    __GLX_DECLARE_SWAP_VARIABLES;
319
320    REQUEST_SIZE_MATCH(xGLXCreateGLXPixmapReq);
321
322    __GLX_SWAP_SHORT(&req->length);
323    __GLX_SWAP_INT(&req->screen);
324    __GLX_SWAP_INT(&req->visual);
325    __GLX_SWAP_INT(&req->pixmap);
326    __GLX_SWAP_INT(&req->glxpixmap);
327
328    return __glXDisp_CreateGLXPixmap(cl, pc);
329}
330
331int
332__glXDispSwap_CreatePixmap(__GLXclientState * cl, GLbyte * pc)
333{
334    ClientPtr client = cl->client;
335    xGLXCreatePixmapReq *req = (xGLXCreatePixmapReq *) pc;
336    CARD32 *attribs;
337
338    __GLX_DECLARE_SWAP_VARIABLES;
339    __GLX_DECLARE_SWAP_ARRAY_VARIABLES;
340
341    REQUEST_AT_LEAST_SIZE(xGLXCreatePixmapReq);
342
343    __GLX_SWAP_SHORT(&req->length);
344    __GLX_SWAP_INT(&req->screen);
345    __GLX_SWAP_INT(&req->fbconfig);
346    __GLX_SWAP_INT(&req->pixmap);
347    __GLX_SWAP_INT(&req->glxpixmap);
348    __GLX_SWAP_INT(&req->numAttribs);
349
350    if (req->numAttribs > (UINT32_MAX >> 3)) {
351        client->errorValue = req->numAttribs;
352        return BadValue;
353    }
354    REQUEST_FIXED_SIZE(xGLXCreatePixmapReq, req->numAttribs << 3);
355    attribs = (CARD32 *) (req + 1);
356    __GLX_SWAP_INT_ARRAY(attribs, req->numAttribs << 1);
357
358    return __glXDisp_CreatePixmap(cl, pc);
359}
360
361int
362__glXDispSwap_CreateGLXPixmapWithConfigSGIX(__GLXclientState * cl, GLbyte * pc)
363{
364    ClientPtr client = cl->client;
365    xGLXCreateGLXPixmapWithConfigSGIXReq *req =
366        (xGLXCreateGLXPixmapWithConfigSGIXReq *) pc;
367    __GLX_DECLARE_SWAP_VARIABLES;
368
369    REQUEST_SIZE_MATCH(xGLXCreateGLXPixmapWithConfigSGIXReq);
370
371    __GLX_SWAP_SHORT(&req->length);
372    __GLX_SWAP_INT(&req->screen);
373    __GLX_SWAP_INT(&req->fbconfig);
374    __GLX_SWAP_INT(&req->pixmap);
375    __GLX_SWAP_INT(&req->glxpixmap);
376
377    return __glXDisp_CreateGLXPixmapWithConfigSGIX(cl, pc);
378}
379
380int
381__glXDispSwap_DestroyGLXPixmap(__GLXclientState * cl, GLbyte * pc)
382{
383    ClientPtr client = cl->client;
384    xGLXDestroyGLXPixmapReq *req = (xGLXDestroyGLXPixmapReq *) pc;
385
386    __GLX_DECLARE_SWAP_VARIABLES;
387
388    REQUEST_SIZE_MATCH(xGLXDestroyGLXPixmapReq);
389
390    __GLX_SWAP_SHORT(&req->length);
391    __GLX_SWAP_INT(&req->glxpixmap);
392
393    return __glXDisp_DestroyGLXPixmap(cl, pc);
394}
395
396int
397__glXDispSwap_DestroyPixmap(__GLXclientState * cl, GLbyte * pc)
398{
399    ClientPtr client = cl->client;
400    xGLXDestroyGLXPixmapReq *req = (xGLXDestroyGLXPixmapReq *) pc;
401
402    __GLX_DECLARE_SWAP_VARIABLES;
403
404    REQUEST_AT_LEAST_SIZE(xGLXDestroyGLXPixmapReq);
405
406    __GLX_SWAP_SHORT(&req->length);
407    __GLX_SWAP_INT(&req->glxpixmap);
408
409    return __glXDisp_DestroyGLXPixmap(cl, pc);
410}
411
412int
413__glXDispSwap_QueryContext(__GLXclientState * cl, GLbyte * pc)
414{
415    ClientPtr client = cl->client;
416    xGLXQueryContextReq *req = (xGLXQueryContextReq *) pc;
417
418    __GLX_DECLARE_SWAP_VARIABLES;
419
420    REQUEST_SIZE_MATCH(xGLXQueryContextReq);
421
422    __GLX_SWAP_INT(&req->context);
423
424    return __glXDisp_QueryContext(cl, pc);
425}
426
427int
428__glXDispSwap_CreatePbuffer(__GLXclientState * cl, GLbyte * pc)
429{
430    ClientPtr client = cl->client;
431    xGLXCreatePbufferReq *req = (xGLXCreatePbufferReq *) pc;
432
433    __GLX_DECLARE_SWAP_VARIABLES;
434    __GLX_DECLARE_SWAP_ARRAY_VARIABLES;
435    CARD32 *attribs;
436
437    REQUEST_AT_LEAST_SIZE(xGLXCreatePbufferReq);
438
439    __GLX_SWAP_INT(&req->screen);
440    __GLX_SWAP_INT(&req->fbconfig);
441    __GLX_SWAP_INT(&req->pbuffer);
442    __GLX_SWAP_INT(&req->numAttribs);
443
444    if (req->numAttribs > (UINT32_MAX >> 3)) {
445        client->errorValue = req->numAttribs;
446        return BadValue;
447    }
448    REQUEST_FIXED_SIZE(xGLXCreatePbufferReq, req->numAttribs << 3);
449    attribs = (CARD32 *) (req + 1);
450    __GLX_SWAP_INT_ARRAY(attribs, req->numAttribs << 1);
451
452    return __glXDisp_CreatePbuffer(cl, pc);
453}
454
455int
456__glXDispSwap_CreateGLXPbufferSGIX(__GLXclientState * cl, GLbyte * pc)
457{
458    ClientPtr client = cl->client;
459    xGLXCreateGLXPbufferSGIXReq *req = (xGLXCreateGLXPbufferSGIXReq *) pc;
460
461    __GLX_DECLARE_SWAP_VARIABLES;
462
463    REQUEST_AT_LEAST_SIZE(xGLXCreateGLXPbufferSGIXReq);
464
465    __GLX_SWAP_INT(&req->screen);
466    __GLX_SWAP_INT(&req->fbconfig);
467    __GLX_SWAP_INT(&req->pbuffer);
468    __GLX_SWAP_INT(&req->width);
469    __GLX_SWAP_INT(&req->height);
470
471    return __glXDisp_CreateGLXPbufferSGIX(cl, pc);
472}
473
474int
475__glXDispSwap_DestroyPbuffer(__GLXclientState * cl, GLbyte * pc)
476{
477    ClientPtr client = cl->client;
478    xGLXDestroyPbufferReq *req = (xGLXDestroyPbufferReq *) pc;
479
480    __GLX_DECLARE_SWAP_VARIABLES;
481
482    REQUEST_SIZE_MATCH(xGLXDestroyPbufferReq);
483
484    __GLX_SWAP_INT(&req->pbuffer);
485
486    return __glXDisp_DestroyPbuffer(cl, pc);
487}
488
489int
490__glXDispSwap_DestroyGLXPbufferSGIX(__GLXclientState * cl, GLbyte * pc)
491{
492    ClientPtr client = cl->client;
493    xGLXDestroyGLXPbufferSGIXReq *req = (xGLXDestroyGLXPbufferSGIXReq *) pc;
494
495    __GLX_DECLARE_SWAP_VARIABLES;
496
497    REQUEST_SIZE_MATCH(xGLXDestroyGLXPbufferSGIXReq);
498
499    __GLX_SWAP_INT(&req->pbuffer);
500
501    return __glXDisp_DestroyGLXPbufferSGIX(cl, pc);
502}
503
504int
505__glXDispSwap_ChangeDrawableAttributes(__GLXclientState * cl, GLbyte * pc)
506{
507    ClientPtr client = cl->client;
508    xGLXChangeDrawableAttributesReq *req =
509        (xGLXChangeDrawableAttributesReq *) pc;
510    __GLX_DECLARE_SWAP_VARIABLES;
511    __GLX_DECLARE_SWAP_ARRAY_VARIABLES;
512    CARD32 *attribs;
513
514    REQUEST_AT_LEAST_SIZE(xGLXChangeDrawableAttributesReq);
515
516    __GLX_SWAP_INT(&req->drawable);
517    __GLX_SWAP_INT(&req->numAttribs);
518
519    if (req->numAttribs > (UINT32_MAX >> 3)) {
520        client->errorValue = req->numAttribs;
521        return BadValue;
522    }
523    if (((sizeof(xGLXChangeDrawableAttributesReq) +
524          (req->numAttribs << 3)) >> 2) < client->req_len)
525        return BadLength;
526
527    attribs = (CARD32 *) (req + 1);
528    __GLX_SWAP_INT_ARRAY(attribs, req->numAttribs << 1);
529
530    return __glXDisp_ChangeDrawableAttributes(cl, pc);
531}
532
533int
534__glXDispSwap_ChangeDrawableAttributesSGIX(__GLXclientState * cl, GLbyte * pc)
535{
536    ClientPtr client = cl->client;
537    xGLXChangeDrawableAttributesSGIXReq *req =
538        (xGLXChangeDrawableAttributesSGIXReq *) pc;
539    __GLX_DECLARE_SWAP_VARIABLES;
540    __GLX_DECLARE_SWAP_ARRAY_VARIABLES;
541    CARD32 *attribs;
542
543    REQUEST_AT_LEAST_SIZE(xGLXChangeDrawableAttributesSGIXReq);
544
545    __GLX_SWAP_INT(&req->drawable);
546    __GLX_SWAP_INT(&req->numAttribs);
547
548    if (req->numAttribs > (UINT32_MAX >> 3)) {
549        client->errorValue = req->numAttribs;
550        return BadValue;
551    }
552    REQUEST_FIXED_SIZE(xGLXChangeDrawableAttributesSGIXReq,
553                       req->numAttribs << 3);
554    attribs = (CARD32 *) (req + 1);
555    __GLX_SWAP_INT_ARRAY(attribs, req->numAttribs << 1);
556
557    return __glXDisp_ChangeDrawableAttributesSGIX(cl, pc);
558}
559
560int
561__glXDispSwap_CreateWindow(__GLXclientState * cl, GLbyte * pc)
562{
563    ClientPtr client = cl->client;
564    xGLXCreateWindowReq *req = (xGLXCreateWindowReq *) pc;
565
566    __GLX_DECLARE_SWAP_VARIABLES;
567    __GLX_DECLARE_SWAP_ARRAY_VARIABLES;
568    CARD32 *attribs;
569
570    REQUEST_AT_LEAST_SIZE(xGLXCreateWindowReq);
571
572    __GLX_SWAP_INT(&req->screen);
573    __GLX_SWAP_INT(&req->fbconfig);
574    __GLX_SWAP_INT(&req->window);
575    __GLX_SWAP_INT(&req->glxwindow);
576    __GLX_SWAP_INT(&req->numAttribs);
577
578    if (req->numAttribs > (UINT32_MAX >> 3)) {
579        client->errorValue = req->numAttribs;
580        return BadValue;
581    }
582    REQUEST_FIXED_SIZE(xGLXCreateWindowReq, req->numAttribs << 3);
583    attribs = (CARD32 *) (req + 1);
584    __GLX_SWAP_INT_ARRAY(attribs, req->numAttribs << 1);
585
586    return __glXDisp_CreateWindow(cl, pc);
587}
588
589int
590__glXDispSwap_DestroyWindow(__GLXclientState * cl, GLbyte * pc)
591{
592    ClientPtr client = cl->client;
593    xGLXDestroyWindowReq *req = (xGLXDestroyWindowReq *) pc;
594
595    __GLX_DECLARE_SWAP_VARIABLES;
596
597    REQUEST_AT_LEAST_SIZE(xGLXDestroyWindowReq);
598
599    __GLX_SWAP_INT(&req->glxwindow);
600
601    return __glXDisp_DestroyWindow(cl, pc);
602}
603
604int
605__glXDispSwap_SwapBuffers(__GLXclientState * cl, GLbyte * pc)
606{
607    ClientPtr client = cl->client;
608    xGLXSwapBuffersReq *req = (xGLXSwapBuffersReq *) pc;
609
610    __GLX_DECLARE_SWAP_VARIABLES;
611
612    REQUEST_SIZE_MATCH(xGLXSwapBuffersReq);
613
614    __GLX_SWAP_SHORT(&req->length);
615    __GLX_SWAP_INT(&req->contextTag);
616    __GLX_SWAP_INT(&req->drawable);
617
618    return __glXDisp_SwapBuffers(cl, pc);
619}
620
621int
622__glXDispSwap_UseXFont(__GLXclientState * cl, GLbyte * pc)
623{
624    ClientPtr client = cl->client;
625    xGLXUseXFontReq *req = (xGLXUseXFontReq *) pc;
626
627    __GLX_DECLARE_SWAP_VARIABLES;
628
629    REQUEST_SIZE_MATCH(xGLXUseXFontReq);
630
631    __GLX_SWAP_SHORT(&req->length);
632    __GLX_SWAP_INT(&req->contextTag);
633    __GLX_SWAP_INT(&req->font);
634    __GLX_SWAP_INT(&req->first);
635    __GLX_SWAP_INT(&req->count);
636    __GLX_SWAP_INT(&req->listBase);
637
638    return __glXDisp_UseXFont(cl, pc);
639}
640
641int
642__glXDispSwap_QueryExtensionsString(__GLXclientState * cl, GLbyte * pc)
643{
644    ClientPtr client = cl->client;
645    xGLXQueryExtensionsStringReq *req = (xGLXQueryExtensionsStringReq *) pc;
646
647    __GLX_DECLARE_SWAP_VARIABLES;
648
649    REQUEST_SIZE_MATCH(xGLXQueryExtensionsStringReq);
650
651    __GLX_SWAP_SHORT(&req->length);
652    __GLX_SWAP_INT(&req->screen);
653
654    return __glXDisp_QueryExtensionsString(cl, pc);
655}
656
657int
658__glXDispSwap_QueryServerString(__GLXclientState * cl, GLbyte * pc)
659{
660    ClientPtr client = cl->client;
661    xGLXQueryServerStringReq *req = (xGLXQueryServerStringReq *) pc;
662
663    __GLX_DECLARE_SWAP_VARIABLES;
664
665    REQUEST_SIZE_MATCH(xGLXQueryServerStringReq);
666
667    __GLX_SWAP_SHORT(&req->length);
668    __GLX_SWAP_INT(&req->screen);
669    __GLX_SWAP_INT(&req->name);
670
671    return __glXDisp_QueryServerString(cl, pc);
672}
673
674int
675__glXDispSwap_ClientInfo(__GLXclientState * cl, GLbyte * pc)
676{
677    ClientPtr client = cl->client;
678    xGLXClientInfoReq *req = (xGLXClientInfoReq *) pc;
679
680    __GLX_DECLARE_SWAP_VARIABLES;
681
682    REQUEST_AT_LEAST_SIZE(xGLXClientInfoReq);
683
684    __GLX_SWAP_SHORT(&req->length);
685    __GLX_SWAP_INT(&req->major);
686    __GLX_SWAP_INT(&req->minor);
687    __GLX_SWAP_INT(&req->numbytes);
688
689    return __glXDisp_ClientInfo(cl, pc);
690}
691
692int
693__glXDispSwap_QueryContextInfoEXT(__GLXclientState * cl, GLbyte * pc)
694{
695    ClientPtr client = cl->client;
696    xGLXQueryContextInfoEXTReq *req = (xGLXQueryContextInfoEXTReq *) pc;
697
698    __GLX_DECLARE_SWAP_VARIABLES;
699
700    REQUEST_SIZE_MATCH(xGLXQueryContextInfoEXTReq);
701
702    __GLX_SWAP_SHORT(&req->length);
703    __GLX_SWAP_INT(&req->context);
704
705    return __glXDisp_QueryContextInfoEXT(cl, pc);
706}
707
708int
709__glXDispSwap_BindTexImageEXT(__GLXclientState * cl, GLbyte * pc)
710{
711    ClientPtr client = cl->client;
712    xGLXVendorPrivateReq *req = (xGLXVendorPrivateReq *) pc;
713    GLXDrawable *drawId;
714    int *buffer;
715    CARD32 *num_attribs;
716
717    __GLX_DECLARE_SWAP_VARIABLES;
718
719    if ((sizeof(xGLXVendorPrivateReq) + 12) >> 2 > client->req_len)
720        return BadLength;
721
722    pc += __GLX_VENDPRIV_HDR_SIZE;
723
724    drawId = ((GLXDrawable *) (pc));
725    buffer = ((int *) (pc + 4));
726    num_attribs = ((CARD32 *) (pc + 8));
727
728    __GLX_SWAP_SHORT(&req->length);
729    __GLX_SWAP_INT(&req->contextTag);
730    __GLX_SWAP_INT(drawId);
731    __GLX_SWAP_INT(buffer);
732    __GLX_SWAP_INT(num_attribs);
733
734    return __glXDisp_BindTexImageEXT(cl, (GLbyte *) pc);
735}
736
737int
738__glXDispSwap_ReleaseTexImageEXT(__GLXclientState * cl, GLbyte * pc)
739{
740    ClientPtr client = cl->client;
741    xGLXVendorPrivateReq *req = (xGLXVendorPrivateReq *) pc;
742    GLXDrawable *drawId;
743    int *buffer;
744
745    __GLX_DECLARE_SWAP_VARIABLES;
746
747    REQUEST_FIXED_SIZE(xGLXVendorPrivateReq, 8);
748
749    pc += __GLX_VENDPRIV_HDR_SIZE;
750
751    drawId = ((GLXDrawable *) (pc));
752    buffer = ((int *) (pc + 4));
753
754    __GLX_SWAP_SHORT(&req->length);
755    __GLX_SWAP_INT(&req->contextTag);
756    __GLX_SWAP_INT(drawId);
757    __GLX_SWAP_INT(buffer);
758
759    return __glXDisp_ReleaseTexImageEXT(cl, (GLbyte *) pc);
760}
761
762int
763__glXDispSwap_CopySubBufferMESA(__GLXclientState * cl, GLbyte * pc)
764{
765    ClientPtr client = cl->client;
766    xGLXVendorPrivateReq *req = (xGLXVendorPrivateReq *) pc;
767    GLXDrawable *drawId;
768    int *buffer;
769
770    __GLX_DECLARE_SWAP_VARIABLES;
771
772    REQUEST_FIXED_SIZE(xGLXVendorPrivateReq, 20);
773
774    (void) drawId;
775    (void) buffer;
776
777    pc += __GLX_VENDPRIV_HDR_SIZE;
778
779    __GLX_SWAP_SHORT(&req->length);
780    __GLX_SWAP_INT(&req->contextTag);
781    __GLX_SWAP_INT(pc);
782    __GLX_SWAP_INT(pc + 4);
783    __GLX_SWAP_INT(pc + 8);
784    __GLX_SWAP_INT(pc + 12);
785    __GLX_SWAP_INT(pc + 16);
786
787    return __glXDisp_CopySubBufferMESA(cl, pc);
788
789}
790
791int
792__glXDispSwap_GetDrawableAttributesSGIX(__GLXclientState * cl, GLbyte * pc)
793{
794    ClientPtr client = cl->client;
795    xGLXVendorPrivateWithReplyReq *req = (xGLXVendorPrivateWithReplyReq *) pc;
796    CARD32 *data;
797
798    __GLX_DECLARE_SWAP_VARIABLES;
799
800    REQUEST_SIZE_MATCH(xGLXGetDrawableAttributesSGIXReq);
801
802    data = (CARD32 *) (req + 1);
803    __GLX_SWAP_SHORT(&req->length);
804    __GLX_SWAP_INT(&req->contextTag);
805    __GLX_SWAP_INT(data);
806
807    return __glXDisp_GetDrawableAttributesSGIX(cl, pc);
808}
809
810int
811__glXDispSwap_GetDrawableAttributes(__GLXclientState * cl, GLbyte * pc)
812{
813    ClientPtr client = cl->client;
814    xGLXGetDrawableAttributesReq *req = (xGLXGetDrawableAttributesReq *) pc;
815
816    __GLX_DECLARE_SWAP_VARIABLES;
817
818    REQUEST_AT_LEAST_SIZE(xGLXGetDrawableAttributesReq);
819
820    __GLX_SWAP_SHORT(&req->length);
821    __GLX_SWAP_INT(&req->drawable);
822
823    return __glXDisp_GetDrawableAttributes(cl, pc);
824}
825
826/************************************************************************/
827
828/*
829** Swap replies.
830*/
831
832void
833__glXSwapMakeCurrentReply(ClientPtr client, xGLXMakeCurrentReply * reply)
834{
835    __GLX_DECLARE_SWAP_VARIABLES;
836    __GLX_SWAP_SHORT(&reply->sequenceNumber);
837    __GLX_SWAP_INT(&reply->length);
838    __GLX_SWAP_INT(&reply->contextTag);
839    WriteToClient(client, sz_xGLXMakeCurrentReply, reply);
840}
841
842void
843__glXSwapIsDirectReply(ClientPtr client, xGLXIsDirectReply * reply)
844{
845    __GLX_DECLARE_SWAP_VARIABLES;
846    __GLX_SWAP_SHORT(&reply->sequenceNumber);
847    __GLX_SWAP_INT(&reply->length);
848    WriteToClient(client, sz_xGLXIsDirectReply, reply);
849}
850
851void
852__glXSwapQueryVersionReply(ClientPtr client, xGLXQueryVersionReply * reply)
853{
854    __GLX_DECLARE_SWAP_VARIABLES;
855    __GLX_SWAP_SHORT(&reply->sequenceNumber);
856    __GLX_SWAP_INT(&reply->length);
857    __GLX_SWAP_INT(&reply->majorVersion);
858    __GLX_SWAP_INT(&reply->minorVersion);
859    WriteToClient(client, sz_xGLXQueryVersionReply, reply);
860}
861
862void
863glxSwapQueryExtensionsStringReply(ClientPtr client,
864                                  xGLXQueryExtensionsStringReply * reply,
865                                  char *buf)
866{
867    int length = reply->length;
868
869    __GLX_DECLARE_SWAP_VARIABLES;
870    __GLX_DECLARE_SWAP_ARRAY_VARIABLES;
871    __GLX_SWAP_SHORT(&reply->sequenceNumber);
872    __GLX_SWAP_INT(&reply->length);
873    __GLX_SWAP_INT(&reply->n);
874    WriteToClient(client, sz_xGLXQueryExtensionsStringReply, reply);
875    __GLX_SWAP_INT_ARRAY((int *) buf, length);
876    WriteToClient(client, length << 2, buf);
877}
878
879void
880glxSwapQueryServerStringReply(ClientPtr client,
881                              xGLXQueryServerStringReply * reply, char *buf)
882{
883    int length = reply->length;
884
885    __GLX_DECLARE_SWAP_VARIABLES;
886    __GLX_SWAP_SHORT(&reply->sequenceNumber);
887    __GLX_SWAP_INT(&reply->length);
888    __GLX_SWAP_INT(&reply->n);
889    WriteToClient(client, sz_xGLXQueryServerStringReply, reply);
890    /** no swap is needed for an array of chars **/
891    /* __GLX_SWAP_INT_ARRAY((int *)buf, length); */
892    WriteToClient(client, length << 2, buf);
893}
894
895void
896__glXSwapQueryContextInfoEXTReply(ClientPtr client,
897                                  xGLXQueryContextInfoEXTReply * reply,
898                                  int *buf)
899{
900    int length = reply->length;
901
902    __GLX_DECLARE_SWAP_VARIABLES;
903    __GLX_DECLARE_SWAP_ARRAY_VARIABLES;
904    __GLX_SWAP_SHORT(&reply->sequenceNumber);
905    __GLX_SWAP_INT(&reply->length);
906    __GLX_SWAP_INT(&reply->n);
907    WriteToClient(client, sz_xGLXQueryContextInfoEXTReply, reply);
908    __GLX_SWAP_INT_ARRAY((int *) buf, length);
909    WriteToClient(client, length << 2, buf);
910}
911
912void
913__glXSwapGetDrawableAttributesReply(ClientPtr client,
914                                    xGLXGetDrawableAttributesReply * reply,
915                                    CARD32 *buf)
916{
917    int length = reply->length;
918
919    __GLX_DECLARE_SWAP_VARIABLES;
920    __GLX_DECLARE_SWAP_ARRAY_VARIABLES;
921    __GLX_SWAP_SHORT(&reply->sequenceNumber);
922    __GLX_SWAP_INT(&reply->length);
923    __GLX_SWAP_INT(&reply->numAttribs);
924    WriteToClient(client, sz_xGLXGetDrawableAttributesReply, reply);
925    __GLX_SWAP_INT_ARRAY((int *) buf, length);
926    WriteToClient(client, length << 2, buf);
927}
928
929/************************************************************************/
930
931/*
932** Render and Renderlarge are not in the GLX API.  They are used by the GLX
933** client library to send batches of GL rendering commands.
934*/
935
936int
937__glXDispSwap_Render(__GLXclientState * cl, GLbyte * pc)
938{
939    return __glXDisp_Render(cl, pc);
940}
941
942/*
943** Execute a large rendering request (one that spans multiple X requests).
944*/
945int
946__glXDispSwap_RenderLarge(__GLXclientState * cl, GLbyte * pc)
947{
948    return __glXDisp_RenderLarge(cl, pc);
949}
950
951/************************************************************************/
952
953/*
954** No support is provided for the vendor-private requests other than
955** allocating these entry points in the dispatch table.
956*/
957
958int
959__glXDispSwap_VendorPrivate(__GLXclientState * cl, GLbyte * pc)
960{
961    ClientPtr client = cl->client;
962    xGLXVendorPrivateReq *req;
963    GLint vendorcode;
964    __GLXdispatchVendorPrivProcPtr proc;
965
966    __GLX_DECLARE_SWAP_VARIABLES;
967    REQUEST_AT_LEAST_SIZE(xGLXVendorPrivateReq);
968
969    req = (xGLXVendorPrivateReq *) pc;
970    __GLX_SWAP_SHORT(&req->length);
971    __GLX_SWAP_INT(&req->vendorCode);
972
973    vendorcode = req->vendorCode;
974
975    proc = (__GLXdispatchVendorPrivProcPtr)
976        __glXGetProtocolDecodeFunction(&VendorPriv_dispatch_info,
977                                       vendorcode, 1);
978    if (proc != NULL) {
979        (*proc) (cl, (GLbyte *) req);
980        return Success;
981    }
982
983    cl->client->errorValue = req->vendorCode;
984    return __glXError(GLXUnsupportedPrivateRequest);
985}
986
987int
988__glXDispSwap_VendorPrivateWithReply(__GLXclientState * cl, GLbyte * pc)
989{
990    ClientPtr client = cl->client;
991    xGLXVendorPrivateWithReplyReq *req;
992    GLint vendorcode;
993    __GLXdispatchVendorPrivProcPtr proc;
994
995    __GLX_DECLARE_SWAP_VARIABLES;
996    REQUEST_AT_LEAST_SIZE(xGLXVendorPrivateWithReplyReq);
997
998    req = (xGLXVendorPrivateWithReplyReq *) pc;
999    __GLX_SWAP_SHORT(&req->length);
1000    __GLX_SWAP_INT(&req->vendorCode);
1001
1002    vendorcode = req->vendorCode;
1003
1004    proc = (__GLXdispatchVendorPrivProcPtr)
1005        __glXGetProtocolDecodeFunction(&VendorPriv_dispatch_info,
1006                                       vendorcode, 1);
1007    if (proc != NULL) {
1008        return (*proc) (cl, (GLbyte *) req);
1009    }
1010
1011    cl->client->errorValue = req->vendorCode;
1012    return __glXError(GLXUnsupportedPrivateRequest);
1013}
1014