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
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
|
/* Copyright (c) 2001, Stanford University
* All rights reserved
*
* See the file LICENSE.txt for information on redistributing this software.
*/
#include "chromium.h"
#include "cr_error.h"
#include "cr_mem.h"
#include "cr_pixeldata.h"
#include "server_dispatch.h"
#include "server.h"
void SERVER_DISPATCH_APIENTRY
crServerDispatchGetTexImage(GLenum target, GLint level, GLenum format,
GLenum type, GLvoid * pixels)
{
GLsizei width, height, depth, size;
GLvoid *buffer = NULL;
#ifdef CR_ARB_pixel_buffer_object
if (crStateIsBufferBound(GL_PIXEL_PACK_BUFFER_ARB))
{
GLvoid *pbo_offset;
/*pixels are actually a pointer to location of 8byte network pointer in hgcm buffer
regardless of guest/host bitness we're using only 4lower bytes as there're no
pbo>4gb (yet?)
*/
pbo_offset = (GLvoid*) ((uintptr_t) *((GLint*)pixels));
cr_server.head_spu->dispatch_table.GetTexImage(target, level, format, type, pbo_offset);
return;
}
#endif
cr_server.head_spu->dispatch_table.GetTexLevelParameteriv(target, level, GL_TEXTURE_WIDTH, &width);
cr_server.head_spu->dispatch_table.GetTexLevelParameteriv(target, level, GL_TEXTURE_HEIGHT, &height);
cr_server.head_spu->dispatch_table.GetTexLevelParameteriv(target, level, GL_TEXTURE_DEPTH, &depth);
size = crTextureSize(format, type, width, height, depth);
#if 0
{
CRContext *ctx = crStateGetCurrent();
CRTextureObj *tobj;
CRTextureLevel *tl;
GLint id;
crDebug("GetTexImage: %d, %i, %d, %d", target, level, format, type);
crDebug("===StateTracker===");
crDebug("Current TU: %i", ctx->texture.curTextureUnit);
if (target==GL_TEXTURE_2D)
{
tobj = ctx->texture.unit[ctx->texture.curTextureUnit].currentTexture2D;
CRASSERT(tobj);
tl = &tobj->level[0][level];
crDebug("Texture %i(hw %i), w=%i, h=%i", tobj->id, tobj->hwid, tl->width, tl->height, tl->depth);
}
else
{
crDebug("Not 2D tex");
}
crDebug("===GPU===");
cr_server.head_spu->dispatch_table.GetIntegerv(GL_ACTIVE_TEXTURE, &id);
crDebug("Current TU: %i", id);
if (target==GL_TEXTURE_2D)
{
cr_server.head_spu->dispatch_table.GetIntegerv(GL_TEXTURE_BINDING_2D, &id);
crDebug("Texture: %i, w=%i, h=%i, d=%i", id, width, height, depth);
}
}
#endif
if (size && (buffer = crAlloc(size))) {
/* Note, the other pixel PACK parameters (default values) should
* be OK at this point.
*/
cr_server.head_spu->dispatch_table.PixelStorei(GL_PACK_ALIGNMENT, 1);
cr_server.head_spu->dispatch_table.GetTexImage(target, level, format, type, buffer);
crServerReturnValue( buffer, size );
crFree(buffer);
}
else {
/* need to return _something_ to avoid blowing up */
GLuint dummy = 0;
crServerReturnValue( (GLvoid *) &dummy, sizeof(dummy) );
}
}
#if CR_ARB_texture_compression
void SERVER_DISPATCH_APIENTRY
crServerDispatchGetCompressedTexImageARB(GLenum target, GLint level,
GLvoid *img)
{
GLint size;
GLvoid *buffer=NULL;
#ifdef CR_ARB_pixel_buffer_object
if (crStateIsBufferBound(GL_PIXEL_PACK_BUFFER_ARB))
{
GLvoid *pbo_offset;
pbo_offset = (GLvoid*) ((uintptr_t) *((GLint*)img));
cr_server.head_spu->dispatch_table.GetCompressedTexImageARB(target, level, pbo_offset);
return;
}
#endif
cr_server.head_spu->dispatch_table.GetTexLevelParameteriv(target, level, GL_TEXTURE_COMPRESSED_IMAGE_SIZE, &size);
if (size && (buffer = crAlloc(size))) {
/* XXX the pixel PACK parameter should be OK at this point */
cr_server.head_spu->dispatch_table.GetCompressedTexImageARB(target, level, buffer);
crServerReturnValue( buffer, size );
crFree(buffer);
}
else {
/* need to return _something_ to avoid blowing up */
GLuint dummy = 0;
crServerReturnValue( (GLvoid *) &dummy, sizeof(dummy) );
}
}
#endif /* CR_ARB_texture_compression */
void SERVER_DISPATCH_APIENTRY crServerDispatchGetPolygonStipple( GLubyte * mask )
{
#ifdef CR_ARB_pixel_buffer_object
if (crStateIsBufferBound(GL_PIXEL_PACK_BUFFER_ARB))
{
GLvoid *pbo_offset;
pbo_offset = (GLubyte*) ((uintptr_t) *((GLint*)mask));
cr_server.head_spu->dispatch_table.GetPolygonStipple(pbo_offset);
}
else
#endif
{
GLubyte local_mask[128];
cr_server.head_spu->dispatch_table.GetPolygonStipple( local_mask );
crServerReturnValue( &(local_mask[0]), 128*sizeof(GLubyte) );
}
}
|