1706f2543Smrg/*
2706f2543Smrg * SGI FREE SOFTWARE LICENSE B (Version 2.0, Sept. 18, 2008)
3706f2543Smrg * Copyright (C) 1991-2000 Silicon Graphics, Inc. All Rights Reserved.
4706f2543Smrg *
5706f2543Smrg * Permission is hereby granted, free of charge, to any person obtaining a
6706f2543Smrg * copy of this software and associated documentation files (the "Software"),
7706f2543Smrg * to deal in the Software without restriction, including without limitation
8706f2543Smrg * the rights to use, copy, modify, merge, publish, distribute, sublicense,
9706f2543Smrg * and/or sell copies of the Software, and to permit persons to whom the
10706f2543Smrg * Software is furnished to do so, subject to the following conditions:
11706f2543Smrg *
12706f2543Smrg * The above copyright notice including the dates of first publication and
13706f2543Smrg * either this permission notice or a reference to
14706f2543Smrg * http://oss.sgi.com/projects/FreeB/
15706f2543Smrg * shall be included in all copies or substantial portions of the Software.
16706f2543Smrg *
17706f2543Smrg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
18706f2543Smrg * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19706f2543Smrg * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
20706f2543Smrg * SILICON GRAPHICS, INC. BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
21706f2543Smrg * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
22706f2543Smrg * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
23706f2543Smrg * SOFTWARE.
24706f2543Smrg *
25706f2543Smrg * Except as contained in this notice, the name of Silicon Graphics, Inc.
26706f2543Smrg * shall not be used in advertising or otherwise to promote the sale, use or
27706f2543Smrg * other dealings in this Software without prior written authorization from
28706f2543Smrg * Silicon Graphics, Inc.
29706f2543Smrg */
30706f2543Smrg
31706f2543Smrg#include "glxserver.h"
32706f2543Smrg#include "glxutil.h"
33706f2543Smrg#include <GL/glxtokens.h>
34706f2543Smrg#include <g_disptab.h>
35706f2543Smrg#include <pixmapstr.h>
36706f2543Smrg#include <windowstr.h>
37706f2543Smrg#include "unpack.h"
38706f2543Smrg#include "glxcmds.h"
39706f2543Smrg#include "glxext.h"
40706f2543Smrg#include "glxvendor.h"
41706f2543Smrg
42706f2543Smrgextern int glxIsExtensionSupported( char *ext );
43706f2543Smrg
44706f2543Smrgint __glXSwapGetFBConfigsSGIX(__GLXclientState *cl, GLbyte *pc);
45706f2543Smrg
46706f2543Smrg/************************************************************************/
47706f2543Smrg
48706f2543Smrg/*
49706f2543Smrg** Byteswapping versions of GLX commands.  In most cases they just swap
50706f2543Smrg** the incoming arguments and then call the unswapped routine.  For commands
51706f2543Smrg** that have replies, a separate swapping routine for the reply is provided;
52706f2543Smrg** it is called at the end of the unswapped routine.
53706f2543Smrg*/
54706f2543Smrg
55706f2543Smrgint __glXSwapCreateContext(__GLXclientState *cl, GLbyte *pc)
56706f2543Smrg{
57706f2543Smrg    xGLXCreateContextReq *req = (xGLXCreateContextReq *) pc;
58706f2543Smrg    __GLX_DECLARE_SWAP_VARIABLES;
59706f2543Smrg
60706f2543Smrg    __GLX_SWAP_SHORT(&req->length);
61706f2543Smrg    __GLX_SWAP_INT(&req->context);
62706f2543Smrg    __GLX_SWAP_INT(&req->visual);
63706f2543Smrg    __GLX_SWAP_INT(&req->screen);
64706f2543Smrg    __GLX_SWAP_INT(&req->shareList);
65706f2543Smrg
66706f2543Smrg    return __glXCreateContext(cl, pc);
67706f2543Smrg}
68706f2543Smrg
69706f2543Smrgint __glXSwapCreateNewContext(__GLXclientState *cl, GLbyte *pc)
70706f2543Smrg{
71706f2543Smrg    xGLXCreateNewContextReq *req = (xGLXCreateNewContextReq *) pc;
72706f2543Smrg    __GLX_DECLARE_SWAP_VARIABLES;
73706f2543Smrg
74706f2543Smrg    __GLX_SWAP_SHORT(&req->length);
75706f2543Smrg    __GLX_SWAP_INT(&req->context);
76706f2543Smrg    __GLX_SWAP_INT(&req->fbconfig);
77706f2543Smrg    __GLX_SWAP_INT(&req->screen);
78706f2543Smrg    __GLX_SWAP_INT(&req->shareList);
79706f2543Smrg
80706f2543Smrg    return __glXCreateNewContext(cl, pc);
81706f2543Smrg}
82706f2543Smrg
83706f2543Smrgint __glXSwapCreateContextWithConfigSGIX(__GLXclientState *cl, GLbyte *pc)
84706f2543Smrg{
85706f2543Smrg    xGLXCreateContextWithConfigSGIXReq *req = (xGLXCreateContextWithConfigSGIXReq *) pc;
86706f2543Smrg    __GLX_DECLARE_SWAP_VARIABLES;
87706f2543Smrg
88706f2543Smrg    __GLX_SWAP_SHORT(&req->length);
89706f2543Smrg    __GLX_SWAP_INT(&req->context);
90706f2543Smrg    __GLX_SWAP_INT(&req->fbconfig);
91706f2543Smrg    __GLX_SWAP_INT(&req->screen);
92706f2543Smrg    __GLX_SWAP_INT(&req->shareList);
93706f2543Smrg
94706f2543Smrg    return __glXCreateContextWithConfigSGIX(cl, pc);
95706f2543Smrg}
96706f2543Smrg
97706f2543Smrgint __glXSwapQueryMaxSwapBarriersSGIX(__GLXclientState *cl, GLbyte *pc)
98706f2543Smrg{
99706f2543Smrg    xGLXQueryMaxSwapBarriersSGIXReq *req =
100706f2543Smrg	(xGLXQueryMaxSwapBarriersSGIXReq *)pc;
101706f2543Smrg    __GLX_DECLARE_SWAP_VARIABLES;
102706f2543Smrg
103706f2543Smrg    __GLX_SWAP_SHORT(&req->length);
104706f2543Smrg    __GLX_SWAP_INT(&req->screen);
105706f2543Smrg
106706f2543Smrg    return __glXQueryMaxSwapBarriersSGIX(cl, pc);
107706f2543Smrg}
108706f2543Smrg
109706f2543Smrgint __glXSwapBindSwapBarrierSGIX(__GLXclientState *cl, GLbyte *pc)
110706f2543Smrg{
111706f2543Smrg    xGLXBindSwapBarrierSGIXReq *req = (xGLXBindSwapBarrierSGIXReq *)pc;
112706f2543Smrg    __GLX_DECLARE_SWAP_VARIABLES;
113706f2543Smrg
114706f2543Smrg    __GLX_SWAP_SHORT(&req->length);
115706f2543Smrg    __GLX_SWAP_INT(&req->drawable);
116706f2543Smrg    __GLX_SWAP_INT(&req->barrier);
117706f2543Smrg
118706f2543Smrg    return __glXBindSwapBarrierSGIX(cl, pc);
119706f2543Smrg}
120706f2543Smrg
121706f2543Smrgint __glXSwapJoinSwapGroupSGIX(__GLXclientState *cl, GLbyte *pc)
122706f2543Smrg{
123706f2543Smrg    xGLXJoinSwapGroupSGIXReq *req = (xGLXJoinSwapGroupSGIXReq *)pc;
124706f2543Smrg    __GLX_DECLARE_SWAP_VARIABLES;
125706f2543Smrg
126706f2543Smrg    __GLX_SWAP_SHORT(&req->length);
127706f2543Smrg    __GLX_SWAP_INT(&req->drawable);
128706f2543Smrg    __GLX_SWAP_INT(&req->member);
129706f2543Smrg
130706f2543Smrg    return __glXJoinSwapGroupSGIX(cl, pc);
131706f2543Smrg}
132706f2543Smrg
133706f2543Smrgint __glXSwapDestroyContext(__GLXclientState *cl, GLbyte *pc)
134706f2543Smrg{
135706f2543Smrg    xGLXDestroyContextReq *req = (xGLXDestroyContextReq *) pc;
136706f2543Smrg    __GLX_DECLARE_SWAP_VARIABLES;
137706f2543Smrg
138706f2543Smrg    __GLX_SWAP_SHORT(&req->length);
139706f2543Smrg    __GLX_SWAP_INT(&req->context);
140706f2543Smrg
141706f2543Smrg    return __glXDestroyContext(cl, pc);
142706f2543Smrg}
143706f2543Smrg
144706f2543Smrgint __glXSwapMakeCurrent(__GLXclientState *cl, GLbyte *pc)
145706f2543Smrg{
146706f2543Smrg    xGLXMakeCurrentReq *req = (xGLXMakeCurrentReq *) pc;
147706f2543Smrg    __GLX_DECLARE_SWAP_VARIABLES;
148706f2543Smrg
149706f2543Smrg    __GLX_SWAP_SHORT(&req->length);
150706f2543Smrg    __GLX_SWAP_INT(&req->drawable);
151706f2543Smrg    __GLX_SWAP_INT(&req->context);
152706f2543Smrg    __GLX_SWAP_INT(&req->oldContextTag);
153706f2543Smrg
154706f2543Smrg    return __glXMakeCurrent(cl, pc);
155706f2543Smrg}
156706f2543Smrg
157706f2543Smrgint __glXSwapMakeContextCurrent(__GLXclientState *cl, GLbyte *pc)
158706f2543Smrg{
159706f2543Smrg    xGLXMakeContextCurrentReq *req = (xGLXMakeContextCurrentReq *) pc;
160706f2543Smrg    __GLX_DECLARE_SWAP_VARIABLES;
161706f2543Smrg
162706f2543Smrg    __GLX_SWAP_SHORT(&req->length);
163706f2543Smrg    __GLX_SWAP_INT(&req->drawable);
164706f2543Smrg    __GLX_SWAP_INT(&req->readdrawable);
165706f2543Smrg    __GLX_SWAP_INT(&req->context);
166706f2543Smrg    __GLX_SWAP_INT(&req->oldContextTag);
167706f2543Smrg
168706f2543Smrg    return __glXMakeContextCurrent(cl, pc);
169706f2543Smrg}
170706f2543Smrg
171706f2543Smrgint __glXSwapMakeCurrentReadSGI(__GLXclientState *cl, GLbyte *pc)
172706f2543Smrg{
173706f2543Smrg    xGLXMakeCurrentReadSGIReq *req = (xGLXMakeCurrentReadSGIReq *) pc;
174706f2543Smrg    __GLX_DECLARE_SWAP_VARIABLES;
175706f2543Smrg
176706f2543Smrg    __GLX_SWAP_SHORT(&req->length);
177706f2543Smrg    __GLX_SWAP_INT(&req->drawable);
178706f2543Smrg    __GLX_SWAP_INT(&req->readable);
179706f2543Smrg    __GLX_SWAP_INT(&req->context);
180706f2543Smrg    __GLX_SWAP_INT(&req->oldContextTag);
181706f2543Smrg
182706f2543Smrg    return __glXMakeCurrentReadSGI(cl, pc);
183706f2543Smrg}
184706f2543Smrg
185706f2543Smrgint __glXSwapIsDirect(__GLXclientState *cl, GLbyte *pc)
186706f2543Smrg{
187706f2543Smrg    xGLXIsDirectReq *req = (xGLXIsDirectReq *) pc;
188706f2543Smrg    __GLX_DECLARE_SWAP_VARIABLES;
189706f2543Smrg
190706f2543Smrg    __GLX_SWAP_SHORT(&req->length);
191706f2543Smrg    __GLX_SWAP_INT(&req->context);
192706f2543Smrg
193706f2543Smrg    return __glXIsDirect(cl, pc);
194706f2543Smrg}
195706f2543Smrg
196706f2543Smrgint __glXSwapQueryVersion(__GLXclientState *cl, GLbyte *pc)
197706f2543Smrg{
198706f2543Smrg    xGLXQueryVersionReq *req = (xGLXQueryVersionReq *) pc;
199706f2543Smrg    __GLX_DECLARE_SWAP_VARIABLES;
200706f2543Smrg
201706f2543Smrg    __GLX_SWAP_SHORT(&req->length);
202706f2543Smrg    __GLX_SWAP_INT(&req->majorVersion);
203706f2543Smrg    __GLX_SWAP_INT(&req->minorVersion);
204706f2543Smrg
205706f2543Smrg    return __glXQueryVersion(cl, pc);
206706f2543Smrg}
207706f2543Smrg
208706f2543Smrgint __glXSwapWaitGL(__GLXclientState *cl, GLbyte *pc)
209706f2543Smrg{
210706f2543Smrg    xGLXWaitGLReq *req = (xGLXWaitGLReq *) pc;
211706f2543Smrg    __GLX_DECLARE_SWAP_VARIABLES;
212706f2543Smrg
213706f2543Smrg    __GLX_SWAP_SHORT(&req->length);
214706f2543Smrg    __GLX_SWAP_INT(&req->contextTag);
215706f2543Smrg
216706f2543Smrg    return __glXWaitGL(cl, pc);
217706f2543Smrg}
218706f2543Smrg
219706f2543Smrgint __glXSwapWaitX(__GLXclientState *cl, GLbyte *pc)
220706f2543Smrg{
221706f2543Smrg    xGLXWaitXReq *req = (xGLXWaitXReq *) pc;
222706f2543Smrg    __GLX_DECLARE_SWAP_VARIABLES;
223706f2543Smrg
224706f2543Smrg    __GLX_SWAP_SHORT(&req->length);
225706f2543Smrg    __GLX_SWAP_INT(&req->contextTag);
226706f2543Smrg
227706f2543Smrg    return __glXWaitX(cl, pc);
228706f2543Smrg}
229706f2543Smrg
230706f2543Smrgint __glXSwapCopyContext(__GLXclientState *cl, GLbyte *pc)
231706f2543Smrg{
232706f2543Smrg    xGLXCopyContextReq *req = (xGLXCopyContextReq *) pc;
233706f2543Smrg    __GLX_DECLARE_SWAP_VARIABLES;
234706f2543Smrg
235706f2543Smrg    __GLX_SWAP_SHORT(&req->length);
236706f2543Smrg    __GLX_SWAP_INT(&req->source);
237706f2543Smrg    __GLX_SWAP_INT(&req->dest);
238706f2543Smrg    __GLX_SWAP_INT(&req->mask);
239706f2543Smrg
240706f2543Smrg    return __glXCopyContext(cl, pc);
241706f2543Smrg}
242706f2543Smrg
243706f2543Smrgint __glXSwapGetVisualConfigs(__GLXclientState *cl, GLbyte *pc)
244706f2543Smrg{
245706f2543Smrg   ClientPtr client = cl->client;
246706f2543Smrg    xGLXGetVisualConfigsReq *req = (xGLXGetVisualConfigsReq *) pc;
247706f2543Smrg    xGLXGetVisualConfigsReply reply;
248706f2543Smrg    __GLXscreenInfo *pGlxScreen;
249706f2543Smrg    __GLXvisualConfig *pGlxVisual;
250706f2543Smrg    CARD32 buf[__GLX_TOTAL_CONFIG];
251706f2543Smrg    unsigned int screen;
252706f2543Smrg    int i, p;
253706f2543Smrg    __GLX_DECLARE_SWAP_VARIABLES;
254706f2543Smrg    __GLX_DECLARE_SWAP_ARRAY_VARIABLES;
255706f2543Smrg
256706f2543Smrg    __GLX_SWAP_INT(&req->screen);
257706f2543Smrg    screen = req->screen;
258706f2543Smrg    if (screen >= screenInfo.numScreens) {
259706f2543Smrg	/* The client library must send a valid screen number. */
260706f2543Smrg	client->errorValue = screen;
261706f2543Smrg	return BadValue;
262706f2543Smrg    }
263706f2543Smrg    pGlxScreen = &__glXActiveScreens[screen];
264706f2543Smrg
265706f2543Smrg    reply.numVisuals = pGlxScreen->numGLXVisuals;
266706f2543Smrg    reply.numProps = __GLX_TOTAL_CONFIG;
267706f2543Smrg    reply.length = (pGlxScreen->numGLXVisuals * __GLX_SIZE_CARD32 *
268706f2543Smrg		    __GLX_TOTAL_CONFIG) >> 2;
269706f2543Smrg    reply.type = X_Reply;
270706f2543Smrg    reply.sequenceNumber = client->sequence;
271706f2543Smrg
272706f2543Smrg    __GLX_SWAP_SHORT(&reply.sequenceNumber);
273706f2543Smrg    __GLX_SWAP_INT(&reply.length);
274706f2543Smrg    __GLX_SWAP_INT(&reply.numVisuals);
275706f2543Smrg    __GLX_SWAP_INT(&reply.numProps);
276706f2543Smrg    WriteToClient(client, sz_xGLXGetVisualConfigsReply, (char *)&reply);
277706f2543Smrg
278706f2543Smrg    for (i=0; i < pGlxScreen->numVisuals; i++) {
279706f2543Smrg	pGlxVisual = &pGlxScreen->pGlxVisual[i];
280706f2543Smrg	if (!pGlxScreen->isGLXvis[i] || pGlxVisual->vid == 0) {
281706f2543Smrg	    /* not a usable visual */
282706f2543Smrg	    continue;
283706f2543Smrg	}
284706f2543Smrg	p = 0;
285706f2543Smrg	buf[p++] = pGlxVisual->vid;
286706f2543Smrg	buf[p++] = pGlxVisual->class;
287706f2543Smrg	buf[p++] = pGlxVisual->rgba;
288706f2543Smrg
289706f2543Smrg	buf[p++] = pGlxVisual->redSize;
290706f2543Smrg	buf[p++] = pGlxVisual->greenSize;
291706f2543Smrg	buf[p++] = pGlxVisual->blueSize;
292706f2543Smrg	buf[p++] = pGlxVisual->alphaSize;
293706f2543Smrg	buf[p++] = pGlxVisual->accumRedSize;
294706f2543Smrg	buf[p++] = pGlxVisual->accumGreenSize;
295706f2543Smrg	buf[p++] = pGlxVisual->accumBlueSize;
296706f2543Smrg	buf[p++] = pGlxVisual->accumAlphaSize;
297706f2543Smrg
298706f2543Smrg	buf[p++] = pGlxVisual->doubleBuffer;
299706f2543Smrg	buf[p++] = pGlxVisual->stereo;
300706f2543Smrg
301706f2543Smrg	buf[p++] = pGlxVisual->bufferSize;
302706f2543Smrg	buf[p++] = pGlxVisual->depthSize;
303706f2543Smrg	buf[p++] = pGlxVisual->stencilSize;
304706f2543Smrg	buf[p++] = pGlxVisual->auxBuffers;
305706f2543Smrg	buf[p++] = pGlxVisual->level;
306706f2543Smrg        /*
307706f2543Smrg        ** Add token/value pairs for extensions.
308706f2543Smrg        */
309706f2543Smrg        buf[p++] = GLX_VISUAL_CAVEAT_EXT;
310706f2543Smrg        buf[p++] = pGlxVisual->visualRating;
311706f2543Smrg        buf[p++] = GLX_TRANSPARENT_TYPE_EXT;
312706f2543Smrg        buf[p++] = pGlxVisual->transparentPixel;
313706f2543Smrg        buf[p++] = GLX_TRANSPARENT_RED_VALUE_EXT;
314706f2543Smrg        buf[p++] = pGlxVisual->transparentRed;
315706f2543Smrg        buf[p++] = GLX_TRANSPARENT_GREEN_VALUE_EXT;
316706f2543Smrg        buf[p++] = pGlxVisual->transparentGreen;
317706f2543Smrg        buf[p++] = GLX_TRANSPARENT_BLUE_VALUE_EXT;
318706f2543Smrg        buf[p++] = pGlxVisual->transparentBlue;
319706f2543Smrg        buf[p++] = GLX_TRANSPARENT_ALPHA_VALUE_EXT;
320706f2543Smrg        buf[p++] = pGlxVisual->transparentAlpha;
321706f2543Smrg        buf[p++] = GLX_TRANSPARENT_INDEX_VALUE_EXT;
322706f2543Smrg        buf[p++] = pGlxVisual->transparentIndex;
323706f2543Smrg
324706f2543Smrg	__GLX_SWAP_INT_ARRAY(buf, __GLX_TOTAL_CONFIG);
325706f2543Smrg	WriteToClient(client, __GLX_SIZE_CARD32 * __GLX_TOTAL_CONFIG,
326706f2543Smrg			(char *)buf);
327706f2543Smrg    }
328706f2543Smrg    return Success;
329706f2543Smrg}
330706f2543Smrg
331706f2543Smrgint __glXSwapCreateGLXPixmap(__GLXclientState *cl, GLbyte *pc)
332706f2543Smrg{
333706f2543Smrg    xGLXCreateGLXPixmapReq *req = (xGLXCreateGLXPixmapReq *) pc;
334706f2543Smrg    __GLX_DECLARE_SWAP_VARIABLES;
335706f2543Smrg
336706f2543Smrg    __GLX_SWAP_SHORT(&req->length);
337706f2543Smrg    __GLX_SWAP_INT(&req->screen);
338706f2543Smrg    __GLX_SWAP_INT(&req->visual);
339706f2543Smrg    __GLX_SWAP_INT(&req->pixmap);
340706f2543Smrg    __GLX_SWAP_INT(&req->glxpixmap);
341706f2543Smrg
342706f2543Smrg    return __glXCreateGLXPixmap(cl, pc);
343706f2543Smrg}
344706f2543Smrg
345706f2543Smrgint __glXSwapCreatePixmap(__GLXclientState *cl, GLbyte *pc)
346706f2543Smrg{
347706f2543Smrg    xGLXCreatePixmapReq *req = (xGLXCreatePixmapReq *) pc;
348706f2543Smrg    __GLX_DECLARE_SWAP_VARIABLES;
349706f2543Smrg
350706f2543Smrg    __GLX_SWAP_SHORT(&req->length);
351706f2543Smrg    __GLX_SWAP_INT(&req->screen);
352706f2543Smrg    __GLX_SWAP_INT(&req->fbconfig);
353706f2543Smrg    __GLX_SWAP_INT(&req->pixmap);
354706f2543Smrg    __GLX_SWAP_INT(&req->glxpixmap);
355706f2543Smrg    __GLX_SWAP_INT(&req->numAttribs);
356706f2543Smrg
357706f2543Smrg    return __glXCreatePixmap(cl, pc);
358706f2543Smrg}
359706f2543Smrg
360706f2543Smrgint __glXSwapDestroyGLXPixmap(__GLXclientState *cl, GLbyte *pc)
361706f2543Smrg{
362706f2543Smrg    xGLXDestroyGLXPixmapReq *req = (xGLXDestroyGLXPixmapReq *) pc;
363706f2543Smrg    __GLX_DECLARE_SWAP_VARIABLES;
364706f2543Smrg
365706f2543Smrg    __GLX_SWAP_SHORT(&req->length);
366706f2543Smrg    __GLX_SWAP_INT(&req->glxpixmap);
367706f2543Smrg
368706f2543Smrg    return __glXDestroyGLXPixmap(cl, pc);
369706f2543Smrg}
370706f2543Smrg
371706f2543Smrgint __glXSwapSwapBuffers(__GLXclientState *cl, GLbyte *pc)
372706f2543Smrg{
373706f2543Smrg    xGLXSwapBuffersReq *req = (xGLXSwapBuffersReq *) pc;
374706f2543Smrg    __GLX_DECLARE_SWAP_VARIABLES;
375706f2543Smrg
376706f2543Smrg    __GLX_SWAP_SHORT(&req->length);
377706f2543Smrg    __GLX_SWAP_INT(&req->contextTag);
378706f2543Smrg    __GLX_SWAP_INT(&req->drawable);
379706f2543Smrg
380706f2543Smrg    return __glXSwapBuffers(cl, pc);
381706f2543Smrg}
382706f2543Smrg
383706f2543Smrgint __glXSwapUseXFont(__GLXclientState *cl, GLbyte *pc)
384706f2543Smrg{
385706f2543Smrg    xGLXUseXFontReq *req = (xGLXUseXFontReq *) pc;
386706f2543Smrg    __GLX_DECLARE_SWAP_VARIABLES;
387706f2543Smrg
388706f2543Smrg    __GLX_SWAP_SHORT(&req->length);
389706f2543Smrg    __GLX_SWAP_INT(&req->contextTag);
390706f2543Smrg    __GLX_SWAP_INT(&req->font);
391706f2543Smrg    __GLX_SWAP_INT(&req->first);
392706f2543Smrg    __GLX_SWAP_INT(&req->count);
393706f2543Smrg    __GLX_SWAP_INT(&req->listBase);
394706f2543Smrg
395706f2543Smrg    return __glXUseXFont(cl, pc);
396706f2543Smrg}
397706f2543Smrg
398706f2543Smrg
399706f2543Smrgint __glXSwapQueryExtensionsString(__GLXclientState *cl, GLbyte *pc)
400706f2543Smrg{
401706f2543Smrg    xGLXQueryExtensionsStringReq *req = NULL;
402706f2543Smrg    __GLX_DECLARE_SWAP_VARIABLES;
403706f2543Smrg
404706f2543Smrg    __GLX_SWAP_SHORT(&req->length);
405706f2543Smrg    __GLX_SWAP_INT(&req->screen);
406706f2543Smrg
407706f2543Smrg    return __glXQueryExtensionsString(cl, pc);
408706f2543Smrg}
409706f2543Smrg
410706f2543Smrgint __glXSwapQueryServerString(__GLXclientState *cl, GLbyte *pc)
411706f2543Smrg{
412706f2543Smrg    xGLXQueryServerStringReq *req = (xGLXQueryServerStringReq *)pc;
413706f2543Smrg    __GLX_DECLARE_SWAP_VARIABLES;
414706f2543Smrg
415706f2543Smrg    __GLX_SWAP_SHORT(&req->length);
416706f2543Smrg    __GLX_SWAP_INT(&req->screen);
417706f2543Smrg    __GLX_SWAP_INT(&req->name);
418706f2543Smrg
419706f2543Smrg    return __glXQueryServerString(cl, pc);
420706f2543Smrg}
421706f2543Smrg
422706f2543Smrgint __glXSwapClientInfo(__GLXclientState *cl, GLbyte *pc)
423706f2543Smrg{
424706f2543Smrg    xGLXClientInfoReq *req = (xGLXClientInfoReq *)pc;
425706f2543Smrg    __GLX_DECLARE_SWAP_VARIABLES;
426706f2543Smrg
427706f2543Smrg    __GLX_SWAP_SHORT(&req->length);
428706f2543Smrg    __GLX_SWAP_INT(&req->major);
429706f2543Smrg    __GLX_SWAP_INT(&req->minor);
430706f2543Smrg    __GLX_SWAP_INT(&req->numbytes);
431706f2543Smrg
432706f2543Smrg    return __glXClientInfo(cl, pc);
433706f2543Smrg}
434706f2543Smrg
435706f2543Smrgint __glXSwapQueryContextInfoEXT(__GLXclientState *cl, char *pc)
436706f2543Smrg{
437706f2543Smrg    xGLXQueryContextInfoEXTReq *req = (xGLXQueryContextInfoEXTReq *) pc;
438706f2543Smrg    __GLX_DECLARE_SWAP_VARIABLES;
439706f2543Smrg
440706f2543Smrg    __GLX_SWAP_SHORT(&req->length);
441706f2543Smrg    __GLX_SWAP_INT(&req->context);
442706f2543Smrg
443706f2543Smrg    return __glXQueryContextInfoEXT(cl, (GLbyte *)pc);
444706f2543Smrg}
445706f2543Smrg
446706f2543Smrg/************************************************************************/
447706f2543Smrg
448706f2543Smrg/*
449706f2543Smrg** Swap replies.
450706f2543Smrg*/
451706f2543Smrg
452706f2543Smrgvoid __glXSwapMakeCurrentReply(ClientPtr client,  xGLXMakeCurrentReadSGIReply *reply)
453706f2543Smrg{
454706f2543Smrg    __GLX_DECLARE_SWAP_VARIABLES;
455706f2543Smrg    __GLX_SWAP_SHORT(&reply->sequenceNumber);
456706f2543Smrg    __GLX_SWAP_INT(&reply->length);
457706f2543Smrg    __GLX_SWAP_INT(&reply->contextTag);
458706f2543Smrg    __GLX_SWAP_INT(&reply->writeVid);
459706f2543Smrg    __GLX_SWAP_INT(&reply->writeType);
460706f2543Smrg    __GLX_SWAP_INT(&reply->readVid);
461706f2543Smrg    __GLX_SWAP_INT(&reply->readType);
462706f2543Smrg    WriteToClient(client, sz_xGLXMakeCurrentReadSGIReply, (char *)reply);
463706f2543Smrg}
464706f2543Smrg
465706f2543Smrgvoid __glXSwapIsDirectReply(ClientPtr client, xGLXIsDirectReply *reply)
466706f2543Smrg{
467706f2543Smrg    __GLX_DECLARE_SWAP_VARIABLES;
468706f2543Smrg    __GLX_SWAP_SHORT(&reply->sequenceNumber);
469706f2543Smrg    __GLX_SWAP_INT(&reply->length);
470706f2543Smrg    WriteToClient(client, sz_xGLXIsDirectReply, (char *)reply);
471706f2543Smrg}
472706f2543Smrg
473706f2543Smrgvoid __glXSwapQueryVersionReply(ClientPtr client, xGLXQueryVersionReply *reply)
474706f2543Smrg{
475706f2543Smrg    __GLX_DECLARE_SWAP_VARIABLES;
476706f2543Smrg    __GLX_SWAP_SHORT(&reply->sequenceNumber);
477706f2543Smrg    __GLX_SWAP_INT(&reply->length);
478706f2543Smrg    __GLX_SWAP_INT(&reply->majorVersion);
479706f2543Smrg    __GLX_SWAP_INT(&reply->minorVersion);
480706f2543Smrg    WriteToClient(client, sz_xGLXQueryVersionReply, (char *)reply);
481706f2543Smrg}
482706f2543Smrg
483706f2543Smrgvoid glxSwapQueryExtensionsStringReply(ClientPtr client,
484706f2543Smrg				       xGLXQueryExtensionsStringReply *reply, char *buf)
485706f2543Smrg{
486706f2543Smrg    int length = reply->length;
487706f2543Smrg    __GLX_DECLARE_SWAP_VARIABLES;
488706f2543Smrg    __GLX_DECLARE_SWAP_ARRAY_VARIABLES;
489706f2543Smrg    __GLX_SWAP_SHORT(&reply->sequenceNumber);
490706f2543Smrg    __GLX_SWAP_INT(&reply->length);
491706f2543Smrg    __GLX_SWAP_INT(&reply->n);
492706f2543Smrg    WriteToClient(client, sz_xGLXQueryExtensionsStringReply, (char *)reply);
493706f2543Smrg    __GLX_SWAP_INT_ARRAY((int *)buf, length);
494706f2543Smrg    WriteToClient(client, length << 2, buf);
495706f2543Smrg}
496706f2543Smrg
497706f2543Smrgvoid glxSwapQueryServerStringReply(ClientPtr client,
498706f2543Smrg				   xGLXQueryServerStringReply *reply, char *buf)
499706f2543Smrg{
500706f2543Smrg    int length = reply->length;
501706f2543Smrg    __GLX_DECLARE_SWAP_VARIABLES;
502706f2543Smrg    __GLX_SWAP_SHORT(&reply->sequenceNumber);
503706f2543Smrg    __GLX_SWAP_INT(&reply->length);
504706f2543Smrg    __GLX_SWAP_INT(&reply->n);
505706f2543Smrg    WriteToClient(client, sz_xGLXQueryServerStringReply, (char *)reply);
506706f2543Smrg    /** no swap is needed for an array of chars **/
507706f2543Smrg    /* __GLX_SWAP_INT_ARRAY((int *)buf, length); */
508706f2543Smrg    WriteToClient(client, length << 2, buf);
509706f2543Smrg}
510706f2543Smrg
511706f2543Smrgvoid __glXSwapQueryContextInfoEXTReply(ClientPtr client, xGLXQueryContextInfoEXTReply *reply, int *buf)
512706f2543Smrg{
513706f2543Smrg    int length = reply->length;
514706f2543Smrg    __GLX_DECLARE_SWAP_VARIABLES;
515706f2543Smrg    __GLX_DECLARE_SWAP_ARRAY_VARIABLES;
516706f2543Smrg    __GLX_SWAP_SHORT(&reply->sequenceNumber);
517706f2543Smrg    __GLX_SWAP_INT(&reply->length);
518706f2543Smrg    __GLX_SWAP_INT(&reply->n);
519706f2543Smrg    WriteToClient(client, sz_xGLXQueryContextInfoEXTReply, (char *)reply);
520706f2543Smrg    __GLX_SWAP_INT_ARRAY((int *)buf, length);
521706f2543Smrg    WriteToClient(client, length << 2, (char *)buf);
522706f2543Smrg}
523706f2543Smrg
524706f2543Smrg
525706f2543Smrgvoid __glXSwapQueryContextReply(ClientPtr client,
526706f2543Smrg                                xGLXQueryContextReply *reply, int *buf)
527706f2543Smrg{
528706f2543Smrg    int length = reply->length;
529706f2543Smrg    __GLX_DECLARE_SWAP_VARIABLES;
530706f2543Smrg    __GLX_DECLARE_SWAP_ARRAY_VARIABLES;
531706f2543Smrg    __GLX_SWAP_SHORT(&reply->sequenceNumber);
532706f2543Smrg    __GLX_SWAP_INT(&reply->length);
533706f2543Smrg    __GLX_SWAP_INT(&reply->n);
534706f2543Smrg    WriteToClient(client, sz_xGLXQueryContextReply, (char *)reply);
535706f2543Smrg    __GLX_SWAP_INT_ARRAY((int *)buf, length);
536706f2543Smrg    WriteToClient(client, length << 2, (char *)buf);
537706f2543Smrg}
538706f2543Smrg
539706f2543Smrgvoid __glXSwapGetDrawableAttributesReply(ClientPtr client,
540706f2543Smrg                                 xGLXGetDrawableAttributesReply *reply, int *buf)
541706f2543Smrg{
542706f2543Smrg    __GLX_DECLARE_SWAP_VARIABLES;
543706f2543Smrg    __GLX_DECLARE_SWAP_ARRAY_VARIABLES;
544706f2543Smrg    __GLX_SWAP_SHORT(&reply->sequenceNumber);
545706f2543Smrg    __GLX_SWAP_INT(&reply->length);
546706f2543Smrg    __GLX_SWAP_INT(&reply->numAttribs);
547706f2543Smrg    __GLX_SWAP_INT_ARRAY( buf, reply->length );
548706f2543Smrg    WriteToClient(client, sz_xGLXGetDrawableAttributesReply, (char *)reply);
549706f2543Smrg    WriteToClient(client, reply->length << 2, (char *)buf);
550706f2543Smrg}
551706f2543Smrg
552706f2543Smrgvoid __glXSwapQueryMaxSwapBarriersSGIXReply(ClientPtr client, xGLXQueryMaxSwapBarriersSGIXReply *reply)
553706f2543Smrg{
554706f2543Smrg    __GLX_DECLARE_SWAP_VARIABLES;
555706f2543Smrg    __GLX_SWAP_SHORT(&reply->sequenceNumber);
556706f2543Smrg    __GLX_SWAP_INT(&reply->length);
557706f2543Smrg    __GLX_SWAP_INT(&reply->max);
558706f2543Smrg    WriteToClient(client, sz_xGLXQueryMaxSwapBarriersSGIXReply, (char *)reply);
559706f2543Smrg}
560706f2543Smrg
561706f2543Smrg/************************************************************************/
562706f2543Smrg
563706f2543Smrg/*
564706f2543Smrg** Render and Renderlarge are not in the GLX API.  They are used by the GLX
565706f2543Smrg** client library to send batches of GL rendering commands.
566706f2543Smrg*/
567706f2543Smrg
568706f2543Smrgint __glXSwapRender(__GLXclientState *cl, GLbyte *pc)
569706f2543Smrg{
570706f2543Smrg    xGLXRenderReq *req;
571706f2543Smrg    int left;
572706f2543Smrg    __GLXrenderHeader *hdr;
573706f2543Smrg    ClientPtr client = cl->client;
574706f2543Smrg    __GLX_DECLARE_SWAP_VARIABLES;
575706f2543Smrg    __GLX_DECLARE_SWAP_ARRAY_VARIABLES;
576706f2543Smrg
577706f2543Smrg    /*
578706f2543Smrg    ** NOTE: much of this code also appears in the nonswapping version of this
579706f2543Smrg    ** routine, __glXRender().  Any changes made here should also be
580706f2543Smrg    ** duplicated there.
581706f2543Smrg    */
582706f2543Smrg
583706f2543Smrg    req = (xGLXRenderReq *) pc;
584706f2543Smrg    __GLX_SWAP_SHORT(&req->length);
585706f2543Smrg    __GLX_SWAP_INT(&req->contextTag);
586706f2543Smrg
587706f2543Smrg    pc += sz_xGLXRenderReq;
588706f2543Smrg    left = (req->length << 2) - sz_xGLXRenderReq;
589706f2543Smrg    while (left > 0) {
590706f2543Smrg	void (* proc)(GLbyte *);
591706f2543Smrg	CARD16 opcode;
592706f2543Smrg
593706f2543Smrg	/*
594706f2543Smrg	** Verify that the header length and the overall length agree.
595706f2543Smrg	** Also, each command must be word aligned.
596706f2543Smrg	*/
597706f2543Smrg	hdr = (__GLXrenderHeader *) pc;
598706f2543Smrg	__GLX_SWAP_SHORT(&hdr->length);
599706f2543Smrg	__GLX_SWAP_SHORT(&hdr->opcode);
600706f2543Smrg
601706f2543Smrg	/*
602706f2543Smrg         * call the command procedure to swap any arguments
603706f2543Smrg	 */
604706f2543Smrg	opcode = hdr->opcode;
605706f2543Smrg	if ( (opcode >= __GLX_MIN_RENDER_OPCODE) &&
606706f2543Smrg	     (opcode <= __GLX_MAX_RENDER_OPCODE) ) {
607706f2543Smrg	    proc = __glXSwapRenderTable[opcode];
608706f2543Smrg#if __GLX_MAX_RENDER_OPCODE_EXT > __GLX_MIN_RENDER_OPCODE_EXT
609706f2543Smrg	} else if ( (opcode >= __GLX_MIN_RENDER_OPCODE_EXT) &&
610706f2543Smrg	     (opcode <= __GLX_MAX_RENDER_OPCODE_EXT) ) {
611706f2543Smrg	    int index = opcode - __GLX_MIN_RENDER_OPCODE_EXT;
612706f2543Smrg	    __GLXRenderSwapInfo *info = &__glXSwapRenderTable_EXT[index];
613706f2543Smrg	    if (info->swapfunc) {
614706f2543Smrg	       proc = info->swapfunc;
615706f2543Smrg	    }
616706f2543Smrg	    else {
617706f2543Smrg	       proc = NULL;
618706f2543Smrg	       if (info->elem_size == 4 && info->nelems > 0) {
619706f2543Smrg		  __GLX_SWAP_INT_ARRAY( (int *)(pc + __GLX_RENDER_HDR_SIZE),
620706f2543Smrg			                info->nelems );
621706f2543Smrg	       }
622706f2543Smrg	       else if (info->elem_size == 2 && info->nelems > 0) {
623706f2543Smrg		  __GLX_SWAP_SHORT_ARRAY( (short *)(pc + __GLX_RENDER_HDR_SIZE),
624706f2543Smrg			                info->nelems );
625706f2543Smrg	       }
626706f2543Smrg	       else if (info->elem_size == 8 && info->nelems > 0) {
627706f2543Smrg		  __GLX_SWAP_DOUBLE_ARRAY( (double *)(pc + __GLX_RENDER_HDR_SIZE),
628706f2543Smrg			                info->nelems );
629706f2543Smrg	       }
630706f2543Smrg	    }
631706f2543Smrg#endif /* __GLX_MAX_RENDER_OPCODE_EXT > __GLX_MIN_RENDER_OPCODE_EXT */
632706f2543Smrg	} else {
633706f2543Smrg	    client->errorValue = 0;
634706f2543Smrg	    return __glXBadRenderRequest;
635706f2543Smrg	}
636706f2543Smrg
637706f2543Smrg	if (proc != NULL)
638706f2543Smrg	   (*proc)(pc + __GLX_RENDER_HDR_SIZE);
639706f2543Smrg
640706f2543Smrg	/*
641706f2543Smrg	 * proceed to the next command
642706f2543Smrg	 */
643706f2543Smrg	pc += hdr->length;
644706f2543Smrg	left -= hdr->length;
645706f2543Smrg    }
646706f2543Smrg
647706f2543Smrg    return __glXRender( cl, (GLbyte *)req );
648706f2543Smrg}
649706f2543Smrg
650706f2543Smrg/*
651706f2543Smrg** Execute a large rendering request (one that spans multiple X requests).
652706f2543Smrg*/
653706f2543Smrgint __glXSwapRenderLarge(__GLXclientState *cl, GLbyte *pc)
654706f2543Smrg{
655706f2543Smrg   ClientPtr client = cl->client;
656706f2543Smrg    xGLXRenderLargeReq *req;
657706f2543Smrg    __GLXrenderLargeHeader *hdr;
658706f2543Smrg    __GLX_DECLARE_SWAP_VARIABLES;
659706f2543Smrg    __GLX_DECLARE_SWAP_ARRAY_VARIABLES;
660706f2543Smrg
661706f2543Smrg    req = (xGLXRenderLargeReq *) pc;
662706f2543Smrg    __GLX_SWAP_SHORT(&req->length);
663706f2543Smrg    __GLX_SWAP_INT(&req->contextTag);
664706f2543Smrg    __GLX_SWAP_INT(&req->dataBytes);
665706f2543Smrg    __GLX_SWAP_SHORT(&req->requestNumber);
666706f2543Smrg    __GLX_SWAP_SHORT(&req->requestTotal);
667706f2543Smrg
668706f2543Smrg    pc += sz_xGLXRenderLargeReq;
669706f2543Smrg
670706f2543Smrg    if (req->requestNumber == 1) {
671706f2543Smrg	void (* proc)(GLbyte *) = NULL;
672706f2543Smrg	__GLXRenderSwapInfo *info = NULL;
673706f2543Smrg	CARD16 opcode;
674706f2543Smrg
675706f2543Smrg	hdr = (__GLXrenderLargeHeader *) pc;
676706f2543Smrg	__GLX_SWAP_INT(&hdr->length);
677706f2543Smrg	__GLX_SWAP_INT(&hdr->opcode);
678706f2543Smrg
679706f2543Smrg	/*
680706f2543Smrg         * call the command procedure to swap any arguments
681706f2543Smrg	 * Note that we are assuming that all arguments that needs to be
682706f2543Smrg	 * swaped are on the first req only !
683706f2543Smrg	 */
684706f2543Smrg	opcode = hdr->opcode;
685706f2543Smrg	if ( (opcode >= __GLX_MIN_RENDER_OPCODE) &&
686706f2543Smrg	     (opcode <= __GLX_MAX_RENDER_OPCODE) ) {
687706f2543Smrg	    proc = __glXSwapRenderTable[opcode];
688706f2543Smrg#if __GLX_MAX_RENDER_OPCODE_EXT > __GLX_MIN_RENDER_OPCODE_EXT
689706f2543Smrg	} else if ( (opcode >= __GLX_MIN_RENDER_OPCODE_EXT) &&
690706f2543Smrg	     (opcode <= __GLX_MAX_RENDER_OPCODE_EXT) ) {
691706f2543Smrg	    int index = opcode - __GLX_MIN_RENDER_OPCODE_EXT;
692706f2543Smrg	    info = &__glXSwapRenderTable_EXT[index];
693706f2543Smrg	    if (info->swapfunc) {
694706f2543Smrg	       proc = info->swapfunc;
695706f2543Smrg	    }
696706f2543Smrg#endif /* __GLX_MAX_RENDER_OPCODE_EXT > __GLX_MIN_RENDER_OPCODE_EXT */
697706f2543Smrg	} else {
698706f2543Smrg	    client->errorValue = 0;
699706f2543Smrg	    cl->largeCmdRequestsTotal = 0;
700706f2543Smrg	    return __glXBadLargeRequest;
701706f2543Smrg	}
702706f2543Smrg
703706f2543Smrg	/*
704706f2543Smrg	** Make enough space in the buffer, then copy the entire request.
705706f2543Smrg	*/
706706f2543Smrg	if (cl->largeCmdBufSize < hdr->length) {
707706f2543Smrg	    if (!cl->largeCmdBuf) {
708706f2543Smrg		cl->largeCmdBuf = (GLbyte *) malloc(hdr->length);
709706f2543Smrg	    } else {
710706f2543Smrg		cl->largeCmdBuf = (GLbyte *) realloc(cl->largeCmdBuf, hdr->length);
711706f2543Smrg	    }
712706f2543Smrg	    if (!cl->largeCmdBuf) {
713706f2543Smrg	       cl->largeCmdRequestsTotal = 0;
714706f2543Smrg		return BadAlloc;
715706f2543Smrg	    }
716706f2543Smrg	    cl->largeCmdBufSize = hdr->length;
717706f2543Smrg	}
718706f2543Smrg	memcpy(cl->largeCmdBuf, pc, req->dataBytes);
719706f2543Smrg
720706f2543Smrg	cl->largeCmdBytesSoFar = req->dataBytes;
721706f2543Smrg	cl->largeCmdBytesTotal = hdr->length;
722706f2543Smrg	cl->largeCmdRequestsSoFar = 1;
723706f2543Smrg	cl->largeCmdRequestsTotal = req->requestTotal;
724706f2543Smrg	cl->largeCmdRequestsSwapProc = proc;
725706f2543Smrg	cl->largeCmdMaxReqDataSize = req->dataBytes;
726706f2543Smrg	cl->largeCmdRequestsSwap_info = info;
727706f2543Smrg
728706f2543Smrg	return Success;
729706f2543Smrg
730706f2543Smrg
731706f2543Smrg    }
732706f2543Smrg    else if (req->requestNumber < cl->largeCmdRequestsTotal) {
733706f2543Smrg       /*
734706f2543Smrg        * This is not the first nor last request - just copy the data
735706f2543Smrg	*/
736706f2543Smrg       if (  cl->largeCmdBytesSoFar + req->dataBytes > cl->largeCmdBytesTotal) {
737706f2543Smrg	    cl->largeCmdRequestsTotal = 0;
738706f2543Smrg	    return __glXBadLargeRequest;
739706f2543Smrg       }
740706f2543Smrg
741706f2543Smrg       memcpy(cl->largeCmdBuf + cl->largeCmdBytesSoFar,
742706f2543Smrg	           pc, req->dataBytes);
743706f2543Smrg
744706f2543Smrg       cl->largeCmdBytesSoFar += req->dataBytes;
745706f2543Smrg
746706f2543Smrg       if (req->dataBytes > cl->largeCmdMaxReqDataSize)
747706f2543Smrg	  cl->largeCmdMaxReqDataSize = req->dataBytes;
748706f2543Smrg
749706f2543Smrg	return Success;
750706f2543Smrg    }
751706f2543Smrg    else if (req->requestNumber == cl->largeCmdRequestsTotal) {
752706f2543Smrg       /*
753706f2543Smrg        * this is the last request
754706f2543Smrg        * copy the remainder bytes, call the procedure to swap any
755706f2543Smrg	* needed data, and then call to transfer the command to all
756706f2543Smrg	* back-end servers
757706f2543Smrg	*/
758706f2543Smrg       if (  cl->largeCmdBytesSoFar + req->dataBytes > cl->largeCmdBytesTotal) {
759706f2543Smrg	    cl->largeCmdRequestsTotal = 0;
760706f2543Smrg	    return __glXBadLargeRequest;
761706f2543Smrg       }
762706f2543Smrg
763706f2543Smrg       memcpy(cl->largeCmdBuf + cl->largeCmdBytesSoFar,
764706f2543Smrg	           pc, req->dataBytes);
765706f2543Smrg
766706f2543Smrg       cl->largeCmdBytesSoFar += req->dataBytes;
767706f2543Smrg
768706f2543Smrg       if (req->dataBytes > cl->largeCmdMaxReqDataSize)
769706f2543Smrg	  cl->largeCmdMaxReqDataSize = req->dataBytes;
770706f2543Smrg
771706f2543Smrg	if (cl->largeCmdRequestsSwapProc != NULL) {
772706f2543Smrg	   (*cl->largeCmdRequestsSwapProc)(cl->largeCmdBuf + __GLX_RENDER_LARGE_HDR_SIZE);
773706f2543Smrg	}
774706f2543Smrg	else if (cl->largeCmdRequestsSwap_info &&
775706f2543Smrg	         cl->largeCmdRequestsSwap_info->nelems > 0) {
776706f2543Smrg    	   if (cl->largeCmdRequestsSwap_info->elem_size == 4) {
777706f2543Smrg	      __GLX_SWAP_INT_ARRAY( (int *)(pc + __GLX_RENDER_LARGE_HDR_SIZE),
778706f2543Smrg		       cl->largeCmdRequestsSwap_info->nelems );
779706f2543Smrg	   }
780706f2543Smrg	   else if (cl->largeCmdRequestsSwap_info->elem_size == 2) {
781706f2543Smrg	      __GLX_SWAP_SHORT_ARRAY( (short *)(pc + __GLX_RENDER_LARGE_HDR_SIZE),
782706f2543Smrg		       cl->largeCmdRequestsSwap_info->nelems );
783706f2543Smrg	   }
784706f2543Smrg	   else if (cl->largeCmdRequestsSwap_info->elem_size == 8) {
785706f2543Smrg	      __GLX_SWAP_DOUBLE_ARRAY( (double *)(pc + __GLX_RENDER_LARGE_HDR_SIZE),
786706f2543Smrg		       cl->largeCmdRequestsSwap_info->nelems );
787706f2543Smrg	   }
788706f2543Smrg	}
789706f2543Smrg
790706f2543Smrg	cl->largeCmdRequestsTotal = 0;
791706f2543Smrg        return( __glXSendLargeCommand(cl, req->contextTag) );
792706f2543Smrg
793706f2543Smrg    }
794706f2543Smrg    else {
795706f2543Smrg       cl->largeCmdRequestsTotal = 0;
796706f2543Smrg       return __glXBadLargeRequest;
797706f2543Smrg    }
798706f2543Smrg
799706f2543Smrg}
800706f2543Smrg
801706f2543Smrg/************************************************************************/
802706f2543Smrg
803706f2543Smrg/*
804706f2543Smrg** No support is provided for the vendor-private requests other than
805706f2543Smrg** allocating these entry points in the dispatch table.
806706f2543Smrg*/
807706f2543Smrg
808706f2543Smrgint __glXSwapVendorPrivate(__GLXclientState *cl, GLbyte *pc)
809706f2543Smrg{
810706f2543Smrg    xGLXVendorPrivateReq *req;
811706f2543Smrg    CARD32 vendorCode;
812706f2543Smrg
813706f2543Smrg    __GLX_DECLARE_SWAP_VARIABLES;
814706f2543Smrg
815706f2543Smrg    req = (xGLXVendorPrivateReq *) pc;
816706f2543Smrg    vendorCode = req->vendorCode;
817706f2543Smrg    __GLX_SWAP_INT(&vendorCode);
818706f2543Smrg
819706f2543Smrg
820706f2543Smrg    switch( vendorCode ) {
821706f2543Smrg
822706f2543Smrg       case X_GLvop_DeleteTexturesEXT:
823706f2543Smrg	  return __glXVForwardSingleReqSwap( cl, pc );
824706f2543Smrg	  break;
825706f2543Smrg
826706f2543Smrg       case X_GLXvop_SwapIntervalSGI:
827706f2543Smrg	  if (glxIsExtensionSupported("SGI_swap_control")) {
828706f2543Smrg	     return __glXVForwardSingleReqSwap( cl, pc );
829706f2543Smrg	  }
830706f2543Smrg	  else {
831706f2543Smrg	     return Success;
832706f2543Smrg	  }
833706f2543Smrg	  break;
834706f2543Smrg
835706f2543Smrg#if 0 /* glx 1.3 */
836706f2543Smrg       case X_GLXvop_CreateGLXVideoSourceSGIX:
837706f2543Smrg	  break;
838706f2543Smrg       case X_GLXvop_DestroyGLXVideoSourceSGIX:
839706f2543Smrg	  break;
840706f2543Smrg       case X_GLXvop_CreateGLXPixmapWithConfigSGIX:
841706f2543Smrg	  break;
842706f2543Smrg       case X_GLXvop_DestroyGLXPbufferSGIX:
843706f2543Smrg	  break;
844706f2543Smrg       case X_GLXvop_ChangeDrawableAttributesSGIX:
845706f2543Smrg	  break;
846706f2543Smrg#endif
847706f2543Smrg
848706f2543Smrg       case X_GLXvop_JoinSwapGroupSGIX:
849706f2543Smrg	  return __glXSwapJoinSwapGroupSGIX( cl, pc );
850706f2543Smrg	  break;
851706f2543Smrg
852706f2543Smrg       case X_GLXvop_BindSwapBarrierSGIX:
853706f2543Smrg	  return __glXSwapBindSwapBarrierSGIX( cl, pc );
854706f2543Smrg	  break;
855706f2543Smrg
856706f2543Smrg       case X_GLXvop_CreateContextWithConfigSGIX:
857706f2543Smrg	  return __glXSwapCreateContextWithConfigSGIX( cl, pc );
858706f2543Smrg	  break;
859706f2543Smrg
860706f2543Smrg       default:
861706f2543Smrg	  /*
862706f2543Smrg	   ** unsupported private request
863706f2543Smrg	   */
864706f2543Smrg	  cl->client->errorValue = req->vendorCode;
865706f2543Smrg	  return __glXUnsupportedPrivateRequest;
866706f2543Smrg    }
867706f2543Smrg
868706f2543Smrg}
869706f2543Smrg
870706f2543Smrgint __glXSwapVendorPrivateWithReply(__GLXclientState *cl, GLbyte *pc)
871706f2543Smrg{
872706f2543Smrg    xGLXVendorPrivateWithReplyReq *req;
873706f2543Smrg    CARD32 vendorCode;
874706f2543Smrg
875706f2543Smrg    __GLX_DECLARE_SWAP_VARIABLES;
876706f2543Smrg
877706f2543Smrg    req = (xGLXVendorPrivateWithReplyReq *) pc;
878706f2543Smrg    vendorCode = req->vendorCode;
879706f2543Smrg    __GLX_SWAP_INT(&vendorCode);
880706f2543Smrg
881706f2543Smrg    switch( vendorCode ) {
882706f2543Smrg
883706f2543Smrg       case X_GLvop_GetConvolutionFilterEXT:
884706f2543Smrg       case X_GLvop_GetSeparableFilterEXT:
885706f2543Smrg       case X_GLvop_GetHistogramEXT:
886706f2543Smrg       case X_GLvop_GetMinmaxEXT:
887706f2543Smrg	  return( __glXNoSuchSingleOpcode(cl, pc) );
888706f2543Smrg	  break;
889706f2543Smrg
890706f2543Smrg       case X_GLvop_GetConvolutionParameterfvEXT:
891706f2543Smrg       case X_GLvop_GetConvolutionParameterivEXT:
892706f2543Smrg       case X_GLvop_GetHistogramParameterivEXT:
893706f2543Smrg       case X_GLvop_GetMinmaxParameterfvEXT:
894706f2543Smrg       case X_GLvop_GetMinmaxParameterivEXT:
895706f2543Smrg       case X_GLvop_GenTexturesEXT:
896706f2543Smrg	  return( __glXVForwardAllWithReplySwapiv(cl, pc) );
897706f2543Smrg	  break;
898706f2543Smrg
899706f2543Smrg       case X_GLvop_AreTexturesResidentEXT:
900706f2543Smrg       case X_GLvop_IsTextureEXT:
901706f2543Smrg	  return( __glXVForwardPipe0WithReplySwap(cl, pc) );
902706f2543Smrg	  break;
903706f2543Smrg
904706f2543Smrg#if 0 /* glx1.3 */
905706f2543Smrg       case X_GLvop_GetDetailTexFuncSGIS:
906706f2543Smrg       case X_GLvop_GetSharpenTexFuncSGIS:
907706f2543Smrg       case X_GLvop_GetColorTableSGI:
908706f2543Smrg       case X_GLvop_GetColorTableParameterfvSGI:
909706f2543Smrg       case X_GLvop_GetColorTableParameterivSGI:
910706f2543Smrg       case X_GLvop_GetTexFilterFuncSGIS:
911706f2543Smrg       case X_GLvop_GetInstrumentsSGIX:
912706f2543Smrg       case X_GLvop_InstrumentsBufferSGIX:
913706f2543Smrg       case X_GLvop_PollInstrumentsSGIX:
914706f2543Smrg       case X_GLvop_FlushRasterSGIX:
915706f2543Smrg       case X_GLXvop_CreateGLXPbufferSGIX:
916706f2543Smrg       case X_GLXvop_GetDrawableAttributesSGIX:
917706f2543Smrg       case X_GLXvop_QueryHyperpipeNetworkSGIX:
918706f2543Smrg       case X_GLXvop_QueryHyperpipeConfigSGIX:
919706f2543Smrg       case X_GLXvop_HyperpipeConfigSGIX:
920706f2543Smrg       case X_GLXvop_DestroyHyperpipeConfigSGIX:
921706f2543Smrg#endif
922706f2543Smrg       case X_GLXvop_QueryMaxSwapBarriersSGIX:
923706f2543Smrg	  return( __glXSwapQueryMaxSwapBarriersSGIX(cl, pc) );
924706f2543Smrg	  break;
925706f2543Smrg
926706f2543Smrg       case X_GLXvop_GetFBConfigsSGIX:
927706f2543Smrg	  return( __glXSwapGetFBConfigsSGIX(cl, pc) );
928706f2543Smrg	  break;
929706f2543Smrg
930706f2543Smrg       case X_GLXvop_MakeCurrentReadSGI:
931706f2543Smrg	  return( __glXSwapMakeCurrentReadSGI(cl, pc) );
932706f2543Smrg	  break;
933706f2543Smrg
934706f2543Smrg       case X_GLXvop_QueryContextInfoEXT:
935706f2543Smrg	  return( __glXSwapQueryContextInfoEXT(cl,(char *)pc) );
936706f2543Smrg	  break;
937706f2543Smrg
938706f2543Smrg       default:
939706f2543Smrg	  /*
940706f2543Smrg	   ** unsupported private request
941706f2543Smrg	   */
942706f2543Smrg	  cl->client->errorValue = req->vendorCode;
943706f2543Smrg	  return __glXUnsupportedPrivateRequest;
944706f2543Smrg    }
945706f2543Smrg
946706f2543Smrg}
947706f2543Smrg
948706f2543Smrgint __glXSwapGetFBConfigs(__GLXclientState *cl, GLbyte *pc)
949706f2543Smrg{
950706f2543Smrg    xGLXGetFBConfigsReq *req = (xGLXGetFBConfigsReq *) pc;
951706f2543Smrg    __GLX_DECLARE_SWAP_VARIABLES;
952706f2543Smrg
953706f2543Smrg    __GLX_SWAP_SHORT(&req->length);
954706f2543Smrg    __GLX_SWAP_INT(&req->screen);
955706f2543Smrg
956706f2543Smrg    return __glXGetFBConfigs(cl, pc);
957706f2543Smrg}
958706f2543Smrg
959706f2543Smrgint __glXSwapGetFBConfigsSGIX(__GLXclientState *cl, GLbyte *pc)
960706f2543Smrg{
961706f2543Smrg   xGLXGetFBConfigsSGIXReq *req = (xGLXGetFBConfigsSGIXReq *)pc;
962706f2543Smrg   xGLXGetFBConfigsReq new_req;
963706f2543Smrg
964706f2543Smrg   new_req.reqType = req->reqType;
965706f2543Smrg   new_req.glxCode = req->glxCode;
966706f2543Smrg   new_req.length = req->length;
967706f2543Smrg   new_req.screen = req->screen;
968706f2543Smrg
969706f2543Smrg   return( __glXSwapGetFBConfigs( cl, (GLbyte *)&new_req ) );
970706f2543Smrg}
971706f2543Smrg
972706f2543Smrgint __glXSwapCreateWindow(__GLXclientState *cl, GLbyte *pc)
973706f2543Smrg{
974706f2543Smrg    xGLXCreateWindowReq *req = (xGLXCreateWindowReq *) pc;
975706f2543Smrg    __GLX_DECLARE_SWAP_VARIABLES;
976706f2543Smrg
977706f2543Smrg    __GLX_SWAP_SHORT(&req->length);
978706f2543Smrg    __GLX_SWAP_INT(&req->screen);
979706f2543Smrg    __GLX_SWAP_INT(&req->fbconfig);
980706f2543Smrg    __GLX_SWAP_INT(&req->window);
981706f2543Smrg    __GLX_SWAP_INT(&req->glxwindow);
982706f2543Smrg    __GLX_SWAP_INT(&req->numAttribs);
983706f2543Smrg
984706f2543Smrg    return( __glXCreateWindow( cl, (GLbyte *)pc ) );
985706f2543Smrg}
986706f2543Smrg
987706f2543Smrgint __glXSwapDestroyWindow(__GLXclientState *cl, GLbyte *pc)
988706f2543Smrg{
989706f2543Smrg    xGLXDestroyWindowReq *req = (xGLXDestroyWindowReq *) pc;
990706f2543Smrg    __GLX_DECLARE_SWAP_VARIABLES;
991706f2543Smrg
992706f2543Smrg    __GLX_SWAP_SHORT(&req->length);
993706f2543Smrg    __GLX_SWAP_INT(&req->glxwindow);
994706f2543Smrg
995706f2543Smrg    return( __glXDestroyWindow( cl, (GLbyte *)pc ) );
996706f2543Smrg}
997706f2543Smrg
998706f2543Smrgint __glXSwapQueryContext(__GLXclientState *cl, GLbyte *pc)
999706f2543Smrg{
1000706f2543Smrg    xGLXQueryContextReq *req = (xGLXQueryContextReq *)pc;
1001706f2543Smrg
1002706f2543Smrg    __GLX_DECLARE_SWAP_VARIABLES;
1003706f2543Smrg
1004706f2543Smrg    __GLX_SWAP_SHORT(&req->length);
1005706f2543Smrg    __GLX_SWAP_INT(&req->context);
1006706f2543Smrg
1007706f2543Smrg    return( __glXQueryContext(cl, (GLbyte *)pc) );
1008706f2543Smrg
1009706f2543Smrg}
1010706f2543Smrg
1011706f2543Smrgint __glXSwapCreatePbuffer(__GLXclientState *cl, GLbyte *pc)
1012706f2543Smrg{
1013706f2543Smrg    xGLXCreatePbufferReq *req = (xGLXCreatePbufferReq *)pc;
1014706f2543Smrg    int nattr = req->numAttribs;
1015706f2543Smrg    __GLX_DECLARE_SWAP_VARIABLES;
1016706f2543Smrg    __GLX_DECLARE_SWAP_ARRAY_VARIABLES;
1017706f2543Smrg
1018706f2543Smrg    __GLX_SWAP_SHORT(&req->length);
1019706f2543Smrg    __GLX_SWAP_INT(&req->screen);
1020706f2543Smrg    __GLX_SWAP_INT(&req->fbconfig);
1021706f2543Smrg    __GLX_SWAP_INT(&req->pbuffer);
1022706f2543Smrg    __GLX_SWAP_INT(&req->numAttribs);
1023706f2543Smrg    __GLX_SWAP_INT_ARRAY( (int *)(req+1), nattr*2 );
1024706f2543Smrg
1025706f2543Smrg    return( __glXCreatePbuffer( cl, pc ) );
1026706f2543Smrg}
1027706f2543Smrg
1028706f2543Smrgint __glXSwapDestroyPbuffer(__GLXclientState *cl, GLbyte *pc)
1029706f2543Smrg{
1030706f2543Smrg    xGLXDestroyPbufferReq *req = (xGLXDestroyPbufferReq *) pc;
1031706f2543Smrg    __GLX_DECLARE_SWAP_VARIABLES;
1032706f2543Smrg
1033706f2543Smrg    __GLX_SWAP_SHORT(&req->length);
1034706f2543Smrg    __GLX_SWAP_INT(&req->pbuffer);
1035706f2543Smrg
1036706f2543Smrg    return( __glXDestroyPbuffer( cl, (GLbyte *)pc ) );
1037706f2543Smrg}
1038706f2543Smrg
1039706f2543Smrgint __glXSwapGetDrawableAttributes(__GLXclientState *cl, GLbyte *pc)
1040706f2543Smrg{
1041706f2543Smrg   xGLXGetDrawableAttributesReq *req = (xGLXGetDrawableAttributesReq *)pc;
1042706f2543Smrg    __GLX_DECLARE_SWAP_VARIABLES;
1043706f2543Smrg
1044706f2543Smrg    __GLX_SWAP_SHORT(&req->length);
1045706f2543Smrg    __GLX_SWAP_INT(&req->drawable);
1046706f2543Smrg
1047706f2543Smrg    return( __glXGetDrawableAttributes(cl, pc) );
1048706f2543Smrg}
1049706f2543Smrg
1050706f2543Smrgint __glXSwapChangeDrawableAttributes(__GLXclientState *cl, GLbyte *pc)
1051706f2543Smrg{
1052706f2543Smrg   xGLXChangeDrawableAttributesReq *req = (xGLXChangeDrawableAttributesReq *)pc;
1053706f2543Smrg    __GLX_DECLARE_SWAP_VARIABLES;
1054706f2543Smrg    __GLX_DECLARE_SWAP_ARRAY_VARIABLES;
1055706f2543Smrg
1056706f2543Smrg    __GLX_SWAP_SHORT(&req->length);
1057706f2543Smrg    __GLX_SWAP_INT(&req->drawable);
1058706f2543Smrg    __GLX_SWAP_INT(&req->numAttribs);
1059706f2543Smrg    __GLX_SWAP_INT_ARRAY( (int *)(req+1), req->numAttribs * 2 );
1060706f2543Smrg
1061706f2543Smrg    return( __glXChangeDrawableAttributes(cl, pc) );
1062706f2543Smrg}
1063