2 * Host-side implementation of GL/GLX API
4 * Copyright (c) 2006,2007 Even Rouault
7 * Gordon Williams <gordon.williams@collabora.co.uk>
8 * Ian Molton <ian.molton@collabora.co.uk>
10 * Permission is hereby granted, free of charge, to any person obtaining a copy
11 * of this software and associated documentation files (the "Software"), to deal
12 * in the Software without restriction, including without limitation the rights
13 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
14 * copies of the Software, and to permit persons to whom the Software is
15 * furnished to do so, subject to the following conditions:
17 * The above copyright notice and this permission notice shall be included in
18 * all copies or substantial portions of the Software.
20 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
21 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
22 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
23 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
24 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISiNG FROM,
25 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
32 #include <sys/types.h> // for pid_t
34 #include "qemu-common.h"
36 /* GW: dyngen-exec.h defines its own version of stuff that is in stdio.h -
37 only it misses things and is mildly different to stdio \o/. Hence
38 don't include stdio and make our own defines. */
43 #define DEBUGF(...) printf(__VA_ARGS__)
45 #define DEBUGF(...) fprintf(stderr, __VA_ARGS__)
48 #define DEBUGF(...) while(0) {printf(__VA_ARGS__); }
51 #include "tizen/src/debug_ch.h"
52 MULTI_DEBUG_CHANNEL(qemu, opengl);
55 #define GL_GLEXT_PROTOTYPES
56 #define GLX_GLXEXT_PROTOTYPES
59 #include "qemu-queue.h"
60 #include "opengl_func.h"
61 #include "mesa_mipmap.h"
62 #include "opengl_process.h"
63 #include "range_alloc.h"
64 #include "gloffscreen.h"
67 /** Misc X11/GLX defines - we don't want to include the whole files for these
68 * as we need them on Windows too */
72 typedef struct __GLXFBConfigRec GLXFBConfig;
73 struct __GLXFBConfigRec {
77 // #defines from glx.h
80 #define GLX_EXTENSIONS 3
82 /* We'll say the XVisual Id is actually just an index into here */
83 const GLXFBConfig FBCONFIGS[] = {
84 {GLO_FF_ALPHA|GLO_FF_BITS_32},
85 {GLO_FF_ALPHA|GLO_FF_BITS_32|GLO_FF_DEPTH_24},
86 {GLO_FF_ALPHA|GLO_FF_BITS_32|GLO_FF_DEPTH_24|GLO_FF_STENCIL_8},
89 {GLO_FF_BITS_32|GLO_FF_DEPTH_24},
90 {GLO_FF_BITS_32|GLO_FF_DEPTH_24|GLO_FF_STENCIL_8},
93 {GLO_FF_BITS_24|GLO_FF_DEPTH_24},
94 {GLO_FF_BITS_24|GLO_FF_DEPTH_24|GLO_FF_STENCIL_8},
98 {GLO_FF_BITS_16|GLO_FF_DEPTH_24},
99 {GLO_FF_BITS_16|GLO_FF_DEPTH_24|GLO_FF_STENCIL_8},*/
102 #define FAKE_GL_VENDOR "Qemu"
103 #define FAKE_GL_RENDERER "VMGL Passthrough"
104 #define FAKE_GL_VERSION "1.4"
105 #define FAKE_GL_MAJOR 1
108 #define FAKE_GLX_VENDOR "Qemu"
109 #define FAKE_GLX_VERSION_STRING "1.2"
110 #define FAKE_GLX_VERSION_MAJOR 1
111 #define FAKE_GLX_VERSION_MINOR 2
113 void *g_malloc(size_t size);
114 void *g_realloc(void *ptr, size_t size);
115 void g_free(void *ptr);
117 /*#define glGetError() 0*/
119 #define GET_EXT_PTR(type, funcname, args_decl) \
120 static int detect_##funcname = 0; \
121 static type(*ptr_func_##funcname)args_decl = NULL; \
122 if (detect_##funcname == 0) \
124 detect_##funcname = 1; \
125 ptr_func_##funcname = (type(*)args_decl)glo_getprocaddress((const char*)#funcname); \
126 assert (ptr_func_##funcname); \
129 #define GET_EXT_PTR_NO_FAIL(type, funcname, args_decl) \
130 static int detect_##funcname = 0; \
131 static type(*ptr_func_##funcname)args_decl = NULL; \
132 if (detect_##funcname == 0) \
134 detect_##funcname = 1; \
135 ptr_func_##funcname = (type(*)args_decl)glo_getprocaddress((const char*)#funcname); \
142 static void *get_glu_ptr(const char *name)
144 static void *handle = (void *) -1;
146 if (handle == (void *) -1) {
148 handle = dlopen("libGLU.so", RTLD_LAZY);
150 DEBUGF("can't load libGLU.so : %s\n", dlerror());
152 handle = (void *) LoadLibrary("glu32.dll");
154 DEBUGF("can't load glu32.dll\n");
159 return dlsym(handle, name);
161 return GetProcAddress(handle, name);
167 #define GET_GLU_PTR(type, funcname, args_decl) \
168 static int detect_##funcname = 0; \
169 static type(*ptr_func_##funcname)args_decl = NULL; \
170 if (detect_##funcname == 0) \
172 detect_##funcname = 1; \
173 ptr_func_##funcname = (type(*)args_decl)get_glu_ptr(#funcname); \
176 int display_function_call = 0;
177 extern int kill_process;
184 #define MAX_HANDLED_PROCESS 100
185 #define MAX_ASSOC_SIZE 100
187 #define MAX_FBCONFIG 10
189 #define MAX_PENDING_DRAWABLE 8
191 #define MAX(a, b) (((a) > (b)) ? (a) : (b))
192 #define DIM(X) (sizeof(X) / sizeof(X[0]))
196 int activeTextureIndex;
199 #define MAX_CLIENT_STATE_STACK_SIZE 16
201 typedef void *ClientGLXDrawable;
203 typedef struct GLState GLState;
212 SURFACE_PENDING, /* Created with light-weight context */
213 SURFACE_ACTIVE, /* Ready after MakeCurrent */
216 typedef struct QGloSurface {
219 ClientGLXDrawable *client_drawable;
220 int type; /* window, pixmap or pbuffer */
224 QTAILQ_ENTRY(QGloSurface) next;
227 #define MAX_PIXMAP_TEXTURE 32
228 typedef struct PixmapTexture {
230 unsigned int texture;
231 ClientGLXDrawable drawable;
239 GloContext *context; // context (owned by this)
240 QGloSurface *current_qsurface; // current rendering surface/drawable
241 QTAILQ_HEAD(, QGloSurface) qsurfaces; // list of surfaces/drawables for
247 void *secondaryColorPointer;
249 void *texCoordPointer[NB_MAX_TEXTURES];
250 void *edgeFlagPointer;
251 void *vertexAttribPointer[MY_GL_MAX_VERTEX_ATTRIBS_ARB];
252 void *vertexAttribPointerNV[MY_GL_MAX_VERTEX_ATTRIBS_NV];
254 void *matrixIndexPointer;
255 void *fogCoordPointer;
256 void *variantPointerEXT[MY_GL_MAX_VARIANT_POINTER_EXT];
257 void *interleavedArrays;
258 void *elementPointerATI;
260 int vertexPointerSize;
261 int normalPointerSize;
262 int colorPointerSize;
263 int secondaryColorPointerSize;
264 int indexPointerSize;
265 int texCoordPointerSize[NB_MAX_TEXTURES];
266 int edgeFlagPointerSize;
267 int vertexAttribPointerSize[MY_GL_MAX_VERTEX_ATTRIBS_ARB];
268 int vertexAttribPointerNVSize[MY_GL_MAX_VERTEX_ATTRIBS_NV];
269 int weightPointerSize;
270 int matrixIndexPointerSize;
271 int fogCoordPointerSize;
272 int variantPointerEXTSize[MY_GL_MAX_VARIANT_POINTER_EXT];
273 int interleavedArraysSize;
274 int elementPointerATISize;
276 int selectBufferSize;
277 void *selectBufferPtr;
278 int feedbackBufferSize;
279 void *feedbackBufferPtr;
281 ClientState clientStateStack[MAX_CLIENT_STATE_STACK_SIZE];
283 int activeTextureIndex;
285 unsigned int ownTabTextures[32768];
286 unsigned int *tabTextures;
287 /* The mapping between the texture and pixmap used as texture */
288 PixmapTexture pixmapTextures[MAX_PIXMAP_TEXTURE];
289 unsigned int bindTexture2D;
290 RangeAllocator ownTextureAllocator;
291 RangeAllocator *textureAllocator;
293 unsigned int ownTabBuffers[32768];
294 unsigned int *tabBuffers;
295 RangeAllocator ownBufferAllocator;
296 RangeAllocator *bufferAllocator;
298 unsigned int ownTabLists[32768];
299 unsigned int *tabLists;
300 RangeAllocator ownListAllocator;
301 RangeAllocator *listAllocator;
308 int next_available_context_number;
311 GLState default_state;
313 GLState *current_state;
315 /* Pending drawables that will be used as texture */
316 ClientGLXDrawable pending_drawables[MAX_PENDING_DRAWABLE];
318 /* Created Pixmap surfaces, will link to context in MakeCurrent */
319 QGloSurface **pending_qsurfaces;
323 const GLXFBConfig *fbconfigs[MAX_FBCONFIG];
324 int fbconfigs_max[MAX_FBCONFIG];
333 static ProcessState processes[MAX_HANDLED_PROCESS];
335 static char *strip_extensions(const char *avail, const char *ext[]) {
336 char *pos, *supported, *srcp;
338 supported = (char *)g_malloc(strlen(avail) + 2);
343 while((srcp = strstr(srcp, *ext))) {
344 int len = strlen(*ext);
345 if(*(srcp+len) == ' ' || *(srcp+len) == '\0') {
348 if(*(srcp+len) == ' ') {
364 static const char *glx_ext_supported[] = {
365 "GLX_ARB_multisample",
369 static char *supported_glx_extensions() {
370 static char *supported;
373 supported = strip_extensions(glo_glXQueryExtensionsString(),
379 static const char *gl_ext_supported[] = {
380 // Mandatory OpenGL 1.4 Extensions
381 "GL_ARB_depth_texture",
382 "GL_ARB_multisample",
383 "GL_ARB_multitexture",
384 "GL_ARB_point_parameters",
386 "GL_ARB_texture_border_clamp",
387 "GL_ARB_texture_compression",
388 "GL_ARB_texture_cube_map",
389 "GL_ARB_texture_env_add",
390 "GL_ARB_texture_env_combine",
391 "GL_ARB_texture_env_crossbar",
392 "GL_ARB_texture_env_dot3",
393 "GL_ARB_texture_mirrored_repeat",
394 "GL_ARB_transpose_matrix",
397 "GL_EXT_blend_color",
398 "GL_EXT_blend_func_separate",
399 "GL_EXT_blend_logic_op",
400 "GL_EXT_blend_minmax",
401 "GL_EXT_blend_subtract",
402 "GL_EXT_copy_texture",
403 "GL_EXT_draw_range_elements",
405 "GL_EXT_multi_draw_arrays",
406 "GL_EXT_packed_pixels",
407 "GL_EXT_point_parameters",
408 "GL_EXT_polygon_offset",
409 "GL_EXT_rescale_normal",
410 "GL_EXT_secondary_color",
411 "GL_EXT_separate_specular_color",
412 "GL_EXT_stencil_wrap",
416 "GL_EXT_texture_edge_clamp",
417 "GL_EXT_texture_env_add",
418 "GL_EXT_texture_env_combine",
419 "GL_EXT_texture_lod",
420 "GL_EXT_texture_lod_bias",
421 "GL_EXT_texture_object",
422 "GL_APPLE_packed_pixels",
423 "GL_NV_blend_square",
424 "GL_SGIS_generate_mipmap",
425 "GL_SGIS_texture_border_clamp",
426 "GL_SGIS_texture_edge_clamp",
427 "GL_SGIS_texture_lod",
428 // Optional extensions. If you get problems try disabling the below.
429 "GL_EXT_compiled_vertex_array",
430 "GL_ARB_copy_buffer",
431 "GL_ARB_depth_clamp",
432 "GL_ARB_draw_buffers ",
433 "GL_ARB_draw_elements_base_vertex",
434 "GL_ARB_fragment_program",
435 "GL_ARB_fragment_program_shadow",
436 "GL_ARB_fragment_shader",
437 "GL_ARB_framebuffer_object",
438 "GL_ARB_half_float_pixel",
439 "GL_ARB_map_buffer_range",
440 "GL_ARB_occlusion_query",
441 "GL_ARB_pixel_buffer_object",
442 "GL_ARB_point_sprite",
443 "GL_ARB_provoking_vertex",
444 "GL_ARB_seamless_cube_map",
445 "GL_ARB_shader_objects",
446 "GL_ARB_shading_language_100",
447 "GL_ARB_shading_language_120",
449 "GL_ARB_texture_non_power_of_two",
450 "GL_ARB_texture_rectangle",
451 "GL_ARB_vertex_array_bgra",
452 "GL_ARB_vertex_array_object",
453 "GL_ARB_vertex_buffer_object",
454 "GL_ARB_vertex_program",
455 "GL_ARB_vertex_shader,"
457 "GL_EXT_blend_equation_separate",
458 "GL_EXT_cull_vertex",
459 "GL_EXT_framebuffer_blit",
460 "GL_EXT_framebuffer_object",
461 "GL_EXT_gpu_program_parameters",
462 "GL_EXT_packed_depth_stencil",
463 "GL_EXT_pixel_buffer_object",
464 "GL_EXT_provoking_vertex",
465 "GL_EXT_shadow_funcs",
466 "GL_EXT_stencil_two_side",
467 "GL_EXT_texture_cube_map",
468 "GL_EXT_texture_env_dot3",
469 "GL_EXT_texture_filter_anisotropic",
470 "GL_EXT_texture_rectangle",
471 "GL_EXT_texture_sRGB",
472 "GL_EXT_texture_swizzle",
473 "GL_EXT_vertex_array",
474 "GL_EXT_vertex_array_bgra",
475 "GL_3DFX_texture_compression_FXT1",
476 "GL_APPLE_client_storage",
477 "GL_APPLE_vertex_array_object",
478 "GL_ATI_blend_equation_separate",
479 "GL_ATI_envmap_bumpmap",
480 "GL_ATI_texture_env_combine3",
481 "GL_ATI_separate_stencil",
482 "GL_IBM_multimode_draw_arrays",
483 "GL_IBM_rasterpos_clip",
484 "GL_IBM_texture_mirrored_repeat",
485 "GL_INGR_blend_func_separate",
486 "GL_MESA_pack_invert",
487 "GL_MESA_texture_signed_rgba",
488 "GL_MESA_ycbcr_texture",
489 "GL_MESA_window_pos",
491 "GL_NV_light_max_exponent",
492 "GL_NV_packed_depth_stencil",
493 "GL_NV_texture_env_combine4",
494 "GL_NV_texture_rectangle",
495 "GL_NV_texgen_reflection",
496 "GL_NV_vertex_program",
497 "GL_NV_vertex_program1_1",
498 "GL_OES_read_format",
499 "GL_SUN_multi_draw_arrays",
503 static char *compute_gl_extensions() {
504 static char *supported;
507 supported = strip_extensions((const char *)glGetString(GL_EXTENSIONS),
513 static inline QGloSurface *get_qsurface_from_client_drawable(GLState *state, ClientGLXDrawable client_drawable) {
514 QGloSurface *qsurface;
516 if(state->current_qsurface->client_drawable == client_drawable)
517 return state->current_qsurface;
519 QTAILQ_FOREACH(qsurface, &state->qsurfaces, next) {
520 if (qsurface->client_drawable == client_drawable)
527 // This must always be called only on surfaces belonging to the current context
528 static inline void render_surface(QGloSurface *qsurface, int bpp, int stride, char *buffer)
534 glo_surface_get_size(qsurface->surface, &w, &h);
536 glo_surface_getcontents(qsurface->surface, stride, bpp, buffer);
539 // This must always be called only on surfaces belonging to the current context
540 static inline void resize_surface(ProcessState *process, QGloSurface *qsurface,
542 GLState *glstate = qsurface->glstate;
543 GloSurface *old_surface = qsurface->surface;
546 DEBUGF("resize_start\n");
548 glo_surface_destroy(old_surface);
550 surface = glo_surface_create(w, h, glstate->context);
551 qsurface->surface = surface;
553 // Client doesnt know surface is new - need to MakeCurrent
554 if(process->current_state == qsurface->glstate) {
555 glo_surface_makecurrent(qsurface->surface);
556 // set the viewport while the window size is changed. It is needed
557 // especially for the case that glViewport is not explicitly called
558 // in program. In this case, the viewport is set to incorrectly
559 // in the first MakeCurrent when the window size is not known.
560 // It will not impact normal GL programs with glViewport set as
562 glViewport (0, 0, w, h);
565 DEBUGF("Error: Surface is not current! %p %p\n",
566 process->current_state,
567 process->current_state->current_qsurface);
571 glstate->current_qsurface->ready = 1;
572 DEBUGF( "resize_done\n");
576 void init_process_tab()
578 memset(processes, 0, sizeof(processes));
581 #define ARG_TO_CHAR(x) (char)(x)
582 #define ARG_TO_UNSIGNED_CHAR(x) (unsigned char)(x)
583 #define ARG_TO_SHORT(x) (short)(x)
584 #define ARG_TO_UNSIGNED_SHORT(x) (unsigned short)(x)
585 #define ARG_TO_INT(x) (int)(x)
586 #define ARG_TO_UNSIGNED_INT(x) (unsigned int)(x)
587 #define ARG_TO_FLOAT(x) (*(float*)&(x))
588 #define ARG_TO_DOUBLE(x) (*(double*)(x))
590 #include "server_stub.c"
592 //typedef void *ClientGLXDrawable;
593 static inline ClientGLXDrawable to_drawable(arg_t arg)
596 if (arg > (unsigned long) -1) {
597 DEBUGF( "GLXDrawable too big for this implementation\n");
601 return (void *) (unsigned long) arg;
606 /* Bind a qsurface to a context (GLState) */
607 static void bind_qsurface(GLState *state,
608 QGloSurface *qsurface)
610 qsurface->glstate = state;
612 if ( qsurface->type == SURFACE_WINDOW )
613 QTAILQ_INSERT_HEAD(&state->qsurfaces, qsurface, next);
615 state->current_qsurface = qsurface;
618 /* Unbind a qsurface from a context (GLState) */
619 static void unbind_qsurface(GLState *state,
620 QGloSurface *qsurface)
622 qsurface->glstate = NULL;
624 if ( qsurface->type == SURFACE_WINDOW )
625 QTAILQ_REMOVE(&state->qsurfaces, qsurface, next);
627 if ( state->current_qsurface == qsurface )
628 state->current_qsurface = NULL;
631 /* Find the qsurface with required drawable in active & pending qsurfaces */
632 QGloSurface* find_qsurface_from_client_drawable(ProcessState *process, ClientGLXDrawable client_drawable)
634 /* search for surfaces in current conetxt */
636 QGloSurface *qsurface = get_qsurface_from_client_drawable(process->current_state, client_drawable);
641 /* search the pending surfaces */
642 for ( i = 0; i < process->nb_qsurf; i++ )
644 qsurface = process->pending_qsurfaces[i];
645 if ( qsurface && qsurface->client_drawable == client_drawable )
652 /* Make the appropriate qsurface current for a given client_drawable */
653 static int set_current_qsurface(GLState *state,
654 ClientGLXDrawable client_drawable)
656 QGloSurface *qsurface;
658 if(state->current_qsurface && state->current_qsurface->client_drawable == client_drawable)
661 QTAILQ_FOREACH(qsurface, &state->qsurfaces, next) {
662 if(qsurface->client_drawable == client_drawable) {
663 state->current_qsurface = qsurface;
664 qsurface->glstate = state;
669 state->current_qsurface = NULL;
675 static int keep_drawable(ProcessState *process, ClientGLXDrawable drawable)
678 for ( i = 0; i < MAX_PENDING_DRAWABLE; i++)
680 if ( process->pending_drawables[i] == 0 )
682 process->pending_drawables[i] = drawable;
689 static int link_drawable(ProcessState *process, ClientGLXDrawable drawable)
692 for ( i = 0; i < MAX_PENDING_DRAWABLE; i++ )
694 if ( process->pending_drawables[i] == drawable )
696 process->pending_drawables[i] = 0;
703 /* Need to create pixmap surface when guest do so, as guest may use it before
704 * MakeCurrent. As no context available at this point, we do the follwoing:
705 * 1. Create one light-weight context just for surface creation.
706 * 2. Store this qsurface, and link it with right context when MakeCurrent
708 static void keep_qsurface(ProcessState *process, QGloSurface *qsurface)
711 process->pending_qsurfaces =
712 g_realloc(process->pending_qsurfaces,
713 (process->nb_qsurf + 1) * sizeof(QGloSurface*));
715 process->pending_qsurfaces[process->nb_qsurf] = qsurface;
720 static int link_qsurface(ProcessState *process, GLState *glstate, ClientGLXDrawable client_drawable)
723 QGloSurface *qsurface;
724 for ( i = 0; i < process->nb_qsurf; i++ )
726 qsurface = process->pending_qsurfaces[i];
727 if ( qsurface && qsurface->client_drawable == client_drawable )
729 /* XXX:Current limitation is that each surface is binded to one
730 * context, and not accessible from another context. It's hard for
731 * glEGLImageTargetTexture2DOES implementation, in which we need
732 * find a pixmap surface from another context that is not owner of
733 * this pixmap. So do not move this pending pixmap surface into
734 * current context. In future need decople of surface and context.
737 memmove(&process->pending_qsurfaces[i],
738 &process->pending_qsurfaces[i+1],
739 (process->nb_qsurf - i - 1) * sizeof(QGloSurface*));
743 if(qsurface->status == SURFACE_PENDING)
745 glo_surface_update_context(qsurface->surface, glstate->context, 1);
746 qsurface->status = SURFACE_ACTIVE;
750 unbind_qsurface(qsurface->glstate, qsurface);
751 glo_surface_update_context(qsurface->surface, glstate->context, 0);
755 bind_qsurface(glstate, qsurface);
763 /* Pixmap can be used as texture via glEGLImageTargetTexture2DOES, so need keep
764 * the mapping between them to add proper action when bind the texture again
766 static void del_pixmap_texture_mapping(GLState *state,
767 unsigned int texture)
770 for ( i = 0; i < MAX_PIXMAP_TEXTURE; i++ )
772 if ( state->pixmapTextures[i].used &&
773 state->pixmapTextures[i].texture == texture )
775 state->pixmapTextures[i].used = 0;
776 state->pixmapTextures[i].texture = 0;
777 state->pixmapTextures[i].drawable = 0;
783 static int add_pixmap_texture_mapping(GLState *state,
784 unsigned int texture, ClientGLXDrawable drawable)
787 for ( i = 0; i < MAX_PIXMAP_TEXTURE; i++ )
789 if ( state->pixmapTextures[i].texture == texture ||
790 !state->pixmapTextures[i].used )
792 state->pixmapTextures[i].used = 1;
793 state->pixmapTextures[i].texture = texture;
794 state->pixmapTextures[i].drawable = drawable;
799 if ( i >= MAX_PIXMAP_TEXTURE )
803 static ClientGLXDrawable find_pixmap_texture(GLState *state,
804 unsigned int texture)
807 for ( i = 0; i < MAX_PIXMAP_TEXTURE; i++ )
809 if ( state->pixmapTextures[i].used &&
810 state->pixmapTextures[i].texture == texture )
811 return state->pixmapTextures[i].drawable;
817 static int get_server_texture(ProcessState *process,
818 unsigned int client_texture)
820 unsigned int server_texture = 0;
822 if (client_texture < 32768) {
823 server_texture = process->current_state->tabTextures[client_texture];
825 DEBUGF( "invalid texture name %d\n", client_texture);
827 return server_texture;
830 static int get_server_buffer(ProcessState *process,
831 unsigned int client_buffer)
833 unsigned int server_buffer = 0;
835 if (client_buffer < 32768) {
836 server_buffer = process->current_state->tabBuffers[client_buffer];
838 DEBUGF( "invalid buffer name %d\n", client_buffer);
840 return server_buffer;
844 static int get_server_list(ProcessState *process, unsigned int client_list)
846 unsigned int server_list = 0;
848 if (client_list < 32768) {
849 server_list = process->current_state->tabLists[client_list];
851 DEBUGF( "invalid list name %d\n", client_list);
856 const GLXFBConfig *get_fbconfig(ProcessState *process, int client_fbconfig)
861 for (i = 0; i < process->nfbconfig; i++) {
862 assert(client_fbconfig >= 1 + nbtotal);
863 if (client_fbconfig <= nbtotal + process->fbconfigs_max[i]) {
864 return &process->fbconfigs[i][client_fbconfig - 1 - nbtotal];
866 nbtotal += process->fbconfigs_max[i];
871 static int glXChooseVisualFunc(const int *attrib_list)
873 if (attrib_list == NULL)
876 int formatFlags = glo_flags_get_from_glx(attrib_list, True);
881 for (i=0;i<DIM(FBCONFIGS);i++) {
882 int score = glo_flags_score(formatFlags, FBCONFIGS[i].formatFlags);
883 if (bestScore < 0 || score<=bestScore) {
890 DEBUGF( "Got format flags %d but we couldn't find an exactly matching config, chose %d\n", formatFlags, bestConfig);
895 static int glXGetConfigFunc(int visualid, int attrib, int *value) {
896 const GLXFBConfig *config = &FBCONFIGS[0]; // default
899 if (visualid>=0 && visualid<DIM(FBCONFIGS))
900 config = &FBCONFIGS[visualid];
902 DEBUGF( "Unknown visual ID %d\n", visualid);
904 v = glo_get_glx_from_flags(config->formatFlags, attrib);
910 static const GLXFBConfig * glXGetFBConfigsFunc(int screen, int *nelements) {
911 *nelements = DIM(FBCONFIGS);
912 return &FBCONFIGS[0];
915 static int glXGetFBConfigAttribFunc(const GLXFBConfig *fbconfig, int attrib, int *value) {
916 // TODO other enums - see http://www.opengl.org/sdk/docs/man/xhtml/glXGetFBConfigAttrib.xml
918 int v = glo_get_glx_from_flags(fbconfig->formatFlags, attrib);
919 if (value) *value = v;
923 static const GLXFBConfig *glXChooseFBConfigFunc(int screen, const int *attrib_list, int *nelements) {
924 if (attrib_list != NULL) {
925 int formatFlags = glo_flags_get_from_glx(attrib_list, False);
930 for (i=0;i<DIM(FBCONFIGS);i++) {
931 int score = glo_flags_score(formatFlags, FBCONFIGS[i].formatFlags);
932 if (bestScore < 0 || score<=bestScore) {
939 DEBUGF( "Got format flags %d but we couldn't find an exactly matching config, chose %d\n", formatFlags, bestConfig);
945 return &FBCONFIGS[bestConfig];
954 static void do_glClientActiveTextureARB(int texture)
956 GET_EXT_PTR_NO_FAIL(void, glClientActiveTextureARB, (int));
958 if (ptr_func_glClientActiveTextureARB) {
959 ptr_func_glClientActiveTextureARB(texture);
963 static void destroy_gl_state(GLState *state)
967 QGloSurface *qsurface, *tmp;
969 QTAILQ_FOREACH_SAFE(qsurface, &state->qsurfaces, next, tmp) {
970 glo_surface_destroy(qsurface->surface);
971 QTAILQ_REMOVE(&state->qsurfaces, qsurface, next);
976 glo_context_destroy(state->context);
978 if (state->vertexPointer)
979 g_free(state->vertexPointer);
980 if (state->normalPointer)
981 g_free(state->normalPointer);
982 if (state->indexPointer)
983 g_free(state->indexPointer);
984 if (state->colorPointer)
985 g_free(state->colorPointer);
986 if (state->secondaryColorPointer)
987 g_free(state->secondaryColorPointer);
988 for (i = 0; i < NB_MAX_TEXTURES; i++) {
989 if (state->texCoordPointer[i])
990 g_free(state->texCoordPointer[i]);
992 for (i = 0; i < MY_GL_MAX_VERTEX_ATTRIBS_ARB; i++) {
993 if (state->vertexAttribPointer[i])
994 g_free(state->vertexAttribPointer[i]);
996 for (i = 0; i < MY_GL_MAX_VERTEX_ATTRIBS_NV; i++) {
997 if (state->vertexAttribPointerNV[i])
998 g_free(state->vertexAttribPointerNV[i]);
1000 if (state->weightPointer)
1001 g_free(state->weightPointer);
1002 if (state->matrixIndexPointer)
1003 g_free(state->matrixIndexPointer);
1004 if (state->fogCoordPointer)
1005 g_free(state->fogCoordPointer);
1006 for (i = 0; i < MY_GL_MAX_VARIANT_POINTER_EXT; i++) {
1007 if (state->variantPointerEXT[i])
1008 g_free(state->variantPointerEXT[i]);
1010 if (state->interleavedArrays)
1011 g_free(state->interleavedArrays);
1012 if (state->elementPointerATI)
1013 g_free(state->elementPointerATI);
1016 static void init_gl_state(GLState *state)
1018 state->textureAllocator = &state->ownTextureAllocator;
1019 state->tabTextures = state->ownTabTextures;
1020 state->bufferAllocator = &state->ownBufferAllocator;
1021 state->tabBuffers = state->ownTabBuffers;
1022 state->listAllocator = &state->ownListAllocator;
1023 state->tabLists = state->ownTabLists;
1027 * Translate the nth element of list from type to GLuint.
1029 static GLuint translate_id(GLsizei n, GLenum type, const GLvoid *list)
1041 bptr = (GLbyte *) list;
1042 return (GLuint) *(bptr + n);
1043 case GL_UNSIGNED_BYTE:
1044 ubptr = (GLubyte *) list;
1045 return (GLuint) *(ubptr + n);
1047 sptr = (GLshort *) list;
1048 return (GLuint) *(sptr + n);
1049 case GL_UNSIGNED_SHORT:
1050 usptr = (GLushort *) list;
1051 return (GLuint) *(usptr + n);
1053 iptr = (GLint *) list;
1054 return (GLuint) *(iptr + n);
1055 case GL_UNSIGNED_INT:
1056 uiptr = (GLuint *) list;
1057 return (GLuint) *(uiptr + n);
1059 fptr = (GLfloat *) list;
1060 return (GLuint) *(fptr + n);
1062 ubptr = ((GLubyte *) list) + 2 * n;
1063 return (GLuint) (*ubptr << 8) + (GLuint) *(ubptr + 1);
1065 ubptr = ((GLubyte *) list) + 3 * n;
1066 return (GLuint) (*ubptr << 16) + (GLuint) (*(ubptr + 1) << 8) +
1067 (GLuint) *(ubptr + 2);
1069 ubptr = ((GLubyte *) list) + 4 * n;
1070 return (GLuint) (*ubptr << 24) + (GLuint) (*(ubptr + 1) << 16) +
1071 (GLuint) (*(ubptr + 2) << 8) + (GLuint) *(ubptr + 3);
1077 GLState *_create_context(ProcessState *process, int fake_ctxt, int fake_shareList)
1079 // FIXMEIM - realloc? really?
1080 process->glstates = g_realloc(process->glstates,
1081 (process->nb_states + 1) * sizeof(GLState *));
1083 process->glstates[process->nb_states] = g_malloc(sizeof(GLState));
1084 memset(process->glstates[process->nb_states], 0, sizeof(GLState));
1086 process->glstates[process->nb_states]->ref = 1;
1087 process->glstates[process->nb_states]->fake_ctxt = fake_ctxt;
1088 process->glstates[process->nb_states]->fake_shareList = fake_shareList;
1090 init_gl_state(process->glstates[process->nb_states]);
1092 if (fake_shareList) {
1095 for (i = 0; i < process->nb_states; i++) {
1096 if (process->glstates[i]->fake_ctxt == fake_shareList) {
1097 process->glstates[i]->ref++;
1098 process->glstates[process->nb_states]->textureAllocator =
1099 process->glstates[i]->textureAllocator;
1100 process->glstates[process->nb_states]->tabTextures =
1101 process->glstates[i]->tabTextures;
1102 process->glstates[process->nb_states]->bufferAllocator =
1103 process->glstates[i]->bufferAllocator;
1104 process->glstates[process->nb_states]->tabBuffers =
1105 process->glstates[i]->tabBuffers;
1106 process->glstates[process->nb_states]->listAllocator =
1107 process->glstates[i]->listAllocator;
1108 process->glstates[process->nb_states]->tabLists =
1109 process->glstates[i]->tabLists;
1114 process->nb_states++;
1116 return process->glstates[process->nb_states-1];
1119 GLState *get_glstate_for_fake_ctxt(ProcessState *process, int fake_ctxt)
1122 for (i = 0; i < process->nb_states; i++) {
1123 if (process->glstates[i]->fake_ctxt == fake_ctxt)
1124 return process->glstates[i];
1130 void gl_disconnect(ProcessState *process)
1133 for (i = 0; i < process->nb_states; i++) {
1134 destroy_gl_state(process->glstates[i]);
1135 g_free(process->glstates[i]);
1137 destroy_gl_state(&process->default_state);
1138 g_free(process->glstates);
1140 if (process->cmdbuf)
1141 g_free(process->cmdbuf);
1143 for (i = 0; &processes[i] != process; i ++) {
1147 memmove(&processes[i], &processes[i + 1],
1148 (MAX_HANDLED_PROCESS - 1 - i) * sizeof(ProcessState));
1151 static const int beginend_allowed[GL_N_CALLS] = {
1153 #define MAGIC_MACRO(name) [name ## _func] = 1,
1154 #include "gl_beginend.h"
1157 ProcessStruct *vmgl_get_process(pid_t pid)
1159 ProcessState *process = NULL;
1168 /* Lookup a process stuct. If there isnt one associated with this pid
1169 * then we create one.
1170 * process->current_state contains info on which of the guests contexts is
1173 for (i = 0; i < MAX_HANDLED_PROCESS; i ++) {
1174 if (processes[i].p.process_id == pid) {
1175 process = &processes[i];
1177 } else if (processes[i].p.process_id == 0) {
1178 process = &processes[i];
1179 memset(process, 0, sizeof(ProcessState));
1180 process->p.process_id = pid;
1181 init_gl_state(&process->default_state);
1182 process->current_state = &process->default_state;
1187 if (process == NULL) {
1188 DEBUGF( "Too many processes !\n");
1192 return (ProcessStruct *)process; // Cast is ok due to struct defn.
1195 void vmgl_context_switch(ProcessStruct *p, int switch_gl_context)
1197 ProcessState *process = (ProcessState *)p;
1198 if(switch_gl_context) {
1199 if(process->current_state->current_qsurface)
1200 glo_surface_makecurrent(process->current_state->current_qsurface->surface);
1202 glo_surface_makecurrent(0); // should never happen
1206 static const char *opengl_strtok(const char *s, int *n, char **saveptr, char *prevbuf)
1212 static const char *delim = " \t\n\r/";
1220 if (!(*saveptr) || !(*n))
1225 for (; *n && strchr(delim, *s); s++, (*n)--) {
1226 if (*s == '/' && *n > 1) {
1230 } while (*n > 1 && s[1] != '\n' && s[1] != '\r');
1231 } else if (s[1] == '*') {
1234 } while (*n > 2 && (s[1] != '*' || s[2] != '/'));
1247 for (; *n && *s && !strchr(delim, *s); s++, (*n)--) {
1257 ret = malloc(retlen + 1);
1265 while (retlen > 0) {
1266 if (*start == '/' && retlen > 1) {
1267 if (start[1] == '/') {
1270 } while (retlen > 1 && start[1] != '\n' && start[1] != '\r');
1273 } else if (start[1] == '*') {
1276 } while (retlen > 2 && (start[1] != '*' || start[2] != '/'));
1277 start += 3, retlen -= 3;
1281 *(p++) = *(start++), retlen--;
1288 static char *do_eglShaderPatch(const char *source, int length, int *patched_len)
1290 char *saveptr = NULL;
1295 length = strlen(source);
1298 int patched_size = length;
1299 char *patched = malloc(patched_size + 1);
1304 p = opengl_strtok(source, &length, &saveptr, NULL);
1305 for (; p; p = opengl_strtok(0, &length, &saveptr, p)) {
1306 if (!strncmp(p, "lowp", 4) || !strncmp(p, "mediump", 7) || !strncmp(p, "highp", 5)) {
1308 } else if (!strncmp(p, "precision", 9)) {
1309 while ((p = opengl_strtok(0, &length, &saveptr, p)) && !strchr(p, ';')) {
1314 if (!strncmp(p, "gl_MaxVertexUniformVectors", 26)) {
1315 p = "(gl_MaxVertexUniformComponents / 4)";
1316 } else if (!strncmp(p, "gl_MaxFragmentUniformVectors", 28)) {
1317 p = "(gl_MaxFragmentUniformComponents / 4)";
1318 } else if (!strncmp(p, "gl_MaxVaryingVectors", 20)) {
1319 p = "(gl_MaxVaryingFloats / 4)";
1322 int new_len = strlen(p);
1323 if (*patched_len + new_len > patched_size) {
1325 patched = realloc(patched, patched_size + 1);
1331 memcpy(patched + *patched_len, p, new_len);
1332 *patched_len += new_len;
1336 patched[*patched_len] = 0;
1337 /* check that we don't leave dummy preprocessor lines */
1338 for (sp = patched; *sp;) {
1339 for (; *sp == ' ' || *sp == '\t'; sp++) {
1342 if (!strncmp(sp, "#define", 7)) {
1343 for (p = sp + 7; *p == ' ' || *p == '\t'; p++) {
1346 if (*p == '\n' || *p == '\r' || *p == '/') {
1347 memset(sp, 0x20, 7);
1350 for (; *sp && *sp != '\n' && *sp != '\r'; sp++) {
1353 for (; *sp == '\n' || *sp == '\r'; sp++) {
1361 shadersrc_gles_to_gl(GLsizei count, const char** string, char **s, const GLint* length, GLint *l)
1365 for(i = 0; i < count; ++i) {
1370 len = string[i] ? strlen(string[i]) : 0;
1372 len = string[i] ? strlen(string[i]) : 0;
1375 s[i] = do_eglShaderPatch(string[i], len, &l[i]);
1395 /* XXX:This is work around fix Mac host GL driver's bug that cause webapp
1396 * screen crash. When one context use textures from other sharing context, some
1397 * textures are not initialized or shared successfully. So use glGetTexImage to
1398 * read texture back right after glTexSubImage2D, thus guarantee a
1401 static void mac_dump_texture()
1406 /* only handle target=GL_TEXTURE_2D, level=0, format=GL_RGBA, type=GL_UNSIGNED_BYTE */
1407 glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_WIDTH, &w);
1408 glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_HEIGHT, &h);
1410 if ( w == 0 && h == 0 )
1413 buf = g_malloc( (w*4) * h); /* XXX:need allignment? */
1415 glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_BYTE, buf);
1421 int do_function_call(ProcessState *process, int func_number, unsigned long *args, char *ret_string)
1423 union gl_ret_type ret;
1425 Signature *signature = (Signature *) tab_opengl_calls[func_number];
1426 int ret_type = signature->ret_type;
1430 if (display_function_call) {
1431 DEBUGF( "[%d]> %s\n", process->p.process_id,
1432 tab_opengl_calls_name[func_number]);
1434 TRACE( "[%d]> %s\n", process->p.process_id,
1435 tab_opengl_calls_name[func_number]);
1437 switch (func_number) {
1441 case _resize_surface_func:
1443 ClientGLXDrawable client_drawable = to_drawable(args[0]);
1444 QGloSurface *qsurface = get_qsurface_from_client_drawable(
1445 process->current_state, client_drawable);
1447 // We have to assume the current context here
1448 // since we assume that a drawable must belong to a specific context
1449 resize_surface(process, qsurface, (int)args[1], (int)args[2]);
1454 case _render_surface_func:
1456 ClientGLXDrawable client_drawable = to_drawable(args[0]);
1457 QGloSurface *qsurface = get_qsurface_from_client_drawable(
1458 process->current_state, client_drawable);
1459 int bpp = (int)args[1];
1460 int stride = (int)args[2];
1461 char *render_buffer = (char*)args[3];
1463 // DEBUGF( "win: %08x stride: %d buf: %08x cl_dr: %08x qsurf: %08x\n", args[0], args[1], args[2], client_drawable, qsurface);
1465 // We have to assume the current context here
1466 // since we assume that a drawable must belong to a specific context
1467 render_surface(qsurface, bpp, stride, render_buffer);
1472 case glXWaitGL_func:
1474 glFinish(); //glXWaitGL();
1481 // FIXME GW Maybe we should just do this on the server?
1487 case glXChooseVisual_func:
1489 ret.i = glXChooseVisualFunc((int *) &args[2]);
1493 case glXQueryExtensionsString_func:
1495 ret.s = supported_glx_extensions();//glXQueryExtensionsString(dpy, 0);
1499 case glXQueryServerString_func:
1502 case GLX_VENDOR : ret.s = FAKE_GLX_VENDOR; break;
1503 case GLX_VERSION : ret.s = FAKE_GLX_VERSION_STRING; break;
1504 case GLX_EXTENSIONS : ret.s = supported_glx_extensions(); break;
1510 case glXGetClientString_func:
1513 case GLX_VENDOR : ret.s = FAKE_GLX_VENDOR; break;
1514 case GLX_VERSION : ret.s = FAKE_GLX_VERSION_STRING; break;
1515 case GLX_EXTENSIONS : ret.s = "GLX_ARB_get_proc_address "; break;
1521 case glXGetScreenDriver_func:
1523 // FIXME GW What is this? not documented anywhere!!
1524 //GET_EXT_PTR(const char *, glXGetScreenDriver, (Display *, int));
1525 //ret.s = ptr_func_glXGetScreenDriver(dpy, 0);
1530 case glXGetDriverConfig_func:
1532 // FIXME GW What is this? not documented anywhere!!
1533 //GET_EXT_PTR(const char *, glXGetDriverConfig, (const char *));
1534 //ret.s = ptr_func_glXGetDriverConfig((const char *) args[0]);
1539 case glXCreateContext_func:
1541 int visualid = (int) args[1];
1542 int fake_shareList = (int) args[2];
1544 if (display_function_call)
1545 DEBUGF( "visualid=%d, fake_shareList=%d\n", visualid,
1548 GLState *shareListState = get_glstate_for_fake_ctxt(process, fake_shareList);
1549 int fake_ctxt = ++process->next_available_context_number;
1553 // Work out format flags from visual id
1554 int formatFlags = GLO_FF_DEFAULT;
1555 if (visualid>=0 && visualid<DIM(FBCONFIGS))
1556 formatFlags = FBCONFIGS[visualid].formatFlags;
1558 GLState *state = _create_context(process, fake_ctxt, fake_shareList);
1559 state->context = glo_context_create(formatFlags,
1560 (GloContext*)shareListState?shareListState->context:0);
1562 DEBUGF( " created context %p for %08x\n", state, fake_ctxt);
1567 case glXCreateNewContext_func:
1569 int client_fbconfig = args[1];
1572 const GLXFBConfig *fbconfig = get_fbconfig(process, client_fbconfig);
1575 int fake_shareList = args[3];
1576 GLState *shareListState = get_glstate_for_fake_ctxt(process, fake_shareList);
1578 process->next_available_context_number++;
1579 int fake_ctxt = process->next_available_context_number;
1582 GLState *state = _create_context(process, fake_ctxt, fake_shareList);
1583 state->context = glo_context_create(fbconfig->formatFlags,
1584 shareListState?shareListState->context:0); // FIXME GW get from fbconfig
1589 case glXCopyContext_func:
1591 DEBUGF( " glXCopyContext not supported (does anything use it?)\n");
1595 case glXDestroyContext_func:
1597 int fake_ctxt = (int) args[1];
1599 if (display_function_call)
1600 DEBUGF( "fake_ctxt=%d\n", fake_ctxt);
1603 for (i = 0; i < process->nb_states; i ++) {
1604 if (process->glstates[i]->fake_ctxt == fake_ctxt) {
1605 /*XXX: DestroyContext should not switch current context, or
1606 * else guest still try to access it and cause qemu
1607 * segfalt. But not sure if any corner case, so comment it
1608 * for now and will remove it completely in future.
1610 // this was our GLState...
1611 // process->current_state = &process->default_state;
1613 int fake_shareList =
1614 process->glstates[i]->fake_shareList;
1615 process->glstates[i]->ref--;
1616 if (process->glstates[i]->ref == 0) {
1618 "destroy_gl_state fake_ctxt = %d\n",
1619 process->glstates[i]->fake_ctxt);
1620 destroy_gl_state(process->glstates[i]);
1621 g_free(process->glstates[i]);
1622 memmove(&process->glstates[i],
1623 &process->glstates[i + 1],
1624 (process->nb_states - i - 1) *
1626 process->nb_states --;
1629 if (fake_shareList) {
1630 for (i = 0; i < process->nb_states; i++) {
1631 if (process->glstates[i]->fake_ctxt ==
1633 process->glstates[i]->ref--;
1634 if (process->glstates[i]->ref == 0) {
1636 "destroy_gl_state fake_ctxt = %d\n",
1637 process->glstates[i]->
1639 destroy_gl_state(process->
1641 g_free(process->glstates[i]);
1642 memmove(&process->glstates[i],
1643 &process->glstates[i + 1],
1644 (process->nb_states - i - 1) *
1646 process->nb_states --;
1659 case glXQueryVersion_func:
1661 int *major = (int *) args[1];
1662 int *minor = (int *) args[2];
1663 //ret.i = glXQueryVersion(dpy, (int *) args[1], (int *) args[2]);
1664 if (major) *major=FAKE_GLX_VERSION_MAJOR;
1665 if (minor) *minor=FAKE_GLX_VERSION_MINOR;
1670 case glGetString_func:
1674 ret.s = FAKE_GL_VENDOR;
1677 ret.s = FAKE_GL_RENDERER;
1680 ret.s = FAKE_GL_VERSION;
1683 ret.s = compute_gl_extensions();
1685 case GL_SHADING_LANGUAGE_VERSION:
1686 if(FAKE_GL_MAJOR < 2) {
1692 ret.s = (char *) glGetString(args[0]);
1698 case glXMakeCurrent_func:
1700 ClientGLXDrawable client_drawable = to_drawable(args[1]);
1701 int fake_ctxt = (int) args[2];
1702 GLState *glstate = NULL;
1704 // DEBUGF( "Makecurrent: fake_ctx=%d client_drawable=%08x\n", fake_ctxt, client_drawable);
1706 if (client_drawable == 0 && fake_ctxt == 0) {
1707 /* Release context */
1708 if(process->current_state->current_qsurface)
1709 process->current_state->current_qsurface->ref--;
1710 process->current_state = &process->default_state;
1712 // DEBUGF( " --release\n");
1713 glo_surface_makecurrent(0);
1714 } else { /* Lookup GLState struct for this context */
1715 glstate = get_glstate_for_fake_ctxt(process, fake_ctxt);
1717 DEBUGF( " --invalid fake_ctxt (%d)!\n", fake_ctxt);
1719 if(!set_current_qsurface(glstate, client_drawable) &&
1720 !link_qsurface(process, glstate, client_drawable) ) {
1721 // If there is no surface, create one.
1722 QGloSurface *qsurface = calloc(1, sizeof(QGloSurface));
1723 qsurface->surface = glo_surface_create(4, 4,
1725 qsurface->client_drawable = client_drawable;
1727 qsurface->type = SURFACE_WINDOW;
1728 qsurface->status = SURFACE_ACTIVE;
1730 bind_qsurface(glstate, qsurface);
1731 // DEBUGF( " --Client drawable not found, create new surface: %16x %16lx\n", (unsigned int)qsurface, (unsigned long int)client_drawable);
1735 // DEBUGF( " --Client drawable found, using surface: %16x %16lx\n", (unsigned int)glstate->current_qsurface, (unsigned long int)client_drawable);
1738 /*Test old surface contents */
1739 int reset_texture = 0;
1740 GLState *old_glstate = NULL;
1741 /* Switch from pixmap */
1742 if (process->current_state->current_qsurface && SURFACE_PIXMAP == process->current_state->current_qsurface->type )
1744 glo_surface_updatecontents(process->current_state->current_qsurface->surface);
1746 old_glstate = process->current_state;
1748 fprintf(stderr, "edwin:MakeCurrent: drawable=0x%x,qsurface=%p.\n", client_drawable, glstate->current_qsurface);
1751 /* Switch in pixmap surface */
1752 if (glstate->current_qsurface && SURFACE_PIXMAP == glstate->current_qsurface->type )
1754 /* Release it if the surface is used as texture target */
1755 glo_surface_release_texture(glstate->current_qsurface);
1758 process->current_state = glstate;
1760 ret.i = glo_surface_makecurrent(glstate->current_qsurface->surface);
1761 /* if (reset_texture)*/
1762 /* glo_surface_as_texture(old_glstate->current_qsurface->surface);*/
1768 case glXSwapBuffers_func:
1770 // Does nothing - window data is copied via render_surface()
1773 case glXIsDirect_func:
1775 // int fake_ctxt = (int) args[1];
1777 // Does this go direct and skip the X server? We'll just say
1784 case glXGetConfig_func:
1786 int visualid = args[1];
1787 ret.i = glXGetConfigFunc(visualid, args[2], (int *) args[3]);
1791 case glXGetConfig_extended_func:
1793 int visualid = args[1];
1796 int *attribs = (int *) args[3];
1797 int *values = (int *) args[4];
1798 int *res = (int *) args[5];
1800 for (i = 0; i < n; i++) {
1801 res[i] = glXGetConfigFunc(visualid, attribs[i], &values[i]);
1806 case glXUseXFont_func:
1808 /* implementation is client-side only :-) */
1812 case glXQueryExtension_func:
1814 int *errorBase = (int *) args[1];
1815 int *eventBase = (int *) args[2];
1816 if (errorBase) *errorBase = 0; /* FIXME GW */
1817 if (eventBase) *eventBase = 0; /* FIXME GW */
1822 case glXChooseFBConfig_func:
1824 if (process->nfbconfig == MAX_FBCONFIG) {
1825 *(int *) args[3] = 0;
1828 const GLXFBConfig *fbconfigs =
1829 glXChooseFBConfigFunc(args[1], (int *) args[2], (int *) args[3]);
1831 process->fbconfigs[process->nfbconfig] = fbconfigs;
1832 process->fbconfigs_max[process->nfbconfig] =
1834 process->nfbconfig++;
1835 ret.i = 1 + process->nfbconfig_total;
1836 process->nfbconfig_total +=
1837 process->fbconfigs_max[process->nfbconfig];
1844 case glXGetFBConfigs_func:
1846 if (process->nfbconfig == MAX_FBCONFIG) {
1847 *(int *) args[2] = 0;
1850 const GLXFBConfig *fbconfigs =
1851 glXGetFBConfigsFunc(args[1], (int *) args[2]);
1853 process->fbconfigs[process->nfbconfig] = fbconfigs;
1854 process->fbconfigs_max[process->nfbconfig] =
1856 process->nfbconfig++;
1857 ret.i = 1 + process->nfbconfig_total;
1858 process->nfbconfig_total +=
1859 process->fbconfigs_max[process->nfbconfig];
1866 case glXGetFBConfigAttrib_func:
1868 int client_fbconfig = args[1];
1871 const GLXFBConfig *fbconfig = get_fbconfig(process, client_fbconfig);
1875 glXGetFBConfigAttribFunc(fbconfig, args[2], (int *) args[3]);
1879 case glXGetFBConfigAttrib_extended_func:
1881 int client_fbconfig = args[1];
1884 int *attribs = (int *) args[3];
1885 int *values = (int *) args[4];
1886 int *res = (int *) args[5];
1887 const GLXFBConfig *fbconfig = get_fbconfig(process, client_fbconfig);
1889 for (i = 0; i < n; i++) {
1892 glXGetFBConfigAttribFunc(fbconfig, attribs[i], &values[i]);
1899 case glXQueryContext_func:
1901 DEBUGF( "glXQueryContext not implemented\n");
1904 GET_EXT_PTR(int, glXQueryContext,
1905 (Display *, GLXContext, int, int *));
1906 int fake_ctxt = (int) args[1];
1908 if (display_function_call)
1909 DEBUGF( "fake_ctx=%i\n", fake_ctxt);
1911 get_association_fakecontext_glxcontext(process, fake_ctxt);
1913 DEBUGF( "invalid fake_ctxt (%i) !\n", fake_ctxt);
1917 ptr_func_glXQueryContext(dpy, ctxt, args[2],
1924 case glXQueryDrawable_func:
1927 // GLX_WIDTH, GLX_HEIGHT, GLX_PRESERVED_CONTENTS, GLX_LARGEST_PBUFFER, GLX_FBCONFIG_ID
1928 DEBUGF( "FIXME: glXQueryDrawable not implemented\n");
1931 GET_EXT_PTR(void, glXQueryDrawable,
1932 (Display *, GLXDrawable, int, int *));
1933 ClientGLXDrawable client_drawable = to_drawable(args[1]);
1934 GLXDrawable drawable =
1935 get_association_clientdrawable_serverdrawable(
1936 glstate, client_drawable);
1938 if (display_function_call)
1939 DEBUGF( "client_drawable=%p\n",
1943 DEBUGF( "invalid client_drawable (%p) !\n",
1946 ptr_func_glXQueryDrawable(dpy, drawable,
1947 args[2], (int *) args[3]);
1951 case glXGetVisualFromFBConfig_func:
1953 int client_fbconfig = args[1];
1956 const GLXFBConfig *fbconfig = get_fbconfig(process, client_fbconfig);
1959 // we tread visualid as the index into the fbconfigs array
1960 ret.i = &FBCONFIGS[0] - fbconfig;
1961 if (display_function_call)
1962 DEBUGF( "visualid = %d\n", ret.i);
1966 case glXSwapIntervalSGI_func:
1968 /*GET_EXT_PTR(int, glXSwapIntervalSGI, (int));
1969 ret.i = ptr_func_glXSwapIntervalSGI(args[0]);*/
1974 case glXGetProcAddress_fake_func:
1976 // if (display_function_call)
1977 //DEBUGF( "glXGetProcAddress %s ", (char *) args[0]);
1978 ret.i = glo_getprocaddress((const char *) args[0]) != NULL;
1979 // DEBUGF( " == %08x\n", ret.i);
1984 case glXGetProcAddress_global_fake_func:
1986 int nbElts = args[0];
1987 char *huge_buffer = (char *) args[1];
1988 char *result = (char *) args[2];
1991 for (i = 0; i < nbElts; i++) {
1992 int len = strlen(huge_buffer);
1993 //DEBUGF( "glXGetProcAddress_global %s ", (char *)huge_buffer);
1995 glo_getprocaddress((const char *) huge_buffer) !=
1997 huge_buffer += len + 1;
2001 case glXCreatePixmap_func:
2003 int client_fbconfig = args[1];
2006 const GLXFBConfig *fbconfig = get_fbconfig(process, client_fbconfig);
2010 /* Create a light-weight context just for creating surface */
2011 GloContext *context = __glo_context_create(fbconfig->formatFlags);
2013 /* glXPixmap same as input Pixmap */
2014 ClientGLXDrawable client_drawable = to_drawable(args[2]);
2016 QGloSurface *qsurface = calloc(1, sizeof(QGloSurface));
2018 /* get the width and height */
2020 glo_geometry_get_from_glx((int*)args[3], &width, &height);
2022 DEBUGF( "glXCreatePixmap: %dX%d.\n", width, height);
2023 qsurface->surface = glo_surface_create(width, height, context);
2024 qsurface->client_drawable = client_drawable;
2025 qsurface->type = SURFACE_PIXMAP;
2026 qsurface->status = SURFACE_PENDING;
2027 /* qsurface->ref = 1;*/
2029 /* Keep this surface, will link it with context in MakeCurrent */
2030 keep_qsurface(process, qsurface);
2032 /* If this pixmap is linked as texture previously */
2033 if (link_drawable(process, client_drawable))
2034 glo_surface_as_texture(qsurface->surface);
2036 ret.i = client_drawable;
2041 case glXDestroyPixmap_func:
2045 case glEGLImageTargetTexture2DOES_fake_func:
2047 int target = args[0];
2048 ClientGLXDrawable client_drawable = to_drawable(args[1]);
2049 QGloSurface *qsurface = find_qsurface_from_client_drawable(process, client_drawable);
2051 /* Only support GL_TEXTURE_2D according to spec */
2052 if ( target == GL_TEXTURE_2D )
2053 add_pixmap_texture_mapping(process->current_state,
2054 process->current_state->bindTexture2D,
2059 if ( !keep_drawable(process, client_drawable) )
2061 DEBUGF( "No space to store drawable for ImageTargetTexture. Need call CreatePixmapSurface to free them.\n");
2066 glo_surface_as_texture(qsurface->surface);
2071 /* Begin of texture stuff */
2072 case glBindTexture_func:
2073 case glBindTextureEXT_func:
2075 int target = args[0];
2076 unsigned int client_texture = args[1];
2077 unsigned int server_texture;
2079 if (client_texture == 0) {
2080 glBindTexture(target, 0);
2082 alloc_value(process->current_state->textureAllocator,
2085 process->current_state->tabTextures[client_texture];
2086 if (server_texture == 0) {
2087 glGenTextures(1, &server_texture);
2088 process->current_state->tabTextures[client_texture] =
2091 glBindTexture(target, server_texture);
2094 if ( target == GL_TEXTURE_2D ) {
2095 QGloSurface *qsurface = NULL;
2096 ClientGLXDrawable drawable =
2097 find_pixmap_texture(process->current_state, client_texture);
2101 qsurface = find_qsurface_from_client_drawable(process, drawable);
2105 glo_surface_as_texture(qsurface->surface);
2106 fprintf(stderr, "edwin:bindtexture: drawable=0x%x,qsurface=%p.\n", drawable, qsurface);
2110 process->current_state->bindTexture2D = client_texture;
2115 case glGenTextures_fake_func:
2117 //GET_EXT_PTR(void, glGenTextures, (GLsizei n, GLuint *textures));
2120 unsigned int *clientTabTextures = g_malloc(n * sizeof(int));
2121 unsigned int *serverTabTextures = g_malloc(n * sizeof(int));
2123 alloc_range(process->current_state->textureAllocator, n,
2126 //ptr_func_glGenTextures(n, serverTabTextures);
2127 glGenTextures(n, serverTabTextures);
2128 for (i = 0; i < n; i++) {
2129 process->current_state->tabTextures[clientTabTextures[i]] =
2130 serverTabTextures[i];
2133 g_free(clientTabTextures);
2134 g_free(serverTabTextures);
2139 case glDeleteTextures_func:
2141 //GET_EXT_PTR(void, glDeleteTextures,
2142 // (GLsizei n, const GLuint *textures));
2145 unsigned int *clientTabTextures = (unsigned int *) args[1];
2147 delete_range(process->current_state->textureAllocator, n,
2150 unsigned int *serverTabTextures = g_malloc(n * sizeof(int));
2152 for (i = 0; i < n; i++) {
2153 serverTabTextures[i] =
2154 get_server_texture(process, clientTabTextures[i]);
2156 //ptr_func_glDeleteTextures(n, serverTabTextures);
2157 glDeleteTextures(n, serverTabTextures);
2158 for (i = 0; i < n; i++) {
2159 process->current_state->tabTextures[clientTabTextures[i]] = 0;
2161 g_free(serverTabTextures);
2163 for ( i = 0; i < n; i++ )
2165 del_pixmap_texture_mapping(process->current_state, clientTabTextures[i]);
2170 case glPrioritizeTextures_func:
2172 GET_EXT_PTR(void, glPrioritizeTextures,
2173 (GLsizei n, const GLuint *textures,
2174 const GLclampf *priorities));
2178 unsigned int *textures = (unsigned int *) args[1];
2180 for (i = 0; i < n; i++) {
2181 textures[i] = get_server_texture(process, textures[i]);
2183 ptr_func_glPrioritizeTextures(n, textures,
2184 (const GLclampf *) args[2]);
2188 case glAreTexturesResident_func:
2190 GET_EXT_PTR(void, glAreTexturesResident,
2191 (GLsizei n, const GLuint *textures,
2192 GLboolean *residences));
2195 unsigned int *textures = (unsigned int *) args[1];
2197 for (i = 0; i < n; i++) {
2198 textures[i] = get_server_texture(process, textures[i]);
2200 ptr_func_glAreTexturesResident(n, textures,
2201 (GLboolean *) args[2]);
2205 case glIsTexture_func:
2206 case glIsTextureEXT_func:
2208 //GET_EXT_PTR(GLboolean, glIsTexture, (GLuint texture));
2209 unsigned int client_texture = args[0];
2210 unsigned int server_texture =
2211 get_server_texture(process, client_texture);
2213 // ret.c = ptr_func_glIsTexture(server_texture);
2214 ret.c = glIsTexture(server_texture);
2220 case glFramebufferTexture1DEXT_func:
2222 GET_EXT_PTR(void, glFramebufferTexture1DEXT,
2223 (int, int, int, int, int));
2224 unsigned int client_texture = args[3];
2225 unsigned int server_texture =
2226 get_server_texture(process, client_texture);
2228 ptr_func_glFramebufferTexture1DEXT(args[0], args[1], args[2],
2229 server_texture, args[4]);
2233 case glFramebufferTexture2D_func:
2234 //DEBUGF( "wooooot!\n");
2235 case glFramebufferTexture2DEXT_func:
2237 GET_EXT_PTR(void, glFramebufferTexture2DEXT,
2238 (int, int, int, int, int));
2239 unsigned int client_texture = args[3];
2240 unsigned int server_texture =
2241 get_server_texture(process, client_texture);
2243 ptr_func_glFramebufferTexture2DEXT(args[0], args[1], args[2],
2244 server_texture, args[4]);
2248 case glFramebufferTexture3DEXT_func:
2250 GET_EXT_PTR(void, glFramebufferTexture3DEXT,
2251 (int, int, int, int, int, int));
2252 unsigned int client_texture = args[3];
2253 unsigned int server_texture =
2254 get_server_texture(process, client_texture);
2256 ptr_func_glFramebufferTexture3DEXT(args[0], args[1], args[2],
2257 server_texture, args[4],
2261 /* End of texture stuff */
2263 /* Begin of list stuff */
2266 unsigned int client_list = args[0];
2267 unsigned int server_list = get_server_list(process, client_list);
2270 ret.c = glIsList(server_list);
2276 case glDeleteLists_func:
2279 unsigned int first_client = args[0];
2282 unsigned int first_server =
2283 get_server_list(process, first_client);
2284 for (i = 0; i < n; i++) {
2285 if (get_server_list(process, first_client + i) !=
2290 glDeleteLists(first_server, n);
2292 for (i = 0; i < n; i++) {
2293 glDeleteLists(get_server_list(process, first_client + i),
2298 for (i = 0; i < n; i++) {
2299 process->current_state->tabLists[first_client + i] = 0;
2301 delete_consecutive_values(process->current_state->listAllocator,
2306 case glGenLists_fake_func:
2310 unsigned int server_first = glGenLists(n);
2313 unsigned int client_first =
2314 alloc_range(process->current_state->listAllocator, n,
2316 for (i = 0; i < n; i++) {
2317 process->current_state->tabLists[client_first + i] =
2324 case glNewList_func:
2326 unsigned int client_list = args[0];
2329 alloc_value(process->current_state->listAllocator, client_list);
2330 unsigned int server_list = get_server_list(process, client_list);
2332 if (server_list == 0) {
2333 server_list = glGenLists(1);
2334 process->current_state->tabLists[client_list] = server_list;
2336 glNewList(server_list, mode);
2340 case glCallList_func:
2342 unsigned int client_list = args[0];
2343 unsigned int server_list = get_server_list(process, client_list);
2345 glCallList(server_list);
2349 case glCallLists_func:
2354 const GLvoid *lists = (const GLvoid *) args[2];
2355 int *new_lists = g_malloc(sizeof(int) * n);
2357 for (i = 0; i < n; i++) {
2359 get_server_list(process, translate_id(i, type, lists));
2361 glCallLists(n, GL_UNSIGNED_INT, new_lists);
2367 /* End of list stuff */
2369 /* Begin of buffer stuff */
2370 case glBindBufferARB_func:
2372 GET_EXT_PTR(void, glBindBufferARB, (int, int));
2373 int target = args[0];
2374 unsigned int client_buffer = args[1];
2375 unsigned int server_buffer;
2377 if (client_buffer == 0) {
2378 ptr_func_glBindBufferARB(target, 0);
2380 server_buffer = get_server_buffer(process, client_buffer);
2381 ptr_func_glBindBufferARB(target, server_buffer);
2386 case glGenBuffersARB_fake_func:
2388 GET_EXT_PTR(void, glGenBuffersARB, (int, unsigned int *));
2391 unsigned int *clientTabBuffers = g_malloc(n * sizeof(int));
2392 unsigned int *serverTabBuffers = g_malloc(n * sizeof(int));
2394 alloc_range(process->current_state->bufferAllocator, n,
2397 ptr_func_glGenBuffersARB(n, serverTabBuffers);
2398 for (i = 0; i < n; i++) {
2399 process->current_state->tabBuffers[clientTabBuffers[i]] =
2400 serverTabBuffers[i];
2403 g_free(clientTabBuffers);
2404 g_free(serverTabBuffers);
2409 case glDeleteBuffersARB_func:
2411 GET_EXT_PTR(void, glDeleteBuffersARB, (int, int *));
2414 unsigned int *clientTabBuffers = (unsigned int *) args[1];
2416 delete_range(process->current_state->bufferAllocator, n,
2419 int *serverTabBuffers = g_malloc(n * sizeof(int));
2421 for (i = 0; i < n; i++) {
2422 serverTabBuffers[i] =
2423 get_server_buffer(process, clientTabBuffers[i]);
2425 ptr_func_glDeleteBuffersARB(n, serverTabBuffers);
2426 for (i = 0; i < n; i++) {
2427 process->current_state->tabBuffers[clientTabBuffers[i]] = 0;
2429 g_free(serverTabBuffers);
2433 case glIsBufferARB_func:
2435 GET_EXT_PTR(int, glIsBufferARB, (int));
2436 unsigned int client_buffer = args[0];
2437 unsigned int server_buffer =
2438 get_server_buffer(process, client_buffer);
2440 ret.i = ptr_func_glIsBufferARB(server_buffer);
2446 /* End of buffer stuff */
2448 case glShaderSourceARB_fake_func:
2450 GET_EXT_PTR(void, glShaderSourceARB, (int, int, char **, void *));
2454 GLcharARB **tab_prog = g_malloc(size * sizeof(GLcharARB *));
2455 int *tab_length = (int *) args[3];
2457 for (i = 0; i < size; i++) {
2458 tab_prog[i] = ((GLcharARB *) args[2]) + acc_length;
2459 acc_length += tab_length[i];
2461 ptr_func_glShaderSourceARB(args[0], args[1], tab_prog,
2467 case glShaderSource_fake_func:
2469 GET_EXT_PTR(void, glShaderSource, (int, int, char **, void *));
2473 GLcharARB **tab_prog = g_malloc(size * sizeof(GLcharARB *));
2474 int *tab_length = (int *) args[3];
2476 char **tab_prog_new;
2477 GLint *tab_length_new;
2479 tab_prog_new = malloc(args[1]* sizeof(char*));
2480 tab_length_new = malloc(args[1]* sizeof(GLint));
2482 memset(tab_prog_new, 0, args[1] * sizeof(char*));
2483 memset(tab_length_new, 0, args[1] * sizeof(GLint));
2486 for (i = 0; i < size; i++) {
2487 tab_prog[i] = ((GLcharARB *) args[2]) + acc_length;
2488 acc_length += tab_length[i];
2491 shadersrc_gles_to_gl(args[1], tab_prog, tab_prog_new, tab_length, tab_length_new);
2493 if (!tab_prog_new || !tab_length_new)
2496 ptr_func_glShaderSource(args[0], args[1], tab_prog_new, tab_length_new);
2498 for (i = 0; i < args[1]; i++) {
2499 free(tab_prog_new[i]);
2503 free(tab_length_new);
2510 case glVertexPointer_fake_func:
2512 int offset = args[0];
2515 int stride = args[3];
2516 int bytes_size = args[4];
2518 process->current_state->vertexPointerSize =
2519 MAX(process->current_state->vertexPointerSize,
2520 offset + bytes_size);
2521 process->current_state->vertexPointer =
2522 g_realloc(process->current_state->vertexPointer,
2523 process->current_state->vertexPointerSize);
2524 memcpy(process->current_state->vertexPointer + offset,
2525 (void *) args[5], bytes_size);
2526 /* DEBUGF( "glVertexPointer_fake_func size=%d, type=%d,
2527 * stride=%d, byte_size=%d\n", size, type, stride, bytes_size); */
2528 glVertexPointer(size, type, stride,
2529 process->current_state->vertexPointer);
2533 case glNormalPointer_fake_func:
2535 int offset = args[0];
2537 int stride = args[2];
2538 int bytes_size = args[3];
2540 process->current_state->normalPointerSize =
2541 MAX(process->current_state->normalPointerSize,
2542 offset + bytes_size);
2543 process->current_state->normalPointer =
2544 g_realloc(process->current_state->normalPointer,
2545 process->current_state->normalPointerSize);
2546 memcpy(process->current_state->normalPointer + offset,
2547 (void *) args[4], bytes_size);
2548 // DEBUGF( "glNormalPointer_fake_func type=%d, stride=%d,
2549 // byte_size=%d\n", type, stride, bytes_size);
2550 glNormalPointer(type, stride,
2551 process->current_state->normalPointer);
2555 case glIndexPointer_fake_func:
2557 int offset = args[0];
2559 int stride = args[2];
2560 int bytes_size = args[3];
2562 process->current_state->indexPointerSize =
2563 MAX(process->current_state->indexPointerSize,
2564 offset + bytes_size);
2565 process->current_state->indexPointer =
2566 g_realloc(process->current_state->indexPointer,
2567 process->current_state->indexPointerSize);
2568 memcpy(process->current_state->indexPointer + offset,
2569 (void *) args[4], bytes_size);
2570 // DEBUGF( "glIndexPointer_fake_func type=%d, stride=%d,
2571 // byte_size=%d\n", type, stride, bytes_size);
2572 glIndexPointer(type, stride,
2573 process->current_state->indexPointer);
2577 case glEdgeFlagPointer_fake_func:
2579 int offset = args[0];
2580 int stride = args[1];
2581 int bytes_size = args[2];
2583 process->current_state->edgeFlagPointerSize =
2584 MAX(process->current_state->edgeFlagPointerSize,
2585 offset + bytes_size);
2586 process->current_state->edgeFlagPointer =
2587 g_realloc(process->current_state->edgeFlagPointer,
2588 process->current_state->edgeFlagPointerSize);
2589 memcpy(process->current_state->edgeFlagPointer + offset,
2590 (void *) args[3], bytes_size);
2591 // DEBUGF( "glEdgeFlagPointer_fake_func stride = %d,
2592 // bytes_size=%d\n", stride, bytes_size);
2593 glEdgeFlagPointer(stride,
2594 process->current_state->edgeFlagPointer);
2598 case glVertexAttribPointerARB_fake_func:
2600 GET_EXT_PTR(void, glVertexAttribPointerARB,
2601 (int, int, int, int, int, void *));
2602 int offset = args[0];
2603 int index = args[1];
2606 int normalized = args[4];
2607 int stride = args[5];
2608 int bytes_size = args[6];
2610 process->current_state->vertexAttribPointerSize[index] =
2611 MAX(process->current_state->vertexAttribPointerSize[index],
2612 offset + bytes_size);
2613 process->current_state->vertexAttribPointer[index] =
2614 g_realloc(process->current_state->vertexAttribPointer[index],
2615 process->current_state->
2616 vertexAttribPointerSize[index]);
2617 memcpy(process->current_state->vertexAttribPointer[index] +
2618 offset, (void *) args[7], bytes_size);
2619 ptr_func_glVertexAttribPointerARB(index, size, type, normalized,
2621 process->current_state->
2622 vertexAttribPointer[index]);
2626 case glVertexAttribPointerNV_fake_func:
2628 GET_EXT_PTR(void, glVertexAttribPointerNV,
2629 (int, int, int, int, void *));
2630 int offset = args[0];
2631 int index = args[1];
2634 int stride = args[4];
2635 int bytes_size = args[5];
2637 process->current_state->vertexAttribPointerNVSize[index] =
2638 MAX(process->current_state->vertexAttribPointerNVSize[index],
2639 offset + bytes_size);
2640 process->current_state->vertexAttribPointerNV[index] =
2641 g_realloc(process->current_state->vertexAttribPointerNV[index],
2642 process->current_state->
2643 vertexAttribPointerNVSize[index]);
2644 memcpy(process->current_state->vertexAttribPointerNV[index] +
2645 offset, (void *) args[6], bytes_size);
2646 ptr_func_glVertexAttribPointerNV(index, size, type, stride,
2647 process->current_state->
2648 vertexAttribPointerNV[index]);
2652 case glColorPointer_fake_func:
2654 int offset = args[0];
2657 int stride = args[3];
2658 int bytes_size = args[4];
2660 process->current_state->colorPointerSize =
2661 MAX(process->current_state->colorPointerSize,
2662 offset + bytes_size);
2663 process->current_state->colorPointer =
2664 g_realloc(process->current_state->colorPointer,
2665 process->current_state->colorPointerSize);
2666 memcpy(process->current_state->colorPointer + offset,
2667 (void *) args[5], bytes_size);
2668 // DEBUGF( "glColorPointer_fake_func bytes_size = %d\n",
2670 glColorPointer(size, type, stride,
2671 process->current_state->colorPointer);
2676 case glSecondaryColorPointer_fake_func:
2678 GET_EXT_PTR(void, glSecondaryColorPointer,
2679 (int, int, int, void *));
2680 int offset = args[0];
2683 int stride = args[3];
2684 int bytes_size = args[4];
2686 process->current_state->secondaryColorPointerSize =
2687 MAX(process->current_state->secondaryColorPointerSize,
2688 offset + bytes_size);
2689 process->current_state->secondaryColorPointer =
2690 g_realloc(process->current_state->secondaryColorPointer,
2691 process->current_state->secondaryColorPointerSize);
2692 memcpy(process->current_state->secondaryColorPointer + offset,
2693 (void *) args[5], bytes_size);
2694 // DEBUGF( "glSecondaryColorPointer_fake_func bytes_size
2695 // = %d\n", bytes_size);
2696 ptr_func_glSecondaryColorPointer(size, type, stride,
2697 process->current_state->
2698 secondaryColorPointer);
2703 case glPushClientAttrib_func:
2707 if (process->current_state->clientStateSp <
2708 MAX_CLIENT_STATE_STACK_SIZE) {
2709 process->current_state->clientStateStack[process->
2711 clientStateSp].mask =
2713 if (mask & GL_CLIENT_VERTEX_ARRAY_BIT) {
2714 process->current_state->clientStateStack[process->
2717 activeTextureIndex =
2718 process->current_state->activeTextureIndex;
2720 process->current_state->clientStateSp++;
2722 glPushClientAttrib(mask);
2726 case glPopClientAttrib_func:
2728 if (process->current_state->clientStateSp > 0) {
2729 process->current_state->clientStateSp--;
2730 if (process->current_state->
2731 clientStateStack[process->current_state->clientStateSp].
2732 mask & GL_CLIENT_VERTEX_ARRAY_BIT) {
2733 process->current_state->activeTextureIndex =
2734 process->current_state->clientStateStack[process->
2740 glPopClientAttrib();
2744 case glClientActiveTexture_func:
2745 case glClientActiveTextureARB_func:
2747 int activeTexture = args[0];
2749 process->current_state->activeTextureIndex =
2750 activeTexture - GL_TEXTURE0_ARB;
2751 do_glClientActiveTextureARB(activeTexture);
2755 case glTexCoordPointer_fake_func:
2757 int offset = args[0];
2758 int index = args[1];
2761 int stride = args[4];
2762 int bytes_size = args[5];
2764 process->current_state->texCoordPointerSize[index] =
2765 MAX(process->current_state->texCoordPointerSize[index],
2766 offset + bytes_size);
2767 process->current_state->texCoordPointer[index] =
2768 g_realloc(process->current_state->texCoordPointer[index],
2769 process->current_state->texCoordPointerSize[index]);
2770 memcpy(process->current_state->texCoordPointer[index] + offset,
2771 (void *) args[6], bytes_size);
2772 /* DEBUGF( "glTexCoordPointer_fake_func size=%d, type=%d,
2773 * stride=%d, byte_size=%d\n", size, type, stride, bytes_size); */
2774 do_glClientActiveTextureARB(GL_TEXTURE0_ARB + index);
2775 glTexCoordPointer(size, type, stride,
2776 process->current_state->texCoordPointer[index]);
2777 do_glClientActiveTextureARB(GL_TEXTURE0_ARB +
2778 process->current_state->
2779 activeTextureIndex);
2783 case glWeightPointerARB_fake_func:
2785 GET_EXT_PTR(void, glWeightPointerARB, (int, int, int, void *));
2786 int offset = args[0];
2789 int stride = args[3];
2790 int bytes_size = args[4];
2792 process->current_state->weightPointerSize =
2793 MAX(process->current_state->weightPointerSize,
2794 offset + bytes_size);
2795 process->current_state->weightPointer =
2796 g_realloc(process->current_state->weightPointer,
2797 process->current_state->weightPointerSize);
2798 memcpy(process->current_state->weightPointer + offset,
2799 (void *) args[5], bytes_size);
2800 /* DEBUGF( "glWeightPointerARB_fake_func size=%d,
2801 * type=%d, stride=%d, byte_size=%d\n", size, type, stride,
2803 ptr_func_glWeightPointerARB(size, type, stride,
2804 process->current_state->
2809 case glMatrixIndexPointerARB_fake_func:
2811 GET_EXT_PTR(void, glMatrixIndexPointerARB,
2812 (int, int, int, void *));
2813 int offset = args[0];
2816 int stride = args[3];
2817 int bytes_size = args[4];
2819 process->current_state->matrixIndexPointerSize =
2820 MAX(process->current_state->matrixIndexPointerSize,
2821 offset + bytes_size);
2822 process->current_state->matrixIndexPointer =
2823 g_realloc(process->current_state->matrixIndexPointer,
2824 process->current_state->matrixIndexPointerSize);
2825 memcpy(process->current_state->matrixIndexPointer + offset,
2826 (void *) args[5], bytes_size);
2827 /* DEBUGF( "glMatrixIndexPointerARB_fake_func size=%d,
2828 * type=%d, stride=%d, byte_size=%d\n", size, type, stride,
2830 ptr_func_glMatrixIndexPointerARB(size, type, stride,
2831 process->current_state->
2832 matrixIndexPointer);
2836 case glFogCoordPointer_fake_func:
2838 GET_EXT_PTR(void, glFogCoordPointer, (int, int, void *));
2839 int offset = args[0];
2841 int stride = args[2];
2842 int bytes_size = args[3];
2844 process->current_state->fogCoordPointerSize =
2845 MAX(process->current_state->fogCoordPointerSize,
2846 offset + bytes_size);
2847 process->current_state->fogCoordPointer =
2848 g_realloc(process->current_state->fogCoordPointer,
2849 process->current_state->fogCoordPointerSize);
2850 memcpy(process->current_state->fogCoordPointer + offset,
2851 (void *) args[4], bytes_size);
2852 // DEBUGF( "glFogCoordPointer_fake_func type=%d,
2853 // stride=%d, byte_size=%d\n", type, stride, bytes_size);
2854 ptr_func_glFogCoordPointer(type, stride,
2855 process->current_state->
2860 case glVariantPointerEXT_fake_func:
2862 GET_EXT_PTR(void, glVariantPointerEXT, (int, int, int, void *));
2863 int offset = args[0];
2866 int stride = args[3];
2867 int bytes_size = args[4];
2869 process->current_state->variantPointerEXTSize[id] =
2870 MAX(process->current_state->variantPointerEXTSize[id],
2871 offset + bytes_size);
2872 process->current_state->variantPointerEXT[id] =
2873 g_realloc(process->current_state->variantPointerEXT[id],
2874 process->current_state->variantPointerEXTSize[id]);
2875 memcpy(process->current_state->variantPointerEXT[id] + offset,
2876 (void *) args[5], bytes_size);
2877 // DEBUGF( "glVariantPointerEXT_fake_func[%d] type=%d,
2878 // stride=%d, byte_size=%d\n", id, type, stride, bytes_size);
2879 ptr_func_glVariantPointerEXT(id, type, stride,
2880 process->current_state->
2881 variantPointerEXT[id]);
2885 case glInterleavedArrays_fake_func:
2887 GET_EXT_PTR(void, glInterleavedArrays, (int, int, void *));
2888 int offset = args[0];
2889 int format = args[1];
2890 int stride = args[2];
2891 int bytes_size = args[3];
2893 process->current_state->interleavedArraysSize =
2894 MAX(process->current_state->interleavedArraysSize,
2895 offset + bytes_size);
2896 process->current_state->interleavedArrays =
2897 g_realloc(process->current_state->interleavedArrays,
2898 process->current_state->interleavedArraysSize);
2899 memcpy(process->current_state->interleavedArrays + offset,
2900 (void *) args[4], bytes_size);
2901 // DEBUGF( "glInterleavedArrays_fake_func format=%d,
2902 // stride=%d, byte_size=%d\n", format, stride, bytes_size);
2903 ptr_func_glInterleavedArrays(format, stride,
2904 process->current_state->
2909 case glElementPointerATI_fake_func:
2911 GET_EXT_PTR(void, glElementPointerATI, (int, void *));
2913 int bytes_size = args[1];
2915 process->current_state->elementPointerATISize = bytes_size;
2916 process->current_state->elementPointerATI =
2917 g_realloc(process->current_state->elementPointerATI,
2918 process->current_state->elementPointerATISize);
2919 memcpy(process->current_state->elementPointerATI,
2920 (void *) args[2], bytes_size);
2921 // DEBUGF( "glElementPointerATI_fake_func type=%d,
2922 // byte_size=%d\n", type, bytes_size);
2923 ptr_func_glElementPointerATI(type,
2924 process->current_state->
2929 case glTexCoordPointer01_fake_func:
2933 int stride = args[2];
2934 int bytes_size = args[3];
2936 process->current_state->texCoordPointerSize[0] = bytes_size;
2937 process->current_state->texCoordPointer[0] =
2938 g_realloc(process->current_state->texCoordPointer[0],
2940 memcpy(process->current_state->texCoordPointer[0],
2941 (void *) args[4], bytes_size);
2942 /* DEBUGF( "glTexCoordPointer01_fake_func size=%d,
2943 * type=%d, stride=%d, byte_size=%d\n", size, type, stride,
2945 do_glClientActiveTextureARB(GL_TEXTURE0_ARB + 0);
2946 glTexCoordPointer(size, type, stride,
2947 process->current_state->texCoordPointer[0]);
2948 do_glClientActiveTextureARB(GL_TEXTURE0_ARB + 1);
2949 glTexCoordPointer(size, type, stride,
2950 process->current_state->texCoordPointer[0]);
2951 do_glClientActiveTextureARB(GL_TEXTURE0_ARB +
2952 process->current_state->
2953 activeTextureIndex);
2957 case glTexCoordPointer012_fake_func:
2961 int stride = args[2];
2962 int bytes_size = args[3];
2964 process->current_state->texCoordPointerSize[0] = bytes_size;
2965 process->current_state->texCoordPointer[0] =
2966 g_realloc(process->current_state->texCoordPointer[0],
2968 memcpy(process->current_state->texCoordPointer[0],
2969 (void *) args[4], bytes_size);
2970 /* DEBUGF( "glTexCoordPointer012_fake_func size=%d,
2971 * type=%d, stride=%d, byte_size=%d\n", size, type, stride,
2973 do_glClientActiveTextureARB(GL_TEXTURE0_ARB + 0);
2974 glTexCoordPointer(size, type, stride,
2975 process->current_state->texCoordPointer[0]);
2976 do_glClientActiveTextureARB(GL_TEXTURE0_ARB + 1);
2977 glTexCoordPointer(size, type, stride,
2978 process->current_state->texCoordPointer[0]);
2979 do_glClientActiveTextureARB(GL_TEXTURE0_ARB + 2);
2980 glTexCoordPointer(size, type, stride,
2981 process->current_state->texCoordPointer[0]);
2982 do_glClientActiveTextureARB(GL_TEXTURE0_ARB +
2983 process->current_state->
2984 activeTextureIndex);
2988 case glVertexAndNormalPointer_fake_func:
2990 int vertexPointerSize = args[0];
2991 int vertexPointerType = args[1];
2992 int vertexPointerStride = args[2];
2993 int normalPointerType = args[3];
2994 int normalPointerStride = args[4];
2995 int bytes_size = args[5];
2996 void *ptr = (void *) args[6];
2998 process->current_state->vertexPointerSize = bytes_size;
2999 process->current_state->vertexPointer =
3000 g_realloc(process->current_state->vertexPointer, bytes_size);
3001 memcpy(process->current_state->vertexPointer, ptr, bytes_size);
3002 glVertexPointer(vertexPointerSize, vertexPointerType,
3003 vertexPointerStride,
3004 process->current_state->vertexPointer);
3005 glNormalPointer(normalPointerType, normalPointerStride,
3006 process->current_state->vertexPointer);
3010 case glVertexNormalPointerInterlaced_fake_func:
3013 int offset = args[i++];
3014 int vertexPointerSize = args[i++];
3015 int vertexPointerType = args[i++];
3016 int stride = args[i++];
3017 int normalPointerOffset = args[i++];
3018 int normalPointerType = args[i++];
3019 int bytes_size = args[i++];
3020 void *ptr = (void *) args[i++];
3022 process->current_state->vertexPointerSize =
3023 MAX(process->current_state->vertexPointerSize,
3024 offset + bytes_size);
3025 process->current_state->vertexPointer =
3026 g_realloc(process->current_state->vertexPointer,
3027 process->current_state->vertexPointerSize);
3028 memcpy(process->current_state->vertexPointer + offset, ptr,
3030 glVertexPointer(vertexPointerSize, vertexPointerType, stride,
3031 process->current_state->vertexPointer);
3032 glNormalPointer(normalPointerType, stride,
3033 process->current_state->vertexPointer +
3034 normalPointerOffset);
3038 case glTuxRacerDrawElements_fake_func:
3041 int count = args[1];
3042 int isColorEnabled = args[2];
3043 void *ptr = (void *) args[3];
3046 ((isColorEnabled) ? 4 * sizeof(unsigned char) : 0);
3047 glVertexPointer(3, GL_FLOAT, stride, ptr);
3048 glNormalPointer(GL_FLOAT, stride, ptr + 3 * sizeof(float));
3050 glColorPointer(4, GL_UNSIGNED_BYTE, stride,
3051 ptr + 6 * sizeof(float));
3052 glDrawArrays(mode, 0, count);
3054 #ifdef __APPLE__ //only for mac
3057 glGetIntegerv(GL_FRAMEBUFFER_BINDING_EXT, &prev_fbo);
3058 if ( prev_fbo != 0 )
3066 case glVertexNormalColorPointerInterlaced_fake_func:
3069 int offset = args[i++];
3070 int vertexPointerSize = args[i++];
3071 int vertexPointerType = args[i++];
3072 int stride = args[i++];
3073 int normalPointerOffset = args[i++];
3074 int normalPointerType = args[i++];
3075 int colorPointerOffset = args[i++];
3076 int colorPointerSize = args[i++];
3077 int colorPointerType = args[i++];
3078 int bytes_size = args[i++];
3079 void *ptr = (void *) args[i++];
3081 process->current_state->vertexPointerSize =
3082 MAX(process->current_state->vertexPointerSize,
3083 offset + bytes_size);
3084 process->current_state->vertexPointer =
3085 g_realloc(process->current_state->vertexPointer,
3086 process->current_state->vertexPointerSize);
3087 memcpy(process->current_state->vertexPointer + offset, ptr,
3089 glVertexPointer(vertexPointerSize, vertexPointerType, stride,
3090 process->current_state->vertexPointer);
3091 glNormalPointer(normalPointerType, stride,
3092 process->current_state->vertexPointer +
3093 normalPointerOffset);
3094 glColorPointer(colorPointerSize, colorPointerType, stride,
3095 process->current_state->vertexPointer +
3096 colorPointerOffset);
3100 case glVertexColorTexCoord0PointerInterlaced_fake_func:
3103 int offset = args[i++];
3104 int vertexPointerSize = args[i++];
3105 int vertexPointerType = args[i++];
3106 int stride = args[i++];
3107 int colorPointerOffset = args[i++];
3108 int colorPointerSize = args[i++];
3109 int colorPointerType = args[i++];
3110 int texCoord0PointerOffset = args[i++];
3111 int texCoord0PointerSize = args[i++];
3112 int texCoord0PointerType = args[i++];
3113 int bytes_size = args[i++];
3114 void *ptr = (void *) args[i++];
3116 process->current_state->vertexPointerSize =
3117 MAX(process->current_state->vertexPointerSize,
3118 offset + bytes_size);
3119 process->current_state->vertexPointer =
3120 g_realloc(process->current_state->vertexPointer,
3121 process->current_state->vertexPointerSize);
3122 memcpy(process->current_state->vertexPointer + offset, ptr,
3124 glVertexPointer(vertexPointerSize, vertexPointerType, stride,
3125 process->current_state->vertexPointer);
3126 glColorPointer(colorPointerSize, colorPointerType, stride,
3127 process->current_state->vertexPointer +
3128 colorPointerOffset);
3129 do_glClientActiveTextureARB(GL_TEXTURE0_ARB + 0);
3130 glTexCoordPointer(texCoord0PointerSize, texCoord0PointerType,
3132 process->current_state->vertexPointer +
3133 texCoord0PointerOffset);
3134 do_glClientActiveTextureARB(GL_TEXTURE0_ARB +
3135 process->current_state->
3136 activeTextureIndex);
3140 case glVertexNormalTexCoord0PointerInterlaced_fake_func:
3143 int offset = args[i++];
3144 int vertexPointerSize = args[i++];
3145 int vertexPointerType = args[i++];
3146 int stride = args[i++];
3147 int normalPointerOffset = args[i++];
3148 int normalPointerType = args[i++];
3149 int texCoord0PointerOffset = args[i++];
3150 int texCoord0PointerSize = args[i++];
3151 int texCoord0PointerType = args[i++];
3152 int bytes_size = args[i++];
3153 void *ptr = (void *) args[i++];
3155 process->current_state->vertexPointerSize =
3156 MAX(process->current_state->vertexPointerSize,
3157 offset + bytes_size);
3158 process->current_state->vertexPointer =
3159 g_realloc(process->current_state->vertexPointer,
3160 process->current_state->vertexPointerSize);
3161 memcpy(process->current_state->vertexPointer + offset, ptr,
3163 glVertexPointer(vertexPointerSize, vertexPointerType, stride,
3164 process->current_state->vertexPointer);
3165 glNormalPointer(normalPointerType, stride,
3166 process->current_state->vertexPointer +
3167 normalPointerOffset);
3168 do_glClientActiveTextureARB(GL_TEXTURE0_ARB + 0);
3169 glTexCoordPointer(texCoord0PointerSize, texCoord0PointerType,
3171 process->current_state->vertexPointer +
3172 texCoord0PointerOffset);
3173 do_glClientActiveTextureARB(GL_TEXTURE0_ARB +
3174 process->current_state->
3175 activeTextureIndex);
3179 case glVertexNormalTexCoord01PointerInterlaced_fake_func:
3182 int offset = args[i++];
3183 int vertexPointerSize = args[i++];
3184 int vertexPointerType = args[i++];
3185 int stride = args[i++];
3186 int normalPointerOffset = args[i++];
3187 int normalPointerType = args[i++];
3188 int texCoord0PointerOffset = args[i++];
3189 int texCoord0PointerSize = args[i++];
3190 int texCoord0PointerType = args[i++];
3191 int texCoord1PointerOffset = args[i++];
3192 int texCoord1PointerSize = args[i++];
3193 int texCoord1PointerType = args[i++];
3194 int bytes_size = args[i++];
3195 void *ptr = (void *) args[i++];
3197 process->current_state->vertexPointerSize =
3198 MAX(process->current_state->vertexPointerSize,
3199 offset + bytes_size);
3200 process->current_state->vertexPointer =
3201 g_realloc(process->current_state->vertexPointer,
3202 process->current_state->vertexPointerSize);
3203 memcpy(process->current_state->vertexPointer + offset, ptr,
3205 glVertexPointer(vertexPointerSize, vertexPointerType, stride,
3206 process->current_state->vertexPointer);
3207 glNormalPointer(normalPointerType, stride,
3208 process->current_state->vertexPointer +
3209 normalPointerOffset);
3210 do_glClientActiveTextureARB(GL_TEXTURE0_ARB + 0);
3211 glTexCoordPointer(texCoord0PointerSize, texCoord0PointerType,
3213 process->current_state->vertexPointer +
3214 texCoord0PointerOffset);
3215 do_glClientActiveTextureARB(GL_TEXTURE0_ARB + 1);
3216 glTexCoordPointer(texCoord1PointerSize, texCoord1PointerType,
3218 process->current_state->vertexPointer +
3219 texCoord1PointerOffset);
3220 do_glClientActiveTextureARB(GL_TEXTURE0_ARB +
3221 process->current_state->
3222 activeTextureIndex);
3226 case glVertexNormalTexCoord012PointerInterlaced_fake_func:
3229 int offset = args[i++];
3230 int vertexPointerSize = args[i++];
3231 int vertexPointerType = args[i++];
3232 int stride = args[i++];
3233 int normalPointerOffset = args[i++];
3234 int normalPointerType = args[i++];
3235 int texCoord0PointerOffset = args[i++];
3236 int texCoord0PointerSize = args[i++];
3237 int texCoord0PointerType = args[i++];
3238 int texCoord1PointerOffset = args[i++];
3239 int texCoord1PointerSize = args[i++];
3240 int texCoord1PointerType = args[i++];
3241 int texCoord2PointerOffset = args[i++];
3242 int texCoord2PointerSize = args[i++];
3243 int texCoord2PointerType = args[i++];
3244 int bytes_size = args[i++];
3245 void *ptr = (void *) args[i++];
3247 process->current_state->vertexPointerSize =
3248 MAX(process->current_state->vertexPointerSize,
3249 offset + bytes_size);
3250 process->current_state->vertexPointer =
3251 g_realloc(process->current_state->vertexPointer,
3252 process->current_state->vertexPointerSize);
3253 memcpy(process->current_state->vertexPointer + offset, ptr,
3255 glVertexPointer(vertexPointerSize, vertexPointerType, stride,
3256 process->current_state->vertexPointer);
3257 glNormalPointer(normalPointerType, stride,
3258 process->current_state->vertexPointer +
3259 normalPointerOffset);
3260 do_glClientActiveTextureARB(GL_TEXTURE0_ARB + 0);
3261 glTexCoordPointer(texCoord0PointerSize, texCoord0PointerType,
3263 process->current_state->vertexPointer +
3264 texCoord0PointerOffset);
3265 do_glClientActiveTextureARB(GL_TEXTURE0_ARB + 1);
3266 glTexCoordPointer(texCoord1PointerSize, texCoord1PointerType,
3268 process->current_state->vertexPointer +
3269 texCoord1PointerOffset);
3270 do_glClientActiveTextureARB(GL_TEXTURE0_ARB + 2);
3271 glTexCoordPointer(texCoord2PointerSize, texCoord2PointerType,
3273 process->current_state->vertexPointer +
3274 texCoord2PointerOffset);
3275 do_glClientActiveTextureARB(GL_TEXTURE0_ARB +
3276 process->current_state->
3277 activeTextureIndex);
3281 case glVertexNormalColorTexCoord0PointerInterlaced_fake_func:
3284 int offset = args[i++];
3285 int vertexPointerSize = args[i++];
3286 int vertexPointerType = args[i++];
3287 int stride = args[i++];
3288 int normalPointerOffset = args[i++];
3289 int normalPointerType = args[i++];
3290 int colorPointerOffset = args[i++];
3291 int colorPointerSize = args[i++];
3292 int colorPointerType = args[i++];
3293 int texCoord0PointerOffset = args[i++];
3294 int texCoord0PointerSize = args[i++];
3295 int texCoord0PointerType = args[i++];
3296 int bytes_size = args[i++];
3297 void *ptr = (void *) args[i++];
3299 process->current_state->vertexPointerSize =
3300 MAX(process->current_state->vertexPointerSize,
3301 offset + bytes_size);
3302 process->current_state->vertexPointer =
3303 g_realloc(process->current_state->vertexPointer,
3304 process->current_state->vertexPointerSize);
3305 memcpy(process->current_state->vertexPointer + offset, ptr,
3307 glVertexPointer(vertexPointerSize, vertexPointerType, stride,
3308 process->current_state->vertexPointer);
3309 glNormalPointer(normalPointerType, stride,
3310 process->current_state->vertexPointer +
3311 normalPointerOffset);
3312 glColorPointer(colorPointerSize, colorPointerType, stride,
3313 process->current_state->vertexPointer +
3314 colorPointerOffset);
3315 do_glClientActiveTextureARB(GL_TEXTURE0_ARB + 0);
3316 glTexCoordPointer(texCoord0PointerSize, texCoord0PointerType,
3318 process->current_state->vertexPointer +
3319 texCoord0PointerOffset);
3320 do_glClientActiveTextureARB(GL_TEXTURE0_ARB +
3321 process->current_state->
3322 activeTextureIndex);
3326 case glVertexNormalColorTexCoord01PointerInterlaced_fake_func:
3329 int offset = args[i++];
3330 int vertexPointerSize = args[i++];
3331 int vertexPointerType = args[i++];
3332 int stride = args[i++];
3333 int normalPointerOffset = args[i++];
3334 int normalPointerType = args[i++];
3335 int colorPointerOffset = args[i++];
3336 int colorPointerSize = args[i++];
3337 int colorPointerType = args[i++];
3338 int texCoord0PointerOffset = args[i++];
3339 int texCoord0PointerSize = args[i++];
3340 int texCoord0PointerType = args[i++];
3341 int texCoord1PointerOffset = args[i++];
3342 int texCoord1PointerSize = args[i++];
3343 int texCoord1PointerType = args[i++];
3344 int bytes_size = args[i++];
3345 void *ptr = (void *) args[i++];
3347 process->current_state->vertexPointerSize =
3348 MAX(process->current_state->vertexPointerSize,
3349 offset + bytes_size);
3350 process->current_state->vertexPointer =
3351 g_realloc(process->current_state->vertexPointer,
3352 process->current_state->vertexPointerSize);
3353 memcpy(process->current_state->vertexPointer + offset, ptr,
3355 glVertexPointer(vertexPointerSize, vertexPointerType, stride,
3356 process->current_state->vertexPointer);
3357 glNormalPointer(normalPointerType, stride,
3358 process->current_state->vertexPointer +
3359 normalPointerOffset);
3360 glColorPointer(colorPointerSize, colorPointerType, stride,
3361 process->current_state->vertexPointer +
3362 colorPointerOffset);
3363 do_glClientActiveTextureARB(GL_TEXTURE0_ARB + 0);
3364 glTexCoordPointer(texCoord0PointerSize, texCoord0PointerType,
3366 process->current_state->vertexPointer +
3367 texCoord0PointerOffset);
3368 do_glClientActiveTextureARB(GL_TEXTURE0_ARB + 1);
3369 glTexCoordPointer(texCoord1PointerSize, texCoord1PointerType,
3371 process->current_state->vertexPointer +
3372 texCoord1PointerOffset);
3373 do_glClientActiveTextureARB(GL_TEXTURE0_ARB +
3374 process->current_state->
3375 activeTextureIndex);
3379 case glVertexNormalColorTexCoord012PointerInterlaced_fake_func:
3382 int offset = args[i++];
3383 int vertexPointerSize = args[i++];
3384 int vertexPointerType = args[i++];
3385 int stride = args[i++];
3386 int normalPointerOffset = args[i++];
3387 int normalPointerType = args[i++];
3388 int colorPointerOffset = args[i++];
3389 int colorPointerSize = args[i++];
3390 int colorPointerType = args[i++];
3391 int texCoord0PointerOffset = args[i++];
3392 int texCoord0PointerSize = args[i++];
3393 int texCoord0PointerType = args[i++];
3394 int texCoord1PointerOffset = args[i++];
3395 int texCoord1PointerSize = args[i++];
3396 int texCoord1PointerType = args[i++];
3397 int texCoord2PointerOffset = args[i++];
3398 int texCoord2PointerSize = args[i++];
3399 int texCoord2PointerType = args[i++];
3400 int bytes_size = args[i++];
3401 void *ptr = (void *) args[i++];
3403 process->current_state->vertexPointerSize =
3404 MAX(process->current_state->vertexPointerSize,
3405 offset + bytes_size);
3406 process->current_state->vertexPointer =
3407 g_realloc(process->current_state->vertexPointer,
3408 process->current_state->vertexPointerSize);
3409 memcpy(process->current_state->vertexPointer + offset, ptr,
3411 glVertexPointer(vertexPointerSize, vertexPointerType, stride,
3412 process->current_state->vertexPointer);
3413 glNormalPointer(normalPointerType, stride,
3414 process->current_state->vertexPointer +
3415 normalPointerOffset);
3416 glColorPointer(colorPointerSize, colorPointerType, stride,
3417 process->current_state->vertexPointer +
3418 colorPointerOffset);
3419 do_glClientActiveTextureARB(GL_TEXTURE0_ARB + 0);
3420 glTexCoordPointer(texCoord0PointerSize, texCoord0PointerType,
3422 process->current_state->vertexPointer +
3423 texCoord0PointerOffset);
3424 do_glClientActiveTextureARB(GL_TEXTURE0_ARB + 1);
3425 glTexCoordPointer(texCoord1PointerSize, texCoord1PointerType,
3427 process->current_state->vertexPointer +
3428 texCoord1PointerOffset);
3429 do_glClientActiveTextureARB(GL_TEXTURE0_ARB + 2);
3430 glTexCoordPointer(texCoord2PointerSize, texCoord2PointerType,
3432 process->current_state->vertexPointer +
3433 texCoord2PointerOffset);
3434 do_glClientActiveTextureARB(GL_TEXTURE0_ARB +
3435 process->current_state->
3436 activeTextureIndex);
3440 case _glVertexPointer_buffer_func:
3442 glVertexPointer(args[0], args[1], args[2], (void *) args[3]);
3446 case _glNormalPointer_buffer_func:
3448 glNormalPointer(args[0], args[1], (void *) args[2]);
3452 case _glColorPointer_buffer_func:
3454 glColorPointer(args[0], args[1], args[2], (void *) args[3]);
3458 case _glSecondaryColorPointer_buffer_func:
3460 GET_EXT_PTR(void, glSecondaryColorPointer,
3461 (int, int, int, void *));
3462 ptr_func_glSecondaryColorPointer(args[0], args[1], args[2],
3467 case _glIndexPointer_buffer_func:
3469 glIndexPointer(args[0], args[1], (void *) args[2]);
3473 case _glTexCoordPointer_buffer_func:
3475 glTexCoordPointer(args[0], args[1], args[2], (void *) args[3]);
3479 case _glEdgeFlagPointer_buffer_func:
3481 glEdgeFlagPointer(args[0], (void *) args[1]);
3485 case _glVertexAttribPointerARB_buffer_func:
3487 GET_EXT_PTR(void, glVertexAttribPointerARB,
3488 (int, int, int, int, int, void *));
3489 ptr_func_glVertexAttribPointerARB(args[0], args[1], args[2],
3495 case _glWeightPointerARB_buffer_func:
3497 GET_EXT_PTR(void, glWeightPointerARB, (int, int, int, void *));
3499 ptr_func_glWeightPointerARB(args[0], args[1], args[2],
3504 case _glMatrixIndexPointerARB_buffer_func:
3506 GET_EXT_PTR(void, glMatrixIndexPointerARB,
3507 (int, int, int, void *));
3508 ptr_func_glMatrixIndexPointerARB(args[0], args[1], args[2],
3513 case _glFogCoordPointer_buffer_func:
3515 GET_EXT_PTR(void, glFogCoordPointer, (int, int, void *));
3517 ptr_func_glFogCoordPointer(args[0], args[1], (void *) args[2]);
3521 case _glVariantPointerEXT_buffer_func:
3523 GET_EXT_PTR(void, glVariantPointerEXT, (int, int, int, void *));
3525 ptr_func_glVariantPointerEXT(args[0], args[1], args[2],
3530 case _glDrawElements_buffer_func:
3532 glDrawElements(args[0], args[1], args[2], (void *) args[3]);
3534 #ifdef __APPLE__ //only for mac
3537 glGetIntegerv(GL_FRAMEBUFFER_BINDING_EXT, &prev_fbo);
3538 if ( prev_fbo != 0 )
3546 case _glDrawRangeElements_buffer_func:
3548 glDrawRangeElements(args[0], args[1], args[2], args[3], args[4],
3553 case _glMultiDrawElements_buffer_func:
3555 GET_EXT_PTR(void, glMultiDrawElements,
3556 (int, int *, int, void **, int));
3557 ptr_func_glMultiDrawElements(args[0], (int *) args[1], args[2],
3558 (void **) args[3], args[4]);
3559 #ifdef __APPLE__ //only for mac
3562 glGetIntegerv(GL_FRAMEBUFFER_BINDING_EXT, &prev_fbo);
3563 if ( prev_fbo != 0 )
3570 #ifdef __APPLE__ // only for mac
3571 case glDrawArrays_func:
3574 glDrawArrays(ARG_TO_UNSIGNED_INT(args[0]), ARG_TO_INT(args[1]), ARG_TO_INT(args[2]));
3575 glGetIntegerv(GL_FRAMEBUFFER_BINDING_EXT, &prev_fbo);
3576 if ( prev_fbo != 0 )
3580 case glDrawElements_func:
3583 glDrawElements(ARG_TO_UNSIGNED_INT(args[0]), ARG_TO_INT(args[1]), ARG_TO_UNSIGNED_INT(args[2]), (const void*)(args[3]));
3584 glGetIntegerv(GL_FRAMEBUFFER_BINDING_EXT, &prev_fbo);
3585 if ( prev_fbo != 0 )
3591 case _glGetError_fake_func:
3596 case glGetIntegerv_func:
3598 glGetIntegerv(args[0], (int *) args[1]);
3602 case _glReadPixels_pbo_func:
3604 glReadPixels(ARG_TO_INT(args[0]), ARG_TO_INT(args[1]),
3605 ARG_TO_INT(args[2]), ARG_TO_INT(args[3]),
3606 ARG_TO_UNSIGNED_INT(args[4]),
3607 ARG_TO_UNSIGNED_INT(args[5]), (void *) (args[6]));
3611 case _glDrawPixels_pbo_func:
3613 glDrawPixels(ARG_TO_INT(args[0]), ARG_TO_INT(args[1]),
3614 ARG_TO_UNSIGNED_INT(args[2]),
3615 ARG_TO_UNSIGNED_INT(args[3]),
3616 (const void *) (args[4]));
3620 case _glMapBufferARB_fake_func:
3622 GET_EXT_PTR(GLvoid *, glMapBufferARB, (GLenum, GLenum));
3623 GET_EXT_PTR(GLboolean, glUnmapBufferARB, (GLenum));
3624 int target = args[0];
3626 void *dst_ptr = (void *) args[2];
3627 void *src_ptr = ptr_func_glMapBufferARB(target, GL_READ_ONLY);
3630 memcpy(dst_ptr, src_ptr, size);
3631 ret.i = ptr_func_glUnmapBufferARB(target);
3638 case fake_gluBuild2DMipmaps_func:
3640 GET_GLU_PTR(GLint, gluBuild2DMipmaps,
3641 (GLenum arg_0, GLint arg_1, GLsizei arg_2,
3642 GLsizei arg_3, GLenum arg_4, GLenum arg_5,
3643 const GLvoid *arg_6));
3644 if (ptr_func_gluBuild2DMipmaps == NULL)
3645 ptr_func_gluBuild2DMipmaps = mesa_gluBuild2DMipmaps;
3646 ptr_func_gluBuild2DMipmaps(ARG_TO_UNSIGNED_INT(args[0]),
3647 ARG_TO_INT(args[1]),
3648 ARG_TO_INT(args[2]),
3649 ARG_TO_INT(args[3]),
3650 ARG_TO_UNSIGNED_INT(args[4]),
3651 ARG_TO_UNSIGNED_INT(args[5]),
3652 (const void *) (args[6]));
3656 case _glSelectBuffer_fake_func:
3658 process->current_state->selectBufferSize = args[0] * 4;
3659 process->current_state->selectBufferPtr =
3660 g_realloc(process->current_state->selectBufferPtr,
3661 process->current_state->selectBufferSize);
3662 glSelectBuffer(args[0], process->current_state->selectBufferPtr);
3666 case _glGetSelectBuffer_fake_func:
3668 void *ptr = (void *) args[0];
3670 memcpy(ptr, process->current_state->selectBufferPtr,
3671 process->current_state->selectBufferSize);
3675 case _glFeedbackBuffer_fake_func:
3677 process->current_state->feedbackBufferSize = args[0] * 4;
3678 process->current_state->feedbackBufferPtr =
3679 g_realloc(process->current_state->feedbackBufferPtr,
3680 process->current_state->feedbackBufferSize);
3681 glFeedbackBuffer((GLsizei)args[0], (GLenum) args[1],
3682 process->current_state->feedbackBufferPtr);
3686 case _glGetFeedbackBuffer_fake_func:
3688 void *ptr = (void *) args[0];
3690 memcpy(ptr, process->current_state->feedbackBufferPtr,
3691 process->current_state->feedbackBufferSize);
3696 * case glEnableClientState_func: { if (display_function_call)
3697 * DEBUGF( "cap : %s\n", nameArrays[args[0] -
3698 * GL_VERTEX_ARRAY]); glEnableClientState(args[0]); break; }
3700 * case glDisableClientState_func: { if (display_function_call)
3701 * DEBUGF( "cap : %s\n", nameArrays[args[0] -
3702 * GL_VERTEX_ARRAY]); glDisableClientState(args[0]); break; }
3704 * case glClientActiveTexture_func: case
3705 * glClientActiveTextureARB_func: { if (display_function_call)
3706 * DEBUGF( "client activeTexture %d\n", args[0] -
3707 * GL_TEXTURE0_ARB); glClientActiveTextureARB(args[0]); break; }
3709 * case glActiveTextureARB_func: { if (display_function_call)
3710 * DEBUGF( "server activeTexture %d\n", args[0] -
3711 * GL_TEXTURE0_ARB); glActiveTextureARB(args[0]); break; }
3713 * case glLockArraysEXT_func: break;
3715 * case glUnlockArraysEXT_func: break;
3717 * case glArrayElement_func: { glArrayElement(args[0]); break; }
3719 * case glDrawArrays_func: { glDrawArrays(args[0],args[1],args[2]);
3722 * case glDrawElements_func: {
3723 * glDrawElements(args[0],args[1],args[2],(void*)args[3]); break; }
3725 * case glDrawRangeElements_func: {
3726 * glDrawRangeElements(args[0],args[1],args[2],args[3],args[4],(void*)args[5]);
3729 case glGetError_func:
3731 ret.i = glGetError();
3735 case glNewObjectBufferATI_func:
3737 GET_EXT_PTR(int, glNewObjectBufferATI, (int, void *, int));
3739 ret.i = ptr_func_glNewObjectBufferATI(args[0],
3740 (void *) args[1], args[2]);
3745 glClear((GLbitfield)args[0]);
3748 /* HACK workaround for an unexplainable issue */
3749 if (args[0] & GL_COLOR_BUFFER_BIT)
3750 glClear(GL_COLOR_BUFFER_BIT);
3751 if (args[0] & GL_STENCIL_BUFFER_BIT)
3752 glClear(GL_STENCIL_BUFFER_BIT);
3753 if (args[0] & GL_DEPTH_BUFFER_BIT)
3754 glClear(GL_DEPTH_BUFFER_BIT);
3755 if (args[0] & GL_ACCUM_BUFFER_BIT)
3756 glClear(GL_ACCUM_BUFFER_BIT);
3761 /* workaround for bug T_SDK-128. If GL_UNPACK_ROW_LENGTH==0, GL driver
3762 * should calculate it for glTexSubImage2D according to width parameter and
3763 * GL_UNPACK_ALIGNMENT. But on windows, some vender's driver like nvidia,
3764 * don't follow it. So we need do it for the driver, and probably remove
3765 * this hack in future if driver get fixed.
3767 case glTexSubImage2D_func:
3769 int origin_row_length, alignment, width;
3771 if (args[6] == GL_ALPHA) {
3773 glGetIntegerv(GL_UNPACK_ALIGNMENT, &alignment);
3774 glGetIntegerv(GL_UNPACK_ROW_LENGTH, &origin_row_length);
3776 if (width%alignment != 0) {
3777 width = (width/alignment + 1) * alignment;
3780 glPixelStorei(GL_UNPACK_ROW_LENGTH, width);
3783 glTexSubImage2D(ARG_TO_UNSIGNED_INT(args[0]), ARG_TO_INT(args[1]),
3784 ARG_TO_INT(args[2]), ARG_TO_INT(args[3]),
3785 ARG_TO_INT(args[4]), ARG_TO_INT(args[5]),
3786 ARG_TO_UNSIGNED_INT(args[6]),
3787 ARG_TO_UNSIGNED_INT(args[7]), (const void*)(args[8]));
3789 if (args[6] == GL_ALPHA)
3790 glPixelStorei(GL_UNPACK_ROW_LENGTH, origin_row_length);
3797 case glTexSubImage2D_func:
3800 glTexSubImage2D(ARG_TO_UNSIGNED_INT(args[0]), ARG_TO_INT(args[1]),
3801 ARG_TO_INT(args[2]), ARG_TO_INT(args[3]),
3802 ARG_TO_INT(args[4]), ARG_TO_INT(args[5]),
3803 ARG_TO_UNSIGNED_INT(args[6]), ARG_TO_UNSIGNED_INT(args[7]),
3804 (const void*)(args[8]));
3806 if ( ARG_TO_UNSIGNED_INT(args[0]) == GL_TEXTURE_2D &&
3807 ARG_TO_INT(args[1]) == 0 &&
3808 ARG_TO_UNSIGNED_INT(args[6]) == GL_RGBA &&
3809 ARG_TO_UNSIGNED_INT(args[7]) == GL_UNSIGNED_BYTE )
3812 fprintf(stderr, "!!! Probable screen crash, no work around as glTexSubImage2d parameters do not match!\n");
3819 execute_func(func_number, (void**)args, &ret);
3826 case TYPE_UNSIGNED_CHAR:
3828 case TYPE_UNSIGNED_INT:
3831 case TYPE_CONST_CHAR:
3833 strncpy(ret_string, (ret.s) ? ret.s : "", 32768);
3838 DEBUGF( "unexpected ret type : %d\n", ret_type);
3843 if (display_function_call)
3844 DEBUGF( "[%d]< %s\n", process->p.process_id,
3845 tab_opengl_calls_name[func_number]);