singlepix.c revision 7e31ba66
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
1080b0d8713Smrg    REQUEST_FIXED_SIZE(xGLXSingleReq, 20);
1090b0d8713Smrg
1104642e01fSmrg    cx = __glXForceCurrent(cl, __GLX_GET_SINGLE_CONTEXT_TAG(pc), &error);
1114642e01fSmrg    if (!cx) {
112f7df2e56Smrg        return error;
1134642e01fSmrg    }
1144642e01fSmrg
1154642e01fSmrg    pc += __GLX_SINGLE_HDR_SIZE;
116f7df2e56Smrg    level = *(GLint *) (pc + 4);
117f7df2e56Smrg    format = *(GLenum *) (pc + 8);
118f7df2e56Smrg    type = *(GLenum *) (pc + 12);
119f7df2e56Smrg    target = *(GLenum *) (pc + 0);
120f7df2e56Smrg    swapBytes = *(GLboolean *) (pc + 16);
121f7df2e56Smrg
122f7df2e56Smrg    glGetTexLevelParameteriv(target, level, GL_TEXTURE_WIDTH, &width);
123f7df2e56Smrg    glGetTexLevelParameteriv(target, level, GL_TEXTURE_HEIGHT, &height);
124f7df2e56Smrg    if (target == GL_TEXTURE_3D) {
125f7df2e56Smrg        glGetTexLevelParameteriv(target, level, GL_TEXTURE_DEPTH, &depth);
1264642e01fSmrg    }
1274642e01fSmrg    /*
1284642e01fSmrg     * The three queries above might fail if we're in a state where queries
1294642e01fSmrg     * are illegal, but then width, height, and depth would still be zero anyway.
1304642e01fSmrg     */
131f7df2e56Smrg    compsize =
132f7df2e56Smrg        __glGetTexImage_size(target, level, format, type, width, height, depth);
1330b0d8713Smrg    if (compsize < 0)
1340b0d8713Smrg        return BadLength;
1354642e01fSmrg
136f7df2e56Smrg    glPixelStorei(GL_PACK_SWAP_BYTES, swapBytes);
137f7df2e56Smrg    __GLX_GET_ANSWER_BUFFER(answer, cl, compsize, 1);
1384642e01fSmrg    __glXClearErrorOccured();
139f7df2e56Smrg    glGetTexImage(*(GLenum *) (pc + 0), *(GLint *) (pc + 4),
140f7df2e56Smrg                  *(GLenum *) (pc + 8), *(GLenum *) (pc + 12), answer);
1414642e01fSmrg
1424642e01fSmrg    if (__glXErrorOccured()) {
143f7df2e56Smrg        __GLX_BEGIN_REPLY(0);
144f7df2e56Smrg        __GLX_SEND_HEADER();
145f7df2e56Smrg    }
146f7df2e56Smrg    else {
147f7df2e56Smrg        __GLX_BEGIN_REPLY(compsize);
1487e31ba66Smrg        ((xGLXGetTexImageReply *) &reply)->width = width;
1497e31ba66Smrg        ((xGLXGetTexImageReply *) &reply)->height = height;
1507e31ba66Smrg        ((xGLXGetTexImageReply *) &reply)->depth = depth;
151f7df2e56Smrg        __GLX_SEND_HEADER();
152f7df2e56Smrg        __GLX_SEND_VOID_ARRAY(compsize);
1534642e01fSmrg    }
1544642e01fSmrg    return Success;
1554642e01fSmrg}
1564642e01fSmrg
157f7df2e56Smrgint
158f7df2e56Smrg__glXDisp_GetPolygonStipple(__GLXclientState * cl, GLbyte * pc)
1594642e01fSmrg{
1604642e01fSmrg    GLboolean lsbFirst;
1614642e01fSmrg    __GLXcontext *cx;
1624642e01fSmrg    ClientPtr client = cl->client;
1634642e01fSmrg    int error;
1644642e01fSmrg    GLubyte answerBuffer[200];
1654642e01fSmrg    char *answer;
1667e31ba66Smrg    xGLXSingleReply reply = { 0, };
1674642e01fSmrg
1680b0d8713Smrg    REQUEST_FIXED_SIZE(xGLXSingleReq, 4);
1690b0d8713Smrg
1704642e01fSmrg    cx = __glXForceCurrent(cl, __GLX_GET_SINGLE_CONTEXT_TAG(pc), &error);
1714642e01fSmrg    if (!cx) {
172f7df2e56Smrg        return error;
1734642e01fSmrg    }
1744642e01fSmrg
1754642e01fSmrg    pc += __GLX_SINGLE_HDR_SIZE;
176f7df2e56Smrg    lsbFirst = *(GLboolean *) (pc + 0);
1774642e01fSmrg
178f7df2e56Smrg    glPixelStorei(GL_PACK_LSB_FIRST, lsbFirst);
179f7df2e56Smrg    __GLX_GET_ANSWER_BUFFER(answer, cl, 128, 1);
1804642e01fSmrg
1814642e01fSmrg    __glXClearErrorOccured();
182f7df2e56Smrg    glGetPolygonStipple((GLubyte *) answer);
1834642e01fSmrg
1844642e01fSmrg    if (__glXErrorOccured()) {
185f7df2e56Smrg        __GLX_BEGIN_REPLY(0);
186f7df2e56Smrg        __GLX_SEND_HEADER();
187f7df2e56Smrg    }
188f7df2e56Smrg    else {
189f7df2e56Smrg        __GLX_BEGIN_REPLY(128);
190f7df2e56Smrg        __GLX_SEND_HEADER();
191f7df2e56Smrg        __GLX_SEND_BYTE_ARRAY(128);
1924642e01fSmrg    }
1934642e01fSmrg    return Success;
1944642e01fSmrg}
1954642e01fSmrg
196f7df2e56Smrgstatic int
197f7df2e56SmrgGetSeparableFilter(__GLXclientState * cl, GLbyte * pc, GLXContextTag tag)
1984642e01fSmrg{
1994642e01fSmrg    GLint compsize, compsize2;
2004642e01fSmrg    GLenum format, type, target;
2014642e01fSmrg    GLboolean swapBytes;
2024642e01fSmrg    __GLXcontext *cx;
2034642e01fSmrg    ClientPtr client = cl->client;
2044642e01fSmrg    int error;
2054642e01fSmrg    char *answer, answerBuffer[200];
206f7df2e56Smrg    GLint width = 0, height = 0;
2077e31ba66Smrg    xGLXSingleReply reply = { 0, };
2084642e01fSmrg
2094642e01fSmrg    cx = __glXForceCurrent(cl, tag, &error);
2104642e01fSmrg    if (!cx) {
211f7df2e56Smrg        return error;
2124642e01fSmrg    }
2134642e01fSmrg
214f7df2e56Smrg    format = *(GLenum *) (pc + 4);
215f7df2e56Smrg    type = *(GLenum *) (pc + 8);
216f7df2e56Smrg    target = *(GLenum *) (pc + 0);
217f7df2e56Smrg    swapBytes = *(GLboolean *) (pc + 12);
2184642e01fSmrg
2194642e01fSmrg    /* target must be SEPARABLE_2D, however I guess we can let the GL
2204642e01fSmrg       barf on this one.... */
2214642e01fSmrg
222f7df2e56Smrg    glGetConvolutionParameteriv(target, GL_CONVOLUTION_WIDTH, &width);
223f7df2e56Smrg    glGetConvolutionParameteriv(target, GL_CONVOLUTION_HEIGHT, &height);
2244642e01fSmrg    /*
2254642e01fSmrg     * The two queries above might fail if we're in a state where queries
2264642e01fSmrg     * are illegal, but then width and height would still be zero anyway.
2274642e01fSmrg     */
228f7df2e56Smrg    compsize = __glGetTexImage_size(target, 1, format, type, width, 1, 1);
229f7df2e56Smrg    compsize2 = __glGetTexImage_size(target, 1, format, type, height, 1, 1);
2304642e01fSmrg
2310b0d8713Smrg    if ((compsize = safe_pad(compsize)) < 0)
2320b0d8713Smrg        return BadLength;
2330b0d8713Smrg    if ((compsize2 = safe_pad(compsize2)) < 0)
2340b0d8713Smrg        return BadLength;
2354642e01fSmrg
236f7df2e56Smrg    glPixelStorei(GL_PACK_SWAP_BYTES, swapBytes);
2370b0d8713Smrg    __GLX_GET_ANSWER_BUFFER(answer, cl, safe_add(compsize, compsize2), 1);
2384642e01fSmrg    __glXClearErrorOccured();
239f7df2e56Smrg    glGetSeparableFilter(*(GLenum *) (pc + 0), *(GLenum *) (pc + 4),
240f7df2e56Smrg                         *(GLenum *) (pc + 8), answer, answer + compsize, NULL);
2414642e01fSmrg
2424642e01fSmrg    if (__glXErrorOccured()) {
243f7df2e56Smrg        __GLX_BEGIN_REPLY(0);
244f7df2e56Smrg        __GLX_SEND_HEADER();
245f7df2e56Smrg    }
246f7df2e56Smrg    else {
247f7df2e56Smrg        __GLX_BEGIN_REPLY(compsize + compsize2);
2487e31ba66Smrg        ((xGLXGetSeparableFilterReply *) &reply)->width = width;
2497e31ba66Smrg        ((xGLXGetSeparableFilterReply *) &reply)->height = height;
250f7df2e56Smrg        __GLX_SEND_HEADER();
251f7df2e56Smrg        __GLX_SEND_VOID_ARRAY(compsize + compsize2);
2524642e01fSmrg    }
2534642e01fSmrg
2544642e01fSmrg    return Success;
2554642e01fSmrg}
2564642e01fSmrg
257f7df2e56Smrgint
258f7df2e56Smrg__glXDisp_GetSeparableFilter(__GLXclientState * cl, GLbyte * pc)
2594642e01fSmrg{
2604642e01fSmrg    const GLXContextTag tag = __GLX_GET_SINGLE_CONTEXT_TAG(pc);
2610b0d8713Smrg    ClientPtr client = cl->client;
2620b0d8713Smrg    REQUEST_FIXED_SIZE(xGLXSingleReq, 16);
2634642e01fSmrg    return GetSeparableFilter(cl, pc + __GLX_SINGLE_HDR_SIZE, tag);
2644642e01fSmrg}
2654642e01fSmrg
266f7df2e56Smrgint
267f7df2e56Smrg__glXDisp_GetSeparableFilterEXT(__GLXclientState * cl, GLbyte * pc)
2684642e01fSmrg{
2694642e01fSmrg    const GLXContextTag tag = __GLX_GET_VENDPRIV_CONTEXT_TAG(pc);
2700b0d8713Smrg    ClientPtr client = cl->client;
2710b0d8713Smrg    REQUEST_FIXED_SIZE(xGLXVendorPrivateReq, 16);
2724642e01fSmrg    return GetSeparableFilter(cl, pc + __GLX_VENDPRIV_HDR_SIZE, tag);
2734642e01fSmrg}
2744642e01fSmrg
275f7df2e56Smrgstatic int
276f7df2e56SmrgGetConvolutionFilter(__GLXclientState * cl, GLbyte * pc, GLXContextTag tag)
2774642e01fSmrg{
2784642e01fSmrg    GLint compsize;
2794642e01fSmrg    GLenum format, type, target;
2804642e01fSmrg    GLboolean swapBytes;
2814642e01fSmrg    __GLXcontext *cx;
2824642e01fSmrg    ClientPtr client = cl->client;
2834642e01fSmrg    int error;
2844642e01fSmrg    char *answer, answerBuffer[200];
285f7df2e56Smrg    GLint width = 0, height = 0;
2867e31ba66Smrg    xGLXSingleReply reply = { 0, };
2874642e01fSmrg
2884642e01fSmrg    cx = __glXForceCurrent(cl, tag, &error);
2894642e01fSmrg    if (!cx) {
290f7df2e56Smrg        return error;
2914642e01fSmrg    }
2924642e01fSmrg
293f7df2e56Smrg    format = *(GLenum *) (pc + 4);
294f7df2e56Smrg    type = *(GLenum *) (pc + 8);
295f7df2e56Smrg    target = *(GLenum *) (pc + 0);
296f7df2e56Smrg    swapBytes = *(GLboolean *) (pc + 12);
2974642e01fSmrg
298f7df2e56Smrg    glGetConvolutionParameteriv(target, GL_CONVOLUTION_WIDTH, &width);
2994642e01fSmrg    if (target == GL_CONVOLUTION_1D) {
3004642e01fSmrg        height = 1;
301f7df2e56Smrg    }
302f7df2e56Smrg    else {
303f7df2e56Smrg        glGetConvolutionParameteriv(target, GL_CONVOLUTION_HEIGHT, &height);
3044642e01fSmrg    }
3054642e01fSmrg    /*
3064642e01fSmrg     * The two queries above might fail if we're in a state where queries
3074642e01fSmrg     * are illegal, but then width and height would still be zero anyway.
3084642e01fSmrg     */
309f7df2e56Smrg    compsize = __glGetTexImage_size(target, 1, format, type, width, height, 1);
3100b0d8713Smrg    if (compsize < 0)
3110b0d8713Smrg        return BadLength;
3124642e01fSmrg
313f7df2e56Smrg    glPixelStorei(GL_PACK_SWAP_BYTES, swapBytes);
314f7df2e56Smrg    __GLX_GET_ANSWER_BUFFER(answer, cl, compsize, 1);
3154642e01fSmrg    __glXClearErrorOccured();
316f7df2e56Smrg    glGetConvolutionFilter(*(GLenum *) (pc + 0), *(GLenum *) (pc + 4),
317f7df2e56Smrg                           *(GLenum *) (pc + 8), answer);
3184642e01fSmrg
3194642e01fSmrg    if (__glXErrorOccured()) {
320f7df2e56Smrg        __GLX_BEGIN_REPLY(0);
321f7df2e56Smrg        __GLX_SEND_HEADER();
322f7df2e56Smrg    }
323f7df2e56Smrg    else {
324f7df2e56Smrg        __GLX_BEGIN_REPLY(compsize);
3257e31ba66Smrg        ((xGLXGetConvolutionFilterReply *) &reply)->width = width;
3267e31ba66Smrg        ((xGLXGetConvolutionFilterReply *) &reply)->height = height;
327f7df2e56Smrg        __GLX_SEND_HEADER();
328f7df2e56Smrg        __GLX_SEND_VOID_ARRAY(compsize);
3294642e01fSmrg    }
3304642e01fSmrg
3314642e01fSmrg    return Success;
3324642e01fSmrg}
3334642e01fSmrg
334f7df2e56Smrgint
335f7df2e56Smrg__glXDisp_GetConvolutionFilter(__GLXclientState * cl, GLbyte * pc)
3364642e01fSmrg{
3374642e01fSmrg    const GLXContextTag tag = __GLX_GET_SINGLE_CONTEXT_TAG(pc);
3380b0d8713Smrg    ClientPtr client = cl->client;
3390b0d8713Smrg    REQUEST_FIXED_SIZE(xGLXSingleReq, 16);
3404642e01fSmrg    return GetConvolutionFilter(cl, pc + __GLX_SINGLE_HDR_SIZE, tag);
3414642e01fSmrg}
3424642e01fSmrg
343f7df2e56Smrgint
344f7df2e56Smrg__glXDisp_GetConvolutionFilterEXT(__GLXclientState * cl, GLbyte * pc)
3454642e01fSmrg{
3464642e01fSmrg    const GLXContextTag tag = __GLX_GET_VENDPRIV_CONTEXT_TAG(pc);
3470b0d8713Smrg    ClientPtr client = cl->client;
3480b0d8713Smrg    REQUEST_FIXED_SIZE(xGLXVendorPrivateReq, 16);
3494642e01fSmrg    return GetConvolutionFilter(cl, pc + __GLX_VENDPRIV_HDR_SIZE, tag);
3504642e01fSmrg}
3514642e01fSmrg
352f7df2e56Smrgstatic int
353f7df2e56SmrgGetHistogram(__GLXclientState * cl, GLbyte * pc, GLXContextTag tag)
3544642e01fSmrg{
3554642e01fSmrg    GLint compsize;
3564642e01fSmrg    GLenum format, type, target;
3574642e01fSmrg    GLboolean swapBytes, reset;
3584642e01fSmrg    __GLXcontext *cx;
3594642e01fSmrg    ClientPtr client = cl->client;
3604642e01fSmrg    int error;
3614642e01fSmrg    char *answer, answerBuffer[200];
362f7df2e56Smrg    GLint width = 0;
3637e31ba66Smrg    xGLXSingleReply reply = { 0, };
3644642e01fSmrg
3654642e01fSmrg    cx = __glXForceCurrent(cl, tag, &error);
3664642e01fSmrg    if (!cx) {
367f7df2e56Smrg        return error;
3684642e01fSmrg    }
3694642e01fSmrg
370f7df2e56Smrg    format = *(GLenum *) (pc + 4);
371f7df2e56Smrg    type = *(GLenum *) (pc + 8);
372f7df2e56Smrg    target = *(GLenum *) (pc + 0);
373f7df2e56Smrg    swapBytes = *(GLboolean *) (pc + 12);
374f7df2e56Smrg    reset = *(GLboolean *) (pc + 13);
3754642e01fSmrg
376f7df2e56Smrg    glGetHistogramParameteriv(target, GL_HISTOGRAM_WIDTH, &width);
3774642e01fSmrg    /*
3784642e01fSmrg     * The one query above might fail if we're in a state where queries
3794642e01fSmrg     * are illegal, but then width would still be zero anyway.
3804642e01fSmrg     */
381f7df2e56Smrg    compsize = __glGetTexImage_size(target, 1, format, type, width, 1, 1);
3820b0d8713Smrg    if (compsize < 0)
3830b0d8713Smrg        return BadLength;
3844642e01fSmrg
385f7df2e56Smrg    glPixelStorei(GL_PACK_SWAP_BYTES, swapBytes);
386f7df2e56Smrg    __GLX_GET_ANSWER_BUFFER(answer, cl, compsize, 1);
3874642e01fSmrg    __glXClearErrorOccured();
388f7df2e56Smrg    glGetHistogram(target, reset, format, type, answer);
3894642e01fSmrg
3904642e01fSmrg    if (__glXErrorOccured()) {
391f7df2e56Smrg        __GLX_BEGIN_REPLY(0);
392f7df2e56Smrg        __GLX_SEND_HEADER();
393f7df2e56Smrg    }
394f7df2e56Smrg    else {
395f7df2e56Smrg        __GLX_BEGIN_REPLY(compsize);
3967e31ba66Smrg        ((xGLXGetHistogramReply *) &reply)->width = width;
397f7df2e56Smrg        __GLX_SEND_HEADER();
398f7df2e56Smrg        __GLX_SEND_VOID_ARRAY(compsize);
3994642e01fSmrg    }
4004642e01fSmrg
4014642e01fSmrg    return Success;
4024642e01fSmrg}
4034642e01fSmrg
404f7df2e56Smrgint
405f7df2e56Smrg__glXDisp_GetHistogram(__GLXclientState * cl, GLbyte * pc)
4064642e01fSmrg{
4074642e01fSmrg    const GLXContextTag tag = __GLX_GET_SINGLE_CONTEXT_TAG(pc);
4080b0d8713Smrg    ClientPtr client = cl->client;
4090b0d8713Smrg    REQUEST_FIXED_SIZE(xGLXSingleReq, 16);
4104642e01fSmrg    return GetHistogram(cl, pc + __GLX_SINGLE_HDR_SIZE, tag);
4114642e01fSmrg}
4124642e01fSmrg
413f7df2e56Smrgint
414f7df2e56Smrg__glXDisp_GetHistogramEXT(__GLXclientState * cl, GLbyte * pc)
4154642e01fSmrg{
4164642e01fSmrg    const GLXContextTag tag = __GLX_GET_VENDPRIV_CONTEXT_TAG(pc);
4170b0d8713Smrg    ClientPtr client = cl->client;
4180b0d8713Smrg    REQUEST_FIXED_SIZE(xGLXVendorPrivateReq, 16);
4194642e01fSmrg    return GetHistogram(cl, pc + __GLX_VENDPRIV_HDR_SIZE, tag);
4204642e01fSmrg}
4214642e01fSmrg
422f7df2e56Smrgstatic int
423f7df2e56SmrgGetMinmax(__GLXclientState * cl, GLbyte * pc, GLXContextTag tag)
4244642e01fSmrg{
4254642e01fSmrg    GLint compsize;
4264642e01fSmrg    GLenum format, type, target;
4274642e01fSmrg    GLboolean swapBytes, reset;
4284642e01fSmrg    __GLXcontext *cx;
4294642e01fSmrg    ClientPtr client = cl->client;
4304642e01fSmrg    int error;
4314642e01fSmrg    char *answer, answerBuffer[200];
4327e31ba66Smrg    xGLXSingleReply reply = { 0, };
4334642e01fSmrg
4344642e01fSmrg    cx = __glXForceCurrent(cl, tag, &error);
4354642e01fSmrg    if (!cx) {
436f7df2e56Smrg        return error;
4374642e01fSmrg    }
4384642e01fSmrg
439f7df2e56Smrg    format = *(GLenum *) (pc + 4);
440f7df2e56Smrg    type = *(GLenum *) (pc + 8);
441f7df2e56Smrg    target = *(GLenum *) (pc + 0);
442f7df2e56Smrg    swapBytes = *(GLboolean *) (pc + 12);
443f7df2e56Smrg    reset = *(GLboolean *) (pc + 13);
4444642e01fSmrg
445f7df2e56Smrg    compsize = __glGetTexImage_size(target, 1, format, type, 2, 1, 1);
4460b0d8713Smrg    if (compsize < 0)
4470b0d8713Smrg        return BadLength;
4484642e01fSmrg
449f7df2e56Smrg    glPixelStorei(GL_PACK_SWAP_BYTES, swapBytes);
450f7df2e56Smrg    __GLX_GET_ANSWER_BUFFER(answer, cl, compsize, 1);
4514642e01fSmrg    __glXClearErrorOccured();
452f7df2e56Smrg    glGetMinmax(target, reset, format, type, answer);
4534642e01fSmrg
4544642e01fSmrg    if (__glXErrorOccured()) {
455f7df2e56Smrg        __GLX_BEGIN_REPLY(0);
456f7df2e56Smrg        __GLX_SEND_HEADER();
457f7df2e56Smrg    }
458f7df2e56Smrg    else {
459f7df2e56Smrg        __GLX_BEGIN_REPLY(compsize);
460f7df2e56Smrg        __GLX_SEND_HEADER();
461f7df2e56Smrg        __GLX_SEND_VOID_ARRAY(compsize);
4624642e01fSmrg    }
4634642e01fSmrg
4644642e01fSmrg    return Success;
4654642e01fSmrg}
4664642e01fSmrg
467f7df2e56Smrgint
468f7df2e56Smrg__glXDisp_GetMinmax(__GLXclientState * cl, GLbyte * pc)
4694642e01fSmrg{
4704642e01fSmrg    const GLXContextTag tag = __GLX_GET_SINGLE_CONTEXT_TAG(pc);
4710b0d8713Smrg    ClientPtr client = cl->client;
4720b0d8713Smrg    REQUEST_FIXED_SIZE(xGLXSingleReq, 16);
4734642e01fSmrg    return GetMinmax(cl, pc + __GLX_SINGLE_HDR_SIZE, tag);
4744642e01fSmrg}
4754642e01fSmrg
476f7df2e56Smrgint
477f7df2e56Smrg__glXDisp_GetMinmaxEXT(__GLXclientState * cl, GLbyte * pc)
4784642e01fSmrg{
4794642e01fSmrg    const GLXContextTag tag = __GLX_GET_VENDPRIV_CONTEXT_TAG(pc);
4800b0d8713Smrg    ClientPtr client = cl->client;
4810b0d8713Smrg    REQUEST_FIXED_SIZE(xGLXVendorPrivateReq, 16);
4824642e01fSmrg    return GetMinmax(cl, pc + __GLX_VENDPRIV_HDR_SIZE, tag);
4834642e01fSmrg}
4844642e01fSmrg
485f7df2e56Smrgstatic int
486f7df2e56SmrgGetColorTable(__GLXclientState * cl, GLbyte * pc, GLXContextTag tag)
4874642e01fSmrg{
4884642e01fSmrg    GLint compsize;
4894642e01fSmrg    GLenum format, type, target;
4904642e01fSmrg    GLboolean swapBytes;
4914642e01fSmrg    __GLXcontext *cx;
4924642e01fSmrg    ClientPtr client = cl->client;
4934642e01fSmrg    int error;
4944642e01fSmrg    char *answer, answerBuffer[200];
495f7df2e56Smrg    GLint width = 0;
4967e31ba66Smrg    xGLXSingleReply reply = { 0, };
4974642e01fSmrg
4984642e01fSmrg    cx = __glXForceCurrent(cl, tag, &error);
4994642e01fSmrg    if (!cx) {
500f7df2e56Smrg        return error;
5014642e01fSmrg    }
5024642e01fSmrg
503f7df2e56Smrg    target = *(GLenum *) (pc + 0);
504f7df2e56Smrg    format = *(GLenum *) (pc + 4);
505f7df2e56Smrg    type = *(GLenum *) (pc + 8);
506f7df2e56Smrg    swapBytes = *(GLboolean *) (pc + 12);
5074642e01fSmrg
508f7df2e56Smrg    glGetColorTableParameteriv(target, GL_COLOR_TABLE_WIDTH, &width);
5094642e01fSmrg    /*
5104642e01fSmrg     * The one query above might fail if we're in a state where queries
5114642e01fSmrg     * are illegal, but then width would still be zero anyway.
5124642e01fSmrg     */
513f7df2e56Smrg    compsize = __glGetTexImage_size(target, 1, format, type, width, 1, 1);
5140b0d8713Smrg    if (compsize < 0)
5150b0d8713Smrg        return BadLength;
5164642e01fSmrg
517f7df2e56Smrg    glPixelStorei(GL_PACK_SWAP_BYTES, swapBytes);
518f7df2e56Smrg    __GLX_GET_ANSWER_BUFFER(answer, cl, compsize, 1);
5194642e01fSmrg    __glXClearErrorOccured();
520f7df2e56Smrg    glGetColorTable(*(GLenum *) (pc + 0), *(GLenum *) (pc + 4),
521f7df2e56Smrg                    *(GLenum *) (pc + 8), answer);
5224642e01fSmrg
5234642e01fSmrg    if (__glXErrorOccured()) {
524f7df2e56Smrg        __GLX_BEGIN_REPLY(0);
525f7df2e56Smrg        __GLX_SEND_HEADER();
526f7df2e56Smrg    }
527f7df2e56Smrg    else {
528f7df2e56Smrg        __GLX_BEGIN_REPLY(compsize);
5297e31ba66Smrg        ((xGLXGetColorTableReply *) &reply)->width = width;
530f7df2e56Smrg        __GLX_SEND_HEADER();
531f7df2e56Smrg        __GLX_SEND_VOID_ARRAY(compsize);
5324642e01fSmrg    }
5334642e01fSmrg
5344642e01fSmrg    return Success;
5354642e01fSmrg}
5364642e01fSmrg
537f7df2e56Smrgint
538f7df2e56Smrg__glXDisp_GetColorTable(__GLXclientState * cl, GLbyte * pc)
5394642e01fSmrg{
5404642e01fSmrg    const GLXContextTag tag = __GLX_GET_SINGLE_CONTEXT_TAG(pc);
5410b0d8713Smrg    ClientPtr client = cl->client;
5420b0d8713Smrg    REQUEST_FIXED_SIZE(xGLXSingleReq, 16);
5434642e01fSmrg    return GetColorTable(cl, pc + __GLX_SINGLE_HDR_SIZE, tag);
5444642e01fSmrg}
5454642e01fSmrg
546f7df2e56Smrgint
547f7df2e56Smrg__glXDisp_GetColorTableSGI(__GLXclientState * cl, GLbyte * pc)
5484642e01fSmrg{
5494642e01fSmrg    const GLXContextTag tag = __GLX_GET_VENDPRIV_CONTEXT_TAG(pc);
5500b0d8713Smrg    ClientPtr client = cl->client;
5510b0d8713Smrg    REQUEST_FIXED_SIZE(xGLXVendorPrivateReq, 16);
5524642e01fSmrg    return GetColorTable(cl, pc + __GLX_VENDPRIV_HDR_SIZE, tag);
5534642e01fSmrg}
554