1706f2543Smrg/* 2706f2543Smrg * SGI FREE SOFTWARE LICENSE B (Version 2.0, Sept. 18, 2008) 3706f2543Smrg * Copyright (C) 1991-2000 Silicon Graphics, Inc. All Rights Reserved. 4706f2543Smrg * 5706f2543Smrg * Permission is hereby granted, free of charge, to any person obtaining a 6706f2543Smrg * copy of this software and associated documentation files (the "Software"), 7706f2543Smrg * to deal in the Software without restriction, including without limitation 8706f2543Smrg * the rights to use, copy, modify, merge, publish, distribute, sublicense, 9706f2543Smrg * and/or sell copies of the Software, and to permit persons to whom the 10706f2543Smrg * Software is furnished to do so, subject to the following conditions: 11706f2543Smrg * 12706f2543Smrg * The above copyright notice including the dates of first publication and 13706f2543Smrg * either this permission notice or a reference to 14706f2543Smrg * http://oss.sgi.com/projects/FreeB/ 15706f2543Smrg * shall be included in all copies or substantial portions of the Software. 16706f2543Smrg * 17706f2543Smrg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 18706f2543Smrg * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 19706f2543Smrg * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 20706f2543Smrg * SILICON GRAPHICS, INC. BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 21706f2543Smrg * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF 22706f2543Smrg * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 23706f2543Smrg * SOFTWARE. 24706f2543Smrg * 25706f2543Smrg * Except as contained in this notice, the name of Silicon Graphics, Inc. 26706f2543Smrg * shall not be used in advertising or otherwise to promote the sale, use or 27706f2543Smrg * other dealings in this Software without prior written authorization from 28706f2543Smrg * Silicon Graphics, Inc. 29706f2543Smrg */ 30706f2543Smrg 31706f2543Smrg#ifdef HAVE_DIX_CONFIG_H 32706f2543Smrg#include <dix-config.h> 33706f2543Smrg#endif 34706f2543Smrg 35706f2543Smrg#include "glxserver.h" 36706f2543Smrg#include "glxext.h" 37706f2543Smrg#include "singlesize.h" 38706f2543Smrg#include "unpack.h" 39706f2543Smrg#include "indirect_dispatch.h" 40706f2543Smrg#include "indirect_size_get.h" 41706f2543Smrg#include "glapitable.h" 42706f2543Smrg#include "glapi.h" 43706f2543Smrg#include "glthread.h" 44706f2543Smrg#include "dispatch.h" 45706f2543Smrg 46706f2543Smrgint __glXDispSwap_ReadPixels(__GLXclientState *cl, GLbyte *pc) 47706f2543Smrg{ 48706f2543Smrg GLsizei width, height; 49706f2543Smrg GLenum format, type; 50706f2543Smrg GLboolean swapBytes, lsbFirst; 51706f2543Smrg GLint compsize; 52706f2543Smrg __GLX_DECLARE_SWAP_VARIABLES; 53706f2543Smrg __GLXcontext *cx; 54706f2543Smrg ClientPtr client = cl->client; 55706f2543Smrg int error; 56706f2543Smrg char *answer, answerBuffer[200]; 57706f2543Smrg 58706f2543Smrg REQUEST_FIXED_SIZE(xGLXSingleReq, 28); 59706f2543Smrg 60706f2543Smrg __GLX_SWAP_INT(&((xGLXSingleReq *)pc)->contextTag); 61706f2543Smrg cx = __glXForceCurrent(cl, __GLX_GET_SINGLE_CONTEXT_TAG(pc), &error); 62706f2543Smrg if (!cx) { 63706f2543Smrg return error; 64706f2543Smrg } 65706f2543Smrg 66706f2543Smrg pc += __GLX_SINGLE_HDR_SIZE; 67706f2543Smrg __GLX_SWAP_INT(pc+0); 68706f2543Smrg __GLX_SWAP_INT(pc+4); 69706f2543Smrg __GLX_SWAP_INT(pc+8); 70706f2543Smrg __GLX_SWAP_INT(pc+12); 71706f2543Smrg __GLX_SWAP_INT(pc+16); 72706f2543Smrg __GLX_SWAP_INT(pc+20); 73706f2543Smrg 74706f2543Smrg width = *(GLsizei *)(pc + 8); 75706f2543Smrg height = *(GLsizei *)(pc + 12); 76706f2543Smrg format = *(GLenum *)(pc + 16); 77706f2543Smrg type = *(GLenum *)(pc + 20); 78706f2543Smrg swapBytes = *(GLboolean *)(pc + 24); 79706f2543Smrg lsbFirst = *(GLboolean *)(pc + 25); 80706f2543Smrg compsize = __glReadPixels_size(format,type,width,height); 81706f2543Smrg if (compsize < 0) 82706f2543Smrg return BadLength; 83706f2543Smrg 84706f2543Smrg CALL_PixelStorei( GET_DISPATCH(), (GL_PACK_SWAP_BYTES, !swapBytes) ); 85706f2543Smrg CALL_PixelStorei( GET_DISPATCH(), (GL_PACK_LSB_FIRST, lsbFirst) ); 86706f2543Smrg __GLX_GET_ANSWER_BUFFER(answer,cl,compsize,1); 87706f2543Smrg __glXClearErrorOccured(); 88706f2543Smrg CALL_ReadPixels( GET_DISPATCH(), 89706f2543Smrg (*(GLint *)(pc + 0), 90706f2543Smrg *(GLint *)(pc + 4), 91706f2543Smrg *(GLsizei *)(pc + 8), 92706f2543Smrg *(GLsizei *)(pc + 12), 93706f2543Smrg *(GLenum *)(pc + 16), 94706f2543Smrg *(GLenum *)(pc + 20), 95706f2543Smrg answer) 96706f2543Smrg ); 97706f2543Smrg 98706f2543Smrg if (__glXErrorOccured()) { 99706f2543Smrg __GLX_BEGIN_REPLY(0); 100706f2543Smrg __GLX_SWAP_REPLY_HEADER(); 101706f2543Smrg __GLX_SEND_HEADER(); 102706f2543Smrg } else { 103706f2543Smrg __GLX_BEGIN_REPLY(compsize); 104706f2543Smrg __GLX_SWAP_REPLY_HEADER(); 105706f2543Smrg __GLX_SEND_HEADER(); 106706f2543Smrg __GLX_SEND_VOID_ARRAY(compsize); 107706f2543Smrg } 108706f2543Smrg __GLX_NOTE_FLUSHED_CMDS(cx); 109706f2543Smrg return Success; 110706f2543Smrg} 111706f2543Smrg 112706f2543Smrgint __glXDispSwap_GetTexImage(__GLXclientState *cl, GLbyte *pc) 113706f2543Smrg{ 114706f2543Smrg GLint level, compsize; 115706f2543Smrg GLenum format, type, target; 116706f2543Smrg GLboolean swapBytes; 117706f2543Smrg __GLX_DECLARE_SWAP_VARIABLES; 118706f2543Smrg __GLXcontext *cx; 119706f2543Smrg ClientPtr client = cl->client; 120706f2543Smrg int error; 121706f2543Smrg char *answer, answerBuffer[200]; 122706f2543Smrg GLint width=0, height=0, depth=1; 123706f2543Smrg 124706f2543Smrg REQUEST_FIXED_SIZE(xGLXSingleReq, 20); 125706f2543Smrg 126706f2543Smrg __GLX_SWAP_INT(&((xGLXSingleReq *)pc)->contextTag); 127706f2543Smrg cx = __glXForceCurrent(cl, __GLX_GET_SINGLE_CONTEXT_TAG(pc), &error); 128706f2543Smrg if (!cx) { 129706f2543Smrg return error; 130706f2543Smrg } 131706f2543Smrg 132706f2543Smrg pc += __GLX_SINGLE_HDR_SIZE; 133706f2543Smrg __GLX_SWAP_INT(pc+0); 134706f2543Smrg __GLX_SWAP_INT(pc+4); 135706f2543Smrg __GLX_SWAP_INT(pc+8); 136706f2543Smrg __GLX_SWAP_INT(pc+12); 137706f2543Smrg 138706f2543Smrg level = *(GLint *)(pc + 4); 139706f2543Smrg format = *(GLenum *)(pc + 8); 140706f2543Smrg type = *(GLenum *)(pc + 12); 141706f2543Smrg target = *(GLenum *)(pc + 0); 142706f2543Smrg swapBytes = *(GLboolean *)(pc + 16); 143706f2543Smrg 144706f2543Smrg CALL_GetTexLevelParameteriv( GET_DISPATCH(), (target, level, GL_TEXTURE_WIDTH, &width) ); 145706f2543Smrg CALL_GetTexLevelParameteriv( GET_DISPATCH(), (target, level, GL_TEXTURE_HEIGHT, &height) ); 146706f2543Smrg if ( target == GL_TEXTURE_3D) { 147706f2543Smrg CALL_GetTexLevelParameteriv( GET_DISPATCH(), (target, level, GL_TEXTURE_DEPTH, &depth) ); 148706f2543Smrg } 149706f2543Smrg /* 150706f2543Smrg * The three queries above might fail if we're in a state where queries 151706f2543Smrg * are illegal, but then width, height, and depth would still be zero anyway. 152706f2543Smrg */ 153706f2543Smrg compsize = __glGetTexImage_size(target,level,format,type,width,height,depth); 154706f2543Smrg if (compsize < 0) 155706f2543Smrg return BadLength; 156706f2543Smrg 157706f2543Smrg CALL_PixelStorei( GET_DISPATCH(), (GL_PACK_SWAP_BYTES, !swapBytes) ); 158706f2543Smrg __GLX_GET_ANSWER_BUFFER(answer,cl,compsize,1); 159706f2543Smrg __glXClearErrorOccured(); 160706f2543Smrg CALL_GetTexImage( GET_DISPATCH(), ( 161706f2543Smrg *(GLenum *)(pc + 0), 162706f2543Smrg *(GLint *)(pc + 4), 163706f2543Smrg *(GLenum *)(pc + 8), 164706f2543Smrg *(GLenum *)(pc + 12), 165706f2543Smrg answer 166706f2543Smrg ) ); 167706f2543Smrg 168706f2543Smrg if (__glXErrorOccured()) { 169706f2543Smrg __GLX_BEGIN_REPLY(0); 170706f2543Smrg __GLX_SWAP_REPLY_HEADER(); 171706f2543Smrg __GLX_SEND_HEADER(); 172706f2543Smrg } else { 173706f2543Smrg __GLX_BEGIN_REPLY(compsize); 174706f2543Smrg __GLX_SWAP_REPLY_HEADER(); 175706f2543Smrg __GLX_SWAP_INT(&width); 176706f2543Smrg __GLX_SWAP_INT(&height); 177706f2543Smrg __GLX_SWAP_INT(&depth); 178706f2543Smrg ((xGLXGetTexImageReply *)&__glXReply)->width = width; 179706f2543Smrg ((xGLXGetTexImageReply *)&__glXReply)->height = height; 180706f2543Smrg ((xGLXGetTexImageReply *)&__glXReply)->depth = depth; 181706f2543Smrg __GLX_SEND_HEADER(); 182706f2543Smrg __GLX_SEND_VOID_ARRAY(compsize); 183706f2543Smrg } 184706f2543Smrg return Success; 185706f2543Smrg} 186706f2543Smrg 187706f2543Smrgint __glXDispSwap_GetPolygonStipple(__GLXclientState *cl, GLbyte *pc) 188706f2543Smrg{ 189706f2543Smrg GLboolean lsbFirst; 190706f2543Smrg __GLXcontext *cx; 191706f2543Smrg ClientPtr client = cl->client; 192706f2543Smrg int error; 193706f2543Smrg GLubyte answerBuffer[200]; 194706f2543Smrg char *answer; 195706f2543Smrg __GLX_DECLARE_SWAP_VARIABLES; 196706f2543Smrg 197706f2543Smrg REQUEST_FIXED_SIZE(xGLXSingleReq, 4); 198706f2543Smrg 199706f2543Smrg __GLX_SWAP_INT(&((xGLXSingleReq *)pc)->contextTag); 200706f2543Smrg cx = __glXForceCurrent(cl, __GLX_GET_SINGLE_CONTEXT_TAG(pc), &error); 201706f2543Smrg if (!cx) { 202706f2543Smrg return error; 203706f2543Smrg } 204706f2543Smrg pc += __GLX_SINGLE_HDR_SIZE; 205706f2543Smrg lsbFirst = *(GLboolean *)(pc + 0); 206706f2543Smrg 207706f2543Smrg CALL_PixelStorei( GET_DISPATCH(), (GL_PACK_LSB_FIRST, lsbFirst) ); 208706f2543Smrg __GLX_GET_ANSWER_BUFFER(answer,cl,128,1); 209706f2543Smrg 210706f2543Smrg __glXClearErrorOccured(); 211706f2543Smrg CALL_GetPolygonStipple( GET_DISPATCH(), ((GLubyte *) answer) ); 212706f2543Smrg if (__glXErrorOccured()) { 213706f2543Smrg __GLX_BEGIN_REPLY(0); 214706f2543Smrg __GLX_SWAP_REPLY_HEADER(); 215706f2543Smrg __GLX_SEND_HEADER(); 216706f2543Smrg } else { 217706f2543Smrg __GLX_BEGIN_REPLY(128); 218706f2543Smrg __GLX_SWAP_REPLY_HEADER(); 219706f2543Smrg __GLX_SEND_HEADER(); 220706f2543Smrg __GLX_SEND_BYTE_ARRAY(128); 221706f2543Smrg } 222706f2543Smrg return Success; 223706f2543Smrg} 224706f2543Smrg 225706f2543Smrgstatic int GetSeparableFilter(__GLXclientState *cl, GLbyte *pc, GLXContextTag tag) 226706f2543Smrg{ 227706f2543Smrg GLint compsize, compsize2; 228706f2543Smrg GLenum format, type, target; 229706f2543Smrg GLboolean swapBytes; 230706f2543Smrg __GLXcontext *cx; 231706f2543Smrg ClientPtr client = cl->client; 232706f2543Smrg int error; 233706f2543Smrg __GLX_DECLARE_SWAP_VARIABLES; 234706f2543Smrg char *answer, answerBuffer[200]; 235706f2543Smrg GLint width=0, height=0; 236706f2543Smrg 237706f2543Smrg cx = __glXForceCurrent(cl, tag, &error); 238706f2543Smrg if (!cx) { 239706f2543Smrg return error; 240706f2543Smrg } 241706f2543Smrg 242706f2543Smrg __GLX_SWAP_INT(pc+0); 243706f2543Smrg __GLX_SWAP_INT(pc+4); 244706f2543Smrg __GLX_SWAP_INT(pc+8); 245706f2543Smrg 246706f2543Smrg format = *(GLenum *)(pc + 4); 247706f2543Smrg type = *(GLenum *)(pc + 8); 248706f2543Smrg target = *(GLenum *)(pc + 0); 249706f2543Smrg swapBytes = *(GLboolean *)(pc + 12); 250706f2543Smrg 251706f2543Smrg /* target must be SEPARABLE_2D, however I guess we can let the GL 252706f2543Smrg barf on this one.... */ 253706f2543Smrg 254706f2543Smrg CALL_GetConvolutionParameteriv( GET_DISPATCH(), (target, GL_CONVOLUTION_WIDTH, &width) ); 255706f2543Smrg CALL_GetConvolutionParameteriv( GET_DISPATCH(), (target, GL_CONVOLUTION_HEIGHT, &height) ); 256706f2543Smrg /* 257706f2543Smrg * The two queries above might fail if we're in a state where queries 258706f2543Smrg * are illegal, but then width and height would still be zero anyway. 259706f2543Smrg */ 260706f2543Smrg compsize = __glGetTexImage_size(target,1,format,type,width,1,1); 261706f2543Smrg compsize2 = __glGetTexImage_size(target,1,format,type,height,1,1); 262706f2543Smrg 263706f2543Smrg if ((compsize = safe_pad(compsize)) < 0) 264706f2543Smrg return BadLength; 265706f2543Smrg if ((compsize2 = safe_pad(compsize2)) < 0) 266706f2543Smrg return BadLength; 267706f2543Smrg 268706f2543Smrg CALL_PixelStorei( GET_DISPATCH(), (GL_PACK_SWAP_BYTES, !swapBytes) ); 269706f2543Smrg __GLX_GET_ANSWER_BUFFER(answer, cl, safe_add(compsize, compsize2), 1); 270706f2543Smrg __glXClearErrorOccured(); 271706f2543Smrg CALL_GetSeparableFilter( GET_DISPATCH(), ( 272706f2543Smrg *(GLenum *)(pc + 0), 273706f2543Smrg *(GLenum *)(pc + 4), 274706f2543Smrg *(GLenum *)(pc + 8), 275706f2543Smrg answer, 276706f2543Smrg answer + compsize, 277706f2543Smrg NULL 278706f2543Smrg ) ); 279706f2543Smrg 280706f2543Smrg if (__glXErrorOccured()) { 281706f2543Smrg __GLX_BEGIN_REPLY(0); 282706f2543Smrg __GLX_SWAP_REPLY_HEADER(); 283706f2543Smrg } else { 284706f2543Smrg __GLX_BEGIN_REPLY(compsize + compsize2); 285706f2543Smrg __GLX_SWAP_REPLY_HEADER(); 286706f2543Smrg __GLX_SWAP_INT(&width); 287706f2543Smrg __GLX_SWAP_INT(&height); 288706f2543Smrg ((xGLXGetSeparableFilterReply *)&__glXReply)->width = width; 289706f2543Smrg ((xGLXGetSeparableFilterReply *)&__glXReply)->height = height; 290706f2543Smrg __GLX_SEND_VOID_ARRAY(compsize + compsize2); 291706f2543Smrg } 292706f2543Smrg 293706f2543Smrg return Success; 294706f2543Smrg} 295706f2543Smrg 296706f2543Smrgint __glXDispSwap_GetSeparableFilter(__GLXclientState *cl, GLbyte *pc) 297706f2543Smrg{ 298706f2543Smrg const GLXContextTag tag = __GLX_GET_SINGLE_CONTEXT_TAG(pc); 299706f2543Smrg ClientPtr client = cl->client; 300706f2543Smrg 301706f2543Smrg REQUEST_FIXED_SIZE(xGLXSingleReq, 16); 302706f2543Smrg return GetSeparableFilter(cl, pc + __GLX_SINGLE_HDR_SIZE, tag); 303706f2543Smrg} 304706f2543Smrg 305706f2543Smrgint __glXDispSwap_GetSeparableFilterEXT(__GLXclientState *cl, GLbyte *pc) 306706f2543Smrg{ 307706f2543Smrg const GLXContextTag tag = __GLX_GET_VENDPRIV_CONTEXT_TAG(pc); 308706f2543Smrg ClientPtr client = cl->client; 309706f2543Smrg 310706f2543Smrg REQUEST_FIXED_SIZE(xGLXVendorPrivateReq, 16); 311706f2543Smrg return GetSeparableFilter(cl, pc + __GLX_VENDPRIV_HDR_SIZE, tag); 312706f2543Smrg} 313706f2543Smrg 314706f2543Smrgstatic int GetConvolutionFilter(__GLXclientState *cl, GLbyte *pc, GLXContextTag tag) 315706f2543Smrg{ 316706f2543Smrg GLint compsize; 317706f2543Smrg GLenum format, type, target; 318706f2543Smrg GLboolean swapBytes; 319706f2543Smrg __GLXcontext *cx; 320706f2543Smrg ClientPtr client = cl->client; 321706f2543Smrg int error; 322706f2543Smrg __GLX_DECLARE_SWAP_VARIABLES; 323706f2543Smrg char *answer, answerBuffer[200]; 324706f2543Smrg GLint width=0, height=0; 325706f2543Smrg 326706f2543Smrg cx = __glXForceCurrent(cl, tag, &error); 327706f2543Smrg if (!cx) { 328706f2543Smrg return error; 329706f2543Smrg } 330706f2543Smrg 331706f2543Smrg __GLX_SWAP_INT(pc+0); 332706f2543Smrg __GLX_SWAP_INT(pc+4); 333706f2543Smrg __GLX_SWAP_INT(pc+8); 334706f2543Smrg 335706f2543Smrg format = *(GLenum *)(pc + 4); 336706f2543Smrg type = *(GLenum *)(pc + 8); 337706f2543Smrg target = *(GLenum *)(pc + 0); 338706f2543Smrg swapBytes = *(GLboolean *)(pc + 12); 339706f2543Smrg 340706f2543Smrg CALL_GetConvolutionParameteriv( GET_DISPATCH(), (target, GL_CONVOLUTION_WIDTH, &width) ); 341706f2543Smrg if (target == GL_CONVOLUTION_2D) { 342706f2543Smrg height = 1; 343706f2543Smrg } else { 344706f2543Smrg CALL_GetConvolutionParameteriv( GET_DISPATCH(), (target, GL_CONVOLUTION_HEIGHT, &height) ); 345706f2543Smrg } 346706f2543Smrg /* 347706f2543Smrg * The two queries above might fail if we're in a state where queries 348706f2543Smrg * are illegal, but then width and height would still be zero anyway. 349706f2543Smrg */ 350706f2543Smrg compsize = __glGetTexImage_size(target,1,format,type,width,height,1); 351706f2543Smrg if (compsize < 0) 352706f2543Smrg return BadLength; 353706f2543Smrg 354706f2543Smrg CALL_PixelStorei( GET_DISPATCH(), (GL_PACK_SWAP_BYTES, !swapBytes) ); 355706f2543Smrg __GLX_GET_ANSWER_BUFFER(answer,cl,compsize,1); 356706f2543Smrg __glXClearErrorOccured(); 357706f2543Smrg CALL_GetConvolutionFilter( GET_DISPATCH(), ( 358706f2543Smrg *(GLenum *)(pc + 0), 359706f2543Smrg *(GLenum *)(pc + 4), 360706f2543Smrg *(GLenum *)(pc + 8), 361706f2543Smrg answer 362706f2543Smrg ) ); 363706f2543Smrg 364706f2543Smrg if (__glXErrorOccured()) { 365706f2543Smrg __GLX_BEGIN_REPLY(0); 366706f2543Smrg __GLX_SWAP_REPLY_HEADER(); 367706f2543Smrg } else { 368706f2543Smrg __GLX_BEGIN_REPLY(compsize); 369706f2543Smrg __GLX_SWAP_REPLY_HEADER(); 370706f2543Smrg __GLX_SWAP_INT(&width); 371706f2543Smrg __GLX_SWAP_INT(&height); 372706f2543Smrg ((xGLXGetConvolutionFilterReply *)&__glXReply)->width = width; 373706f2543Smrg ((xGLXGetConvolutionFilterReply *)&__glXReply)->height = height; 374706f2543Smrg __GLX_SEND_VOID_ARRAY(compsize); 375706f2543Smrg } 376706f2543Smrg 377706f2543Smrg return Success; 378706f2543Smrg} 379706f2543Smrg 380706f2543Smrgint __glXDispSwap_GetConvolutionFilter(__GLXclientState *cl, GLbyte *pc) 381706f2543Smrg{ 382706f2543Smrg const GLXContextTag tag = __GLX_GET_SINGLE_CONTEXT_TAG(pc); 383706f2543Smrg ClientPtr client = cl->client; 384706f2543Smrg 385706f2543Smrg REQUEST_FIXED_SIZE(xGLXSingleReq, 16); 386706f2543Smrg return GetConvolutionFilter(cl, pc + __GLX_SINGLE_HDR_SIZE, tag); 387706f2543Smrg} 388706f2543Smrg 389706f2543Smrgint __glXDispSwap_GetConvolutionFilterEXT(__GLXclientState *cl, GLbyte *pc) 390706f2543Smrg{ 391706f2543Smrg const GLXContextTag tag = __GLX_GET_VENDPRIV_CONTEXT_TAG(pc); 392706f2543Smrg ClientPtr client = cl->client; 393706f2543Smrg 394706f2543Smrg REQUEST_FIXED_SIZE(xGLXVendorPrivateReq, 16); 395706f2543Smrg return GetConvolutionFilter(cl, pc + __GLX_VENDPRIV_HDR_SIZE, tag); 396706f2543Smrg} 397706f2543Smrg 398706f2543Smrgstatic int GetHistogram(__GLXclientState *cl, GLbyte *pc, GLXContextTag tag) 399706f2543Smrg{ 400706f2543Smrg GLint compsize; 401706f2543Smrg GLenum format, type, target; 402706f2543Smrg GLboolean swapBytes, reset; 403706f2543Smrg __GLXcontext *cx; 404706f2543Smrg ClientPtr client = cl->client; 405706f2543Smrg int error; 406706f2543Smrg __GLX_DECLARE_SWAP_VARIABLES; 407706f2543Smrg char *answer, answerBuffer[200]; 408706f2543Smrg GLint width=0; 409706f2543Smrg 410706f2543Smrg cx = __glXForceCurrent(cl, tag, &error); 411706f2543Smrg if (!cx) { 412706f2543Smrg return error; 413706f2543Smrg } 414706f2543Smrg 415706f2543Smrg __GLX_SWAP_INT(pc+0); 416706f2543Smrg __GLX_SWAP_INT(pc+4); 417706f2543Smrg __GLX_SWAP_INT(pc+8); 418706f2543Smrg 419706f2543Smrg format = *(GLenum *)(pc + 4); 420706f2543Smrg type = *(GLenum *)(pc + 8); 421706f2543Smrg target = *(GLenum *)(pc + 0); 422706f2543Smrg swapBytes = *(GLboolean *)(pc + 12); 423706f2543Smrg reset = *(GLboolean *)(pc + 13); 424706f2543Smrg 425706f2543Smrg CALL_GetHistogramParameteriv( GET_DISPATCH(), (target, GL_HISTOGRAM_WIDTH, &width) ); 426706f2543Smrg /* 427706f2543Smrg * The one query above might fail if we're in a state where queries 428706f2543Smrg * are illegal, but then width would still be zero anyway. 429706f2543Smrg */ 430706f2543Smrg compsize = __glGetTexImage_size(target,1,format,type,width,1,1); 431706f2543Smrg if (compsize < 0) 432706f2543Smrg return BadLength; 433706f2543Smrg 434706f2543Smrg CALL_PixelStorei( GET_DISPATCH(), (GL_PACK_SWAP_BYTES, !swapBytes) ); 435706f2543Smrg __GLX_GET_ANSWER_BUFFER(answer,cl,compsize,1); 436706f2543Smrg __glXClearErrorOccured(); 437706f2543Smrg CALL_GetHistogram( GET_DISPATCH(), (target, reset, format, type, answer) ); 438706f2543Smrg 439706f2543Smrg if (__glXErrorOccured()) { 440706f2543Smrg __GLX_BEGIN_REPLY(0); 441706f2543Smrg __GLX_SWAP_REPLY_HEADER(); 442706f2543Smrg } else { 443706f2543Smrg __GLX_BEGIN_REPLY(compsize); 444706f2543Smrg __GLX_SWAP_REPLY_HEADER(); 445706f2543Smrg __GLX_SWAP_INT(&width); 446706f2543Smrg ((xGLXGetHistogramReply *)&__glXReply)->width = width; 447706f2543Smrg __GLX_SEND_VOID_ARRAY(compsize); 448706f2543Smrg } 449706f2543Smrg 450706f2543Smrg return Success; 451706f2543Smrg} 452706f2543Smrg 453706f2543Smrgint __glXDispSwap_GetHistogram(__GLXclientState *cl, GLbyte *pc) 454706f2543Smrg{ 455706f2543Smrg const GLXContextTag tag = __GLX_GET_SINGLE_CONTEXT_TAG(pc); 456706f2543Smrg ClientPtr client = cl->client; 457706f2543Smrg 458706f2543Smrg REQUEST_FIXED_SIZE(xGLXSingleReq, 16); 459706f2543Smrg return GetHistogram(cl, pc + __GLX_SINGLE_HDR_SIZE, tag); 460706f2543Smrg} 461706f2543Smrg 462706f2543Smrgint __glXDispSwap_GetHistogramEXT(__GLXclientState *cl, GLbyte *pc) 463706f2543Smrg{ 464706f2543Smrg const GLXContextTag tag = __GLX_GET_VENDPRIV_CONTEXT_TAG(pc); 465706f2543Smrg ClientPtr client = cl->client; 466706f2543Smrg 467706f2543Smrg REQUEST_FIXED_SIZE(xGLXVendorPrivateReq, 16); 468706f2543Smrg return GetHistogram(cl, pc + __GLX_VENDPRIV_HDR_SIZE, tag); 469706f2543Smrg} 470706f2543Smrg 471706f2543Smrgstatic int GetMinmax(__GLXclientState *cl, GLbyte *pc, GLXContextTag tag) 472706f2543Smrg{ 473706f2543Smrg GLint compsize; 474706f2543Smrg GLenum format, type, target; 475706f2543Smrg GLboolean swapBytes, reset; 476706f2543Smrg __GLXcontext *cx; 477706f2543Smrg ClientPtr client = cl->client; 478706f2543Smrg int error; 479706f2543Smrg __GLX_DECLARE_SWAP_VARIABLES; 480706f2543Smrg char *answer, answerBuffer[200]; 481706f2543Smrg 482706f2543Smrg cx = __glXForceCurrent(cl, tag, &error); 483706f2543Smrg if (!cx) { 484706f2543Smrg return error; 485706f2543Smrg } 486706f2543Smrg 487706f2543Smrg __GLX_SWAP_INT(pc+0); 488706f2543Smrg __GLX_SWAP_INT(pc+4); 489706f2543Smrg __GLX_SWAP_INT(pc+8); 490706f2543Smrg 491706f2543Smrg format = *(GLenum *)(pc + 4); 492706f2543Smrg type = *(GLenum *)(pc + 8); 493706f2543Smrg target = *(GLenum *)(pc + 0); 494706f2543Smrg swapBytes = *(GLboolean *)(pc + 12); 495706f2543Smrg reset = *(GLboolean *)(pc + 13); 496706f2543Smrg 497706f2543Smrg compsize = __glGetTexImage_size(target,1,format,type,2,1,1); 498706f2543Smrg if (compsize < 0) 499706f2543Smrg return BadLength; 500706f2543Smrg 501706f2543Smrg CALL_PixelStorei( GET_DISPATCH(), (GL_PACK_SWAP_BYTES, !swapBytes) ); 502706f2543Smrg __GLX_GET_ANSWER_BUFFER(answer,cl,compsize,1); 503706f2543Smrg __glXClearErrorOccured(); 504706f2543Smrg CALL_GetMinmax( GET_DISPATCH(), (target, reset, format, type, answer) ); 505706f2543Smrg 506706f2543Smrg if (__glXErrorOccured()) { 507706f2543Smrg __GLX_BEGIN_REPLY(0); 508706f2543Smrg __GLX_SWAP_REPLY_HEADER(); 509706f2543Smrg } else { 510706f2543Smrg __GLX_BEGIN_REPLY(compsize); 511706f2543Smrg __GLX_SWAP_REPLY_HEADER(); 512706f2543Smrg __GLX_SEND_VOID_ARRAY(compsize); 513706f2543Smrg } 514706f2543Smrg 515706f2543Smrg return Success; 516706f2543Smrg} 517706f2543Smrg 518706f2543Smrgint __glXDispSwap_GetMinmax(__GLXclientState *cl, GLbyte *pc) 519706f2543Smrg{ 520706f2543Smrg const GLXContextTag tag = __GLX_GET_SINGLE_CONTEXT_TAG(pc); 521706f2543Smrg ClientPtr client = cl->client; 522706f2543Smrg 523706f2543Smrg REQUEST_FIXED_SIZE(xGLXSingleReq, 16); 524706f2543Smrg return GetMinmax(cl, pc + __GLX_SINGLE_HDR_SIZE, tag); 525706f2543Smrg} 526706f2543Smrg 527706f2543Smrgint __glXDispSwap_GetMinmaxEXT(__GLXclientState *cl, GLbyte *pc) 528706f2543Smrg{ 529706f2543Smrg const GLXContextTag tag = __GLX_GET_VENDPRIV_CONTEXT_TAG(pc); 530706f2543Smrg ClientPtr client = cl->client; 531706f2543Smrg 532706f2543Smrg REQUEST_FIXED_SIZE(xGLXVendorPrivateReq, 16); 533706f2543Smrg return GetMinmax(cl, pc + __GLX_VENDPRIV_HDR_SIZE, tag); 534706f2543Smrg} 535706f2543Smrg 536706f2543Smrgstatic int GetColorTable(__GLXclientState *cl, GLbyte *pc, GLXContextTag tag) 537706f2543Smrg{ 538706f2543Smrg GLint compsize; 539706f2543Smrg GLenum format, type, target; 540706f2543Smrg GLboolean swapBytes; 541706f2543Smrg __GLXcontext *cx; 542706f2543Smrg ClientPtr client = cl->client; 543706f2543Smrg int error; 544706f2543Smrg __GLX_DECLARE_SWAP_VARIABLES; 545706f2543Smrg char *answer, answerBuffer[200]; 546706f2543Smrg GLint width=0; 547706f2543Smrg 548706f2543Smrg cx = __glXForceCurrent(cl, tag, &error); 549706f2543Smrg if (!cx) { 550706f2543Smrg return error; 551706f2543Smrg } 552706f2543Smrg 553706f2543Smrg __GLX_SWAP_INT(pc+0); 554706f2543Smrg __GLX_SWAP_INT(pc+4); 555706f2543Smrg __GLX_SWAP_INT(pc+8); 556706f2543Smrg 557706f2543Smrg format = *(GLenum *)(pc + 4); 558706f2543Smrg type = *(GLenum *)(pc + 8); 559706f2543Smrg target = *(GLenum *)(pc + 0); 560706f2543Smrg swapBytes = *(GLboolean *)(pc + 12); 561706f2543Smrg 562706f2543Smrg CALL_GetColorTableParameteriv( GET_DISPATCH(), (target, GL_COLOR_TABLE_WIDTH, &width) ); 563706f2543Smrg /* 564706f2543Smrg * The one query above might fail if we're in a state where queries 565706f2543Smrg * are illegal, but then width would still be zero anyway. 566706f2543Smrg */ 567706f2543Smrg compsize = __glGetTexImage_size(target,1,format,type,width,1,1); 568706f2543Smrg if (compsize < 0) 569706f2543Smrg return BadLength; 570706f2543Smrg 571706f2543Smrg CALL_PixelStorei( GET_DISPATCH(), (GL_PACK_SWAP_BYTES, !swapBytes) ); 572706f2543Smrg __GLX_GET_ANSWER_BUFFER(answer,cl,compsize,1); 573706f2543Smrg __glXClearErrorOccured(); 574706f2543Smrg CALL_GetColorTable( GET_DISPATCH(), ( 575706f2543Smrg *(GLenum *)(pc + 0), 576706f2543Smrg *(GLenum *)(pc + 4), 577706f2543Smrg *(GLenum *)(pc + 8), 578706f2543Smrg answer 579706f2543Smrg ) ); 580706f2543Smrg 581706f2543Smrg if (__glXErrorOccured()) { 582706f2543Smrg __GLX_BEGIN_REPLY(0); 583706f2543Smrg __GLX_SWAP_REPLY_HEADER(); 584706f2543Smrg } else { 585706f2543Smrg __GLX_BEGIN_REPLY(compsize); 586706f2543Smrg __GLX_SWAP_REPLY_HEADER(); 587706f2543Smrg __GLX_SWAP_INT(&width); 588706f2543Smrg ((xGLXGetColorTableReply *)&__glXReply)->width = width; 589706f2543Smrg __GLX_SEND_VOID_ARRAY(compsize); 590706f2543Smrg } 591706f2543Smrg 592706f2543Smrg return Success; 593706f2543Smrg} 594706f2543Smrg 595706f2543Smrgint __glXDispSwap_GetColorTable(__GLXclientState *cl, GLbyte *pc) 596706f2543Smrg{ 597706f2543Smrg const GLXContextTag tag = __GLX_GET_SINGLE_CONTEXT_TAG(pc); 598706f2543Smrg ClientPtr client = cl->client; 599706f2543Smrg 600706f2543Smrg REQUEST_FIXED_SIZE(xGLXSingleReq, 16); 601706f2543Smrg return GetColorTable(cl, pc + __GLX_SINGLE_HDR_SIZE, tag); 602706f2543Smrg} 603706f2543Smrg 604706f2543Smrgint __glXDispSwap_GetColorTableSGI(__GLXclientState *cl, GLbyte *pc) 605706f2543Smrg{ 606706f2543Smrg const GLXContextTag tag = __GLX_GET_VENDPRIV_CONTEXT_TAG(pc); 607706f2543Smrg ClientPtr client = cl->client; 608706f2543Smrg 609706f2543Smrg REQUEST_FIXED_SIZE(xGLXVendorPrivateReq, 16); 610706f2543Smrg return GetColorTable(cl, pc + __GLX_VENDPRIV_HDR_SIZE, tag); 611706f2543Smrg} 612