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