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_size_get.h" 404642e01fSmrg#include "indirect_dispatch.h" 414642e01fSmrg 42f7df2e56Smrgint 43f7df2e56Smrg__glXDisp_ReadPixels(__GLXclientState * cl, GLbyte * pc) 444642e01fSmrg{ 454642e01fSmrg GLsizei width, height; 464642e01fSmrg GLenum format, type; 474642e01fSmrg GLboolean swapBytes, lsbFirst; 484642e01fSmrg GLint compsize; 494642e01fSmrg __GLXcontext *cx; 504642e01fSmrg ClientPtr client = cl->client; 514642e01fSmrg int error; 524642e01fSmrg char *answer, answerBuffer[200]; 537e31ba66Smrg xGLXSingleReply reply = { 0, }; 544642e01fSmrg 550b0d8713Smrg REQUEST_FIXED_SIZE(xGLXSingleReq, 28); 560b0d8713Smrg 574642e01fSmrg cx = __glXForceCurrent(cl, __GLX_GET_SINGLE_CONTEXT_TAG(pc), &error); 584642e01fSmrg if (!cx) { 59f7df2e56Smrg return error; 604642e01fSmrg } 614642e01fSmrg 624642e01fSmrg pc += __GLX_SINGLE_HDR_SIZE; 63f7df2e56Smrg width = *(GLsizei *) (pc + 8); 64f7df2e56Smrg height = *(GLsizei *) (pc + 12); 65f7df2e56Smrg format = *(GLenum *) (pc + 16); 66f7df2e56Smrg type = *(GLenum *) (pc + 20); 67f7df2e56Smrg swapBytes = *(GLboolean *) (pc + 24); 68f7df2e56Smrg lsbFirst = *(GLboolean *) (pc + 25); 69f7df2e56Smrg compsize = __glReadPixels_size(format, type, width, height); 700b0d8713Smrg if (compsize < 0) 710b0d8713Smrg return BadLength; 724642e01fSmrg 73f7df2e56Smrg glPixelStorei(GL_PACK_SWAP_BYTES, swapBytes); 74f7df2e56Smrg glPixelStorei(GL_PACK_LSB_FIRST, lsbFirst); 75f7df2e56Smrg __GLX_GET_ANSWER_BUFFER(answer, cl, compsize, 1); 764642e01fSmrg __glXClearErrorOccured(); 77f7df2e56Smrg glReadPixels(*(GLint *) (pc + 0), *(GLint *) (pc + 4), 78f7df2e56Smrg *(GLsizei *) (pc + 8), *(GLsizei *) (pc + 12), 79f7df2e56Smrg *(GLenum *) (pc + 16), *(GLenum *) (pc + 20), answer); 804642e01fSmrg 814642e01fSmrg if (__glXErrorOccured()) { 82f7df2e56Smrg __GLX_BEGIN_REPLY(0); 83f7df2e56Smrg __GLX_SEND_HEADER(); 844642e01fSmrg } 85f7df2e56Smrg else { 86f7df2e56Smrg __GLX_BEGIN_REPLY(compsize); 87f7df2e56Smrg __GLX_SEND_HEADER(); 88f7df2e56Smrg __GLX_SEND_VOID_ARRAY(compsize); 89f7df2e56Smrg } 904642e01fSmrg return Success; 914642e01fSmrg} 924642e01fSmrg 93f7df2e56Smrgint 94f7df2e56Smrg__glXDisp_GetTexImage(__GLXclientState * cl, GLbyte * pc) 954642e01fSmrg{ 964642e01fSmrg GLint level, compsize; 974642e01fSmrg GLenum format, type, target; 984642e01fSmrg GLboolean swapBytes; 994642e01fSmrg __GLXcontext *cx; 1004642e01fSmrg ClientPtr client = cl->client; 1014642e01fSmrg int error; 1024642e01fSmrg char *answer, answerBuffer[200]; 103f7df2e56Smrg GLint width = 0, height = 0, depth = 1; 1047e31ba66Smrg xGLXSingleReply reply = { 0, }; 105f7df2e56Smrg 106f7df2e56Smrg REQUEST_FIXED_SIZE(xGLXSingleReq, 20); 1074642e01fSmrg 1084642e01fSmrg cx = __glXForceCurrent(cl, __GLX_GET_SINGLE_CONTEXT_TAG(pc), &error); 1094642e01fSmrg if (!cx) { 110f7df2e56Smrg return error; 1114642e01fSmrg } 1124642e01fSmrg 1134642e01fSmrg pc += __GLX_SINGLE_HDR_SIZE; 114f7df2e56Smrg level = *(GLint *) (pc + 4); 115f7df2e56Smrg format = *(GLenum *) (pc + 8); 116f7df2e56Smrg type = *(GLenum *) (pc + 12); 117f7df2e56Smrg target = *(GLenum *) (pc + 0); 118f7df2e56Smrg swapBytes = *(GLboolean *) (pc + 16); 119f7df2e56Smrg 120f7df2e56Smrg glGetTexLevelParameteriv(target, level, GL_TEXTURE_WIDTH, &width); 121f7df2e56Smrg glGetTexLevelParameteriv(target, level, GL_TEXTURE_HEIGHT, &height); 122f7df2e56Smrg if (target == GL_TEXTURE_3D) { 123f7df2e56Smrg glGetTexLevelParameteriv(target, level, GL_TEXTURE_DEPTH, &depth); 1244642e01fSmrg } 1254642e01fSmrg /* 1264642e01fSmrg * The three queries above might fail if we're in a state where queries 1274642e01fSmrg * are illegal, but then width, height, and depth would still be zero anyway. 1284642e01fSmrg */ 129f7df2e56Smrg compsize = 130f7df2e56Smrg __glGetTexImage_size(target, level, format, type, width, height, depth); 1310b0d8713Smrg if (compsize < 0) 1320b0d8713Smrg return BadLength; 1334642e01fSmrg 134f7df2e56Smrg glPixelStorei(GL_PACK_SWAP_BYTES, swapBytes); 135f7df2e56Smrg __GLX_GET_ANSWER_BUFFER(answer, cl, compsize, 1); 1364642e01fSmrg __glXClearErrorOccured(); 137f7df2e56Smrg glGetTexImage(*(GLenum *) (pc + 0), *(GLint *) (pc + 4), 138f7df2e56Smrg *(GLenum *) (pc + 8), *(GLenum *) (pc + 12), answer); 1394642e01fSmrg 1404642e01fSmrg if (__glXErrorOccured()) { 141f7df2e56Smrg __GLX_BEGIN_REPLY(0); 142f7df2e56Smrg __GLX_SEND_HEADER(); 143f7df2e56Smrg } 144f7df2e56Smrg else { 145f7df2e56Smrg __GLX_BEGIN_REPLY(compsize); 1467e31ba66Smrg ((xGLXGetTexImageReply *) &reply)->width = width; 1477e31ba66Smrg ((xGLXGetTexImageReply *) &reply)->height = height; 1487e31ba66Smrg ((xGLXGetTexImageReply *) &reply)->depth = depth; 149f7df2e56Smrg __GLX_SEND_HEADER(); 150f7df2e56Smrg __GLX_SEND_VOID_ARRAY(compsize); 1514642e01fSmrg } 1524642e01fSmrg return Success; 1534642e01fSmrg} 1544642e01fSmrg 155f7df2e56Smrgint 156f7df2e56Smrg__glXDisp_GetPolygonStipple(__GLXclientState * cl, GLbyte * pc) 1574642e01fSmrg{ 1584642e01fSmrg GLboolean lsbFirst; 1594642e01fSmrg __GLXcontext *cx; 1604642e01fSmrg ClientPtr client = cl->client; 1614642e01fSmrg int error; 1624642e01fSmrg GLubyte answerBuffer[200]; 1634642e01fSmrg char *answer; 1647e31ba66Smrg xGLXSingleReply reply = { 0, }; 1654642e01fSmrg 1660b0d8713Smrg REQUEST_FIXED_SIZE(xGLXSingleReq, 4); 1670b0d8713Smrg 1684642e01fSmrg cx = __glXForceCurrent(cl, __GLX_GET_SINGLE_CONTEXT_TAG(pc), &error); 1694642e01fSmrg if (!cx) { 170f7df2e56Smrg return error; 1714642e01fSmrg } 1724642e01fSmrg 1734642e01fSmrg pc += __GLX_SINGLE_HDR_SIZE; 174f7df2e56Smrg lsbFirst = *(GLboolean *) (pc + 0); 1754642e01fSmrg 176f7df2e56Smrg glPixelStorei(GL_PACK_LSB_FIRST, lsbFirst); 177f7df2e56Smrg __GLX_GET_ANSWER_BUFFER(answer, cl, 128, 1); 1784642e01fSmrg 1794642e01fSmrg __glXClearErrorOccured(); 180f7df2e56Smrg glGetPolygonStipple((GLubyte *) answer); 1814642e01fSmrg 1824642e01fSmrg if (__glXErrorOccured()) { 183f7df2e56Smrg __GLX_BEGIN_REPLY(0); 184f7df2e56Smrg __GLX_SEND_HEADER(); 185f7df2e56Smrg } 186f7df2e56Smrg else { 187f7df2e56Smrg __GLX_BEGIN_REPLY(128); 188f7df2e56Smrg __GLX_SEND_HEADER(); 189f7df2e56Smrg __GLX_SEND_BYTE_ARRAY(128); 1904642e01fSmrg } 1914642e01fSmrg return Success; 1924642e01fSmrg} 1934642e01fSmrg 194f7df2e56Smrgstatic int 195f7df2e56SmrgGetSeparableFilter(__GLXclientState * cl, GLbyte * pc, GLXContextTag tag) 1964642e01fSmrg{ 1974642e01fSmrg GLint compsize, compsize2; 1984642e01fSmrg GLenum format, type, target; 1994642e01fSmrg GLboolean swapBytes; 2004642e01fSmrg __GLXcontext *cx; 2014642e01fSmrg ClientPtr client = cl->client; 2024642e01fSmrg int error; 2034642e01fSmrg char *answer, answerBuffer[200]; 204f7df2e56Smrg GLint width = 0, height = 0; 2057e31ba66Smrg xGLXSingleReply reply = { 0, }; 2064642e01fSmrg 2074642e01fSmrg cx = __glXForceCurrent(cl, tag, &error); 2084642e01fSmrg if (!cx) { 209f7df2e56Smrg return error; 2104642e01fSmrg } 2114642e01fSmrg 212f7df2e56Smrg format = *(GLenum *) (pc + 4); 213f7df2e56Smrg type = *(GLenum *) (pc + 8); 214f7df2e56Smrg target = *(GLenum *) (pc + 0); 215f7df2e56Smrg swapBytes = *(GLboolean *) (pc + 12); 2164642e01fSmrg 2174642e01fSmrg /* target must be SEPARABLE_2D, however I guess we can let the GL 2184642e01fSmrg barf on this one.... */ 2194642e01fSmrg 220f7df2e56Smrg glGetConvolutionParameteriv(target, GL_CONVOLUTION_WIDTH, &width); 221f7df2e56Smrg glGetConvolutionParameteriv(target, GL_CONVOLUTION_HEIGHT, &height); 2224642e01fSmrg /* 2234642e01fSmrg * The two queries above might fail if we're in a state where queries 2244642e01fSmrg * are illegal, but then width and height would still be zero anyway. 2254642e01fSmrg */ 226f7df2e56Smrg compsize = __glGetTexImage_size(target, 1, format, type, width, 1, 1); 227f7df2e56Smrg compsize2 = __glGetTexImage_size(target, 1, format, type, height, 1, 1); 2284642e01fSmrg 2290b0d8713Smrg if ((compsize = safe_pad(compsize)) < 0) 2300b0d8713Smrg return BadLength; 2310b0d8713Smrg if ((compsize2 = safe_pad(compsize2)) < 0) 2320b0d8713Smrg return BadLength; 2334642e01fSmrg 234f7df2e56Smrg glPixelStorei(GL_PACK_SWAP_BYTES, swapBytes); 2350b0d8713Smrg __GLX_GET_ANSWER_BUFFER(answer, cl, safe_add(compsize, compsize2), 1); 2364642e01fSmrg __glXClearErrorOccured(); 237f7df2e56Smrg glGetSeparableFilter(*(GLenum *) (pc + 0), *(GLenum *) (pc + 4), 238f7df2e56Smrg *(GLenum *) (pc + 8), answer, answer + compsize, NULL); 2394642e01fSmrg 2404642e01fSmrg if (__glXErrorOccured()) { 241f7df2e56Smrg __GLX_BEGIN_REPLY(0); 242f7df2e56Smrg __GLX_SEND_HEADER(); 243f7df2e56Smrg } 244f7df2e56Smrg else { 245f7df2e56Smrg __GLX_BEGIN_REPLY(compsize + compsize2); 2467e31ba66Smrg ((xGLXGetSeparableFilterReply *) &reply)->width = width; 2477e31ba66Smrg ((xGLXGetSeparableFilterReply *) &reply)->height = height; 248f7df2e56Smrg __GLX_SEND_HEADER(); 249f7df2e56Smrg __GLX_SEND_VOID_ARRAY(compsize + compsize2); 2504642e01fSmrg } 2514642e01fSmrg 2524642e01fSmrg return Success; 2534642e01fSmrg} 2544642e01fSmrg 255f7df2e56Smrgint 256f7df2e56Smrg__glXDisp_GetSeparableFilter(__GLXclientState * cl, GLbyte * pc) 2574642e01fSmrg{ 2584642e01fSmrg const GLXContextTag tag = __GLX_GET_SINGLE_CONTEXT_TAG(pc); 2590b0d8713Smrg ClientPtr client = cl->client; 2600b0d8713Smrg REQUEST_FIXED_SIZE(xGLXSingleReq, 16); 2614642e01fSmrg return GetSeparableFilter(cl, pc + __GLX_SINGLE_HDR_SIZE, tag); 2624642e01fSmrg} 2634642e01fSmrg 264f7df2e56Smrgint 265f7df2e56Smrg__glXDisp_GetSeparableFilterEXT(__GLXclientState * cl, GLbyte * pc) 2664642e01fSmrg{ 2674642e01fSmrg const GLXContextTag tag = __GLX_GET_VENDPRIV_CONTEXT_TAG(pc); 2680b0d8713Smrg ClientPtr client = cl->client; 2690b0d8713Smrg REQUEST_FIXED_SIZE(xGLXVendorPrivateReq, 16); 2704642e01fSmrg return GetSeparableFilter(cl, pc + __GLX_VENDPRIV_HDR_SIZE, tag); 2714642e01fSmrg} 2724642e01fSmrg 273f7df2e56Smrgstatic int 274f7df2e56SmrgGetConvolutionFilter(__GLXclientState * cl, GLbyte * pc, GLXContextTag tag) 2754642e01fSmrg{ 2764642e01fSmrg GLint compsize; 2774642e01fSmrg GLenum format, type, target; 2784642e01fSmrg GLboolean swapBytes; 2794642e01fSmrg __GLXcontext *cx; 2804642e01fSmrg ClientPtr client = cl->client; 2814642e01fSmrg int error; 2824642e01fSmrg char *answer, answerBuffer[200]; 283f7df2e56Smrg GLint width = 0, height = 0; 2847e31ba66Smrg xGLXSingleReply reply = { 0, }; 2854642e01fSmrg 2864642e01fSmrg cx = __glXForceCurrent(cl, tag, &error); 2874642e01fSmrg if (!cx) { 288f7df2e56Smrg return error; 2894642e01fSmrg } 2904642e01fSmrg 291f7df2e56Smrg format = *(GLenum *) (pc + 4); 292f7df2e56Smrg type = *(GLenum *) (pc + 8); 293f7df2e56Smrg target = *(GLenum *) (pc + 0); 294f7df2e56Smrg swapBytes = *(GLboolean *) (pc + 12); 2954642e01fSmrg 296f7df2e56Smrg glGetConvolutionParameteriv(target, GL_CONVOLUTION_WIDTH, &width); 2974642e01fSmrg if (target == GL_CONVOLUTION_1D) { 2984642e01fSmrg height = 1; 299f7df2e56Smrg } 300f7df2e56Smrg else { 301f7df2e56Smrg glGetConvolutionParameteriv(target, GL_CONVOLUTION_HEIGHT, &height); 3024642e01fSmrg } 3034642e01fSmrg /* 3044642e01fSmrg * The two queries above might fail if we're in a state where queries 3054642e01fSmrg * are illegal, but then width and height would still be zero anyway. 3064642e01fSmrg */ 307f7df2e56Smrg compsize = __glGetTexImage_size(target, 1, format, type, width, height, 1); 3080b0d8713Smrg if (compsize < 0) 3090b0d8713Smrg return BadLength; 3104642e01fSmrg 311f7df2e56Smrg glPixelStorei(GL_PACK_SWAP_BYTES, swapBytes); 312f7df2e56Smrg __GLX_GET_ANSWER_BUFFER(answer, cl, compsize, 1); 3134642e01fSmrg __glXClearErrorOccured(); 314f7df2e56Smrg glGetConvolutionFilter(*(GLenum *) (pc + 0), *(GLenum *) (pc + 4), 315f7df2e56Smrg *(GLenum *) (pc + 8), answer); 3164642e01fSmrg 3174642e01fSmrg if (__glXErrorOccured()) { 318f7df2e56Smrg __GLX_BEGIN_REPLY(0); 319f7df2e56Smrg __GLX_SEND_HEADER(); 320f7df2e56Smrg } 321f7df2e56Smrg else { 322f7df2e56Smrg __GLX_BEGIN_REPLY(compsize); 3237e31ba66Smrg ((xGLXGetConvolutionFilterReply *) &reply)->width = width; 3247e31ba66Smrg ((xGLXGetConvolutionFilterReply *) &reply)->height = height; 325f7df2e56Smrg __GLX_SEND_HEADER(); 326f7df2e56Smrg __GLX_SEND_VOID_ARRAY(compsize); 3274642e01fSmrg } 3284642e01fSmrg 3294642e01fSmrg return Success; 3304642e01fSmrg} 3314642e01fSmrg 332f7df2e56Smrgint 333f7df2e56Smrg__glXDisp_GetConvolutionFilter(__GLXclientState * cl, GLbyte * pc) 3344642e01fSmrg{ 3354642e01fSmrg const GLXContextTag tag = __GLX_GET_SINGLE_CONTEXT_TAG(pc); 3360b0d8713Smrg ClientPtr client = cl->client; 3370b0d8713Smrg REQUEST_FIXED_SIZE(xGLXSingleReq, 16); 3384642e01fSmrg return GetConvolutionFilter(cl, pc + __GLX_SINGLE_HDR_SIZE, tag); 3394642e01fSmrg} 3404642e01fSmrg 341f7df2e56Smrgint 342f7df2e56Smrg__glXDisp_GetConvolutionFilterEXT(__GLXclientState * cl, GLbyte * pc) 3434642e01fSmrg{ 3444642e01fSmrg const GLXContextTag tag = __GLX_GET_VENDPRIV_CONTEXT_TAG(pc); 3450b0d8713Smrg ClientPtr client = cl->client; 3460b0d8713Smrg REQUEST_FIXED_SIZE(xGLXVendorPrivateReq, 16); 3474642e01fSmrg return GetConvolutionFilter(cl, pc + __GLX_VENDPRIV_HDR_SIZE, tag); 3484642e01fSmrg} 3494642e01fSmrg 350f7df2e56Smrgstatic int 351f7df2e56SmrgGetHistogram(__GLXclientState * cl, GLbyte * pc, GLXContextTag tag) 3524642e01fSmrg{ 3534642e01fSmrg GLint compsize; 3544642e01fSmrg GLenum format, type, target; 3554642e01fSmrg GLboolean swapBytes, reset; 3564642e01fSmrg __GLXcontext *cx; 3574642e01fSmrg ClientPtr client = cl->client; 3584642e01fSmrg int error; 3594642e01fSmrg char *answer, answerBuffer[200]; 360f7df2e56Smrg GLint width = 0; 3617e31ba66Smrg xGLXSingleReply reply = { 0, }; 3624642e01fSmrg 3634642e01fSmrg cx = __glXForceCurrent(cl, tag, &error); 3644642e01fSmrg if (!cx) { 365f7df2e56Smrg return error; 3664642e01fSmrg } 3674642e01fSmrg 368f7df2e56Smrg format = *(GLenum *) (pc + 4); 369f7df2e56Smrg type = *(GLenum *) (pc + 8); 370f7df2e56Smrg target = *(GLenum *) (pc + 0); 371f7df2e56Smrg swapBytes = *(GLboolean *) (pc + 12); 372f7df2e56Smrg reset = *(GLboolean *) (pc + 13); 3734642e01fSmrg 374f7df2e56Smrg glGetHistogramParameteriv(target, GL_HISTOGRAM_WIDTH, &width); 3754642e01fSmrg /* 3764642e01fSmrg * The one query above might fail if we're in a state where queries 3774642e01fSmrg * are illegal, but then width would still be zero anyway. 3784642e01fSmrg */ 379f7df2e56Smrg compsize = __glGetTexImage_size(target, 1, format, type, width, 1, 1); 3800b0d8713Smrg if (compsize < 0) 3810b0d8713Smrg return BadLength; 3824642e01fSmrg 383f7df2e56Smrg glPixelStorei(GL_PACK_SWAP_BYTES, swapBytes); 384f7df2e56Smrg __GLX_GET_ANSWER_BUFFER(answer, cl, compsize, 1); 3854642e01fSmrg __glXClearErrorOccured(); 386f7df2e56Smrg glGetHistogram(target, reset, format, type, answer); 3874642e01fSmrg 3884642e01fSmrg if (__glXErrorOccured()) { 389f7df2e56Smrg __GLX_BEGIN_REPLY(0); 390f7df2e56Smrg __GLX_SEND_HEADER(); 391f7df2e56Smrg } 392f7df2e56Smrg else { 393f7df2e56Smrg __GLX_BEGIN_REPLY(compsize); 3947e31ba66Smrg ((xGLXGetHistogramReply *) &reply)->width = width; 395f7df2e56Smrg __GLX_SEND_HEADER(); 396f7df2e56Smrg __GLX_SEND_VOID_ARRAY(compsize); 3974642e01fSmrg } 3984642e01fSmrg 3994642e01fSmrg return Success; 4004642e01fSmrg} 4014642e01fSmrg 402f7df2e56Smrgint 403f7df2e56Smrg__glXDisp_GetHistogram(__GLXclientState * cl, GLbyte * pc) 4044642e01fSmrg{ 4054642e01fSmrg const GLXContextTag tag = __GLX_GET_SINGLE_CONTEXT_TAG(pc); 4060b0d8713Smrg ClientPtr client = cl->client; 4070b0d8713Smrg REQUEST_FIXED_SIZE(xGLXSingleReq, 16); 4084642e01fSmrg return GetHistogram(cl, pc + __GLX_SINGLE_HDR_SIZE, tag); 4094642e01fSmrg} 4104642e01fSmrg 411f7df2e56Smrgint 412f7df2e56Smrg__glXDisp_GetHistogramEXT(__GLXclientState * cl, GLbyte * pc) 4134642e01fSmrg{ 4144642e01fSmrg const GLXContextTag tag = __GLX_GET_VENDPRIV_CONTEXT_TAG(pc); 4150b0d8713Smrg ClientPtr client = cl->client; 4160b0d8713Smrg REQUEST_FIXED_SIZE(xGLXVendorPrivateReq, 16); 4174642e01fSmrg return GetHistogram(cl, pc + __GLX_VENDPRIV_HDR_SIZE, tag); 4184642e01fSmrg} 4194642e01fSmrg 420f7df2e56Smrgstatic int 421f7df2e56SmrgGetMinmax(__GLXclientState * cl, GLbyte * pc, GLXContextTag tag) 4224642e01fSmrg{ 4234642e01fSmrg GLint compsize; 4244642e01fSmrg GLenum format, type, target; 4254642e01fSmrg GLboolean swapBytes, reset; 4264642e01fSmrg __GLXcontext *cx; 4274642e01fSmrg ClientPtr client = cl->client; 4284642e01fSmrg int error; 4294642e01fSmrg char *answer, answerBuffer[200]; 4307e31ba66Smrg xGLXSingleReply reply = { 0, }; 4314642e01fSmrg 4324642e01fSmrg cx = __glXForceCurrent(cl, tag, &error); 4334642e01fSmrg if (!cx) { 434f7df2e56Smrg return error; 4354642e01fSmrg } 4364642e01fSmrg 437f7df2e56Smrg format = *(GLenum *) (pc + 4); 438f7df2e56Smrg type = *(GLenum *) (pc + 8); 439f7df2e56Smrg target = *(GLenum *) (pc + 0); 440f7df2e56Smrg swapBytes = *(GLboolean *) (pc + 12); 441f7df2e56Smrg reset = *(GLboolean *) (pc + 13); 4424642e01fSmrg 443f7df2e56Smrg compsize = __glGetTexImage_size(target, 1, format, type, 2, 1, 1); 4440b0d8713Smrg if (compsize < 0) 4450b0d8713Smrg return BadLength; 4464642e01fSmrg 447f7df2e56Smrg glPixelStorei(GL_PACK_SWAP_BYTES, swapBytes); 448f7df2e56Smrg __GLX_GET_ANSWER_BUFFER(answer, cl, compsize, 1); 4494642e01fSmrg __glXClearErrorOccured(); 450f7df2e56Smrg glGetMinmax(target, reset, format, type, answer); 4514642e01fSmrg 4524642e01fSmrg if (__glXErrorOccured()) { 453f7df2e56Smrg __GLX_BEGIN_REPLY(0); 454f7df2e56Smrg __GLX_SEND_HEADER(); 455f7df2e56Smrg } 456f7df2e56Smrg else { 457f7df2e56Smrg __GLX_BEGIN_REPLY(compsize); 458f7df2e56Smrg __GLX_SEND_HEADER(); 459f7df2e56Smrg __GLX_SEND_VOID_ARRAY(compsize); 4604642e01fSmrg } 4614642e01fSmrg 4624642e01fSmrg return Success; 4634642e01fSmrg} 4644642e01fSmrg 465f7df2e56Smrgint 466f7df2e56Smrg__glXDisp_GetMinmax(__GLXclientState * cl, GLbyte * pc) 4674642e01fSmrg{ 4684642e01fSmrg const GLXContextTag tag = __GLX_GET_SINGLE_CONTEXT_TAG(pc); 4690b0d8713Smrg ClientPtr client = cl->client; 4700b0d8713Smrg REQUEST_FIXED_SIZE(xGLXSingleReq, 16); 4714642e01fSmrg return GetMinmax(cl, pc + __GLX_SINGLE_HDR_SIZE, tag); 4724642e01fSmrg} 4734642e01fSmrg 474f7df2e56Smrgint 475f7df2e56Smrg__glXDisp_GetMinmaxEXT(__GLXclientState * cl, GLbyte * pc) 4764642e01fSmrg{ 4774642e01fSmrg const GLXContextTag tag = __GLX_GET_VENDPRIV_CONTEXT_TAG(pc); 4780b0d8713Smrg ClientPtr client = cl->client; 4790b0d8713Smrg REQUEST_FIXED_SIZE(xGLXVendorPrivateReq, 16); 4804642e01fSmrg return GetMinmax(cl, pc + __GLX_VENDPRIV_HDR_SIZE, tag); 4814642e01fSmrg} 4824642e01fSmrg 483f7df2e56Smrgstatic int 484f7df2e56SmrgGetColorTable(__GLXclientState * cl, GLbyte * pc, GLXContextTag tag) 4854642e01fSmrg{ 4864642e01fSmrg GLint compsize; 4874642e01fSmrg GLenum format, type, target; 4884642e01fSmrg GLboolean swapBytes; 4894642e01fSmrg __GLXcontext *cx; 4904642e01fSmrg ClientPtr client = cl->client; 4914642e01fSmrg int error; 4924642e01fSmrg char *answer, answerBuffer[200]; 493f7df2e56Smrg GLint width = 0; 4947e31ba66Smrg xGLXSingleReply reply = { 0, }; 4954642e01fSmrg 4964642e01fSmrg cx = __glXForceCurrent(cl, tag, &error); 4974642e01fSmrg if (!cx) { 498f7df2e56Smrg return error; 4994642e01fSmrg } 5004642e01fSmrg 501f7df2e56Smrg target = *(GLenum *) (pc + 0); 502f7df2e56Smrg format = *(GLenum *) (pc + 4); 503f7df2e56Smrg type = *(GLenum *) (pc + 8); 504f7df2e56Smrg swapBytes = *(GLboolean *) (pc + 12); 5054642e01fSmrg 506f7df2e56Smrg glGetColorTableParameteriv(target, GL_COLOR_TABLE_WIDTH, &width); 5074642e01fSmrg /* 5084642e01fSmrg * The one query above might fail if we're in a state where queries 5094642e01fSmrg * are illegal, but then width would still be zero anyway. 5104642e01fSmrg */ 511f7df2e56Smrg compsize = __glGetTexImage_size(target, 1, format, type, width, 1, 1); 5120b0d8713Smrg if (compsize < 0) 5130b0d8713Smrg return BadLength; 5144642e01fSmrg 515f7df2e56Smrg glPixelStorei(GL_PACK_SWAP_BYTES, swapBytes); 516f7df2e56Smrg __GLX_GET_ANSWER_BUFFER(answer, cl, compsize, 1); 5174642e01fSmrg __glXClearErrorOccured(); 518f7df2e56Smrg glGetColorTable(*(GLenum *) (pc + 0), *(GLenum *) (pc + 4), 519f7df2e56Smrg *(GLenum *) (pc + 8), answer); 5204642e01fSmrg 5214642e01fSmrg if (__glXErrorOccured()) { 522f7df2e56Smrg __GLX_BEGIN_REPLY(0); 523f7df2e56Smrg __GLX_SEND_HEADER(); 524f7df2e56Smrg } 525f7df2e56Smrg else { 526f7df2e56Smrg __GLX_BEGIN_REPLY(compsize); 5277e31ba66Smrg ((xGLXGetColorTableReply *) &reply)->width = width; 528f7df2e56Smrg __GLX_SEND_HEADER(); 529f7df2e56Smrg __GLX_SEND_VOID_ARRAY(compsize); 5304642e01fSmrg } 5314642e01fSmrg 5324642e01fSmrg return Success; 5334642e01fSmrg} 5344642e01fSmrg 535f7df2e56Smrgint 536f7df2e56Smrg__glXDisp_GetColorTable(__GLXclientState * cl, GLbyte * pc) 5374642e01fSmrg{ 5384642e01fSmrg const GLXContextTag tag = __GLX_GET_SINGLE_CONTEXT_TAG(pc); 5390b0d8713Smrg ClientPtr client = cl->client; 5400b0d8713Smrg REQUEST_FIXED_SIZE(xGLXSingleReq, 16); 5414642e01fSmrg return GetColorTable(cl, pc + __GLX_SINGLE_HDR_SIZE, tag); 5424642e01fSmrg} 5434642e01fSmrg 544f7df2e56Smrgint 545f7df2e56Smrg__glXDisp_GetColorTableSGI(__GLXclientState * cl, GLbyte * pc) 5464642e01fSmrg{ 5474642e01fSmrg const GLXContextTag tag = __GLX_GET_VENDPRIV_CONTEXT_TAG(pc); 5480b0d8713Smrg ClientPtr client = cl->client; 5490b0d8713Smrg REQUEST_FIXED_SIZE(xGLXVendorPrivateReq, 16); 5504642e01fSmrg return GetColorTable(cl, pc + __GLX_VENDPRIV_HDR_SIZE, tag); 5514642e01fSmrg} 552