singlepixswap.c revision 4642e01f
14642e01fSmrg/*
24642e01fSmrg * SGI FREE SOFTWARE LICENSE B (Version 2.0, Sept. 18, 2008)
34642e01fSmrg * Copyright (C) 1991-2000 Silicon Graphics, Inc. All Rights Reserved.
44642e01fSmrg *
54642e01fSmrg * Permission is hereby granted, free of charge, to any person obtaining a
64642e01fSmrg * copy of this software and associated documentation files (the "Software"),
74642e01fSmrg * to deal in the Software without restriction, including without limitation
84642e01fSmrg * the rights to use, copy, modify, merge, publish, distribute, sublicense,
94642e01fSmrg * and/or sell copies of the Software, and to permit persons to whom the
104642e01fSmrg * Software is furnished to do so, subject to the following conditions:
114642e01fSmrg *
124642e01fSmrg * The above copyright notice including the dates of first publication and
134642e01fSmrg * either this permission notice or a reference to
144642e01fSmrg * http://oss.sgi.com/projects/FreeB/
154642e01fSmrg * shall be included in all copies or substantial portions of the Software.
164642e01fSmrg *
174642e01fSmrg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
184642e01fSmrg * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
194642e01fSmrg * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
204642e01fSmrg * SILICON GRAPHICS, INC. BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
214642e01fSmrg * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
224642e01fSmrg * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
234642e01fSmrg * SOFTWARE.
244642e01fSmrg *
254642e01fSmrg * Except as contained in this notice, the name of Silicon Graphics, Inc.
264642e01fSmrg * shall not be used in advertising or otherwise to promote the sale, use or
274642e01fSmrg * other dealings in this Software without prior written authorization from
284642e01fSmrg * Silicon Graphics, Inc.
294642e01fSmrg */
304642e01fSmrg
314642e01fSmrg#define NEED_REPLIES
324642e01fSmrg#ifdef HAVE_DIX_CONFIG_H
334642e01fSmrg#include <dix-config.h>
344642e01fSmrg#endif
354642e01fSmrg
364642e01fSmrg#include "glxserver.h"
374642e01fSmrg#include "glxext.h"
384642e01fSmrg#include "singlesize.h"
394642e01fSmrg#include "unpack.h"
404642e01fSmrg#include "indirect_dispatch.h"
414642e01fSmrg#include "indirect_size_get.h"
424642e01fSmrg#include "glapitable.h"
434642e01fSmrg#include "glapi.h"
444642e01fSmrg#include "glthread.h"
454642e01fSmrg#include "dispatch.h"
464642e01fSmrg
474642e01fSmrgint __glXDispSwap_ReadPixels(__GLXclientState *cl, GLbyte *pc)
484642e01fSmrg{
494642e01fSmrg    GLsizei width, height;
504642e01fSmrg    GLenum format, type;
514642e01fSmrg    GLboolean swapBytes, lsbFirst;
524642e01fSmrg    GLint compsize;
534642e01fSmrg    __GLX_DECLARE_SWAP_VARIABLES;
544642e01fSmrg    __GLXcontext *cx;
554642e01fSmrg    ClientPtr client = cl->client;
564642e01fSmrg    int error;
574642e01fSmrg    char *answer, answerBuffer[200];
584642e01fSmrg
594642e01fSmrg    __GLX_SWAP_INT(&((xGLXSingleReq *)pc)->contextTag);
604642e01fSmrg    cx = __glXForceCurrent(cl, __GLX_GET_SINGLE_CONTEXT_TAG(pc), &error);
614642e01fSmrg    if (!cx) {
624642e01fSmrg	return error;
634642e01fSmrg    }
644642e01fSmrg
654642e01fSmrg    pc += __GLX_SINGLE_HDR_SIZE;
664642e01fSmrg    __GLX_SWAP_INT(pc+0);
674642e01fSmrg    __GLX_SWAP_INT(pc+4);
684642e01fSmrg    __GLX_SWAP_INT(pc+8);
694642e01fSmrg    __GLX_SWAP_INT(pc+12);
704642e01fSmrg    __GLX_SWAP_INT(pc+16);
714642e01fSmrg    __GLX_SWAP_INT(pc+20);
724642e01fSmrg
734642e01fSmrg    width = *(GLsizei *)(pc + 8);
744642e01fSmrg    height = *(GLsizei *)(pc + 12);
754642e01fSmrg    format = *(GLenum *)(pc + 16);
764642e01fSmrg    type = *(GLenum *)(pc + 20);
774642e01fSmrg    swapBytes = *(GLboolean *)(pc + 24);
784642e01fSmrg    lsbFirst = *(GLboolean *)(pc + 25);
794642e01fSmrg    compsize = __glReadPixels_size(format,type,width,height);
804642e01fSmrg    if (compsize < 0) compsize = 0;
814642e01fSmrg
824642e01fSmrg    CALL_PixelStorei( GET_DISPATCH(), (GL_PACK_SWAP_BYTES, !swapBytes) );
834642e01fSmrg    CALL_PixelStorei( GET_DISPATCH(), (GL_PACK_LSB_FIRST, lsbFirst) );
844642e01fSmrg    __GLX_GET_ANSWER_BUFFER(answer,cl,compsize,1);
854642e01fSmrg    __glXClearErrorOccured();
864642e01fSmrg    CALL_ReadPixels( GET_DISPATCH(),
874642e01fSmrg		 (*(GLint    *)(pc + 0),
884642e01fSmrg		 *(GLint    *)(pc + 4),
894642e01fSmrg		 *(GLsizei  *)(pc + 8),
904642e01fSmrg		 *(GLsizei  *)(pc + 12),
914642e01fSmrg		 *(GLenum   *)(pc + 16),
924642e01fSmrg		 *(GLenum   *)(pc + 20),
934642e01fSmrg		 answer)
944642e01fSmrg		 );
954642e01fSmrg
964642e01fSmrg    if (__glXErrorOccured()) {
974642e01fSmrg	__GLX_BEGIN_REPLY(0);
984642e01fSmrg	__GLX_SWAP_REPLY_HEADER();
994642e01fSmrg	__GLX_SEND_HEADER();
1004642e01fSmrg    } else {
1014642e01fSmrg	__GLX_BEGIN_REPLY(compsize);
1024642e01fSmrg	__GLX_SWAP_REPLY_HEADER();
1034642e01fSmrg	__GLX_SEND_HEADER();
1044642e01fSmrg	__GLX_SEND_VOID_ARRAY(compsize);
1054642e01fSmrg    }
1064642e01fSmrg    return Success;
1074642e01fSmrg}
1084642e01fSmrg
1094642e01fSmrgint __glXDispSwap_GetTexImage(__GLXclientState *cl, GLbyte *pc)
1104642e01fSmrg{
1114642e01fSmrg    GLint level, compsize;
1124642e01fSmrg    GLenum format, type, target;
1134642e01fSmrg    GLboolean swapBytes;
1144642e01fSmrg    __GLX_DECLARE_SWAP_VARIABLES;
1154642e01fSmrg    __GLXcontext *cx;
1164642e01fSmrg    ClientPtr client = cl->client;
1174642e01fSmrg    int error;
1184642e01fSmrg    char *answer, answerBuffer[200];
1194642e01fSmrg    GLint width=0, height=0, depth=1;
1204642e01fSmrg
1214642e01fSmrg    __GLX_SWAP_INT(&((xGLXSingleReq *)pc)->contextTag);
1224642e01fSmrg    cx = __glXForceCurrent(cl, __GLX_GET_SINGLE_CONTEXT_TAG(pc), &error);
1234642e01fSmrg    if (!cx) {
1244642e01fSmrg	return error;
1254642e01fSmrg    }
1264642e01fSmrg
1274642e01fSmrg    pc += __GLX_SINGLE_HDR_SIZE;
1284642e01fSmrg    __GLX_SWAP_INT(pc+0);
1294642e01fSmrg    __GLX_SWAP_INT(pc+4);
1304642e01fSmrg    __GLX_SWAP_INT(pc+8);
1314642e01fSmrg    __GLX_SWAP_INT(pc+12);
1324642e01fSmrg
1334642e01fSmrg    level = *(GLint *)(pc + 4);
1344642e01fSmrg    format = *(GLenum *)(pc + 8);
1354642e01fSmrg    type = *(GLenum *)(pc + 12);
1364642e01fSmrg    target = *(GLenum *)(pc + 0);
1374642e01fSmrg    swapBytes = *(GLboolean *)(pc + 16);
1384642e01fSmrg
1394642e01fSmrg    CALL_GetTexLevelParameteriv( GET_DISPATCH(), (target, level, GL_TEXTURE_WIDTH, &width) );
1404642e01fSmrg    CALL_GetTexLevelParameteriv( GET_DISPATCH(), (target, level, GL_TEXTURE_HEIGHT, &height) );
1414642e01fSmrg    if ( target == GL_TEXTURE_3D) {
1424642e01fSmrg	CALL_GetTexLevelParameteriv( GET_DISPATCH(), (target, level, GL_TEXTURE_DEPTH, &depth) );
1434642e01fSmrg    }
1444642e01fSmrg    /*
1454642e01fSmrg     * The three queries above might fail if we're in a state where queries
1464642e01fSmrg     * are illegal, but then width, height, and depth would still be zero anyway.
1474642e01fSmrg     */
1484642e01fSmrg    compsize = __glGetTexImage_size(target,level,format,type,width,height,depth);
1494642e01fSmrg    if (compsize < 0) compsize = 0;
1504642e01fSmrg
1514642e01fSmrg    CALL_PixelStorei( GET_DISPATCH(), (GL_PACK_SWAP_BYTES, !swapBytes) );
1524642e01fSmrg    __GLX_GET_ANSWER_BUFFER(answer,cl,compsize,1);
1534642e01fSmrg    __glXClearErrorOccured();
1544642e01fSmrg    CALL_GetTexImage( GET_DISPATCH(), (
1554642e01fSmrg		  *(GLenum   *)(pc + 0),
1564642e01fSmrg		  *(GLint    *)(pc + 4),
1574642e01fSmrg		  *(GLenum   *)(pc + 8),
1584642e01fSmrg		  *(GLenum   *)(pc + 12),
1594642e01fSmrg		  answer
1604642e01fSmrg		  ) );
1614642e01fSmrg
1624642e01fSmrg    if (__glXErrorOccured()) {
1634642e01fSmrg	__GLX_BEGIN_REPLY(0);
1644642e01fSmrg	__GLX_SWAP_REPLY_HEADER();
1654642e01fSmrg	__GLX_SEND_HEADER();
1664642e01fSmrg    } else {
1674642e01fSmrg	__GLX_BEGIN_REPLY(compsize);
1684642e01fSmrg	__GLX_SWAP_REPLY_HEADER();
1694642e01fSmrg	__GLX_SWAP_INT(&width);
1704642e01fSmrg	__GLX_SWAP_INT(&height);
1714642e01fSmrg	__GLX_SWAP_INT(&depth);
1724642e01fSmrg	((xGLXGetTexImageReply *)&__glXReply)->width = width;
1734642e01fSmrg	((xGLXGetTexImageReply *)&__glXReply)->height = height;
1744642e01fSmrg	((xGLXGetTexImageReply *)&__glXReply)->depth = depth;
1754642e01fSmrg	__GLX_SEND_HEADER();
1764642e01fSmrg	__GLX_SEND_VOID_ARRAY(compsize);
1774642e01fSmrg    }
1784642e01fSmrg    return Success;
1794642e01fSmrg}
1804642e01fSmrg
1814642e01fSmrgint __glXDispSwap_GetPolygonStipple(__GLXclientState *cl, GLbyte *pc)
1824642e01fSmrg{
1834642e01fSmrg    GLboolean lsbFirst;
1844642e01fSmrg    __GLXcontext *cx;
1854642e01fSmrg    ClientPtr client = cl->client;
1864642e01fSmrg    int error;
1874642e01fSmrg    GLubyte answerBuffer[200];
1884642e01fSmrg    char *answer;
1894642e01fSmrg    __GLX_DECLARE_SWAP_VARIABLES;
1904642e01fSmrg
1914642e01fSmrg    __GLX_SWAP_INT(&((xGLXSingleReq *)pc)->contextTag);
1924642e01fSmrg    cx = __glXForceCurrent(cl, __GLX_GET_SINGLE_CONTEXT_TAG(pc), &error);
1934642e01fSmrg    if (!cx) {
1944642e01fSmrg	return error;
1954642e01fSmrg    }
1964642e01fSmrg    pc += __GLX_SINGLE_HDR_SIZE;
1974642e01fSmrg    lsbFirst = *(GLboolean *)(pc + 0);
1984642e01fSmrg
1994642e01fSmrg    CALL_PixelStorei( GET_DISPATCH(), (GL_PACK_LSB_FIRST, lsbFirst) );
2004642e01fSmrg    __GLX_GET_ANSWER_BUFFER(answer,cl,128,1);
2014642e01fSmrg
2024642e01fSmrg    __glXClearErrorOccured();
2034642e01fSmrg    CALL_GetPolygonStipple( GET_DISPATCH(), ((GLubyte  *) answer) );
2044642e01fSmrg    if (__glXErrorOccured()) {
2054642e01fSmrg	__GLX_BEGIN_REPLY(0);
2064642e01fSmrg	__GLX_SWAP_REPLY_HEADER();
2074642e01fSmrg	__GLX_SEND_HEADER();
2084642e01fSmrg    } else {
2094642e01fSmrg	__GLX_BEGIN_REPLY(128);
2104642e01fSmrg	__GLX_SWAP_REPLY_HEADER();
2114642e01fSmrg	__GLX_SEND_HEADER();
2124642e01fSmrg	__GLX_SEND_BYTE_ARRAY(128);
2134642e01fSmrg    }
2144642e01fSmrg    return Success;
2154642e01fSmrg}
2164642e01fSmrg
2174642e01fSmrgstatic int GetSeparableFilter(__GLXclientState *cl, GLbyte *pc, GLXContextTag tag)
2184642e01fSmrg{
2194642e01fSmrg    GLint compsize, compsize2;
2204642e01fSmrg    GLenum format, type, target;
2214642e01fSmrg    GLboolean swapBytes;
2224642e01fSmrg    __GLXcontext *cx;
2234642e01fSmrg    ClientPtr client = cl->client;
2244642e01fSmrg    int error;
2254642e01fSmrg    __GLX_DECLARE_SWAP_VARIABLES;
2264642e01fSmrg    char *answer, answerBuffer[200];
2274642e01fSmrg    GLint width=0, height=0;
2284642e01fSmrg
2294642e01fSmrg    cx = __glXForceCurrent(cl, tag, &error);
2304642e01fSmrg    if (!cx) {
2314642e01fSmrg	return error;
2324642e01fSmrg    }
2334642e01fSmrg
2344642e01fSmrg    __GLX_SWAP_INT(pc+0);
2354642e01fSmrg    __GLX_SWAP_INT(pc+4);
2364642e01fSmrg    __GLX_SWAP_INT(pc+8);
2374642e01fSmrg
2384642e01fSmrg    format = *(GLenum *)(pc + 4);
2394642e01fSmrg    type = *(GLenum *)(pc + 8);
2404642e01fSmrg    target = *(GLenum *)(pc + 0);
2414642e01fSmrg    swapBytes = *(GLboolean *)(pc + 12);
2424642e01fSmrg
2434642e01fSmrg    /* target must be SEPARABLE_2D, however I guess we can let the GL
2444642e01fSmrg       barf on this one.... */
2454642e01fSmrg
2464642e01fSmrg    CALL_GetConvolutionParameteriv( GET_DISPATCH(), (target, GL_CONVOLUTION_WIDTH, &width) );
2474642e01fSmrg    CALL_GetConvolutionParameteriv( GET_DISPATCH(), (target, GL_CONVOLUTION_HEIGHT, &height) );
2484642e01fSmrg    /*
2494642e01fSmrg     * The two queries above might fail if we're in a state where queries
2504642e01fSmrg     * are illegal, but then width and height would still be zero anyway.
2514642e01fSmrg     */
2524642e01fSmrg    compsize = __glGetTexImage_size(target,1,format,type,width,1,1);
2534642e01fSmrg    compsize2 = __glGetTexImage_size(target,1,format,type,height,1,1);
2544642e01fSmrg
2554642e01fSmrg    if (compsize < 0) compsize = 0;
2564642e01fSmrg    if (compsize2 < 0) compsize2 = 0;
2574642e01fSmrg    compsize = __GLX_PAD(compsize);
2584642e01fSmrg    compsize2 = __GLX_PAD(compsize2);
2594642e01fSmrg
2604642e01fSmrg    CALL_PixelStorei( GET_DISPATCH(), (GL_PACK_SWAP_BYTES, !swapBytes) );
2614642e01fSmrg    __GLX_GET_ANSWER_BUFFER(answer,cl,compsize + compsize2,1);
2624642e01fSmrg    __glXClearErrorOccured();
2634642e01fSmrg    CALL_GetSeparableFilter( GET_DISPATCH(), (
2644642e01fSmrg		  *(GLenum   *)(pc + 0),
2654642e01fSmrg		  *(GLenum   *)(pc + 4),
2664642e01fSmrg		  *(GLenum   *)(pc + 8),
2674642e01fSmrg		  answer,
2684642e01fSmrg		  answer + compsize,
2694642e01fSmrg		  NULL
2704642e01fSmrg		  ) );
2714642e01fSmrg
2724642e01fSmrg    if (__glXErrorOccured()) {
2734642e01fSmrg	__GLX_BEGIN_REPLY(0);
2744642e01fSmrg	__GLX_SWAP_REPLY_HEADER();
2754642e01fSmrg    } else {
2764642e01fSmrg	__GLX_BEGIN_REPLY(compsize + compsize2);
2774642e01fSmrg	__GLX_SWAP_REPLY_HEADER();
2784642e01fSmrg	__GLX_SWAP_INT(&width);
2794642e01fSmrg	__GLX_SWAP_INT(&height);
2804642e01fSmrg	((xGLXGetSeparableFilterReply *)&__glXReply)->width = width;
2814642e01fSmrg	((xGLXGetSeparableFilterReply *)&__glXReply)->height = height;
2824642e01fSmrg	__GLX_SEND_VOID_ARRAY(compsize + compsize2);
2834642e01fSmrg    }
2844642e01fSmrg
2854642e01fSmrg    return Success;
2864642e01fSmrg}
2874642e01fSmrg
2884642e01fSmrgint __glXDispSwap_GetSeparableFilter(__GLXclientState *cl, GLbyte *pc)
2894642e01fSmrg{
2904642e01fSmrg    const GLXContextTag tag = __GLX_GET_SINGLE_CONTEXT_TAG(pc);
2914642e01fSmrg
2924642e01fSmrg    return GetSeparableFilter(cl, pc + __GLX_SINGLE_HDR_SIZE, tag);
2934642e01fSmrg}
2944642e01fSmrg
2954642e01fSmrgint __glXDispSwap_GetSeparableFilterEXT(__GLXclientState *cl, GLbyte *pc)
2964642e01fSmrg{
2974642e01fSmrg    const GLXContextTag tag = __GLX_GET_VENDPRIV_CONTEXT_TAG(pc);
2984642e01fSmrg
2994642e01fSmrg    return GetSeparableFilter(cl, pc + __GLX_VENDPRIV_HDR_SIZE, tag);
3004642e01fSmrg}
3014642e01fSmrg
3024642e01fSmrgstatic int GetConvolutionFilter(__GLXclientState *cl, GLbyte *pc, GLXContextTag tag)
3034642e01fSmrg{
3044642e01fSmrg    GLint compsize;
3054642e01fSmrg    GLenum format, type, target;
3064642e01fSmrg    GLboolean swapBytes;
3074642e01fSmrg    __GLXcontext *cx;
3084642e01fSmrg    ClientPtr client = cl->client;
3094642e01fSmrg    int error;
3104642e01fSmrg    __GLX_DECLARE_SWAP_VARIABLES;
3114642e01fSmrg    char *answer, answerBuffer[200];
3124642e01fSmrg    GLint width=0, height=0;
3134642e01fSmrg
3144642e01fSmrg    cx = __glXForceCurrent(cl, tag, &error);
3154642e01fSmrg    if (!cx) {
3164642e01fSmrg	return error;
3174642e01fSmrg    }
3184642e01fSmrg
3194642e01fSmrg    __GLX_SWAP_INT(pc+0);
3204642e01fSmrg    __GLX_SWAP_INT(pc+4);
3214642e01fSmrg    __GLX_SWAP_INT(pc+8);
3224642e01fSmrg
3234642e01fSmrg    format = *(GLenum *)(pc + 4);
3244642e01fSmrg    type = *(GLenum *)(pc + 8);
3254642e01fSmrg    target = *(GLenum *)(pc + 0);
3264642e01fSmrg    swapBytes = *(GLboolean *)(pc + 12);
3274642e01fSmrg
3284642e01fSmrg    CALL_GetConvolutionParameteriv( GET_DISPATCH(), (target, GL_CONVOLUTION_WIDTH, &width) );
3294642e01fSmrg    if (target == GL_CONVOLUTION_2D) {
3304642e01fSmrg        height = 1;
3314642e01fSmrg    } else {
3324642e01fSmrg	CALL_GetConvolutionParameteriv( GET_DISPATCH(), (target, GL_CONVOLUTION_HEIGHT, &height) );
3334642e01fSmrg    }
3344642e01fSmrg    /*
3354642e01fSmrg     * The two queries above might fail if we're in a state where queries
3364642e01fSmrg     * are illegal, but then width and height would still be zero anyway.
3374642e01fSmrg     */
3384642e01fSmrg    compsize = __glGetTexImage_size(target,1,format,type,width,height,1);
3394642e01fSmrg    if (compsize < 0) compsize = 0;
3404642e01fSmrg
3414642e01fSmrg    CALL_PixelStorei( GET_DISPATCH(), (GL_PACK_SWAP_BYTES, !swapBytes) );
3424642e01fSmrg    __GLX_GET_ANSWER_BUFFER(answer,cl,compsize,1);
3434642e01fSmrg    __glXClearErrorOccured();
3444642e01fSmrg    CALL_GetConvolutionFilter( GET_DISPATCH(), (
3454642e01fSmrg		  *(GLenum   *)(pc + 0),
3464642e01fSmrg		  *(GLenum   *)(pc + 4),
3474642e01fSmrg		  *(GLenum   *)(pc + 8),
3484642e01fSmrg		  answer
3494642e01fSmrg		  ) );
3504642e01fSmrg
3514642e01fSmrg    if (__glXErrorOccured()) {
3524642e01fSmrg	__GLX_BEGIN_REPLY(0);
3534642e01fSmrg	__GLX_SWAP_REPLY_HEADER();
3544642e01fSmrg    } else {
3554642e01fSmrg	__GLX_BEGIN_REPLY(compsize);
3564642e01fSmrg	__GLX_SWAP_REPLY_HEADER();
3574642e01fSmrg	__GLX_SWAP_INT(&width);
3584642e01fSmrg	__GLX_SWAP_INT(&height);
3594642e01fSmrg	((xGLXGetConvolutionFilterReply *)&__glXReply)->width = width;
3604642e01fSmrg	((xGLXGetConvolutionFilterReply *)&__glXReply)->height = height;
3614642e01fSmrg	__GLX_SEND_VOID_ARRAY(compsize);
3624642e01fSmrg    }
3634642e01fSmrg
3644642e01fSmrg    return Success;
3654642e01fSmrg}
3664642e01fSmrg
3674642e01fSmrgint __glXDispSwap_GetConvolutionFilter(__GLXclientState *cl, GLbyte *pc)
3684642e01fSmrg{
3694642e01fSmrg    const GLXContextTag tag = __GLX_GET_SINGLE_CONTEXT_TAG(pc);
3704642e01fSmrg
3714642e01fSmrg    return GetConvolutionFilter(cl, pc + __GLX_SINGLE_HDR_SIZE, tag);
3724642e01fSmrg}
3734642e01fSmrg
3744642e01fSmrgint __glXDispSwap_GetConvolutionFilterEXT(__GLXclientState *cl, GLbyte *pc)
3754642e01fSmrg{
3764642e01fSmrg    const GLXContextTag tag = __GLX_GET_VENDPRIV_CONTEXT_TAG(pc);
3774642e01fSmrg
3784642e01fSmrg    return GetConvolutionFilter(cl, pc + __GLX_VENDPRIV_HDR_SIZE, tag);
3794642e01fSmrg}
3804642e01fSmrg
3814642e01fSmrgstatic int GetHistogram(__GLXclientState *cl, GLbyte *pc, GLXContextTag tag)
3824642e01fSmrg{
3834642e01fSmrg    GLint compsize;
3844642e01fSmrg    GLenum format, type, target;
3854642e01fSmrg    GLboolean swapBytes, reset;
3864642e01fSmrg    __GLXcontext *cx;
3874642e01fSmrg    ClientPtr client = cl->client;
3884642e01fSmrg    int error;
3894642e01fSmrg    __GLX_DECLARE_SWAP_VARIABLES;
3904642e01fSmrg    char *answer, answerBuffer[200];
3914642e01fSmrg    GLint width=0;
3924642e01fSmrg
3934642e01fSmrg    cx = __glXForceCurrent(cl, tag, &error);
3944642e01fSmrg    if (!cx) {
3954642e01fSmrg	return error;
3964642e01fSmrg    }
3974642e01fSmrg
3984642e01fSmrg    __GLX_SWAP_INT(pc+0);
3994642e01fSmrg    __GLX_SWAP_INT(pc+4);
4004642e01fSmrg    __GLX_SWAP_INT(pc+8);
4014642e01fSmrg
4024642e01fSmrg    format = *(GLenum *)(pc + 4);
4034642e01fSmrg    type = *(GLenum *)(pc + 8);
4044642e01fSmrg    target = *(GLenum *)(pc + 0);
4054642e01fSmrg    swapBytes = *(GLboolean *)(pc + 12);
4064642e01fSmrg    reset = *(GLboolean *)(pc + 13);
4074642e01fSmrg
4084642e01fSmrg    CALL_GetHistogramParameteriv( GET_DISPATCH(), (target, GL_HISTOGRAM_WIDTH, &width) );
4094642e01fSmrg    /*
4104642e01fSmrg     * The one query above might fail if we're in a state where queries
4114642e01fSmrg     * are illegal, but then width would still be zero anyway.
4124642e01fSmrg     */
4134642e01fSmrg    compsize = __glGetTexImage_size(target,1,format,type,width,1,1);
4144642e01fSmrg    if (compsize < 0) compsize = 0;
4154642e01fSmrg
4164642e01fSmrg    CALL_PixelStorei( GET_DISPATCH(), (GL_PACK_SWAP_BYTES, !swapBytes) );
4174642e01fSmrg    __GLX_GET_ANSWER_BUFFER(answer,cl,compsize,1);
4184642e01fSmrg    __glXClearErrorOccured();
4194642e01fSmrg    CALL_GetHistogram( GET_DISPATCH(), (target, reset, format, type, answer) );
4204642e01fSmrg
4214642e01fSmrg    if (__glXErrorOccured()) {
4224642e01fSmrg	__GLX_BEGIN_REPLY(0);
4234642e01fSmrg	__GLX_SWAP_REPLY_HEADER();
4244642e01fSmrg    } else {
4254642e01fSmrg	__GLX_BEGIN_REPLY(compsize);
4264642e01fSmrg	__GLX_SWAP_REPLY_HEADER();
4274642e01fSmrg	__GLX_SWAP_INT(&width);
4284642e01fSmrg	((xGLXGetHistogramReply *)&__glXReply)->width = width;
4294642e01fSmrg	__GLX_SEND_VOID_ARRAY(compsize);
4304642e01fSmrg    }
4314642e01fSmrg
4324642e01fSmrg    return Success;
4334642e01fSmrg}
4344642e01fSmrg
4354642e01fSmrgint __glXDispSwap_GetHistogram(__GLXclientState *cl, GLbyte *pc)
4364642e01fSmrg{
4374642e01fSmrg    const GLXContextTag tag = __GLX_GET_SINGLE_CONTEXT_TAG(pc);
4384642e01fSmrg
4394642e01fSmrg    return GetHistogram(cl, pc + __GLX_SINGLE_HDR_SIZE, tag);
4404642e01fSmrg}
4414642e01fSmrg
4424642e01fSmrgint __glXDispSwap_GetHistogramEXT(__GLXclientState *cl, GLbyte *pc)
4434642e01fSmrg{
4444642e01fSmrg    const GLXContextTag tag = __GLX_GET_VENDPRIV_CONTEXT_TAG(pc);
4454642e01fSmrg
4464642e01fSmrg    return GetHistogram(cl, pc + __GLX_VENDPRIV_HDR_SIZE, tag);
4474642e01fSmrg}
4484642e01fSmrg
4494642e01fSmrgstatic int GetMinmax(__GLXclientState *cl, GLbyte *pc, GLXContextTag tag)
4504642e01fSmrg{
4514642e01fSmrg    GLint compsize;
4524642e01fSmrg    GLenum format, type, target;
4534642e01fSmrg    GLboolean swapBytes, reset;
4544642e01fSmrg    __GLXcontext *cx;
4554642e01fSmrg    ClientPtr client = cl->client;
4564642e01fSmrg    int error;
4574642e01fSmrg    __GLX_DECLARE_SWAP_VARIABLES;
4584642e01fSmrg    char *answer, answerBuffer[200];
4594642e01fSmrg
4604642e01fSmrg    cx = __glXForceCurrent(cl, tag, &error);
4614642e01fSmrg    if (!cx) {
4624642e01fSmrg	return error;
4634642e01fSmrg    }
4644642e01fSmrg
4654642e01fSmrg    __GLX_SWAP_INT(pc+0);
4664642e01fSmrg    __GLX_SWAP_INT(pc+4);
4674642e01fSmrg    __GLX_SWAP_INT(pc+8);
4684642e01fSmrg
4694642e01fSmrg    format = *(GLenum *)(pc + 4);
4704642e01fSmrg    type = *(GLenum *)(pc + 8);
4714642e01fSmrg    target = *(GLenum *)(pc + 0);
4724642e01fSmrg    swapBytes = *(GLboolean *)(pc + 12);
4734642e01fSmrg    reset = *(GLboolean *)(pc + 13);
4744642e01fSmrg
4754642e01fSmrg    compsize = __glGetTexImage_size(target,1,format,type,2,1,1);
4764642e01fSmrg    if (compsize < 0) compsize = 0;
4774642e01fSmrg
4784642e01fSmrg    CALL_PixelStorei( GET_DISPATCH(), (GL_PACK_SWAP_BYTES, !swapBytes) );
4794642e01fSmrg    __GLX_GET_ANSWER_BUFFER(answer,cl,compsize,1);
4804642e01fSmrg    __glXClearErrorOccured();
4814642e01fSmrg    CALL_GetMinmax( GET_DISPATCH(), (target, reset, format, type, answer) );
4824642e01fSmrg
4834642e01fSmrg    if (__glXErrorOccured()) {
4844642e01fSmrg	__GLX_BEGIN_REPLY(0);
4854642e01fSmrg	__GLX_SWAP_REPLY_HEADER();
4864642e01fSmrg    } else {
4874642e01fSmrg	__GLX_BEGIN_REPLY(compsize);
4884642e01fSmrg	__GLX_SWAP_REPLY_HEADER();
4894642e01fSmrg	__GLX_SEND_VOID_ARRAY(compsize);
4904642e01fSmrg    }
4914642e01fSmrg
4924642e01fSmrg    return Success;
4934642e01fSmrg}
4944642e01fSmrg
4954642e01fSmrgint __glXDispSwap_GetMinmax(__GLXclientState *cl, GLbyte *pc)
4964642e01fSmrg{
4974642e01fSmrg    const GLXContextTag tag = __GLX_GET_SINGLE_CONTEXT_TAG(pc);
4984642e01fSmrg
4994642e01fSmrg    return GetMinmax(cl, pc + __GLX_SINGLE_HDR_SIZE, tag);
5004642e01fSmrg}
5014642e01fSmrg
5024642e01fSmrgint __glXDispSwap_GetMinmaxEXT(__GLXclientState *cl, GLbyte *pc)
5034642e01fSmrg{
5044642e01fSmrg    const GLXContextTag tag = __GLX_GET_VENDPRIV_CONTEXT_TAG(pc);
5054642e01fSmrg
5064642e01fSmrg    return GetMinmax(cl, pc + __GLX_VENDPRIV_HDR_SIZE, tag);
5074642e01fSmrg}
5084642e01fSmrg
5094642e01fSmrgstatic int GetColorTable(__GLXclientState *cl, GLbyte *pc, GLXContextTag tag)
5104642e01fSmrg{
5114642e01fSmrg    GLint compsize;
5124642e01fSmrg    GLenum format, type, target;
5134642e01fSmrg    GLboolean swapBytes;
5144642e01fSmrg    __GLXcontext *cx;
5154642e01fSmrg    ClientPtr client = cl->client;
5164642e01fSmrg    int error;
5174642e01fSmrg    __GLX_DECLARE_SWAP_VARIABLES;
5184642e01fSmrg    char *answer, answerBuffer[200];
5194642e01fSmrg    GLint width=0;
5204642e01fSmrg
5214642e01fSmrg    cx = __glXForceCurrent(cl, tag, &error);
5224642e01fSmrg    if (!cx) {
5234642e01fSmrg	return error;
5244642e01fSmrg    }
5254642e01fSmrg
5264642e01fSmrg    __GLX_SWAP_INT(pc+0);
5274642e01fSmrg    __GLX_SWAP_INT(pc+4);
5284642e01fSmrg    __GLX_SWAP_INT(pc+8);
5294642e01fSmrg
5304642e01fSmrg    format = *(GLenum *)(pc + 4);
5314642e01fSmrg    type = *(GLenum *)(pc + 8);
5324642e01fSmrg    target = *(GLenum *)(pc + 0);
5334642e01fSmrg    swapBytes = *(GLboolean *)(pc + 12);
5344642e01fSmrg
5354642e01fSmrg    CALL_GetColorTableParameteriv( GET_DISPATCH(), (target, GL_COLOR_TABLE_WIDTH, &width) );
5364642e01fSmrg    /*
5374642e01fSmrg     * The one query above might fail if we're in a state where queries
5384642e01fSmrg     * are illegal, but then width would still be zero anyway.
5394642e01fSmrg     */
5404642e01fSmrg    compsize = __glGetTexImage_size(target,1,format,type,width,1,1);
5414642e01fSmrg    if (compsize < 0) compsize = 0;
5424642e01fSmrg
5434642e01fSmrg    CALL_PixelStorei( GET_DISPATCH(), (GL_PACK_SWAP_BYTES, !swapBytes) );
5444642e01fSmrg    __GLX_GET_ANSWER_BUFFER(answer,cl,compsize,1);
5454642e01fSmrg    __glXClearErrorOccured();
5464642e01fSmrg    CALL_GetColorTable( GET_DISPATCH(), (
5474642e01fSmrg		  *(GLenum   *)(pc + 0),
5484642e01fSmrg		  *(GLenum   *)(pc + 4),
5494642e01fSmrg		  *(GLenum   *)(pc + 8),
5504642e01fSmrg		  answer
5514642e01fSmrg		  ) );
5524642e01fSmrg
5534642e01fSmrg    if (__glXErrorOccured()) {
5544642e01fSmrg	__GLX_BEGIN_REPLY(0);
5554642e01fSmrg	__GLX_SWAP_REPLY_HEADER();
5564642e01fSmrg    } else {
5574642e01fSmrg	__GLX_BEGIN_REPLY(compsize);
5584642e01fSmrg	__GLX_SWAP_REPLY_HEADER();
5594642e01fSmrg	__GLX_SWAP_INT(&width);
5604642e01fSmrg	((xGLXGetColorTableReply *)&__glXReply)->width = width;
5614642e01fSmrg	__GLX_SEND_VOID_ARRAY(compsize);
5624642e01fSmrg    }
5634642e01fSmrg
5644642e01fSmrg    return Success;
5654642e01fSmrg}
5664642e01fSmrg
5674642e01fSmrgint __glXDispSwap_GetColorTable(__GLXclientState *cl, GLbyte *pc)
5684642e01fSmrg{
5694642e01fSmrg    const GLXContextTag tag = __GLX_GET_SINGLE_CONTEXT_TAG(pc);
5704642e01fSmrg
5714642e01fSmrg    return GetColorTable(cl, pc + __GLX_SINGLE_HDR_SIZE, tag);
5724642e01fSmrg}
5734642e01fSmrg
5744642e01fSmrgint __glXDispSwap_GetColorTableSGI(__GLXclientState *cl, GLbyte *pc)
5754642e01fSmrg{
5764642e01fSmrg    const GLXContextTag tag = __GLX_GET_VENDPRIV_CONTEXT_TAG(pc);
5774642e01fSmrg
5784642e01fSmrg    return GetColorTable(cl, pc + __GLX_VENDPRIV_HDR_SIZE, tag);
5794642e01fSmrg}
580