indirect_texture_compression.c revision 4642e01f
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#define NEED_REPLIES 27#ifdef HAVE_DIX_CONFIG_H 28#include <dix-config.h> 29#endif 30 31#include "glxserver.h" 32#include "glxbyteorder.h" 33#include "glxext.h" 34#include "singlesize.h" 35#include "unpack.h" 36#include "indirect_size_get.h" 37#include "indirect_dispatch.h" 38#include "glapitable.h" 39#include "glapi.h" 40#include "glthread.h" 41#include "dispatch.h" 42 43int __glXDisp_GetCompressedTexImageARB(struct __GLXclientStateRec *cl, GLbyte *pc) 44{ 45 xGLXSingleReq * const req = (xGLXSingleReq *) pc; 46 int error; 47 __GLXcontext * const cx = __glXForceCurrent( cl, req->contextTag, & error ); 48 ClientPtr client = cl->client; 49 50 51 pc += __GLX_SINGLE_HDR_SIZE; 52 if ( cx != NULL ) { 53 const GLenum target = *(GLenum *)(pc + 0); 54 const GLint level = *(GLint *)(pc + 4); 55 GLint compsize = 0; 56 char *answer, answerBuffer[200]; 57 58 CALL_GetTexLevelParameteriv(GET_DISPATCH(), (target, level, GL_TEXTURE_COMPRESSED_IMAGE_SIZE, &compsize)); 59 60 if ( compsize != 0 ) { 61 __GLX_GET_ANSWER_BUFFER(answer,cl,compsize,1); 62 __glXClearErrorOccured(); 63 CALL_GetCompressedTexImageARB(GET_DISPATCH(), (target, level, answer)); 64 } 65 66 if (__glXErrorOccured()) { 67 __GLX_BEGIN_REPLY(0); 68 __GLX_SEND_HEADER(); 69 } else { 70 __GLX_BEGIN_REPLY(compsize); 71 ((xGLXGetTexImageReply *)&__glXReply)->width = compsize; 72 __GLX_SEND_HEADER(); 73 __GLX_SEND_VOID_ARRAY(compsize); 74 } 75 76 error = Success; 77 } 78 79 return error; 80} 81 82 83int __glXDispSwap_GetCompressedTexImageARB(struct __GLXclientStateRec *cl, GLbyte *pc) 84{ 85 xGLXSingleReq * const req = (xGLXSingleReq *) pc; 86 int error; 87 __GLXcontext * const cx = __glXForceCurrent( cl, bswap_32( req->contextTag ), & error ); 88 ClientPtr client = cl->client; 89 90 91 pc += __GLX_SINGLE_HDR_SIZE; 92 if ( cx != NULL ) { 93 const GLenum target = (GLenum) bswap_32( *(int *)(pc + 0) ); 94 const GLint level = (GLint ) bswap_32( *(int *)(pc + 4) ); 95 GLint compsize = 0; 96 char *answer, answerBuffer[200]; 97 98 CALL_GetTexLevelParameteriv(GET_DISPATCH(), (target, level, GL_TEXTURE_COMPRESSED_IMAGE_SIZE, &compsize)); 99 100 if ( compsize != 0 ) { 101 __GLX_GET_ANSWER_BUFFER(answer,cl,compsize,1); 102 __glXClearErrorOccured(); 103 CALL_GetCompressedTexImageARB(GET_DISPATCH(), (target, level, answer)); 104 } 105 106 if (__glXErrorOccured()) { 107 __GLX_BEGIN_REPLY(0); 108 __GLX_SEND_HEADER(); 109 } else { 110 __GLX_BEGIN_REPLY(compsize); 111 ((xGLXGetTexImageReply *)&__glXReply)->width = compsize; 112 __GLX_SEND_HEADER(); 113 __GLX_SEND_VOID_ARRAY(compsize); 114 } 115 116 error = Success; 117 } 118 119 return error; 120} 121