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