VirtualBox

source: vbox/trunk/src/VBox/HostServices/SharedOpenGL/unpacker/unpack_texture.cpp@ 80334

最後變更 在這個檔案從80334是 78875,由 vboxsync 提交於 6 年 前

HostServices/SharedOpenGL/unpacker/unpack_texture.cpp: Fix crUnpackTexSubImage3D(), crUnpackTexSubImage2D() and crUnpackTexSubImage1D and calculate the proper texture size for crUnpackTexImage3DEXT() and crUnpackTexImage3D()

  • 屬性 svn:eol-style 設為 native
  • 屬性 svn:keywords 設為 Id Revision
檔案大小: 29.8 KB
 
1/* Copyright (c) 2001, Stanford University
2 * All rights reserved
3 *
4 * See the file LICENSE.txt for information on redistributing this software.
5 */
6
7#include "unpacker.h"
8#include "cr_error.h"
9#include "cr_pixeldata.h"
10#include "cr_protocol.h"
11#include "cr_mem.h"
12#include "cr_version.h"
13
14#if defined( GL_EXT_texture3D )
15void crUnpackTexImage3DEXT(PCrUnpackerState pState)
16{
17 CHECK_BUFFER_SIZE_STATIC_LAST(pState, sizeof(int) + 36, int);
18
19 GLenum target = READ_DATA(pState, sizeof( int ) + 0, GLenum );
20 GLint level = READ_DATA(pState, sizeof( int ) + 4, GLint );
21 GLenum internalformat = READ_DATA(pState, sizeof( int ) + 8, GLint );
22 GLsizei width = READ_DATA(pState, sizeof( int ) + 12, GLsizei );
23 GLsizei height = READ_DATA(pState, sizeof( int ) + 16, GLsizei );
24 GLsizei depth = READ_DATA(pState, sizeof( int ) + 20, GLsizei );
25 GLint border = READ_DATA(pState, sizeof( int ) + 24, GLint );
26 GLenum format = READ_DATA(pState, sizeof( int ) + 28, GLenum );
27 GLenum type = READ_DATA(pState, sizeof( int ) + 32, GLenum );
28 int noimagedata = READ_DATA(pState, sizeof( int ) + 36, int );
29 GLvoid *pixels;
30
31 /*If there's no imagedata send, it's either that passed pointer was NULL or
32 there was GL_PIXEL_UNPACK_BUFFER_ARB bound, in both cases 4bytes of passed
33 pointer would convert to either NULL or offset in the bound buffer.
34 */
35 CHECK_BUFFER_SIZE_STATIC_UPDATE_LAST(pState, sizeof(int)+40, GLint);
36 if ( noimagedata )
37 pixels = (void*) (uintptr_t) READ_DATA(pState, sizeof(int)+40, GLint);
38 else
39 {
40 size_t cbImg = crTextureSize(format, type, width, height, depth);
41 if (RT_UNLIKELY(cbImg == 0))
42 {
43 pState->rcUnpack = VERR_INVALID_PARAMETER;
44 return;
45 }
46 pixels = DATA_POINTER(pState, sizeof( int ) + 44, GLvoid );
47 CHECK_ARRAY_SIZE_FROM_PTR_UPDATE_LAST(pState, pixels, cbImg, GLubyte);
48 }
49
50 pState->pDispatchTbl->TexImage3DEXT(target, level, internalformat, width,
51 height, depth, border, format, type,
52 pixels);
53 INCR_VAR_PTR(pState);
54}
55#endif /* GL_EXT_texture3D */
56
57#if defined( CR_OPENGL_VERSION_1_2 )
58void crUnpackTexImage3D(PCrUnpackerState pState)
59{
60 CHECK_BUFFER_SIZE_STATIC_LAST(pState, sizeof(int) + 36, int);
61
62 GLenum target = READ_DATA(pState, sizeof( int ) + 0, GLenum );
63 GLint level = READ_DATA(pState, sizeof( int ) + 4, GLint );
64 GLint internalformat = READ_DATA(pState, sizeof( int ) + 8, GLint );
65 GLsizei width = READ_DATA(pState, sizeof( int ) + 12, GLsizei );
66 GLsizei height = READ_DATA(pState, sizeof( int ) + 16, GLsizei );
67 GLsizei depth = READ_DATA(pState, sizeof( int ) + 20, GLsizei );
68 GLint border = READ_DATA(pState, sizeof( int ) + 24, GLint );
69 GLenum format = READ_DATA(pState, sizeof( int ) + 28, GLenum );
70 GLenum type = READ_DATA(pState, sizeof( int ) + 32, GLenum );
71 int noimagedata = READ_DATA(pState, sizeof( int ) + 36, int );
72 GLvoid *pixels;
73
74 CHECK_BUFFER_SIZE_STATIC_UPDATE_LAST(pState, sizeof(int)+40, GLint);
75 if ( noimagedata )
76 pixels = (void*) (uintptr_t) READ_DATA(pState, sizeof(int)+40, GLint);
77 else
78 {
79 size_t cbImg = crTextureSize(format, type, width, height, depth);
80 if (RT_UNLIKELY(cbImg == 0))
81 {
82 pState->rcUnpack = VERR_INVALID_PARAMETER;
83 return;
84 }
85 pixels = DATA_POINTER(pState, sizeof( int ) + 44, GLvoid );
86 CHECK_ARRAY_SIZE_FROM_PTR_UPDATE_LAST(pState, pixels, cbImg, GLubyte);
87 }
88
89 pState->pDispatchTbl->TexImage3D( target, level, internalformat, width, height,
90 depth, border, format, type, pixels );
91 INCR_VAR_PTR(pState);
92}
93#endif /* CR_OPENGL_VERSION_1_2 */
94
95void crUnpackTexImage2D(PCrUnpackerState pState)
96{
97 CHECK_BUFFER_SIZE_STATIC_LAST(pState, sizeof(int) + 32, int);
98
99 GLenum target = READ_DATA(pState, sizeof( int ) + 0, GLenum );
100 GLint level = READ_DATA(pState, sizeof( int ) + 4, GLint );
101 GLint internalformat = READ_DATA(pState, sizeof( int ) + 8, GLint );
102 GLsizei width = READ_DATA(pState, sizeof( int ) + 12, GLsizei );
103 GLsizei height = READ_DATA(pState, sizeof( int ) + 16, GLsizei );
104 GLint border = READ_DATA(pState, sizeof( int ) + 20, GLint );
105 GLenum format = READ_DATA(pState, sizeof( int ) + 24, GLenum );
106 GLenum type = READ_DATA(pState, sizeof( int ) + 28, GLenum );
107 int noimagedata = READ_DATA(pState, sizeof( int ) + 32, int );
108 GLvoid *pixels;
109
110 CHECK_BUFFER_SIZE_STATIC_UPDATE_LAST(pState, sizeof(int)+36, GLint);
111 if ( noimagedata )
112 pixels = (void*) (uintptr_t) READ_DATA(pState, sizeof(int)+36, GLint);
113 else
114 {
115 size_t cbImg = crImageSize(format, type, width, height);
116 if (RT_UNLIKELY(cbImg == 0))
117 {
118 pState->rcUnpack = VERR_INVALID_PARAMETER;
119 return;
120 }
121 pixels = DATA_POINTER(pState, sizeof( int ) + 40, GLvoid );
122 CHECK_ARRAY_SIZE_FROM_PTR_UPDATE_LAST(pState, pixels, cbImg, GLubyte);
123 }
124
125 pState->pDispatchTbl->TexImage2D( target, level, internalformat, width, height,
126 border, format, type, pixels );
127 INCR_VAR_PTR(pState);
128}
129
130void crUnpackTexImage1D(PCrUnpackerState pState)
131{
132 CHECK_BUFFER_SIZE_STATIC_LAST(pState, sizeof(int) + 28, int);
133
134 GLenum target = READ_DATA(pState, sizeof( int ) + 0, GLenum );
135 GLint level = READ_DATA(pState, sizeof( int ) + 4, GLint );
136 GLint internalformat = READ_DATA(pState, sizeof( int ) + 8, GLint );
137 GLsizei width = READ_DATA(pState, sizeof( int ) + 12, GLsizei );
138 GLint border = READ_DATA(pState, sizeof( int ) + 16, GLint );
139 GLenum format = READ_DATA(pState, sizeof( int ) + 20, GLenum );
140 GLenum type = READ_DATA(pState, sizeof( int ) + 24, GLenum );
141 int noimagedata = READ_DATA(pState, sizeof( int ) + 28, int );
142 GLvoid *pixels;
143
144 CHECK_BUFFER_SIZE_STATIC_UPDATE_LAST(pState, sizeof(int)+32, GLint);
145 if ( noimagedata )
146 pixels = (void*) (uintptr_t) READ_DATA(pState, sizeof(int)+32, GLint);
147 else
148 {
149 size_t cbImg = crImageSize(format, type, width, 1);
150 if (RT_UNLIKELY(cbImg == 0))
151 {
152 pState->rcUnpack = VERR_INVALID_PARAMETER;
153 return;
154 }
155 pixels = DATA_POINTER(pState, sizeof( int ) + 36, GLvoid );
156 CHECK_ARRAY_SIZE_FROM_PTR_UPDATE_LAST(pState, pixels, cbImg, GLubyte);
157 }
158
159 pState->pDispatchTbl->TexImage1D(target, level, internalformat, width, border,
160 format, type, pixels );
161 INCR_VAR_PTR(pState);
162}
163
164void crUnpackDeleteTextures(PCrUnpackerState pState)
165{
166 CHECK_BUFFER_SIZE_STATIC_LAST(pState, sizeof(int) + 0, GLsizei);
167
168 GLsizei n = READ_DATA(pState, sizeof( int ) + 0, GLsizei );
169 GLuint *textures = DATA_POINTER(pState, sizeof( int ) + 4, GLuint );
170
171 CHECK_ARRAY_SIZE_FROM_PTR_UPDATE_LAST(pState, textures, n, GLuint);
172 pState->pDispatchTbl->DeleteTextures( n, textures );
173 INCR_VAR_PTR(pState);
174}
175
176
177void crUnpackPrioritizeTextures(PCrUnpackerState pState)
178{
179 CHECK_BUFFER_SIZE_STATIC_LAST(pState, sizeof(int) + 0, GLsizei);
180
181 GLsizei n = READ_DATA(pState, sizeof( int ) + 0, GLsizei );
182 GLuint *textures = DATA_POINTER(pState, sizeof( int ) + 4, GLuint );
183 CHECK_ARRAY_SIZE_FROM_PTR_UPDATE_LAST(pState, textures, n, GLuint);
184
185 GLclampf *priorities = DATA_POINTER(pState, sizeof( int ) + 4 + n*sizeof( GLuint ),
186 GLclampf );
187 CHECK_ARRAY_SIZE_FROM_PTR_UPDATE_LAST(pState, priorities, n, GLclampf);
188
189 pState->pDispatchTbl->PrioritizeTextures( n, textures, priorities );
190 INCR_VAR_PTR(pState);
191}
192
193static size_t crGetTexParameterParamsFromPname(GLenum pname)
194{
195 int cParams = 0;
196
197 switch (pname)
198 {
199 case GL_TEXTURE_MIN_FILTER:
200 case GL_TEXTURE_MAG_FILTER:
201 case GL_TEXTURE_WRAP_R:
202 case GL_TEXTURE_WRAP_S:
203 case GL_TEXTURE_WRAP_T:
204 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
205 case GL_TEXTURE_MIN_LOD:
206 case GL_TEXTURE_MAX_LOD:
207 case GL_TEXTURE_BASE_LEVEL:
208 case GL_TEXTURE_MAX_LEVEL:
209#ifdef CR_ARB_shadow
210 case GL_TEXTURE_COMPARE_MODE_ARB:
211 case GL_TEXTURE_COMPARE_FUNC_ARB:
212#endif
213#ifdef GL_TEXTURE_PRIORITY
214 case GL_TEXTURE_PRIORITY:
215#endif
216#ifdef CR_ARB_shadow_ambient
217 case GL_TEXTURE_COMPARE_FAIL_VALUE_ARB:
218#endif
219#ifdef CR_ARB_depth_texture
220 case GL_DEPTH_TEXTURE_MODE_ARB:
221#endif
222#ifdef CR_SGIS_generate_mipmap
223 case GL_GENERATE_MIPMAP_SGIS:
224#endif
225 cParams = 1;
226 break;
227 case GL_TEXTURE_BORDER_COLOR:
228 cParams = 4;
229 break;
230 default:
231 break; /* Error, handled in caller. */
232 }
233
234 return cParams;
235}
236
237void crUnpackTexParameterfv(PCrUnpackerState pState)
238{
239 CHECK_BUFFER_SIZE_STATIC_LAST(pState, sizeof(int) + 4, GLenum);
240
241 GLenum target = READ_DATA(pState, sizeof( int ) + 0, GLenum );
242 GLenum pname = READ_DATA(pState, sizeof( int ) + 4, GLenum );
243 GLfloat *params = DATA_POINTER(pState, sizeof( int ) + 8, GLfloat );
244
245 size_t cParams = crGetTexParameterParamsFromPname(pname);
246 if (RT_UNLIKELY(cParams == 0))
247 {
248 pState->rcUnpack = VERR_INVALID_PARAMETER;
249 return;
250 }
251
252 CHECK_ARRAY_SIZE_FROM_PTR_UPDATE_LAST(pState, params, cParams, GLfloat);
253 pState->pDispatchTbl->TexParameterfv( target, pname, params );
254 INCR_VAR_PTR(pState);
255}
256
257void crUnpackTexParameteriv(PCrUnpackerState pState)
258{
259 CHECK_BUFFER_SIZE_STATIC_LAST(pState, sizeof(int) + 4, GLenum);
260
261 GLenum target = READ_DATA(pState, sizeof( int ) + 0, GLenum );
262 GLenum pname = READ_DATA(pState, sizeof( int ) + 4, GLenum );
263 GLint *params = DATA_POINTER(pState, sizeof( int ) + 8, GLint );
264
265 size_t cParams = crGetTexParameterParamsFromPname(pname);
266 if (RT_UNLIKELY(cParams == 0))
267 {
268 pState->rcUnpack = VERR_INVALID_PARAMETER;
269 return;
270 }
271
272 CHECK_ARRAY_SIZE_FROM_PTR_UPDATE_LAST(pState, params, cParams, GLint);
273 pState->pDispatchTbl->TexParameteriv( target, pname, params );
274 INCR_VAR_PTR(pState);
275}
276
277void crUnpackTexParameterf(PCrUnpackerState pState)
278{
279 CHECK_BUFFER_SIZE_STATIC_LAST(pState, sizeof(int) + 8, GLfloat);
280
281 GLenum target = READ_DATA(pState, sizeof( int ) + 0, GLenum );
282 GLenum pname = READ_DATA(pState, sizeof( int ) + 4, GLenum );
283 GLfloat param = READ_DATA(pState, sizeof( int ) + 8, GLfloat );
284
285 pState->pDispatchTbl->TexParameterf( target, pname, param );
286 INCR_VAR_PTR(pState);
287}
288
289void crUnpackTexParameteri(PCrUnpackerState pState)
290{
291 CHECK_BUFFER_SIZE_STATIC_LAST(pState, sizeof(int) + 8, GLint);
292
293 GLenum target = READ_DATA(pState, sizeof( int ) + 0, GLenum );
294 GLenum pname = READ_DATA(pState, sizeof( int ) + 4, GLenum );
295 GLint param = READ_DATA(pState, sizeof( int ) + 8, GLint );
296
297 pState->pDispatchTbl->TexParameteri( target, pname, param );
298 INCR_VAR_PTR(pState);
299}
300
301#if defined(CR_OPENGL_VERSION_1_2)
302void crUnpackTexSubImage3D(PCrUnpackerState pState)
303{
304 CHECK_BUFFER_SIZE_STATIC_LAST(pState, sizeof(int) + 40, int);
305
306 GLenum target = READ_DATA(pState, sizeof( int ) + 0, GLenum );
307 GLint level = READ_DATA(pState, sizeof( int ) + 4, GLint );
308 GLint xoffset = READ_DATA(pState, sizeof( int ) + 8, GLint );
309 GLint yoffset = READ_DATA(pState, sizeof( int ) + 12, GLint );
310 GLint zoffset = READ_DATA(pState, sizeof( int ) + 16, GLint );
311 GLsizei width = READ_DATA(pState, sizeof( int ) + 20, GLsizei );
312 GLsizei height = READ_DATA(pState, sizeof( int ) + 24, GLsizei );
313 GLsizei depth = READ_DATA(pState, sizeof( int ) + 28, GLsizei );
314 GLenum format = READ_DATA(pState, sizeof( int ) + 32, GLenum );
315 GLenum type = READ_DATA(pState, sizeof( int ) + 36, GLenum );
316 int noimagedata = READ_DATA(pState, sizeof( int ) + 40, int );
317 GLvoid *pixels;
318
319 CHECK_BUFFER_SIZE_STATIC_UPDATE_LAST(pState, sizeof(int)+44, GLint);
320 if ( noimagedata )
321 pixels = (void*) (uintptr_t) READ_DATA(pState, sizeof(int)+44, GLint);
322 else
323 {
324 /*
325 * Specifying a sub texture with zero width, height or depth is not an
326 * error but has no effect.
327 * See: https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glTexSubImage3D.xml
328 */
329 size_t cbImg = crTextureSize(format, type, width, height, depth);
330 if (RT_UNLIKELY( cbImg == 0
331 && width != 0
332 && height != 0
333 && depth != 0))
334 {
335 pState->rcUnpack = VERR_INVALID_PARAMETER;
336 return;
337 }
338 pixels = DATA_POINTER(pState, sizeof( int ) + 48, GLvoid );
339 CHECK_ARRAY_SIZE_FROM_PTR_UPDATE_LAST(pState, pixels, cbImg, GLubyte);
340 }
341
342 pState->pDispatchTbl->PixelStorei( GL_UNPACK_ROW_LENGTH, 0 );
343 pState->pDispatchTbl->PixelStorei( GL_UNPACK_SKIP_PIXELS, 0 );
344 pState->pDispatchTbl->PixelStorei( GL_UNPACK_SKIP_ROWS, 0 );
345 pState->pDispatchTbl->PixelStorei( GL_UNPACK_ALIGNMENT, 1 );
346
347 pState->pDispatchTbl->TexSubImage3D(target, level, xoffset, yoffset, zoffset,
348 width, height, depth, format, type, pixels);
349 INCR_VAR_PTR(pState);
350}
351#endif /* CR_OPENGL_VERSION_1_2 */
352
353void crUnpackTexSubImage2D(PCrUnpackerState pState)
354{
355 CHECK_BUFFER_SIZE_STATIC_LAST(pState, sizeof(int) + 32, int);
356
357 GLenum target = READ_DATA(pState, sizeof( int ) + 0, GLenum );
358 GLint level = READ_DATA(pState, sizeof( int ) + 4, GLint );
359 GLint xoffset = READ_DATA(pState, sizeof( int ) + 8, GLint );
360 GLint yoffset = READ_DATA(pState, sizeof( int ) + 12, GLint );
361 GLsizei width = READ_DATA(pState, sizeof( int ) + 16, GLsizei );
362 GLsizei height = READ_DATA(pState, sizeof( int ) + 20, GLsizei );
363 GLenum format = READ_DATA(pState, sizeof( int ) + 24, GLenum );
364 GLenum type = READ_DATA(pState, sizeof( int ) + 28, GLenum );
365 int noimagedata = READ_DATA(pState, sizeof( int ) + 32, int );
366 GLvoid *pixels;
367
368 CHECK_BUFFER_SIZE_STATIC_UPDATE_LAST(pState, sizeof(int)+36, GLint);
369 if ( noimagedata )
370 {
371 CHECK_BUFFER_SIZE_STATIC_UPDATE_LAST(pState, sizeof(int)+36, GLint);
372 pixels = (void*) (uintptr_t) READ_DATA(pState, sizeof(int)+36, GLint);
373 }
374 else
375 {
376 /*
377 * Specifying a sub texture with zero width, height or depth is not an
378 * error but has no effect.
379 * See: https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glTexSubImage2D.xml
380 */
381 size_t cbImg = crImageSize(format, type, width, height);
382 if (RT_UNLIKELY( cbImg == 0
383 && width != 0
384 && height != 0))
385 {
386 pState->rcUnpack = VERR_INVALID_PARAMETER;
387 return;
388 }
389 pixels = DATA_POINTER(pState, sizeof( int ) + 40, GLvoid );
390 CHECK_ARRAY_SIZE_FROM_PTR_UPDATE_LAST(pState, pixels, cbImg, GLubyte);
391 }
392
393 pState->pDispatchTbl->PixelStorei( GL_UNPACK_ROW_LENGTH, 0 );
394 pState->pDispatchTbl->PixelStorei( GL_UNPACK_SKIP_PIXELS, 0 );
395 pState->pDispatchTbl->PixelStorei( GL_UNPACK_SKIP_ROWS, 0 );
396 pState->pDispatchTbl->PixelStorei( GL_UNPACK_ALIGNMENT, 1 );
397
398 pState->pDispatchTbl->TexSubImage2D( target, level, xoffset, yoffset, width,
399 height, format, type, pixels );
400 INCR_VAR_PTR(pState);
401}
402
403void crUnpackTexSubImage1D(PCrUnpackerState pState)
404{
405 CHECK_BUFFER_SIZE_STATIC_LAST(pState, sizeof(int) + 24, int);
406
407 GLenum target = READ_DATA(pState, sizeof( int ) + 0, GLenum );
408 GLint level = READ_DATA(pState, sizeof( int ) + 4, GLint );
409 GLint xoffset = READ_DATA(pState, sizeof( int ) + 8, GLint );
410 GLsizei width = READ_DATA(pState, sizeof( int ) + 12, GLsizei );
411 GLenum format = READ_DATA(pState, sizeof( int ) + 16, GLenum );
412 GLenum type = READ_DATA(pState, sizeof( int ) + 20, GLenum );
413 int noimagedata = READ_DATA(pState, sizeof( int ) + 24, int );
414 GLvoid *pixels;
415
416 CHECK_BUFFER_SIZE_STATIC_UPDATE_LAST(pState, sizeof(int)+28, GLint);
417 if ( noimagedata )
418 pixels = (void*) (uintptr_t) READ_DATA(pState, sizeof(int)+28, GLint);
419 else
420 {
421 /*
422 * Specifying a sub texture with zero width, height or depth is not an
423 * error but has no effect.
424 * See: https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glTexSubImage1D.xml
425 */
426 size_t cbImg = crImageSize(format, type, width, 1);
427 if (RT_UNLIKELY( cbImg == 0
428 && width != 0))
429 {
430 pState->rcUnpack = VERR_INVALID_PARAMETER;
431 return;
432 }
433 pixels = DATA_POINTER(pState, sizeof( int ) + 32, GLvoid );
434 CHECK_ARRAY_SIZE_FROM_PTR_UPDATE_LAST(pState, pixels, cbImg, GLubyte);
435 }
436
437 pState->pDispatchTbl->PixelStorei( GL_UNPACK_ROW_LENGTH, 0 );
438 pState->pDispatchTbl->PixelStorei( GL_UNPACK_SKIP_PIXELS, 0 );
439 pState->pDispatchTbl->PixelStorei( GL_UNPACK_SKIP_ROWS, 0 );
440 pState->pDispatchTbl->PixelStorei( GL_UNPACK_ALIGNMENT, 1 );
441
442 pState->pDispatchTbl->TexSubImage1D( target, level, xoffset, width, format,
443 type, pixels );
444 INCR_VAR_PTR(pState);
445}
446
447
448void crUnpackTexEnvfv(PCrUnpackerState pState)
449{
450 CHECK_BUFFER_SIZE_STATIC_LAST(pState, sizeof(int) + 4, GLenum);
451
452 GLenum target = READ_DATA(pState, sizeof( int ) + 0, GLenum );
453 GLenum pname = READ_DATA(pState, sizeof( int ) + 4, GLenum );
454 GLfloat *params = DATA_POINTER(pState, sizeof( int ) + 8, GLfloat );
455
456 size_t cParams = 1;
457 if (pname == GL_TEXTURE_ENV_COLOR)
458 cParams = 4;
459
460 CHECK_ARRAY_SIZE_FROM_PTR_UPDATE_LAST(pState, params, cParams, GLfloat);
461 pState->pDispatchTbl->TexEnvfv( target, pname, params );
462 INCR_VAR_PTR(pState);
463}
464
465void crUnpackTexEnviv(PCrUnpackerState pState)
466{
467 CHECK_BUFFER_SIZE_STATIC_LAST(pState, sizeof(int) + 4, GLenum);
468
469 GLenum target = READ_DATA(pState, sizeof( int ) + 0, GLenum );
470 GLenum pname = READ_DATA(pState, sizeof( int ) + 4, GLenum );
471 GLint *params = DATA_POINTER(pState, sizeof( int ) + 8, GLint );
472
473 size_t cParams = 1;
474 if (pname == GL_TEXTURE_ENV_COLOR)
475 cParams = 4;
476
477 CHECK_ARRAY_SIZE_FROM_PTR_UPDATE_LAST(pState, params, cParams, GLint);
478 pState->pDispatchTbl->TexEnviv( target, pname, params );
479 INCR_VAR_PTR(pState);
480}
481
482void crUnpackTexGendv(PCrUnpackerState pState)
483{
484 CHECK_BUFFER_SIZE_STATIC_LAST(pState, sizeof(int) + 4, GLenum);
485
486 GLenum coord = READ_DATA(pState, sizeof( int ) + 0, GLenum );
487 GLenum pname = READ_DATA(pState, sizeof( int ) + 4, GLenum );
488 GLdouble *params = DATA_POINTER(pState, sizeof( int ) + 8, GLdouble );
489
490 size_t cParams = 1;
491 if (pname == GL_OBJECT_PLANE || pname == GL_EYE_PLANE)
492 cParams = 4;
493
494 CHECK_ARRAY_SIZE_FROM_PTR_UPDATE_LAST(pState, params, cParams, GLdouble);
495 pState->pDispatchTbl->TexGendv( coord, pname, params );
496 INCR_VAR_PTR(pState);
497}
498
499void crUnpackTexGenfv(PCrUnpackerState pState)
500{
501 CHECK_BUFFER_SIZE_STATIC_LAST(pState, sizeof(int) + 4, GLenum);
502
503 GLenum coord = READ_DATA(pState, sizeof( int ) + 0, GLenum );
504 GLenum pname = READ_DATA(pState, sizeof( int ) + 4, GLenum );
505 GLfloat *params = DATA_POINTER(pState, sizeof( int ) + 8, GLfloat );
506
507 size_t cParams = 1;
508 if (pname == GL_OBJECT_PLANE || pname == GL_EYE_PLANE)
509 cParams = 4;
510
511 CHECK_ARRAY_SIZE_FROM_PTR_UPDATE_LAST(pState, params, cParams, GLfloat);
512 pState->pDispatchTbl->TexGenfv( coord, pname, params );
513 INCR_VAR_PTR(pState);
514}
515
516void crUnpackTexGeniv(PCrUnpackerState pState)
517{
518 CHECK_BUFFER_SIZE_STATIC_LAST(pState, sizeof(int) + 4, GLenum);
519
520 GLenum coord = READ_DATA(pState, sizeof( int ) + 0, GLenum );
521 GLenum pname = READ_DATA(pState, sizeof( int ) + 4, GLenum );
522 GLint *params = DATA_POINTER(pState, sizeof( int ) + 8, GLint );
523
524 size_t cParams = 1;
525 if (pname == GL_OBJECT_PLANE || pname == GL_EYE_PLANE)
526 cParams = 4;
527
528 CHECK_ARRAY_SIZE_FROM_PTR_UPDATE_LAST(pState, params, cParams, GLint);
529 pState->pDispatchTbl->TexGeniv( coord, pname, params );
530 INCR_VAR_PTR(pState);
531}
532
533void crUnpackExtendAreTexturesResident(PCrUnpackerState pState)
534{
535 CHECK_BUFFER_SIZE_STATIC_LAST(pState, sizeof(int) + 8, GLsizei);
536
537 GLsizei n = READ_DATA(pState, 8, GLsizei );
538 const GLuint *textures = DATA_POINTER(pState, 12, const GLuint );
539
540 CHECK_ARRAY_SIZE_FROM_PTR_UPDATE_LAST(pState, textures, n, GLuint);
541 CHECK_BUFFER_SIZE_STATIC_UPDATE_LAST(pState, 20 + n * sizeof(GLuint), CRNetworkPointer);
542 SET_RETURN_PTR(pState, 12 + n * sizeof(GLuint));
543 SET_WRITEBACK_PTR(pState, 20 + n * sizeof(GLuint));
544 (void) pState->pDispatchTbl->AreTexturesResident( n, textures, NULL );
545}
546
547
548void crUnpackExtendCompressedTexImage3DARB(PCrUnpackerState pState)
549{
550 CHECK_BUFFER_SIZE_STATIC_LAST(pState, 4 + sizeof(int) + 32, int);
551
552 GLenum target = READ_DATA(pState, 4 + sizeof(int) + 0, GLenum );
553 GLint level = READ_DATA(pState, 4 + sizeof(int) + 4, GLint );
554 GLenum internalformat = READ_DATA(pState, 4 + sizeof(int) + 8, GLenum );
555 GLsizei width = READ_DATA(pState, 4 + sizeof(int) + 12, GLsizei );
556 GLsizei height = READ_DATA(pState, 4 + sizeof(int) + 16, GLsizei );
557 GLsizei depth = READ_DATA(pState, 4 + sizeof(int) + 20, GLsizei );
558 GLint border = READ_DATA(pState, 4 + sizeof(int) + 24, GLint );
559 GLsizei imagesize = READ_DATA(pState, 4 + sizeof(int) + 28, GLsizei );
560 int noimagedata = READ_DATA(pState, 4 + sizeof(int) + 32, int );
561 GLvoid *pixels;
562
563 CHECK_BUFFER_SIZE_STATIC_UPDATE_LAST(pState, 4 + sizeof(int)+36, GLint);
564 if( noimagedata )
565 pixels = (void*) (uintptr_t) READ_DATA(pState, 4+sizeof(int)+36, GLint);
566 else
567 {
568 pixels = DATA_POINTER(pState, 4 + sizeof( int ) + 40, GLvoid );
569 CHECK_ARRAY_SIZE_FROM_PTR_UPDATE_LAST(pState, pixels, imagesize, GLubyte);
570 }
571
572 pState->pDispatchTbl->CompressedTexImage3DARB(target, level, internalformat,
573 width, height, depth, border,
574 imagesize, pixels);
575}
576
577
578void crUnpackExtendCompressedTexImage2DARB(PCrUnpackerState pState)
579{
580 CHECK_BUFFER_SIZE_STATIC_LAST(pState, 4 + sizeof(int) + 28, int);
581
582 GLenum target = READ_DATA(pState, 4 + sizeof( int ) + 0, GLenum );
583 GLint level = READ_DATA(pState, 4 + sizeof( int ) + 4, GLint );
584 GLenum internalformat = READ_DATA(pState, 4 + sizeof( int ) + 8, GLenum );
585 GLsizei width = READ_DATA(pState, 4 + sizeof( int ) + 12, GLsizei );
586 GLsizei height = READ_DATA(pState, 4 + sizeof( int ) + 16, GLsizei );
587 GLint border = READ_DATA(pState, 4 + sizeof( int ) + 20, GLint );
588 GLsizei imagesize = READ_DATA(pState, 4 + sizeof( int ) + 24, GLsizei );
589 int noimagedata = READ_DATA(pState, 4 + sizeof( int ) + 28, int );
590 GLvoid *pixels;
591
592 CHECK_BUFFER_SIZE_STATIC_UPDATE_LAST(pState, 4 + sizeof(int)+32, GLint);
593 if ( noimagedata )
594 pixels = (void*) (uintptr_t) READ_DATA(pState, 4+sizeof(int)+32, GLint);
595 else
596 {
597 pixels = DATA_POINTER(pState, 4 + sizeof( int ) + 36, GLvoid );
598 CHECK_ARRAY_SIZE_FROM_PTR_UPDATE_LAST(pState, pixels, imagesize, GLubyte);
599 }
600
601 pState->pDispatchTbl->CompressedTexImage2DARB( target, level, internalformat,
602 width, height, border, imagesize,
603 pixels );
604}
605
606
607void crUnpackExtendCompressedTexImage1DARB(PCrUnpackerState pState)
608{
609 CHECK_BUFFER_SIZE_STATIC_LAST(pState, 4 + sizeof(int) + 24, int);
610
611 GLenum target = READ_DATA(pState, 4 + sizeof(int) + 0, GLenum );
612 GLint level = READ_DATA(pState, 4 + sizeof(int) + 4, GLint );
613 GLenum internalformat = READ_DATA(pState, 4 + sizeof(int) + 8, GLenum );
614 GLsizei width = READ_DATA(pState, 4 + sizeof(int) + 12, GLsizei );
615 GLint border = READ_DATA(pState, 4 + sizeof(int) + 16, GLint );
616 GLsizei imagesize = READ_DATA(pState, 4 + sizeof(int) + 20, GLsizei );
617 int noimagedata = READ_DATA(pState, 4 + sizeof(int) + 24, int );
618 GLvoid *pixels;
619
620 CHECK_BUFFER_SIZE_STATIC_UPDATE_LAST(pState, 4 + sizeof(int)+28, GLint);
621 if( noimagedata )
622 pixels = (void*) (uintptr_t) READ_DATA(pState, 4+sizeof(int)+28, GLint);
623 else
624 {
625 pixels = DATA_POINTER(pState, 4 + sizeof( int ) + 32, GLvoid );
626 CHECK_ARRAY_SIZE_FROM_PTR_UPDATE_LAST(pState, pixels, imagesize, GLubyte);
627 }
628
629 pState->pDispatchTbl->CompressedTexImage1DARB(target, level, internalformat,
630 width, border, imagesize, pixels);
631}
632
633
634void crUnpackExtendCompressedTexSubImage3DARB(PCrUnpackerState pState)
635{
636 CHECK_BUFFER_SIZE_STATIC_LAST(pState, 4 + sizeof(int) + 40, int);
637
638 GLenum target = READ_DATA(pState, 4 + sizeof(int) + 0, GLenum );
639 GLint level = READ_DATA(pState, 4 + sizeof(int) + 4, GLint );
640 GLint xoffset = READ_DATA(pState, 4 + sizeof(int) + 8, GLint );
641 GLint yoffset = READ_DATA(pState, 4 + sizeof(int) + 12, GLint );
642 GLint zoffset = READ_DATA(pState, 4 + sizeof(int) + 16, GLint );
643 GLsizei width = READ_DATA(pState, 4 + sizeof(int) + 20, GLsizei );
644 GLsizei height = READ_DATA(pState, 4 + sizeof(int) + 24, GLsizei );
645 GLsizei depth = READ_DATA(pState, 4 + sizeof(int) + 28, GLsizei );
646 GLenum format = READ_DATA(pState, 4 + sizeof(int) + 32, GLenum );
647 GLsizei imagesize = READ_DATA(pState, 4 + sizeof(int) + 36, GLsizei );
648 int noimagedata = READ_DATA(pState, 4 + sizeof(int) + 40, int );
649 GLvoid *pixels;
650
651 CHECK_BUFFER_SIZE_STATIC_UPDATE_LAST(pState, 4 + sizeof(int)+44, GLint);
652 if( noimagedata )
653 pixels = (void*) (uintptr_t) READ_DATA(pState, 4+sizeof(int)+44, GLint);
654 else
655 {
656 pixels = DATA_POINTER(pState, 4 + sizeof( int ) + 48, GLvoid );
657 CHECK_ARRAY_SIZE_FROM_PTR_UPDATE_LAST(pState, pixels, imagesize, GLubyte);
658 }
659
660 pState->pDispatchTbl->CompressedTexSubImage3DARB(target, level, xoffset,
661 yoffset, zoffset, width,
662 height, depth, format,
663 imagesize, pixels);
664}
665
666
667void crUnpackExtendCompressedTexSubImage2DARB(PCrUnpackerState pState)
668{
669 CHECK_BUFFER_SIZE_STATIC_LAST(pState, 4 + sizeof(int) + 32, int);
670
671 GLenum target = READ_DATA(pState, 4 + sizeof(int) + 0, GLenum );
672 GLint level = READ_DATA(pState, 4 + sizeof(int) + 4, GLint );
673 GLint xoffset = READ_DATA(pState, 4 + sizeof(int) + 8, GLint );
674 GLint yoffset = READ_DATA(pState, 4 + sizeof(int) + 12, GLint );
675 GLsizei width = READ_DATA(pState, 4 + sizeof(int) + 16, GLsizei );
676 GLsizei height = READ_DATA(pState, 4 + sizeof(int) + 20, GLsizei );
677 GLenum format = READ_DATA(pState, 4 + sizeof(int) + 24, GLenum );
678 GLsizei imagesize = READ_DATA(pState, 4 + sizeof(int) + 28, GLsizei );
679 int noimagedata = READ_DATA(pState, 4 + sizeof(int) + 32, int );
680 GLvoid *pixels;
681
682 CHECK_BUFFER_SIZE_STATIC_UPDATE_LAST(pState, 4 + sizeof(int)+36, GLint);
683 if( noimagedata )
684 pixels = (void*) (uintptr_t) READ_DATA(pState, 4+sizeof(int)+36, GLint);
685 else
686 {
687 pixels = DATA_POINTER(pState, 4 + sizeof( int ) + 40, GLvoid );
688 CHECK_ARRAY_SIZE_FROM_PTR_UPDATE_LAST(pState, pixels, imagesize, GLubyte);
689 }
690
691 pState->pDispatchTbl->CompressedTexSubImage2DARB(target, level, xoffset,
692 yoffset, width, height,
693 format, imagesize, pixels);
694}
695
696
697void crUnpackExtendCompressedTexSubImage1DARB(PCrUnpackerState pState)
698{
699 CHECK_BUFFER_SIZE_STATIC_LAST(pState, 4 + sizeof(int) + 24, int);
700
701 GLenum target = READ_DATA(pState, 4 + sizeof(int) + 0, GLenum );
702 GLint level = READ_DATA(pState, 4 + sizeof(int) + 4, GLint );
703 GLint xoffset = READ_DATA(pState, 4 + sizeof(int) + 8, GLint );
704 GLsizei width = READ_DATA(pState, 4 + sizeof(int) + 12, GLsizei );
705 GLenum format = READ_DATA(pState, 4 + sizeof(int) + 16, GLenum );
706 GLsizei imagesize = READ_DATA(pState, 4 + sizeof(int) + 20, GLsizei );
707 int noimagedata = READ_DATA(pState, 4 + sizeof(int) + 24, int );
708 GLvoid *pixels;
709
710 CHECK_BUFFER_SIZE_STATIC_UPDATE_LAST(pState, 4 + sizeof(int)+28, GLint);
711 if( noimagedata )
712 pixels = (void*) (uintptr_t) READ_DATA(pState, 4+sizeof(int)+28, GLint);
713 else
714 {
715 pixels = DATA_POINTER(pState, 4 + sizeof( int ) + 32, GLvoid );
716 CHECK_ARRAY_SIZE_FROM_PTR_UPDATE_LAST(pState, pixels, imagesize, GLubyte);
717 }
718
719 pState->pDispatchTbl->CompressedTexSubImage1DARB(target, level, xoffset, width,
720 format, imagesize, pixels);
721}
722
723void crUnpackExtendGetTexImage(PCrUnpackerState pState)
724{
725 CHECK_BUFFER_SIZE_STATIC_LAST(pState, 32, CRNetworkPointer);
726
727 GLenum target = READ_DATA(pState, 8, GLenum );
728 GLint level = READ_DATA(pState, 12, GLint );
729 GLenum format = READ_DATA(pState, 16, GLenum );
730 GLenum type = READ_DATA(pState, 20, GLenum );
731 GLvoid *pixels;
732
733 SET_RETURN_PTR(pState, 24);
734 SET_WRITEBACK_PTR(pState, 32);
735 pixels = DATA_POINTER(pState, 24, GLvoid); /* Used for PBO offset. */
736
737 /*
738 * pixels is not written to, see crServerDispatchGetTexImage(). It is only used as an offset
739 * The data is returned in the writeback pointer set above.
740 */
741 pState->pDispatchTbl->GetTexImage(target, level, format, type, pixels);
742}
743
744void crUnpackExtendGetCompressedTexImageARB(PCrUnpackerState pState)
745{
746 CHECK_BUFFER_SIZE_STATIC_LAST(pState, 24, CRNetworkPointer);
747
748 GLenum target = READ_DATA(pState, 8, GLenum );
749 GLint level = READ_DATA(pState, 12, GLint );
750 GLvoid *img;
751
752 SET_RETURN_PTR(pState, 16 );
753 SET_WRITEBACK_PTR(pState, 24 );
754 img = DATA_POINTER(pState, 16, GLvoid); /* Used for PBO offset. */
755
756 /* see crUnpackExtendGetTexImage() for explanations regarding verification. */
757 pState->pDispatchTbl->GetCompressedTexImageARB( target, level, img );
758}
注意: 瀏覽 TracBrowser 來幫助您使用儲存庫瀏覽器

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette