singlepixswap.c revision f7df2e56
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#ifdef HAVE_DIX_CONFIG_H 324642e01fSmrg#include <dix-config.h> 334642e01fSmrg#endif 344642e01fSmrg 354642e01fSmrg#include "glxserver.h" 364642e01fSmrg#include "glxext.h" 374642e01fSmrg#include "singlesize.h" 384642e01fSmrg#include "unpack.h" 394642e01fSmrg#include "indirect_dispatch.h" 404642e01fSmrg#include "indirect_size_get.h" 414642e01fSmrg 42f7df2e56Smrgint 43f7df2e56Smrg__glXDispSwap_ReadPixels(__GLXclientState * cl, GLbyte * pc) 444642e01fSmrg{ 454642e01fSmrg GLsizei width, height; 464642e01fSmrg GLenum format, type; 474642e01fSmrg GLboolean swapBytes, lsbFirst; 484642e01fSmrg GLint compsize; 49f7df2e56Smrg 504642e01fSmrg __GLX_DECLARE_SWAP_VARIABLES; 514642e01fSmrg __GLXcontext *cx; 524642e01fSmrg ClientPtr client = cl->client; 534642e01fSmrg int error; 544642e01fSmrg char *answer, answerBuffer[200]; 554642e01fSmrg 560b0d8713Smrg REQUEST_FIXED_SIZE(xGLXSingleReq, 28); 570b0d8713Smrg 58f7df2e56Smrg __GLX_SWAP_INT(&((xGLXSingleReq *) pc)->contextTag); 594642e01fSmrg cx = __glXForceCurrent(cl, __GLX_GET_SINGLE_CONTEXT_TAG(pc), &error); 604642e01fSmrg if (!cx) { 61f7df2e56Smrg return error; 624642e01fSmrg } 634642e01fSmrg 644642e01fSmrg pc += __GLX_SINGLE_HDR_SIZE; 65f7df2e56Smrg __GLX_SWAP_INT(pc + 0); 66f7df2e56Smrg __GLX_SWAP_INT(pc + 4); 67f7df2e56Smrg __GLX_SWAP_INT(pc + 8); 68f7df2e56Smrg __GLX_SWAP_INT(pc + 12); 69f7df2e56Smrg __GLX_SWAP_INT(pc + 16); 70f7df2e56Smrg __GLX_SWAP_INT(pc + 20); 71f7df2e56Smrg 72f7df2e56Smrg width = *(GLsizei *) (pc + 8); 73f7df2e56Smrg height = *(GLsizei *) (pc + 12); 74f7df2e56Smrg format = *(GLenum *) (pc + 16); 75f7df2e56Smrg type = *(GLenum *) (pc + 20); 76f7df2e56Smrg swapBytes = *(GLboolean *) (pc + 24); 77f7df2e56Smrg lsbFirst = *(GLboolean *) (pc + 25); 78f7df2e56Smrg compsize = __glReadPixels_size(format, type, width, height); 790b0d8713Smrg if (compsize < 0) 800b0d8713Smrg return BadLength; 814642e01fSmrg 82f7df2e56Smrg glPixelStorei(GL_PACK_SWAP_BYTES, !swapBytes); 83f7df2e56Smrg glPixelStorei(GL_PACK_LSB_FIRST, lsbFirst); 84f7df2e56Smrg __GLX_GET_ANSWER_BUFFER(answer, cl, compsize, 1); 854642e01fSmrg __glXClearErrorOccured(); 86f7df2e56Smrg glReadPixels(*(GLint *) (pc + 0), *(GLint *) (pc + 4), 87f7df2e56Smrg *(GLsizei *) (pc + 8), *(GLsizei *) (pc + 12), 88f7df2e56Smrg *(GLenum *) (pc + 16), *(GLenum *) (pc + 20), answer); 894642e01fSmrg 904642e01fSmrg if (__glXErrorOccured()) { 91f7df2e56Smrg __GLX_BEGIN_REPLY(0); 92f7df2e56Smrg __GLX_SWAP_REPLY_HEADER(); 93f7df2e56Smrg __GLX_SEND_HEADER(); 94f7df2e56Smrg } 95f7df2e56Smrg else { 96f7df2e56Smrg __GLX_BEGIN_REPLY(compsize); 97f7df2e56Smrg __GLX_SWAP_REPLY_HEADER(); 98f7df2e56Smrg __GLX_SEND_HEADER(); 99f7df2e56Smrg __GLX_SEND_VOID_ARRAY(compsize); 1004642e01fSmrg } 101f7df2e56Smrg cx->hasUnflushedCommands = GL_FALSE; 1024642e01fSmrg return Success; 1034642e01fSmrg} 1044642e01fSmrg 105f7df2e56Smrgint 106f7df2e56Smrg__glXDispSwap_GetTexImage(__GLXclientState * cl, GLbyte * pc) 1074642e01fSmrg{ 1084642e01fSmrg GLint level, compsize; 1094642e01fSmrg GLenum format, type, target; 1104642e01fSmrg GLboolean swapBytes; 111f7df2e56Smrg 1124642e01fSmrg __GLX_DECLARE_SWAP_VARIABLES; 1134642e01fSmrg __GLXcontext *cx; 1144642e01fSmrg ClientPtr client = cl->client; 1154642e01fSmrg int error; 1164642e01fSmrg char *answer, answerBuffer[200]; 117f7df2e56Smrg GLint width = 0, height = 0, depth = 1; 1184642e01fSmrg 1190b0d8713Smrg REQUEST_FIXED_SIZE(xGLXSingleReq, 20); 1200b0d8713Smrg 121f7df2e56Smrg __GLX_SWAP_INT(&((xGLXSingleReq *) pc)->contextTag); 1224642e01fSmrg cx = __glXForceCurrent(cl, __GLX_GET_SINGLE_CONTEXT_TAG(pc), &error); 1234642e01fSmrg if (!cx) { 124f7df2e56Smrg return error; 1254642e01fSmrg } 1264642e01fSmrg 1274642e01fSmrg pc += __GLX_SINGLE_HDR_SIZE; 128f7df2e56Smrg __GLX_SWAP_INT(pc + 0); 129f7df2e56Smrg __GLX_SWAP_INT(pc + 4); 130f7df2e56Smrg __GLX_SWAP_INT(pc + 8); 131f7df2e56Smrg __GLX_SWAP_INT(pc + 12); 132f7df2e56Smrg 133f7df2e56Smrg level = *(GLint *) (pc + 4); 134f7df2e56Smrg format = *(GLenum *) (pc + 8); 135f7df2e56Smrg type = *(GLenum *) (pc + 12); 136f7df2e56Smrg target = *(GLenum *) (pc + 0); 137f7df2e56Smrg swapBytes = *(GLboolean *) (pc + 16); 138f7df2e56Smrg 139f7df2e56Smrg glGetTexLevelParameteriv(target, level, GL_TEXTURE_WIDTH, &width); 140f7df2e56Smrg glGetTexLevelParameteriv(target, level, GL_TEXTURE_HEIGHT, &height); 141f7df2e56Smrg if (target == GL_TEXTURE_3D) { 142f7df2e56Smrg glGetTexLevelParameteriv(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 */ 148f7df2e56Smrg compsize = 149f7df2e56Smrg __glGetTexImage_size(target, level, format, type, width, height, depth); 1500b0d8713Smrg if (compsize < 0) 1510b0d8713Smrg return BadLength; 1524642e01fSmrg 153f7df2e56Smrg glPixelStorei(GL_PACK_SWAP_BYTES, !swapBytes); 154f7df2e56Smrg __GLX_GET_ANSWER_BUFFER(answer, cl, compsize, 1); 1554642e01fSmrg __glXClearErrorOccured(); 156f7df2e56Smrg glGetTexImage(*(GLenum *) (pc + 0), *(GLint *) (pc + 4), 157f7df2e56Smrg *(GLenum *) (pc + 8), *(GLenum *) (pc + 12), answer); 1584642e01fSmrg 1594642e01fSmrg if (__glXErrorOccured()) { 160f7df2e56Smrg __GLX_BEGIN_REPLY(0); 161f7df2e56Smrg __GLX_SWAP_REPLY_HEADER(); 162f7df2e56Smrg __GLX_SEND_HEADER(); 163f7df2e56Smrg } 164f7df2e56Smrg else { 165f7df2e56Smrg __GLX_BEGIN_REPLY(compsize); 166f7df2e56Smrg __GLX_SWAP_REPLY_HEADER(); 167f7df2e56Smrg __GLX_SWAP_INT(&width); 168f7df2e56Smrg __GLX_SWAP_INT(&height); 169f7df2e56Smrg __GLX_SWAP_INT(&depth); 170f7df2e56Smrg ((xGLXGetTexImageReply *) &__glXReply)->width = width; 171f7df2e56Smrg ((xGLXGetTexImageReply *) &__glXReply)->height = height; 172f7df2e56Smrg ((xGLXGetTexImageReply *) &__glXReply)->depth = depth; 173f7df2e56Smrg __GLX_SEND_HEADER(); 174f7df2e56Smrg __GLX_SEND_VOID_ARRAY(compsize); 1754642e01fSmrg } 1764642e01fSmrg return Success; 1774642e01fSmrg} 1784642e01fSmrg 179f7df2e56Smrgint 180f7df2e56Smrg__glXDispSwap_GetPolygonStipple(__GLXclientState * cl, GLbyte * pc) 1814642e01fSmrg{ 1824642e01fSmrg GLboolean lsbFirst; 1834642e01fSmrg __GLXcontext *cx; 1844642e01fSmrg ClientPtr client = cl->client; 1854642e01fSmrg int error; 1864642e01fSmrg GLubyte answerBuffer[200]; 1874642e01fSmrg char *answer; 188f7df2e56Smrg 1894642e01fSmrg __GLX_DECLARE_SWAP_VARIABLES; 1904642e01fSmrg 1910b0d8713Smrg REQUEST_FIXED_SIZE(xGLXSingleReq, 4); 1920b0d8713Smrg 193f7df2e56Smrg __GLX_SWAP_INT(&((xGLXSingleReq *) pc)->contextTag); 1944642e01fSmrg cx = __glXForceCurrent(cl, __GLX_GET_SINGLE_CONTEXT_TAG(pc), &error); 1954642e01fSmrg if (!cx) { 196f7df2e56Smrg return error; 1974642e01fSmrg } 1984642e01fSmrg pc += __GLX_SINGLE_HDR_SIZE; 199f7df2e56Smrg lsbFirst = *(GLboolean *) (pc + 0); 2004642e01fSmrg 201f7df2e56Smrg glPixelStorei(GL_PACK_LSB_FIRST, lsbFirst); 202f7df2e56Smrg __GLX_GET_ANSWER_BUFFER(answer, cl, 128, 1); 2034642e01fSmrg 2044642e01fSmrg __glXClearErrorOccured(); 205f7df2e56Smrg glGetPolygonStipple((GLubyte *) answer); 2064642e01fSmrg if (__glXErrorOccured()) { 207f7df2e56Smrg __GLX_BEGIN_REPLY(0); 208f7df2e56Smrg __GLX_SWAP_REPLY_HEADER(); 209f7df2e56Smrg __GLX_SEND_HEADER(); 210f7df2e56Smrg } 211f7df2e56Smrg else { 212f7df2e56Smrg __GLX_BEGIN_REPLY(128); 213f7df2e56Smrg __GLX_SWAP_REPLY_HEADER(); 214f7df2e56Smrg __GLX_SEND_HEADER(); 215f7df2e56Smrg __GLX_SEND_BYTE_ARRAY(128); 2164642e01fSmrg } 2174642e01fSmrg return Success; 2184642e01fSmrg} 2194642e01fSmrg 220f7df2e56Smrgstatic int 221f7df2e56SmrgGetSeparableFilter(__GLXclientState * cl, GLbyte * pc, GLXContextTag tag) 2224642e01fSmrg{ 2234642e01fSmrg GLint compsize, compsize2; 2244642e01fSmrg GLenum format, type, target; 2254642e01fSmrg GLboolean swapBytes; 2264642e01fSmrg __GLXcontext *cx; 2274642e01fSmrg ClientPtr client = cl->client; 2284642e01fSmrg int error; 229f7df2e56Smrg 2304642e01fSmrg __GLX_DECLARE_SWAP_VARIABLES; 2314642e01fSmrg char *answer, answerBuffer[200]; 232f7df2e56Smrg GLint width = 0, height = 0; 2334642e01fSmrg 2344642e01fSmrg cx = __glXForceCurrent(cl, tag, &error); 2354642e01fSmrg if (!cx) { 236f7df2e56Smrg return error; 2374642e01fSmrg } 2384642e01fSmrg 239f7df2e56Smrg __GLX_SWAP_INT(pc + 0); 240f7df2e56Smrg __GLX_SWAP_INT(pc + 4); 241f7df2e56Smrg __GLX_SWAP_INT(pc + 8); 2424642e01fSmrg 243f7df2e56Smrg format = *(GLenum *) (pc + 4); 244f7df2e56Smrg type = *(GLenum *) (pc + 8); 245f7df2e56Smrg target = *(GLenum *) (pc + 0); 246f7df2e56Smrg swapBytes = *(GLboolean *) (pc + 12); 2474642e01fSmrg 2484642e01fSmrg /* target must be SEPARABLE_2D, however I guess we can let the GL 2494642e01fSmrg barf on this one.... */ 2504642e01fSmrg 251f7df2e56Smrg glGetConvolutionParameteriv(target, GL_CONVOLUTION_WIDTH, &width); 252f7df2e56Smrg glGetConvolutionParameteriv(target, GL_CONVOLUTION_HEIGHT, &height); 2534642e01fSmrg /* 2544642e01fSmrg * The two queries above might fail if we're in a state where queries 2554642e01fSmrg * are illegal, but then width and height would still be zero anyway. 2564642e01fSmrg */ 257f7df2e56Smrg compsize = __glGetTexImage_size(target, 1, format, type, width, 1, 1); 258f7df2e56Smrg compsize2 = __glGetTexImage_size(target, 1, format, type, height, 1, 1); 2594642e01fSmrg 2600b0d8713Smrg if ((compsize = safe_pad(compsize)) < 0) 2610b0d8713Smrg return BadLength; 2620b0d8713Smrg if ((compsize2 = safe_pad(compsize2)) < 0) 2630b0d8713Smrg return BadLength; 2644642e01fSmrg 265f7df2e56Smrg glPixelStorei(GL_PACK_SWAP_BYTES, !swapBytes); 2660b0d8713Smrg __GLX_GET_ANSWER_BUFFER(answer, cl, safe_add(compsize, compsize2), 1); 2674642e01fSmrg __glXClearErrorOccured(); 268f7df2e56Smrg glGetSeparableFilter(*(GLenum *) (pc + 0), *(GLenum *) (pc + 4), 269f7df2e56Smrg *(GLenum *) (pc + 8), answer, answer + compsize, NULL); 2704642e01fSmrg 2714642e01fSmrg if (__glXErrorOccured()) { 272f7df2e56Smrg __GLX_BEGIN_REPLY(0); 273f7df2e56Smrg __GLX_SWAP_REPLY_HEADER(); 274f7df2e56Smrg } 275f7df2e56Smrg else { 276f7df2e56Smrg __GLX_BEGIN_REPLY(compsize + compsize2); 277f7df2e56Smrg __GLX_SWAP_REPLY_HEADER(); 278f7df2e56Smrg __GLX_SWAP_INT(&width); 279f7df2e56Smrg __GLX_SWAP_INT(&height); 280f7df2e56Smrg ((xGLXGetSeparableFilterReply *) &__glXReply)->width = width; 281f7df2e56Smrg ((xGLXGetSeparableFilterReply *) &__glXReply)->height = height; 282f7df2e56Smrg __GLX_SEND_VOID_ARRAY(compsize + compsize2); 2834642e01fSmrg } 2844642e01fSmrg 2854642e01fSmrg return Success; 2864642e01fSmrg} 2874642e01fSmrg 288f7df2e56Smrgint 289f7df2e56Smrg__glXDispSwap_GetSeparableFilter(__GLXclientState * cl, GLbyte * pc) 2904642e01fSmrg{ 2914642e01fSmrg const GLXContextTag tag = __GLX_GET_SINGLE_CONTEXT_TAG(pc); 2920b0d8713Smrg ClientPtr client = cl->client; 2934642e01fSmrg 2940b0d8713Smrg REQUEST_FIXED_SIZE(xGLXSingleReq, 16); 2954642e01fSmrg return GetSeparableFilter(cl, pc + __GLX_SINGLE_HDR_SIZE, tag); 2964642e01fSmrg} 2974642e01fSmrg 298f7df2e56Smrgint 299f7df2e56Smrg__glXDispSwap_GetSeparableFilterEXT(__GLXclientState * cl, GLbyte * pc) 3004642e01fSmrg{ 3014642e01fSmrg const GLXContextTag tag = __GLX_GET_VENDPRIV_CONTEXT_TAG(pc); 3020b0d8713Smrg ClientPtr client = cl->client; 3034642e01fSmrg 3040b0d8713Smrg REQUEST_FIXED_SIZE(xGLXVendorPrivateReq, 16); 3054642e01fSmrg return GetSeparableFilter(cl, pc + __GLX_VENDPRIV_HDR_SIZE, tag); 3064642e01fSmrg} 3074642e01fSmrg 308f7df2e56Smrgstatic int 309f7df2e56SmrgGetConvolutionFilter(__GLXclientState * cl, GLbyte * pc, GLXContextTag tag) 3104642e01fSmrg{ 3114642e01fSmrg GLint compsize; 3124642e01fSmrg GLenum format, type, target; 3134642e01fSmrg GLboolean swapBytes; 3144642e01fSmrg __GLXcontext *cx; 3154642e01fSmrg ClientPtr client = cl->client; 3164642e01fSmrg int error; 317f7df2e56Smrg 3184642e01fSmrg __GLX_DECLARE_SWAP_VARIABLES; 3194642e01fSmrg char *answer, answerBuffer[200]; 320f7df2e56Smrg GLint width = 0, height = 0; 3214642e01fSmrg 3224642e01fSmrg cx = __glXForceCurrent(cl, tag, &error); 3234642e01fSmrg if (!cx) { 324f7df2e56Smrg return error; 3254642e01fSmrg } 3264642e01fSmrg 327f7df2e56Smrg __GLX_SWAP_INT(pc + 0); 328f7df2e56Smrg __GLX_SWAP_INT(pc + 4); 329f7df2e56Smrg __GLX_SWAP_INT(pc + 8); 3304642e01fSmrg 331f7df2e56Smrg format = *(GLenum *) (pc + 4); 332f7df2e56Smrg type = *(GLenum *) (pc + 8); 333f7df2e56Smrg target = *(GLenum *) (pc + 0); 334f7df2e56Smrg swapBytes = *(GLboolean *) (pc + 12); 3354642e01fSmrg 336f7df2e56Smrg glGetConvolutionParameteriv(target, GL_CONVOLUTION_WIDTH, &width); 3374642e01fSmrg if (target == GL_CONVOLUTION_2D) { 3384642e01fSmrg height = 1; 339f7df2e56Smrg } 340f7df2e56Smrg else { 341f7df2e56Smrg glGetConvolutionParameteriv(target, GL_CONVOLUTION_HEIGHT, &height); 3424642e01fSmrg } 3434642e01fSmrg /* 3444642e01fSmrg * The two queries above might fail if we're in a state where queries 3454642e01fSmrg * are illegal, but then width and height would still be zero anyway. 3464642e01fSmrg */ 347f7df2e56Smrg compsize = __glGetTexImage_size(target, 1, format, type, width, height, 1); 3480b0d8713Smrg if (compsize < 0) 3490b0d8713Smrg return BadLength; 3504642e01fSmrg 351f7df2e56Smrg glPixelStorei(GL_PACK_SWAP_BYTES, !swapBytes); 352f7df2e56Smrg __GLX_GET_ANSWER_BUFFER(answer, cl, compsize, 1); 3534642e01fSmrg __glXClearErrorOccured(); 354f7df2e56Smrg glGetConvolutionFilter(*(GLenum *) (pc + 0), *(GLenum *) (pc + 4), 355f7df2e56Smrg *(GLenum *) (pc + 8), answer); 3564642e01fSmrg 3574642e01fSmrg if (__glXErrorOccured()) { 358f7df2e56Smrg __GLX_BEGIN_REPLY(0); 359f7df2e56Smrg __GLX_SWAP_REPLY_HEADER(); 360f7df2e56Smrg } 361f7df2e56Smrg else { 362f7df2e56Smrg __GLX_BEGIN_REPLY(compsize); 363f7df2e56Smrg __GLX_SWAP_REPLY_HEADER(); 364f7df2e56Smrg __GLX_SWAP_INT(&width); 365f7df2e56Smrg __GLX_SWAP_INT(&height); 366f7df2e56Smrg ((xGLXGetConvolutionFilterReply *) &__glXReply)->width = width; 367f7df2e56Smrg ((xGLXGetConvolutionFilterReply *) &__glXReply)->height = height; 368f7df2e56Smrg __GLX_SEND_VOID_ARRAY(compsize); 3694642e01fSmrg } 3704642e01fSmrg 3714642e01fSmrg return Success; 3724642e01fSmrg} 3734642e01fSmrg 374f7df2e56Smrgint 375f7df2e56Smrg__glXDispSwap_GetConvolutionFilter(__GLXclientState * cl, GLbyte * pc) 3764642e01fSmrg{ 3774642e01fSmrg const GLXContextTag tag = __GLX_GET_SINGLE_CONTEXT_TAG(pc); 3780b0d8713Smrg ClientPtr client = cl->client; 3794642e01fSmrg 3800b0d8713Smrg REQUEST_FIXED_SIZE(xGLXSingleReq, 16); 3814642e01fSmrg return GetConvolutionFilter(cl, pc + __GLX_SINGLE_HDR_SIZE, tag); 3824642e01fSmrg} 3834642e01fSmrg 384f7df2e56Smrgint 385f7df2e56Smrg__glXDispSwap_GetConvolutionFilterEXT(__GLXclientState * cl, GLbyte * pc) 3864642e01fSmrg{ 3874642e01fSmrg const GLXContextTag tag = __GLX_GET_VENDPRIV_CONTEXT_TAG(pc); 3880b0d8713Smrg ClientPtr client = cl->client; 3894642e01fSmrg 3900b0d8713Smrg REQUEST_FIXED_SIZE(xGLXVendorPrivateReq, 16); 3914642e01fSmrg return GetConvolutionFilter(cl, pc + __GLX_VENDPRIV_HDR_SIZE, tag); 3924642e01fSmrg} 3934642e01fSmrg 394f7df2e56Smrgstatic int 395f7df2e56SmrgGetHistogram(__GLXclientState * cl, GLbyte * pc, GLXContextTag tag) 3964642e01fSmrg{ 3974642e01fSmrg GLint compsize; 3984642e01fSmrg GLenum format, type, target; 3994642e01fSmrg GLboolean swapBytes, reset; 4004642e01fSmrg __GLXcontext *cx; 4014642e01fSmrg ClientPtr client = cl->client; 4024642e01fSmrg int error; 403f7df2e56Smrg 4044642e01fSmrg __GLX_DECLARE_SWAP_VARIABLES; 4054642e01fSmrg char *answer, answerBuffer[200]; 406f7df2e56Smrg GLint width = 0; 4074642e01fSmrg 4084642e01fSmrg cx = __glXForceCurrent(cl, tag, &error); 4094642e01fSmrg if (!cx) { 410f7df2e56Smrg return error; 4114642e01fSmrg } 4124642e01fSmrg 413f7df2e56Smrg __GLX_SWAP_INT(pc + 0); 414f7df2e56Smrg __GLX_SWAP_INT(pc + 4); 415f7df2e56Smrg __GLX_SWAP_INT(pc + 8); 4164642e01fSmrg 417f7df2e56Smrg format = *(GLenum *) (pc + 4); 418f7df2e56Smrg type = *(GLenum *) (pc + 8); 419f7df2e56Smrg target = *(GLenum *) (pc + 0); 420f7df2e56Smrg swapBytes = *(GLboolean *) (pc + 12); 421f7df2e56Smrg reset = *(GLboolean *) (pc + 13); 4224642e01fSmrg 423f7df2e56Smrg glGetHistogramParameteriv(target, GL_HISTOGRAM_WIDTH, &width); 4244642e01fSmrg /* 4254642e01fSmrg * The one query above might fail if we're in a state where queries 4264642e01fSmrg * are illegal, but then width would still be zero anyway. 4274642e01fSmrg */ 428f7df2e56Smrg compsize = __glGetTexImage_size(target, 1, format, type, width, 1, 1); 4290b0d8713Smrg if (compsize < 0) 4300b0d8713Smrg return BadLength; 4314642e01fSmrg 432f7df2e56Smrg glPixelStorei(GL_PACK_SWAP_BYTES, !swapBytes); 433f7df2e56Smrg __GLX_GET_ANSWER_BUFFER(answer, cl, compsize, 1); 4344642e01fSmrg __glXClearErrorOccured(); 435f7df2e56Smrg glGetHistogram(target, reset, format, type, answer); 4364642e01fSmrg 4374642e01fSmrg if (__glXErrorOccured()) { 438f7df2e56Smrg __GLX_BEGIN_REPLY(0); 439f7df2e56Smrg __GLX_SWAP_REPLY_HEADER(); 440f7df2e56Smrg } 441f7df2e56Smrg else { 442f7df2e56Smrg __GLX_BEGIN_REPLY(compsize); 443f7df2e56Smrg __GLX_SWAP_REPLY_HEADER(); 444f7df2e56Smrg __GLX_SWAP_INT(&width); 445f7df2e56Smrg ((xGLXGetHistogramReply *) &__glXReply)->width = width; 446f7df2e56Smrg __GLX_SEND_VOID_ARRAY(compsize); 4474642e01fSmrg } 4484642e01fSmrg 4494642e01fSmrg return Success; 4504642e01fSmrg} 4514642e01fSmrg 452f7df2e56Smrgint 453f7df2e56Smrg__glXDispSwap_GetHistogram(__GLXclientState * cl, GLbyte * pc) 4544642e01fSmrg{ 4554642e01fSmrg const GLXContextTag tag = __GLX_GET_SINGLE_CONTEXT_TAG(pc); 4560b0d8713Smrg ClientPtr client = cl->client; 4574642e01fSmrg 4580b0d8713Smrg REQUEST_FIXED_SIZE(xGLXSingleReq, 16); 4594642e01fSmrg return GetHistogram(cl, pc + __GLX_SINGLE_HDR_SIZE, tag); 4604642e01fSmrg} 4614642e01fSmrg 462f7df2e56Smrgint 463f7df2e56Smrg__glXDispSwap_GetHistogramEXT(__GLXclientState * cl, GLbyte * pc) 4644642e01fSmrg{ 4654642e01fSmrg const GLXContextTag tag = __GLX_GET_VENDPRIV_CONTEXT_TAG(pc); 4660b0d8713Smrg ClientPtr client = cl->client; 4674642e01fSmrg 4680b0d8713Smrg REQUEST_FIXED_SIZE(xGLXVendorPrivateReq, 16); 4694642e01fSmrg return GetHistogram(cl, pc + __GLX_VENDPRIV_HDR_SIZE, tag); 4704642e01fSmrg} 4714642e01fSmrg 472f7df2e56Smrgstatic int 473f7df2e56SmrgGetMinmax(__GLXclientState * cl, GLbyte * pc, GLXContextTag tag) 4744642e01fSmrg{ 4754642e01fSmrg GLint compsize; 4764642e01fSmrg GLenum format, type, target; 4774642e01fSmrg GLboolean swapBytes, reset; 4784642e01fSmrg __GLXcontext *cx; 4794642e01fSmrg ClientPtr client = cl->client; 4804642e01fSmrg int error; 481f7df2e56Smrg 4824642e01fSmrg __GLX_DECLARE_SWAP_VARIABLES; 4834642e01fSmrg char *answer, answerBuffer[200]; 4844642e01fSmrg 4854642e01fSmrg cx = __glXForceCurrent(cl, tag, &error); 4864642e01fSmrg if (!cx) { 487f7df2e56Smrg return error; 4884642e01fSmrg } 4894642e01fSmrg 490f7df2e56Smrg __GLX_SWAP_INT(pc + 0); 491f7df2e56Smrg __GLX_SWAP_INT(pc + 4); 492f7df2e56Smrg __GLX_SWAP_INT(pc + 8); 4934642e01fSmrg 494f7df2e56Smrg format = *(GLenum *) (pc + 4); 495f7df2e56Smrg type = *(GLenum *) (pc + 8); 496f7df2e56Smrg target = *(GLenum *) (pc + 0); 497f7df2e56Smrg swapBytes = *(GLboolean *) (pc + 12); 498f7df2e56Smrg reset = *(GLboolean *) (pc + 13); 4994642e01fSmrg 500f7df2e56Smrg compsize = __glGetTexImage_size(target, 1, format, type, 2, 1, 1); 5010b0d8713Smrg if (compsize < 0) 5020b0d8713Smrg return BadLength; 5034642e01fSmrg 504f7df2e56Smrg glPixelStorei(GL_PACK_SWAP_BYTES, !swapBytes); 505f7df2e56Smrg __GLX_GET_ANSWER_BUFFER(answer, cl, compsize, 1); 5064642e01fSmrg __glXClearErrorOccured(); 507f7df2e56Smrg glGetMinmax(target, reset, format, type, answer); 5084642e01fSmrg 5094642e01fSmrg if (__glXErrorOccured()) { 510f7df2e56Smrg __GLX_BEGIN_REPLY(0); 511f7df2e56Smrg __GLX_SWAP_REPLY_HEADER(); 512f7df2e56Smrg } 513f7df2e56Smrg else { 514f7df2e56Smrg __GLX_BEGIN_REPLY(compsize); 515f7df2e56Smrg __GLX_SWAP_REPLY_HEADER(); 516f7df2e56Smrg __GLX_SEND_VOID_ARRAY(compsize); 5174642e01fSmrg } 5184642e01fSmrg 5194642e01fSmrg return Success; 5204642e01fSmrg} 5214642e01fSmrg 522f7df2e56Smrgint 523f7df2e56Smrg__glXDispSwap_GetMinmax(__GLXclientState * cl, GLbyte * pc) 5244642e01fSmrg{ 5254642e01fSmrg const GLXContextTag tag = __GLX_GET_SINGLE_CONTEXT_TAG(pc); 5260b0d8713Smrg ClientPtr client = cl->client; 5274642e01fSmrg 5280b0d8713Smrg REQUEST_FIXED_SIZE(xGLXSingleReq, 16); 5294642e01fSmrg return GetMinmax(cl, pc + __GLX_SINGLE_HDR_SIZE, tag); 5304642e01fSmrg} 5314642e01fSmrg 532f7df2e56Smrgint 533f7df2e56Smrg__glXDispSwap_GetMinmaxEXT(__GLXclientState * cl, GLbyte * pc) 5344642e01fSmrg{ 5354642e01fSmrg const GLXContextTag tag = __GLX_GET_VENDPRIV_CONTEXT_TAG(pc); 5360b0d8713Smrg ClientPtr client = cl->client; 5374642e01fSmrg 5380b0d8713Smrg REQUEST_FIXED_SIZE(xGLXVendorPrivateReq, 16); 5394642e01fSmrg return GetMinmax(cl, pc + __GLX_VENDPRIV_HDR_SIZE, tag); 5404642e01fSmrg} 5414642e01fSmrg 542f7df2e56Smrgstatic int 543f7df2e56SmrgGetColorTable(__GLXclientState * cl, GLbyte * pc, GLXContextTag tag) 5444642e01fSmrg{ 5454642e01fSmrg GLint compsize; 5464642e01fSmrg GLenum format, type, target; 5474642e01fSmrg GLboolean swapBytes; 5484642e01fSmrg __GLXcontext *cx; 5494642e01fSmrg ClientPtr client = cl->client; 5504642e01fSmrg int error; 551f7df2e56Smrg 5524642e01fSmrg __GLX_DECLARE_SWAP_VARIABLES; 5534642e01fSmrg char *answer, answerBuffer[200]; 554f7df2e56Smrg GLint width = 0; 5554642e01fSmrg 5564642e01fSmrg cx = __glXForceCurrent(cl, tag, &error); 5574642e01fSmrg if (!cx) { 558f7df2e56Smrg return error; 5594642e01fSmrg } 5604642e01fSmrg 561f7df2e56Smrg __GLX_SWAP_INT(pc + 0); 562f7df2e56Smrg __GLX_SWAP_INT(pc + 4); 563f7df2e56Smrg __GLX_SWAP_INT(pc + 8); 5644642e01fSmrg 565f7df2e56Smrg format = *(GLenum *) (pc + 4); 566f7df2e56Smrg type = *(GLenum *) (pc + 8); 567f7df2e56Smrg target = *(GLenum *) (pc + 0); 568f7df2e56Smrg swapBytes = *(GLboolean *) (pc + 12); 5694642e01fSmrg 570f7df2e56Smrg glGetColorTableParameteriv(target, GL_COLOR_TABLE_WIDTH, &width); 5714642e01fSmrg /* 5724642e01fSmrg * The one query above might fail if we're in a state where queries 5734642e01fSmrg * are illegal, but then width would still be zero anyway. 5744642e01fSmrg */ 575f7df2e56Smrg compsize = __glGetTexImage_size(target, 1, format, type, width, 1, 1); 5760b0d8713Smrg if (compsize < 0) 5770b0d8713Smrg return BadLength; 5784642e01fSmrg 579f7df2e56Smrg glPixelStorei(GL_PACK_SWAP_BYTES, !swapBytes); 580f7df2e56Smrg __GLX_GET_ANSWER_BUFFER(answer, cl, compsize, 1); 5814642e01fSmrg __glXClearErrorOccured(); 582f7df2e56Smrg glGetColorTable(*(GLenum *) (pc + 0), *(GLenum *) (pc + 4), 583f7df2e56Smrg *(GLenum *) (pc + 8), answer); 5844642e01fSmrg 5854642e01fSmrg if (__glXErrorOccured()) { 586f7df2e56Smrg __GLX_BEGIN_REPLY(0); 587f7df2e56Smrg __GLX_SWAP_REPLY_HEADER(); 588f7df2e56Smrg } 589f7df2e56Smrg else { 590f7df2e56Smrg __GLX_BEGIN_REPLY(compsize); 591f7df2e56Smrg __GLX_SWAP_REPLY_HEADER(); 592f7df2e56Smrg __GLX_SWAP_INT(&width); 593f7df2e56Smrg ((xGLXGetColorTableReply *) &__glXReply)->width = width; 594f7df2e56Smrg __GLX_SEND_VOID_ARRAY(compsize); 5954642e01fSmrg } 5964642e01fSmrg 5974642e01fSmrg return Success; 5984642e01fSmrg} 5994642e01fSmrg 600f7df2e56Smrgint 601f7df2e56Smrg__glXDispSwap_GetColorTable(__GLXclientState * cl, GLbyte * pc) 6024642e01fSmrg{ 6034642e01fSmrg const GLXContextTag tag = __GLX_GET_SINGLE_CONTEXT_TAG(pc); 6040b0d8713Smrg ClientPtr client = cl->client; 6054642e01fSmrg 6060b0d8713Smrg REQUEST_FIXED_SIZE(xGLXSingleReq, 16); 6074642e01fSmrg return GetColorTable(cl, pc + __GLX_SINGLE_HDR_SIZE, tag); 6084642e01fSmrg} 6094642e01fSmrg 610f7df2e56Smrgint 611f7df2e56Smrg__glXDispSwap_GetColorTableSGI(__GLXclientState * cl, GLbyte * pc) 6124642e01fSmrg{ 6134642e01fSmrg const GLXContextTag tag = __GLX_GET_VENDPRIV_CONTEXT_TAG(pc); 6140b0d8713Smrg ClientPtr client = cl->client; 6154642e01fSmrg 6160b0d8713Smrg REQUEST_FIXED_SIZE(xGLXVendorPrivateReq, 16); 6174642e01fSmrg return GetColorTable(cl, pc + __GLX_VENDPRIV_HDR_SIZE, tag); 6184642e01fSmrg} 619