summaryrefslogtreecommitdiff
path: root/glx/indirect_texture_compression.c
blob: 5f44d7b1aec6d80bc09c881a926897c29b7dd835 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
/*
 * (C) Copyright IBM Corporation 2005, 2006
 * All Rights Reserved.
 * 
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the "Software"),
 * to deal in the Software without restriction, including without limitation
 * the rights to use, copy, modify, merge, publish, distribute, sub license,
 * and/or sell copies of the Software, and to permit persons to whom the
 * Software is furnished to do so, subject to the following conditions:
 * 
 * The above copyright notice and this permission notice (including the next
 * paragraph) shall be included in all copies or substantial portions of the
 * Software.
 * 
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.  IN NO EVENT SHALL
 * IBM,
 * AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
 * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
 * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 * SOFTWARE.
 */

#ifdef HAVE_DIX_CONFIG_H
#include <dix-config.h>
#endif

#include "glxserver.h"
#include "glxbyteorder.h"
#include "glxext.h"
#include "singlesize.h"
#include "unpack.h"
#include "indirect_size_get.h"
#include "indirect_dispatch.h"
#include "glapitable.h"
#include "glapi.h"
#include "glthread.h"
#include "dispatch.h"

int __glXDisp_GetCompressedTexImageARB(struct __GLXclientStateRec *cl, GLbyte *pc)
{
    xGLXSingleReq * const req = (xGLXSingleReq *) pc;
    int error;
    __GLXcontext * const cx = __glXForceCurrent( cl, req->contextTag, & error );
    ClientPtr client = cl->client;


    pc += __GLX_SINGLE_HDR_SIZE;
    if ( cx != NULL ) {
	const GLenum target = *(GLenum *)(pc + 0);
	const GLint  level  = *(GLint  *)(pc + 4);
	GLint compsize = 0;
	char *answer = NULL, answerBuffer[200];

	CALL_GetTexLevelParameteriv(GET_DISPATCH(), (target, level, GL_TEXTURE_COMPRESSED_IMAGE_SIZE, &compsize));

	if ( compsize != 0 ) {
	    __GLX_GET_ANSWER_BUFFER(answer,cl,compsize,1);
	    __glXClearErrorOccured();
	    CALL_GetCompressedTexImageARB(GET_DISPATCH(), (target, level, answer));
	}

	if (__glXErrorOccured()) {
	    __GLX_BEGIN_REPLY(0);
	    __GLX_SEND_HEADER();
	} else {
	    __GLX_BEGIN_REPLY(compsize);
	    ((xGLXGetTexImageReply *)&__glXReply)->width = compsize;
	    __GLX_SEND_HEADER();
	    __GLX_SEND_VOID_ARRAY(compsize);
	}

	error = Success;
    }

    return error;
}


int __glXDispSwap_GetCompressedTexImageARB(struct __GLXclientStateRec *cl, GLbyte *pc)
{
    xGLXSingleReq * const req = (xGLXSingleReq *) pc;
    int error;
    __GLXcontext * const cx = __glXForceCurrent( cl, bswap_32( req->contextTag ), & error );
    ClientPtr client = cl->client;


    pc += __GLX_SINGLE_HDR_SIZE;
    if ( cx != NULL ) {
	const GLenum target = (GLenum) bswap_32( *(int *)(pc + 0) );
	const GLint  level =  (GLint ) bswap_32( *(int *)(pc + 4) );
	GLint compsize = 0;
	char *answer = NULL, answerBuffer[200];

	CALL_GetTexLevelParameteriv(GET_DISPATCH(), (target, level, GL_TEXTURE_COMPRESSED_IMAGE_SIZE, &compsize));

	if ( compsize != 0 ) {
	    __GLX_GET_ANSWER_BUFFER(answer,cl,compsize,1);
	    __glXClearErrorOccured();
	    CALL_GetCompressedTexImageARB(GET_DISPATCH(), (target, level, answer));
	}

	if (__glXErrorOccured()) {
	    __GLX_BEGIN_REPLY(0);
	    __GLX_SEND_HEADER();
	} else {
	    __GLX_BEGIN_REPLY(compsize);
	    ((xGLXGetTexImageReply *)&__glXReply)->width = compsize;
	    __GLX_SEND_HEADER();
	    __GLX_SEND_VOID_ARRAY(compsize);
	}
	
	error = Success;
    }

    return error;
}