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