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