1/* 2 * (C) Copyright IBM Corporation 2005, 2006 3 * All Rights Reserved. 4 * 5 * Permission is hereby granted, free of charge, to any person obtaining a 6 * copy of this software and associated documentation files (the "Software"), 7 * to deal in the Software without restriction, including without limitation 8 * the rights to use, copy, modify, merge, publish, distribute, sub license, 9 * and/or sell copies of the Software, and to permit persons to whom the 10 * Software is furnished to do so, subject to the following conditions: 11 * 12 * The above copyright notice and this permission notice (including the next 13 * paragraph) shall be included in all copies or substantial portions of the 14 * Software. 15 * 16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL 19 * IBM, 20 * AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 21 * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF 22 * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 23 * SOFTWARE. 24 */ 25 26#ifdef HAVE_DIX_CONFIG_H 27#include <dix-config.h> 28#endif 29 30#include "glxserver.h" 31#include "glxbyteorder.h" 32#include "glxext.h" 33#include "singlesize.h" 34#include "unpack.h" 35#include "indirect_size_get.h" 36#include "indirect_dispatch.h" 37 38int 39__glXDisp_GetCompressedTexImage(struct __GLXclientStateRec *cl, GLbyte * pc) 40{ 41 xGLXSingleReq *const req = (xGLXSingleReq *) pc; 42 int error; 43 __GLXcontext *const cx = __glXForceCurrent(cl, req->contextTag, &error); 44 ClientPtr client = cl->client; 45 46 REQUEST_FIXED_SIZE(xGLXSingleReq, 8); 47 48 pc += __GLX_SINGLE_HDR_SIZE; 49 if (cx != NULL) { 50 const GLenum target = *(GLenum *) (pc + 0); 51 const GLint level = *(GLint *) (pc + 4); 52 GLint compsize = 0; 53 char *answer = NULL, answerBuffer[200]; 54 xGLXSingleReply reply = { 0, }; 55 56 glGetTexLevelParameteriv(target, level, GL_TEXTURE_COMPRESSED_IMAGE_SIZE, 57 &compsize); 58 59 if (compsize != 0) { 60 PFNGLGETCOMPRESSEDTEXIMAGEARBPROC GetCompressedTexImageARB = 61 __glGetProcAddress("glGetCompressedTexImageARB"); 62 __GLX_GET_ANSWER_BUFFER(answer, cl, compsize, 1); 63 __glXClearErrorOccured(); 64 GetCompressedTexImageARB(target, level, answer); 65 } 66 67 if (__glXErrorOccured()) { 68 __GLX_BEGIN_REPLY(0); 69 __GLX_SEND_HEADER(); 70 } 71 else { 72 __GLX_BEGIN_REPLY(compsize); 73 ((xGLXGetTexImageReply *) &reply)->width = compsize; 74 __GLX_SEND_HEADER(); 75 __GLX_SEND_VOID_ARRAY(compsize); 76 } 77 78 error = Success; 79 } 80 81 return error; 82} 83 84int 85__glXDispSwap_GetCompressedTexImage(struct __GLXclientStateRec *cl, GLbyte * pc) 86{ 87 xGLXSingleReq *const req = (xGLXSingleReq *) pc; 88 int error; 89 __GLXcontext *const cx = 90 __glXForceCurrent(cl, bswap_32(req->contextTag), &error); 91 ClientPtr client = cl->client; 92 93 REQUEST_FIXED_SIZE(xGLXSingleReq, 8); 94 95 pc += __GLX_SINGLE_HDR_SIZE; 96 if (cx != NULL) { 97 const GLenum target = (GLenum) bswap_32(*(int *) (pc + 0)); 98 const GLint level = (GLint) bswap_32(*(int *) (pc + 4)); 99 GLint compsize = 0; 100 char *answer = NULL, answerBuffer[200]; 101 xGLXSingleReply reply = { 0, }; 102 103 glGetTexLevelParameteriv(target, level, GL_TEXTURE_COMPRESSED_IMAGE_SIZE, 104 &compsize); 105 106 if (compsize != 0) { 107 PFNGLGETCOMPRESSEDTEXIMAGEARBPROC GetCompressedTexImageARB = 108 __glGetProcAddress("glGetCompressedTexImageARB"); 109 __GLX_GET_ANSWER_BUFFER(answer, cl, compsize, 1); 110 __glXClearErrorOccured(); 111 GetCompressedTexImageARB(target, level, answer); 112 } 113 114 if (__glXErrorOccured()) { 115 __GLX_BEGIN_REPLY(0); 116 __GLX_SEND_HEADER(); 117 } 118 else { 119 __GLX_BEGIN_REPLY(compsize); 120 ((xGLXGetTexImageReply *) &reply)->width = compsize; 121 __GLX_SEND_HEADER(); 122 __GLX_SEND_VOID_ARRAY(compsize); 123 } 124 125 error = Success; 126 } 127 128 return error; 129} 130