1161 lines
33 KiB
C
1161 lines
33 KiB
C
/*
|
|
* SGI FREE SOFTWARE LICENSE B (Version 2.0, Sept. 18, 2008)
|
|
* Copyright (C) 1991-2000 Silicon Graphics, Inc. All Rights Reserved.
|
|
*
|
|
* Permission is hereby granted, free of charge, to any person obtaining a
|
|
* copy of this software and associated documentation files (the "Software"),
|
|
* to deal in the Software without restriction, including without limitation
|
|
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
|
* and/or sell copies of the Software, and to permit persons to whom the
|
|
* Software is furnished to do so, subject to the following conditions:
|
|
*
|
|
* The above copyright notice including the dates of first publication and
|
|
* either this permission notice or a reference to
|
|
* http://oss.sgi.com/projects/FreeB/
|
|
* shall be included in all copies or substantial portions of the Software.
|
|
*
|
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
|
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
|
* SILICON GRAPHICS, INC. BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
|
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
|
|
* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
* SOFTWARE.
|
|
*
|
|
* Except as contained in this notice, the name of Silicon Graphics, Inc.
|
|
* shall not be used in advertising or otherwise to promote the sale, use or
|
|
* other dealings in this Software without prior written authorization from
|
|
* Silicon Graphics, Inc.
|
|
*/
|
|
|
|
#include "glxserver.h"
|
|
#include "glxutil.h"
|
|
#include <GL/glxtokens.h>
|
|
#include <g_disptab.h>
|
|
#include <pixmapstr.h>
|
|
#include <windowstr.h>
|
|
#include "unpack.h"
|
|
#include "glxcmds.h"
|
|
#include "glxext.h"
|
|
#include "glxvendor.h"
|
|
|
|
extern int glxIsExtensionSupported(char *ext);
|
|
|
|
int __glXSwapGetFBConfigsSGIX(__GLXclientState * cl, GLbyte * pc);
|
|
|
|
/************************************************************************/
|
|
|
|
/*
|
|
** Byteswapping versions of GLX commands. In most cases they just swap
|
|
** the incoming arguments and then call the unswapped routine. For commands
|
|
** that have replies, a separate swapping routine for the reply is provided;
|
|
** it is called at the end of the unswapped routine.
|
|
*/
|
|
|
|
int
|
|
__glXSwapCreateContext(__GLXclientState * cl, GLbyte * pc)
|
|
{
|
|
xGLXCreateContextReq *req = (xGLXCreateContextReq *) pc;
|
|
|
|
__GLX_DECLARE_SWAP_VARIABLES;
|
|
|
|
__GLX_SWAP_SHORT(&req->length);
|
|
__GLX_SWAP_INT(&req->context);
|
|
__GLX_SWAP_INT(&req->visual);
|
|
__GLX_SWAP_INT(&req->screen);
|
|
__GLX_SWAP_INT(&req->shareList);
|
|
|
|
return __glXCreateContext(cl, pc);
|
|
}
|
|
|
|
int
|
|
__glXSwapCreateNewContext(__GLXclientState * cl, GLbyte * pc)
|
|
{
|
|
xGLXCreateNewContextReq *req = (xGLXCreateNewContextReq *) pc;
|
|
|
|
__GLX_DECLARE_SWAP_VARIABLES;
|
|
|
|
__GLX_SWAP_SHORT(&req->length);
|
|
__GLX_SWAP_INT(&req->context);
|
|
__GLX_SWAP_INT(&req->fbconfig);
|
|
__GLX_SWAP_INT(&req->screen);
|
|
__GLX_SWAP_INT(&req->shareList);
|
|
|
|
return __glXCreateNewContext(cl, pc);
|
|
}
|
|
|
|
int
|
|
__glXSwapCreateContextWithConfigSGIX(__GLXclientState * cl, GLbyte * pc)
|
|
{
|
|
xGLXCreateContextWithConfigSGIXReq *req =
|
|
(xGLXCreateContextWithConfigSGIXReq *) pc;
|
|
__GLX_DECLARE_SWAP_VARIABLES;
|
|
|
|
__GLX_SWAP_SHORT(&req->length);
|
|
__GLX_SWAP_INT(&req->context);
|
|
__GLX_SWAP_INT(&req->fbconfig);
|
|
__GLX_SWAP_INT(&req->screen);
|
|
__GLX_SWAP_INT(&req->shareList);
|
|
|
|
return __glXCreateContextWithConfigSGIX(cl, pc);
|
|
}
|
|
|
|
int
|
|
__glXSwapQueryMaxSwapBarriersSGIX(__GLXclientState * cl, GLbyte * pc)
|
|
{
|
|
xGLXQueryMaxSwapBarriersSGIXReq *req =
|
|
(xGLXQueryMaxSwapBarriersSGIXReq *) pc;
|
|
__GLX_DECLARE_SWAP_VARIABLES;
|
|
|
|
__GLX_SWAP_SHORT(&req->length);
|
|
__GLX_SWAP_INT(&req->screen);
|
|
|
|
return __glXQueryMaxSwapBarriersSGIX(cl, pc);
|
|
}
|
|
|
|
int
|
|
__glXSwapBindSwapBarrierSGIX(__GLXclientState * cl, GLbyte * pc)
|
|
{
|
|
xGLXBindSwapBarrierSGIXReq *req = (xGLXBindSwapBarrierSGIXReq *) pc;
|
|
|
|
__GLX_DECLARE_SWAP_VARIABLES;
|
|
|
|
__GLX_SWAP_SHORT(&req->length);
|
|
__GLX_SWAP_INT(&req->drawable);
|
|
__GLX_SWAP_INT(&req->barrier);
|
|
|
|
return __glXBindSwapBarrierSGIX(cl, pc);
|
|
}
|
|
|
|
int
|
|
__glXSwapJoinSwapGroupSGIX(__GLXclientState * cl, GLbyte * pc)
|
|
{
|
|
xGLXJoinSwapGroupSGIXReq *req = (xGLXJoinSwapGroupSGIXReq *) pc;
|
|
|
|
__GLX_DECLARE_SWAP_VARIABLES;
|
|
|
|
__GLX_SWAP_SHORT(&req->length);
|
|
__GLX_SWAP_INT(&req->drawable);
|
|
__GLX_SWAP_INT(&req->member);
|
|
|
|
return __glXJoinSwapGroupSGIX(cl, pc);
|
|
}
|
|
|
|
int
|
|
__glXSwapDestroyContext(__GLXclientState * cl, GLbyte * pc)
|
|
{
|
|
xGLXDestroyContextReq *req = (xGLXDestroyContextReq *) pc;
|
|
|
|
__GLX_DECLARE_SWAP_VARIABLES;
|
|
|
|
__GLX_SWAP_SHORT(&req->length);
|
|
__GLX_SWAP_INT(&req->context);
|
|
|
|
return __glXDestroyContext(cl, pc);
|
|
}
|
|
|
|
int
|
|
__glXSwapMakeCurrent(__GLXclientState * cl, GLbyte * pc)
|
|
{
|
|
xGLXMakeCurrentReq *req = (xGLXMakeCurrentReq *) pc;
|
|
|
|
__GLX_DECLARE_SWAP_VARIABLES;
|
|
|
|
__GLX_SWAP_SHORT(&req->length);
|
|
__GLX_SWAP_INT(&req->drawable);
|
|
__GLX_SWAP_INT(&req->context);
|
|
__GLX_SWAP_INT(&req->oldContextTag);
|
|
|
|
return __glXMakeCurrent(cl, pc);
|
|
}
|
|
|
|
int
|
|
__glXSwapMakeContextCurrent(__GLXclientState * cl, GLbyte * pc)
|
|
{
|
|
xGLXMakeContextCurrentReq *req = (xGLXMakeContextCurrentReq *) pc;
|
|
|
|
__GLX_DECLARE_SWAP_VARIABLES;
|
|
|
|
__GLX_SWAP_SHORT(&req->length);
|
|
__GLX_SWAP_INT(&req->drawable);
|
|
__GLX_SWAP_INT(&req->readdrawable);
|
|
__GLX_SWAP_INT(&req->context);
|
|
__GLX_SWAP_INT(&req->oldContextTag);
|
|
|
|
return __glXMakeContextCurrent(cl, pc);
|
|
}
|
|
|
|
int
|
|
__glXSwapMakeCurrentReadSGI(__GLXclientState * cl, GLbyte * pc)
|
|
{
|
|
xGLXMakeCurrentReadSGIReq *req = (xGLXMakeCurrentReadSGIReq *) pc;
|
|
|
|
__GLX_DECLARE_SWAP_VARIABLES;
|
|
|
|
__GLX_SWAP_SHORT(&req->length);
|
|
__GLX_SWAP_INT(&req->drawable);
|
|
__GLX_SWAP_INT(&req->readable);
|
|
__GLX_SWAP_INT(&req->context);
|
|
__GLX_SWAP_INT(&req->oldContextTag);
|
|
|
|
return __glXMakeCurrentReadSGI(cl, pc);
|
|
}
|
|
|
|
int
|
|
__glXSwapIsDirect(__GLXclientState * cl, GLbyte * pc)
|
|
{
|
|
xGLXIsDirectReq *req = (xGLXIsDirectReq *) pc;
|
|
|
|
__GLX_DECLARE_SWAP_VARIABLES;
|
|
|
|
__GLX_SWAP_SHORT(&req->length);
|
|
__GLX_SWAP_INT(&req->context);
|
|
|
|
return __glXIsDirect(cl, pc);
|
|
}
|
|
|
|
int
|
|
__glXSwapQueryVersion(__GLXclientState * cl, GLbyte * pc)
|
|
{
|
|
xGLXQueryVersionReq *req = (xGLXQueryVersionReq *) pc;
|
|
|
|
__GLX_DECLARE_SWAP_VARIABLES;
|
|
|
|
__GLX_SWAP_SHORT(&req->length);
|
|
__GLX_SWAP_INT(&req->majorVersion);
|
|
__GLX_SWAP_INT(&req->minorVersion);
|
|
|
|
return __glXQueryVersion(cl, pc);
|
|
}
|
|
|
|
int
|
|
__glXSwapWaitGL(__GLXclientState * cl, GLbyte * pc)
|
|
{
|
|
xGLXWaitGLReq *req = (xGLXWaitGLReq *) pc;
|
|
|
|
__GLX_DECLARE_SWAP_VARIABLES;
|
|
|
|
__GLX_SWAP_SHORT(&req->length);
|
|
__GLX_SWAP_INT(&req->contextTag);
|
|
|
|
return __glXWaitGL(cl, pc);
|
|
}
|
|
|
|
int
|
|
__glXSwapWaitX(__GLXclientState * cl, GLbyte * pc)
|
|
{
|
|
xGLXWaitXReq *req = (xGLXWaitXReq *) pc;
|
|
|
|
__GLX_DECLARE_SWAP_VARIABLES;
|
|
|
|
__GLX_SWAP_SHORT(&req->length);
|
|
__GLX_SWAP_INT(&req->contextTag);
|
|
|
|
return __glXWaitX(cl, pc);
|
|
}
|
|
|
|
int
|
|
__glXSwapCopyContext(__GLXclientState * cl, GLbyte * pc)
|
|
{
|
|
xGLXCopyContextReq *req = (xGLXCopyContextReq *) pc;
|
|
|
|
__GLX_DECLARE_SWAP_VARIABLES;
|
|
|
|
__GLX_SWAP_SHORT(&req->length);
|
|
__GLX_SWAP_INT(&req->source);
|
|
__GLX_SWAP_INT(&req->dest);
|
|
__GLX_SWAP_INT(&req->mask);
|
|
|
|
return __glXCopyContext(cl, pc);
|
|
}
|
|
|
|
int
|
|
__glXSwapGetVisualConfigs(__GLXclientState * cl, GLbyte * pc)
|
|
{
|
|
ClientPtr client = cl->client;
|
|
xGLXGetVisualConfigsReq *req = (xGLXGetVisualConfigsReq *) pc;
|
|
xGLXGetVisualConfigsReply reply;
|
|
__GLXscreenInfo *pGlxScreen;
|
|
__GLXvisualConfig *pGlxVisual;
|
|
CARD32 buf[__GLX_TOTAL_CONFIG];
|
|
unsigned int screen;
|
|
int i, p;
|
|
|
|
__GLX_DECLARE_SWAP_VARIABLES;
|
|
__GLX_DECLARE_SWAP_ARRAY_VARIABLES;
|
|
|
|
__GLX_SWAP_INT(&req->screen);
|
|
screen = req->screen;
|
|
if (screen >= screenInfo.numScreens) {
|
|
/* The client library must send a valid screen number. */
|
|
client->errorValue = screen;
|
|
return BadValue;
|
|
}
|
|
pGlxScreen = &__glXActiveScreens[screen];
|
|
|
|
reply = (xGLXGetVisualConfigsReply) {
|
|
.type = X_Reply,
|
|
.sequenceNumber = client->sequence,
|
|
.length = (pGlxScreen->numGLXVisuals * __GLX_SIZE_CARD32 *
|
|
__GLX_TOTAL_CONFIG) >> 2,
|
|
.numVisuals = pGlxScreen->numGLXVisuals,
|
|
.numProps = __GLX_TOTAL_CONFIG
|
|
};
|
|
|
|
__GLX_SWAP_SHORT(&reply.sequenceNumber);
|
|
__GLX_SWAP_INT(&reply.length);
|
|
__GLX_SWAP_INT(&reply.numVisuals);
|
|
__GLX_SWAP_INT(&reply.numProps);
|
|
WriteToClient(client, sz_xGLXGetVisualConfigsReply, &reply);
|
|
|
|
for (i = 0; i < pGlxScreen->numVisuals; i++) {
|
|
pGlxVisual = &pGlxScreen->pGlxVisual[i];
|
|
if (!pGlxScreen->isGLXvis[i] || pGlxVisual->vid == 0) {
|
|
/* not a usable visual */
|
|
continue;
|
|
}
|
|
p = 0;
|
|
buf[p++] = pGlxVisual->vid;
|
|
buf[p++] = pGlxVisual->class;
|
|
buf[p++] = pGlxVisual->rgba;
|
|
|
|
buf[p++] = pGlxVisual->redSize;
|
|
buf[p++] = pGlxVisual->greenSize;
|
|
buf[p++] = pGlxVisual->blueSize;
|
|
buf[p++] = pGlxVisual->alphaSize;
|
|
buf[p++] = pGlxVisual->accumRedSize;
|
|
buf[p++] = pGlxVisual->accumGreenSize;
|
|
buf[p++] = pGlxVisual->accumBlueSize;
|
|
buf[p++] = pGlxVisual->accumAlphaSize;
|
|
|
|
buf[p++] = pGlxVisual->doubleBuffer;
|
|
buf[p++] = pGlxVisual->stereo;
|
|
|
|
buf[p++] = pGlxVisual->bufferSize;
|
|
buf[p++] = pGlxVisual->depthSize;
|
|
buf[p++] = pGlxVisual->stencilSize;
|
|
buf[p++] = pGlxVisual->auxBuffers;
|
|
buf[p++] = pGlxVisual->level;
|
|
/*
|
|
** Add token/value pairs for extensions.
|
|
*/
|
|
buf[p++] = GLX_VISUAL_CAVEAT_EXT;
|
|
buf[p++] = pGlxVisual->visualRating;
|
|
buf[p++] = GLX_TRANSPARENT_TYPE_EXT;
|
|
buf[p++] = pGlxVisual->transparentPixel;
|
|
buf[p++] = GLX_TRANSPARENT_RED_VALUE_EXT;
|
|
buf[p++] = pGlxVisual->transparentRed;
|
|
buf[p++] = GLX_TRANSPARENT_GREEN_VALUE_EXT;
|
|
buf[p++] = pGlxVisual->transparentGreen;
|
|
buf[p++] = GLX_TRANSPARENT_BLUE_VALUE_EXT;
|
|
buf[p++] = pGlxVisual->transparentBlue;
|
|
buf[p++] = GLX_TRANSPARENT_ALPHA_VALUE_EXT;
|
|
buf[p++] = pGlxVisual->transparentAlpha;
|
|
buf[p++] = GLX_TRANSPARENT_INDEX_VALUE_EXT;
|
|
buf[p++] = pGlxVisual->transparentIndex;
|
|
|
|
__GLX_SWAP_INT_ARRAY(buf, __GLX_TOTAL_CONFIG);
|
|
WriteToClient(client, __GLX_SIZE_CARD32 * __GLX_TOTAL_CONFIG, buf);
|
|
}
|
|
return Success;
|
|
}
|
|
|
|
int
|
|
__glXSwapCreateGLXPixmap(__GLXclientState * cl, GLbyte * pc)
|
|
{
|
|
xGLXCreateGLXPixmapReq *req = (xGLXCreateGLXPixmapReq *) pc;
|
|
|
|
__GLX_DECLARE_SWAP_VARIABLES;
|
|
|
|
__GLX_SWAP_SHORT(&req->length);
|
|
__GLX_SWAP_INT(&req->screen);
|
|
__GLX_SWAP_INT(&req->visual);
|
|
__GLX_SWAP_INT(&req->pixmap);
|
|
__GLX_SWAP_INT(&req->glxpixmap);
|
|
|
|
return __glXCreateGLXPixmap(cl, pc);
|
|
}
|
|
|
|
int
|
|
__glXSwapCreatePixmap(__GLXclientState * cl, GLbyte * pc)
|
|
{
|
|
xGLXCreatePixmapReq *req = (xGLXCreatePixmapReq *) pc;
|
|
|
|
__GLX_DECLARE_SWAP_VARIABLES;
|
|
|
|
__GLX_SWAP_SHORT(&req->length);
|
|
__GLX_SWAP_INT(&req->screen);
|
|
__GLX_SWAP_INT(&req->fbconfig);
|
|
__GLX_SWAP_INT(&req->pixmap);
|
|
__GLX_SWAP_INT(&req->glxpixmap);
|
|
__GLX_SWAP_INT(&req->numAttribs);
|
|
|
|
return __glXCreatePixmap(cl, pc);
|
|
}
|
|
|
|
int
|
|
__glXSwapDestroyGLXPixmap(__GLXclientState * cl, GLbyte * pc)
|
|
{
|
|
xGLXDestroyGLXPixmapReq *req = (xGLXDestroyGLXPixmapReq *) pc;
|
|
|
|
__GLX_DECLARE_SWAP_VARIABLES;
|
|
|
|
__GLX_SWAP_SHORT(&req->length);
|
|
__GLX_SWAP_INT(&req->glxpixmap);
|
|
|
|
return __glXDestroyGLXPixmap(cl, pc);
|
|
}
|
|
|
|
int
|
|
__glXSwapSwapBuffers(__GLXclientState * cl, GLbyte * pc)
|
|
{
|
|
xGLXSwapBuffersReq *req = (xGLXSwapBuffersReq *) pc;
|
|
|
|
__GLX_DECLARE_SWAP_VARIABLES;
|
|
|
|
__GLX_SWAP_SHORT(&req->length);
|
|
__GLX_SWAP_INT(&req->contextTag);
|
|
__GLX_SWAP_INT(&req->drawable);
|
|
|
|
return __glXSwapBuffers(cl, pc);
|
|
}
|
|
|
|
int
|
|
__glXSwapUseXFont(__GLXclientState * cl, GLbyte * pc)
|
|
{
|
|
xGLXUseXFontReq *req = (xGLXUseXFontReq *) pc;
|
|
|
|
__GLX_DECLARE_SWAP_VARIABLES;
|
|
|
|
__GLX_SWAP_SHORT(&req->length);
|
|
__GLX_SWAP_INT(&req->contextTag);
|
|
__GLX_SWAP_INT(&req->font);
|
|
__GLX_SWAP_INT(&req->first);
|
|
__GLX_SWAP_INT(&req->count);
|
|
__GLX_SWAP_INT(&req->listBase);
|
|
|
|
return __glXUseXFont(cl, pc);
|
|
}
|
|
|
|
int
|
|
__glXSwapQueryExtensionsString(__GLXclientState * cl, GLbyte * pc)
|
|
{
|
|
xGLXQueryExtensionsStringReq *req = NULL;
|
|
|
|
__GLX_DECLARE_SWAP_VARIABLES;
|
|
|
|
__GLX_SWAP_SHORT(&req->length);
|
|
__GLX_SWAP_INT(&req->screen);
|
|
|
|
return __glXQueryExtensionsString(cl, pc);
|
|
}
|
|
|
|
int
|
|
__glXSwapQueryServerString(__GLXclientState * cl, GLbyte * pc)
|
|
{
|
|
xGLXQueryServerStringReq *req = (xGLXQueryServerStringReq *) pc;
|
|
|
|
__GLX_DECLARE_SWAP_VARIABLES;
|
|
|
|
__GLX_SWAP_SHORT(&req->length);
|
|
__GLX_SWAP_INT(&req->screen);
|
|
__GLX_SWAP_INT(&req->name);
|
|
|
|
return __glXQueryServerString(cl, pc);
|
|
}
|
|
|
|
int
|
|
__glXSwapClientInfo(__GLXclientState * cl, GLbyte * pc)
|
|
{
|
|
xGLXClientInfoReq *req = (xGLXClientInfoReq *) pc;
|
|
|
|
__GLX_DECLARE_SWAP_VARIABLES;
|
|
|
|
__GLX_SWAP_SHORT(&req->length);
|
|
__GLX_SWAP_INT(&req->major);
|
|
__GLX_SWAP_INT(&req->minor);
|
|
__GLX_SWAP_INT(&req->numbytes);
|
|
|
|
return __glXClientInfo(cl, pc);
|
|
}
|
|
|
|
int
|
|
__glXSwapQueryContextInfoEXT(__GLXclientState * cl, char *pc)
|
|
{
|
|
xGLXQueryContextInfoEXTReq *req = (xGLXQueryContextInfoEXTReq *) pc;
|
|
|
|
__GLX_DECLARE_SWAP_VARIABLES;
|
|
|
|
__GLX_SWAP_SHORT(&req->length);
|
|
__GLX_SWAP_INT(&req->context);
|
|
|
|
return __glXQueryContextInfoEXT(cl, (GLbyte *) pc);
|
|
}
|
|
|
|
/************************************************************************/
|
|
|
|
/*
|
|
** Swap replies.
|
|
*/
|
|
|
|
void
|
|
__glXSwapMakeCurrentReply(ClientPtr client, xGLXMakeCurrentReadSGIReply * reply)
|
|
{
|
|
__GLX_DECLARE_SWAP_VARIABLES;
|
|
__GLX_SWAP_SHORT(&reply->sequenceNumber);
|
|
__GLX_SWAP_INT(&reply->length);
|
|
__GLX_SWAP_INT(&reply->contextTag);
|
|
__GLX_SWAP_INT(&reply->writeVid);
|
|
__GLX_SWAP_INT(&reply->writeType);
|
|
__GLX_SWAP_INT(&reply->readVid);
|
|
__GLX_SWAP_INT(&reply->readType);
|
|
WriteToClient(client, sz_xGLXMakeCurrentReadSGIReply, reply);
|
|
}
|
|
|
|
void
|
|
__glXSwapIsDirectReply(ClientPtr client, xGLXIsDirectReply * reply)
|
|
{
|
|
__GLX_DECLARE_SWAP_VARIABLES;
|
|
__GLX_SWAP_SHORT(&reply->sequenceNumber);
|
|
__GLX_SWAP_INT(&reply->length);
|
|
WriteToClient(client, sz_xGLXIsDirectReply, reply);
|
|
}
|
|
|
|
void
|
|
__glXSwapQueryVersionReply(ClientPtr client, xGLXQueryVersionReply * reply)
|
|
{
|
|
__GLX_DECLARE_SWAP_VARIABLES;
|
|
__GLX_SWAP_SHORT(&reply->sequenceNumber);
|
|
__GLX_SWAP_INT(&reply->length);
|
|
__GLX_SWAP_INT(&reply->majorVersion);
|
|
__GLX_SWAP_INT(&reply->minorVersion);
|
|
WriteToClient(client, sz_xGLXQueryVersionReply, reply);
|
|
}
|
|
|
|
void
|
|
glxSwapQueryExtensionsStringReply(ClientPtr client,
|
|
xGLXQueryExtensionsStringReply * reply,
|
|
char *buf)
|
|
{
|
|
int length = reply->length;
|
|
|
|
__GLX_DECLARE_SWAP_VARIABLES;
|
|
__GLX_DECLARE_SWAP_ARRAY_VARIABLES;
|
|
__GLX_SWAP_SHORT(&reply->sequenceNumber);
|
|
__GLX_SWAP_INT(&reply->length);
|
|
__GLX_SWAP_INT(&reply->n);
|
|
WriteToClient(client, sz_xGLXQueryExtensionsStringReply, reply);
|
|
__GLX_SWAP_INT_ARRAY((int *) buf, length);
|
|
WriteToClient(client, length << 2, buf);
|
|
}
|
|
|
|
void
|
|
glxSwapQueryServerStringReply(ClientPtr client,
|
|
xGLXQueryServerStringReply * reply, char *buf)
|
|
{
|
|
int length = reply->length;
|
|
|
|
__GLX_DECLARE_SWAP_VARIABLES;
|
|
__GLX_SWAP_SHORT(&reply->sequenceNumber);
|
|
__GLX_SWAP_INT(&reply->length);
|
|
__GLX_SWAP_INT(&reply->n);
|
|
WriteToClient(client, sz_xGLXQueryServerStringReply, reply);
|
|
/** no swap is needed for an array of chars **/
|
|
/* __GLX_SWAP_INT_ARRAY((int *)buf, length); */
|
|
WriteToClient(client, length << 2, buf);
|
|
}
|
|
|
|
void
|
|
__glXSwapQueryContextInfoEXTReply(ClientPtr client,
|
|
xGLXQueryContextInfoEXTReply * reply,
|
|
int *buf)
|
|
{
|
|
int length = reply->length;
|
|
|
|
__GLX_DECLARE_SWAP_VARIABLES;
|
|
__GLX_DECLARE_SWAP_ARRAY_VARIABLES;
|
|
__GLX_SWAP_SHORT(&reply->sequenceNumber);
|
|
__GLX_SWAP_INT(&reply->length);
|
|
__GLX_SWAP_INT(&reply->n);
|
|
WriteToClient(client, sz_xGLXQueryContextInfoEXTReply, reply);
|
|
__GLX_SWAP_INT_ARRAY((int *) buf, length);
|
|
WriteToClient(client, length << 2, buf);
|
|
}
|
|
|
|
void
|
|
__glXSwapQueryContextReply(ClientPtr client,
|
|
xGLXQueryContextReply * reply, int *buf)
|
|
{
|
|
int length = reply->length;
|
|
|
|
__GLX_DECLARE_SWAP_VARIABLES;
|
|
__GLX_DECLARE_SWAP_ARRAY_VARIABLES;
|
|
__GLX_SWAP_SHORT(&reply->sequenceNumber);
|
|
__GLX_SWAP_INT(&reply->length);
|
|
__GLX_SWAP_INT(&reply->n);
|
|
WriteToClient(client, sz_xGLXQueryContextReply, reply);
|
|
__GLX_SWAP_INT_ARRAY((int *) buf, length);
|
|
WriteToClient(client, length << 2, buf);
|
|
}
|
|
|
|
void
|
|
__glXSwapGetDrawableAttributesReply(ClientPtr client,
|
|
xGLXGetDrawableAttributesReply * reply,
|
|
int *buf)
|
|
{
|
|
__GLX_DECLARE_SWAP_VARIABLES;
|
|
__GLX_DECLARE_SWAP_ARRAY_VARIABLES;
|
|
__GLX_SWAP_SHORT(&reply->sequenceNumber);
|
|
__GLX_SWAP_INT(&reply->length);
|
|
__GLX_SWAP_INT(&reply->numAttribs);
|
|
__GLX_SWAP_INT_ARRAY(buf, reply->length);
|
|
WriteToClient(client, sz_xGLXGetDrawableAttributesReply, reply);
|
|
WriteToClient(client, reply->length << 2, buf);
|
|
}
|
|
|
|
void
|
|
__glXSwapQueryMaxSwapBarriersSGIXReply(ClientPtr client,
|
|
xGLXQueryMaxSwapBarriersSGIXReply *
|
|
reply)
|
|
{
|
|
__GLX_DECLARE_SWAP_VARIABLES;
|
|
__GLX_SWAP_SHORT(&reply->sequenceNumber);
|
|
__GLX_SWAP_INT(&reply->length);
|
|
__GLX_SWAP_INT(&reply->max);
|
|
WriteToClient(client, sz_xGLXQueryMaxSwapBarriersSGIXReply, reply);
|
|
}
|
|
|
|
/************************************************************************/
|
|
|
|
/*
|
|
** Render and Renderlarge are not in the GLX API. They are used by the GLX
|
|
** client library to send batches of GL rendering commands.
|
|
*/
|
|
|
|
int
|
|
__glXSwapRender(__GLXclientState * cl, GLbyte * pc)
|
|
{
|
|
xGLXRenderReq *req;
|
|
int left;
|
|
__GLXrenderHeader *hdr;
|
|
ClientPtr client = cl->client;
|
|
|
|
__GLX_DECLARE_SWAP_VARIABLES;
|
|
__GLX_DECLARE_SWAP_ARRAY_VARIABLES;
|
|
|
|
/*
|
|
** NOTE: much of this code also appears in the nonswapping version of this
|
|
** routine, __glXRender(). Any changes made here should also be
|
|
** duplicated there.
|
|
*/
|
|
|
|
req = (xGLXRenderReq *) pc;
|
|
__GLX_SWAP_SHORT(&req->length);
|
|
__GLX_SWAP_INT(&req->contextTag);
|
|
|
|
pc += sz_xGLXRenderReq;
|
|
left = (req->length << 2) - sz_xGLXRenderReq;
|
|
while (left > 0) {
|
|
void (*proc) (GLbyte *);
|
|
CARD16 opcode;
|
|
|
|
/*
|
|
** Verify that the header length and the overall length agree.
|
|
** Also, each command must be word aligned.
|
|
*/
|
|
hdr = (__GLXrenderHeader *) pc;
|
|
__GLX_SWAP_SHORT(&hdr->length);
|
|
__GLX_SWAP_SHORT(&hdr->opcode);
|
|
|
|
/*
|
|
* call the command procedure to swap any arguments
|
|
*/
|
|
opcode = hdr->opcode;
|
|
if ((opcode >= __GLX_MIN_RENDER_OPCODE) &&
|
|
(opcode <= __GLX_MAX_RENDER_OPCODE)) {
|
|
proc = __glXSwapRenderTable[opcode];
|
|
#if __GLX_MAX_RENDER_OPCODE_EXT > __GLX_MIN_RENDER_OPCODE_EXT
|
|
}
|
|
else if ((opcode >= __GLX_MIN_RENDER_OPCODE_EXT) &&
|
|
(opcode <= __GLX_MAX_RENDER_OPCODE_EXT)) {
|
|
int index = opcode - __GLX_MIN_RENDER_OPCODE_EXT;
|
|
__GLXRenderSwapInfo *info = &__glXSwapRenderTable_EXT[index];
|
|
|
|
if (info->swapfunc) {
|
|
proc = info->swapfunc;
|
|
}
|
|
else {
|
|
proc = NULL;
|
|
if (info->elem_size == 4 && info->nelems > 0) {
|
|
__GLX_SWAP_INT_ARRAY((int *) (pc + __GLX_RENDER_HDR_SIZE),
|
|
info->nelems);
|
|
}
|
|
else if (info->elem_size == 2 && info->nelems > 0) {
|
|
__GLX_SWAP_SHORT_ARRAY((short *) (pc +
|
|
__GLX_RENDER_HDR_SIZE),
|
|
info->nelems);
|
|
}
|
|
else if (info->elem_size == 8 && info->nelems > 0) {
|
|
__GLX_SWAP_DOUBLE_ARRAY((double *) (pc +
|
|
__GLX_RENDER_HDR_SIZE),
|
|
info->nelems);
|
|
}
|
|
}
|
|
#endif /* __GLX_MAX_RENDER_OPCODE_EXT > __GLX_MIN_RENDER_OPCODE_EXT */
|
|
}
|
|
else {
|
|
client->errorValue = 0;
|
|
return __glXBadRenderRequest;
|
|
}
|
|
|
|
if (proc != NULL)
|
|
(*proc) (pc + __GLX_RENDER_HDR_SIZE);
|
|
|
|
/*
|
|
* proceed to the next command
|
|
*/
|
|
pc += hdr->length;
|
|
left -= hdr->length;
|
|
}
|
|
|
|
return __glXRender(cl, (GLbyte *) req);
|
|
}
|
|
|
|
/*
|
|
** Execute a large rendering request (one that spans multiple X requests).
|
|
*/
|
|
int
|
|
__glXSwapRenderLarge(__GLXclientState * cl, GLbyte * pc)
|
|
{
|
|
ClientPtr client = cl->client;
|
|
xGLXRenderLargeReq *req;
|
|
__GLXrenderLargeHeader *hdr;
|
|
|
|
__GLX_DECLARE_SWAP_VARIABLES;
|
|
__GLX_DECLARE_SWAP_ARRAY_VARIABLES;
|
|
|
|
req = (xGLXRenderLargeReq *) pc;
|
|
__GLX_SWAP_SHORT(&req->length);
|
|
__GLX_SWAP_INT(&req->contextTag);
|
|
__GLX_SWAP_INT(&req->dataBytes);
|
|
__GLX_SWAP_SHORT(&req->requestNumber);
|
|
__GLX_SWAP_SHORT(&req->requestTotal);
|
|
|
|
pc += sz_xGLXRenderLargeReq;
|
|
|
|
if (req->requestNumber == 1) {
|
|
void (*proc) (GLbyte *) = NULL;
|
|
__GLXRenderSwapInfo *info = NULL;
|
|
CARD16 opcode;
|
|
|
|
hdr = (__GLXrenderLargeHeader *) pc;
|
|
__GLX_SWAP_INT(&hdr->length);
|
|
__GLX_SWAP_INT(&hdr->opcode);
|
|
|
|
/*
|
|
* call the command procedure to swap any arguments
|
|
* Note that we are assuming that all arguments that needs to be
|
|
* swaped are on the first req only !
|
|
*/
|
|
opcode = hdr->opcode;
|
|
if ((opcode >= __GLX_MIN_RENDER_OPCODE) &&
|
|
(opcode <= __GLX_MAX_RENDER_OPCODE)) {
|
|
proc = __glXSwapRenderTable[opcode];
|
|
#if __GLX_MAX_RENDER_OPCODE_EXT > __GLX_MIN_RENDER_OPCODE_EXT
|
|
}
|
|
else if ((opcode >= __GLX_MIN_RENDER_OPCODE_EXT) &&
|
|
(opcode <= __GLX_MAX_RENDER_OPCODE_EXT)) {
|
|
int index = opcode - __GLX_MIN_RENDER_OPCODE_EXT;
|
|
|
|
info = &__glXSwapRenderTable_EXT[index];
|
|
if (info->swapfunc) {
|
|
proc = info->swapfunc;
|
|
}
|
|
#endif /* __GLX_MAX_RENDER_OPCODE_EXT > __GLX_MIN_RENDER_OPCODE_EXT */
|
|
}
|
|
else {
|
|
client->errorValue = 0;
|
|
cl->largeCmdRequestsTotal = 0;
|
|
return __glXBadLargeRequest;
|
|
}
|
|
|
|
/*
|
|
** Make enough space in the buffer, then copy the entire request.
|
|
*/
|
|
if (cl->largeCmdBufSize < hdr->length) {
|
|
if (!cl->largeCmdBuf) {
|
|
cl->largeCmdBuf = (GLbyte *) malloc(hdr->length);
|
|
}
|
|
else {
|
|
cl->largeCmdBuf =
|
|
(GLbyte *) realloc(cl->largeCmdBuf, hdr->length);
|
|
}
|
|
if (!cl->largeCmdBuf) {
|
|
cl->largeCmdRequestsTotal = 0;
|
|
return BadAlloc;
|
|
}
|
|
cl->largeCmdBufSize = hdr->length;
|
|
}
|
|
memcpy(cl->largeCmdBuf, pc, req->dataBytes);
|
|
|
|
cl->largeCmdBytesSoFar = req->dataBytes;
|
|
cl->largeCmdBytesTotal = hdr->length;
|
|
cl->largeCmdRequestsSoFar = 1;
|
|
cl->largeCmdRequestsTotal = req->requestTotal;
|
|
cl->largeCmdRequestsSwapProc = proc;
|
|
cl->largeCmdMaxReqDataSize = req->dataBytes;
|
|
cl->largeCmdRequestsSwap_info = info;
|
|
|
|
return Success;
|
|
|
|
}
|
|
else if (req->requestNumber < cl->largeCmdRequestsTotal) {
|
|
/*
|
|
* This is not the first nor last request - just copy the data
|
|
*/
|
|
if (cl->largeCmdBytesSoFar + req->dataBytes > cl->largeCmdBytesTotal) {
|
|
cl->largeCmdRequestsTotal = 0;
|
|
return __glXBadLargeRequest;
|
|
}
|
|
|
|
memcpy(cl->largeCmdBuf + cl->largeCmdBytesSoFar, pc, req->dataBytes);
|
|
|
|
cl->largeCmdBytesSoFar += req->dataBytes;
|
|
|
|
if (req->dataBytes > cl->largeCmdMaxReqDataSize)
|
|
cl->largeCmdMaxReqDataSize = req->dataBytes;
|
|
|
|
return Success;
|
|
}
|
|
else if (req->requestNumber == cl->largeCmdRequestsTotal) {
|
|
/*
|
|
* this is the last request
|
|
* copy the remainder bytes, call the procedure to swap any
|
|
* needed data, and then call to transfer the command to all
|
|
* back-end servers
|
|
*/
|
|
if (cl->largeCmdBytesSoFar + req->dataBytes > cl->largeCmdBytesTotal) {
|
|
cl->largeCmdRequestsTotal = 0;
|
|
return __glXBadLargeRequest;
|
|
}
|
|
|
|
memcpy(cl->largeCmdBuf + cl->largeCmdBytesSoFar, pc, req->dataBytes);
|
|
|
|
cl->largeCmdBytesSoFar += req->dataBytes;
|
|
|
|
if (req->dataBytes > cl->largeCmdMaxReqDataSize)
|
|
cl->largeCmdMaxReqDataSize = req->dataBytes;
|
|
|
|
if (cl->largeCmdRequestsSwapProc != NULL) {
|
|
(*cl->largeCmdRequestsSwapProc) (cl->largeCmdBuf +
|
|
__GLX_RENDER_LARGE_HDR_SIZE);
|
|
}
|
|
else if (cl->largeCmdRequestsSwap_info &&
|
|
cl->largeCmdRequestsSwap_info->nelems > 0) {
|
|
if (cl->largeCmdRequestsSwap_info->elem_size == 4) {
|
|
__GLX_SWAP_INT_ARRAY((int *) (pc + __GLX_RENDER_LARGE_HDR_SIZE),
|
|
cl->largeCmdRequestsSwap_info->nelems);
|
|
}
|
|
else if (cl->largeCmdRequestsSwap_info->elem_size == 2) {
|
|
__GLX_SWAP_SHORT_ARRAY((short *) (pc +
|
|
__GLX_RENDER_LARGE_HDR_SIZE),
|
|
cl->largeCmdRequestsSwap_info->nelems);
|
|
}
|
|
else if (cl->largeCmdRequestsSwap_info->elem_size == 8) {
|
|
__GLX_SWAP_DOUBLE_ARRAY((double *) (pc +
|
|
__GLX_RENDER_LARGE_HDR_SIZE),
|
|
cl->largeCmdRequestsSwap_info->nelems);
|
|
}
|
|
}
|
|
|
|
cl->largeCmdRequestsTotal = 0;
|
|
return (__glXSendLargeCommand(cl, req->contextTag));
|
|
|
|
}
|
|
else {
|
|
cl->largeCmdRequestsTotal = 0;
|
|
return __glXBadLargeRequest;
|
|
}
|
|
|
|
}
|
|
|
|
/************************************************************************/
|
|
|
|
/*
|
|
** No support is provided for the vendor-private requests other than
|
|
** allocating these entry points in the dispatch table.
|
|
*/
|
|
|
|
int
|
|
__glXSwapVendorPrivate(__GLXclientState * cl, GLbyte * pc)
|
|
{
|
|
xGLXVendorPrivateReq *req;
|
|
CARD32 vendorCode;
|
|
|
|
__GLX_DECLARE_SWAP_VARIABLES;
|
|
|
|
req = (xGLXVendorPrivateReq *) pc;
|
|
vendorCode = req->vendorCode;
|
|
__GLX_SWAP_INT(&vendorCode);
|
|
|
|
switch (vendorCode) {
|
|
|
|
case X_GLvop_DeleteTexturesEXT:
|
|
return __glXVForwardSingleReqSwap(cl, pc);
|
|
break;
|
|
|
|
case X_GLXvop_SwapIntervalSGI:
|
|
if (glxIsExtensionSupported("SGI_swap_control")) {
|
|
return __glXVForwardSingleReqSwap(cl, pc);
|
|
}
|
|
else {
|
|
return Success;
|
|
}
|
|
break;
|
|
|
|
#if 0 /* glx 1.3 */
|
|
case X_GLXvop_CreateGLXVideoSourceSGIX:
|
|
break;
|
|
case X_GLXvop_DestroyGLXVideoSourceSGIX:
|
|
break;
|
|
case X_GLXvop_CreateGLXPixmapWithConfigSGIX:
|
|
break;
|
|
case X_GLXvop_DestroyGLXPbufferSGIX:
|
|
break;
|
|
case X_GLXvop_ChangeDrawableAttributesSGIX:
|
|
break;
|
|
#endif
|
|
|
|
case X_GLXvop_JoinSwapGroupSGIX:
|
|
return __glXSwapJoinSwapGroupSGIX(cl, pc);
|
|
break;
|
|
|
|
case X_GLXvop_BindSwapBarrierSGIX:
|
|
return __glXSwapBindSwapBarrierSGIX(cl, pc);
|
|
break;
|
|
|
|
case X_GLXvop_CreateContextWithConfigSGIX:
|
|
return __glXSwapCreateContextWithConfigSGIX(cl, pc);
|
|
break;
|
|
|
|
default:
|
|
/*
|
|
** unsupported private request
|
|
*/
|
|
cl->client->errorValue = req->vendorCode;
|
|
return __glXUnsupportedPrivateRequest;
|
|
}
|
|
|
|
}
|
|
|
|
int
|
|
__glXSwapVendorPrivateWithReply(__GLXclientState * cl, GLbyte * pc)
|
|
{
|
|
xGLXVendorPrivateWithReplyReq *req;
|
|
CARD32 vendorCode;
|
|
|
|
__GLX_DECLARE_SWAP_VARIABLES;
|
|
|
|
req = (xGLXVendorPrivateWithReplyReq *) pc;
|
|
vendorCode = req->vendorCode;
|
|
__GLX_SWAP_INT(&vendorCode);
|
|
|
|
switch (vendorCode) {
|
|
|
|
case X_GLvop_GetConvolutionFilterEXT:
|
|
case X_GLvop_GetSeparableFilterEXT:
|
|
case X_GLvop_GetHistogramEXT:
|
|
case X_GLvop_GetMinmaxEXT:
|
|
return (__glXNoSuchSingleOpcode(cl, pc));
|
|
break;
|
|
|
|
case X_GLvop_GetConvolutionParameterfvEXT:
|
|
case X_GLvop_GetConvolutionParameterivEXT:
|
|
case X_GLvop_GetHistogramParameterivEXT:
|
|
case X_GLvop_GetMinmaxParameterfvEXT:
|
|
case X_GLvop_GetMinmaxParameterivEXT:
|
|
case X_GLvop_GenTexturesEXT:
|
|
return (__glXVForwardAllWithReplySwapiv(cl, pc));
|
|
break;
|
|
|
|
case X_GLvop_AreTexturesResidentEXT:
|
|
case X_GLvop_IsTextureEXT:
|
|
return (__glXVForwardPipe0WithReplySwap(cl, pc));
|
|
break;
|
|
|
|
#if 0 /* glx1.3 */
|
|
case X_GLvop_GetDetailTexFuncSGIS:
|
|
case X_GLvop_GetSharpenTexFuncSGIS:
|
|
case X_GLvop_GetColorTableSGI:
|
|
case X_GLvop_GetColorTableParameterfvSGI:
|
|
case X_GLvop_GetColorTableParameterivSGI:
|
|
case X_GLvop_GetTexFilterFuncSGIS:
|
|
case X_GLvop_GetInstrumentsSGIX:
|
|
case X_GLvop_InstrumentsBufferSGIX:
|
|
case X_GLvop_PollInstrumentsSGIX:
|
|
case X_GLvop_FlushRasterSGIX:
|
|
case X_GLXvop_CreateGLXPbufferSGIX:
|
|
case X_GLXvop_GetDrawableAttributesSGIX:
|
|
case X_GLXvop_QueryHyperpipeNetworkSGIX:
|
|
case X_GLXvop_QueryHyperpipeConfigSGIX:
|
|
case X_GLXvop_HyperpipeConfigSGIX:
|
|
case X_GLXvop_DestroyHyperpipeConfigSGIX:
|
|
#endif
|
|
case X_GLXvop_QueryMaxSwapBarriersSGIX:
|
|
return (__glXSwapQueryMaxSwapBarriersSGIX(cl, pc));
|
|
break;
|
|
|
|
case X_GLXvop_GetFBConfigsSGIX:
|
|
return (__glXSwapGetFBConfigsSGIX(cl, pc));
|
|
break;
|
|
|
|
case X_GLXvop_MakeCurrentReadSGI:
|
|
return (__glXSwapMakeCurrentReadSGI(cl, pc));
|
|
break;
|
|
|
|
case X_GLXvop_QueryContextInfoEXT:
|
|
return (__glXSwapQueryContextInfoEXT(cl, (char *) pc));
|
|
break;
|
|
|
|
default:
|
|
/*
|
|
** unsupported private request
|
|
*/
|
|
cl->client->errorValue = req->vendorCode;
|
|
return __glXUnsupportedPrivateRequest;
|
|
}
|
|
|
|
}
|
|
|
|
int
|
|
__glXSwapGetFBConfigs(__GLXclientState * cl, GLbyte * pc)
|
|
{
|
|
xGLXGetFBConfigsReq *req = (xGLXGetFBConfigsReq *) pc;
|
|
|
|
__GLX_DECLARE_SWAP_VARIABLES;
|
|
|
|
__GLX_SWAP_SHORT(&req->length);
|
|
__GLX_SWAP_INT(&req->screen);
|
|
|
|
return __glXGetFBConfigs(cl, pc);
|
|
}
|
|
|
|
int
|
|
__glXSwapGetFBConfigsSGIX(__GLXclientState * cl, GLbyte * pc)
|
|
{
|
|
xGLXGetFBConfigsSGIXReq *req = (xGLXGetFBConfigsSGIXReq *) pc;
|
|
xGLXGetFBConfigsReq new_req;
|
|
|
|
new_req.reqType = req->reqType;
|
|
new_req.glxCode = req->glxCode;
|
|
new_req.length = req->length;
|
|
new_req.screen = req->screen;
|
|
|
|
return (__glXSwapGetFBConfigs(cl, (GLbyte *) &new_req));
|
|
}
|
|
|
|
int
|
|
__glXSwapCreateWindow(__GLXclientState * cl, GLbyte * pc)
|
|
{
|
|
xGLXCreateWindowReq *req = (xGLXCreateWindowReq *) pc;
|
|
|
|
__GLX_DECLARE_SWAP_VARIABLES;
|
|
|
|
__GLX_SWAP_SHORT(&req->length);
|
|
__GLX_SWAP_INT(&req->screen);
|
|
__GLX_SWAP_INT(&req->fbconfig);
|
|
__GLX_SWAP_INT(&req->window);
|
|
__GLX_SWAP_INT(&req->glxwindow);
|
|
__GLX_SWAP_INT(&req->numAttribs);
|
|
|
|
return (__glXCreateWindow(cl, (GLbyte *) pc));
|
|
}
|
|
|
|
int
|
|
__glXSwapDestroyWindow(__GLXclientState * cl, GLbyte * pc)
|
|
{
|
|
xGLXDestroyWindowReq *req = (xGLXDestroyWindowReq *) pc;
|
|
|
|
__GLX_DECLARE_SWAP_VARIABLES;
|
|
|
|
__GLX_SWAP_SHORT(&req->length);
|
|
__GLX_SWAP_INT(&req->glxwindow);
|
|
|
|
return (__glXDestroyWindow(cl, (GLbyte *) pc));
|
|
}
|
|
|
|
int
|
|
__glXSwapQueryContext(__GLXclientState * cl, GLbyte * pc)
|
|
{
|
|
xGLXQueryContextReq *req = (xGLXQueryContextReq *) pc;
|
|
|
|
__GLX_DECLARE_SWAP_VARIABLES;
|
|
|
|
__GLX_SWAP_SHORT(&req->length);
|
|
__GLX_SWAP_INT(&req->context);
|
|
|
|
return (__glXQueryContext(cl, (GLbyte *) pc));
|
|
|
|
}
|
|
|
|
int
|
|
__glXSwapCreatePbuffer(__GLXclientState * cl, GLbyte * pc)
|
|
{
|
|
xGLXCreatePbufferReq *req = (xGLXCreatePbufferReq *) pc;
|
|
int nattr = req->numAttribs;
|
|
|
|
__GLX_DECLARE_SWAP_VARIABLES;
|
|
__GLX_DECLARE_SWAP_ARRAY_VARIABLES;
|
|
|
|
__GLX_SWAP_SHORT(&req->length);
|
|
__GLX_SWAP_INT(&req->screen);
|
|
__GLX_SWAP_INT(&req->fbconfig);
|
|
__GLX_SWAP_INT(&req->pbuffer);
|
|
__GLX_SWAP_INT(&req->numAttribs);
|
|
__GLX_SWAP_INT_ARRAY((int *) (req + 1), nattr * 2);
|
|
|
|
return (__glXCreatePbuffer(cl, pc));
|
|
}
|
|
|
|
int
|
|
__glXSwapDestroyPbuffer(__GLXclientState * cl, GLbyte * pc)
|
|
{
|
|
xGLXDestroyPbufferReq *req = (xGLXDestroyPbufferReq *) pc;
|
|
|
|
__GLX_DECLARE_SWAP_VARIABLES;
|
|
|
|
__GLX_SWAP_SHORT(&req->length);
|
|
__GLX_SWAP_INT(&req->pbuffer);
|
|
|
|
return (__glXDestroyPbuffer(cl, (GLbyte *) pc));
|
|
}
|
|
|
|
int
|
|
__glXSwapGetDrawableAttributes(__GLXclientState * cl, GLbyte * pc)
|
|
{
|
|
xGLXGetDrawableAttributesReq *req = (xGLXGetDrawableAttributesReq *) pc;
|
|
|
|
__GLX_DECLARE_SWAP_VARIABLES;
|
|
|
|
__GLX_SWAP_SHORT(&req->length);
|
|
__GLX_SWAP_INT(&req->drawable);
|
|
|
|
return (__glXGetDrawableAttributes(cl, pc));
|
|
}
|
|
|
|
int
|
|
__glXSwapChangeDrawableAttributes(__GLXclientState * cl, GLbyte * pc)
|
|
{
|
|
xGLXChangeDrawableAttributesReq *req =
|
|
(xGLXChangeDrawableAttributesReq *) pc;
|
|
__GLX_DECLARE_SWAP_VARIABLES;
|
|
__GLX_DECLARE_SWAP_ARRAY_VARIABLES;
|
|
|
|
__GLX_SWAP_SHORT(&req->length);
|
|
__GLX_SWAP_INT(&req->drawable);
|
|
__GLX_SWAP_INT(&req->numAttribs);
|
|
__GLX_SWAP_INT_ARRAY((int *) (req + 1), req->numAttribs * 2);
|
|
|
|
return (__glXChangeDrawableAttributes(cl, pc));
|
|
}
|