2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS kernel
4 * FILE: lib/opengl32/gl.c
5 * PURPOSE: OpenGL32 lib, glXXX functions
6 * PROGRAMMER: Anich Gregor (blight)
11 /* On a x86 we call the ICD functions in a special-way:
13 * For every glXXX function we export a glXXX entry-point which loads the
14 * matching "real" function pointer from the NtCurrentTeb()->glDispatchTable
15 * for gl functions in teblist.h and for others it gets the pointer from
16 * NtCurrentTeb()->glTable and jmps to the address, leaving the stack alone and
17 * letting the "real" function return for us.
18 * Royce has implemented this in NASM =D
20 * On other machines we use C to forward the calls (slow...)
26 C_ASSERT(FIELD_OFFSET(TEB
, glTable
) == 0xbe8);
29 int STDCALL
glEmptyFunc0() { return 0; }
30 int STDCALL
glEmptyFunc4( long l1
) { return 0; }
31 int STDCALL
glEmptyFunc8( long l1
, long l2
) { return 0; }
32 int STDCALL
glEmptyFunc12( long l1
, long l2
, long l3
) { return 0; }
33 int STDCALL
glEmptyFunc16( long l1
, long l2
, long l3
, long l4
) { return 0; }
34 int STDCALL
glEmptyFunc20( long l1
, long l2
, long l3
, long l4
, long l5
)
36 int STDCALL
glEmptyFunc24( long l1
, long l2
, long l3
, long l4
, long l5
,
37 long l6
) { return 0; }
38 int STDCALL
glEmptyFunc28( long l1
, long l2
, long l3
, long l4
, long l5
,
39 long l6
, long l7
) { return 0; }
40 int STDCALL
glEmptyFunc32( long l1
, long l2
, long l3
, long l4
, long l5
,
41 long l6
, long l7
, long l8
) { return 0; }
42 int STDCALL
glEmptyFunc36( long l1
, long l2
, long l3
, long l4
, long l5
,
43 long l6
, long l7
, long l8
, long l9
) { return 0; }
44 int STDCALL
glEmptyFunc40( long l1
, long l2
, long l3
, long l4
, long l5
,
45 long l6
, long l7
, long l8
, long l9
, long l10
)
47 int STDCALL
glEmptyFunc44( long l1
, long l2
, long l3
, long l4
, long l5
,
48 long l6
, long l7
, long l8
, long l9
, long l10
,
49 long l11
) { return 0; }
50 int STDCALL
glEmptyFunc48( long l1
, long l2
, long l3
, long l4
, long l5
,
51 long l6
, long l7
, long l8
, long l9
, long l10
,
52 long l11
, long l12
) { return 0; }
53 int STDCALL
glEmptyFunc52( long l1
, long l2
, long l3
, long l4
, long l5
,
54 long l6
, long l7
, long l8
, long l9
, long l10
,
55 long l11
, long l12
, long l13
) { return 0; }
56 int STDCALL
glEmptyFunc56( long l1
, long l2
, long l3
, long l4
, long l5
,
57 long l6
, long l7
, long l8
, long l9
, long l10
,
58 long l11
, long l12
, long l13
, long l14
)
65 # define X(func, ret, typeargs, args, icdidx, tebidx, stack) \
66 __asm__(".align 4" "\n\t" \
67 ".globl _"#func"@"#stack "\n\t" \
68 "_"#func"@"#stack":" "\n\t" \
69 " movl %fs:0x18, %eax" "\n\t" \
70 " movl 0xbe8(%eax), %eax" "\n\t" \
71 " jmp *"FOO((icdidx*4))"(%eax)" "\n\t");
73 # define X(func, ret, typeargs, args, icdidx, tebidx, stack) \
74 ret STDCALL func typeargs \
78 if (tebidx >= 0 && 0) \
80 table = (PROC *)NtCurrentTeb()->glDispatchTable; \
85 table = (PROC *)NtCurrentTeb()->glTable; \
88 return (ret)((ret(*)typeargs)fn)args; \
95 #else /* defined(_M_IX86) */
96 # define X(func, ret, typeargs, args, icdidx, tebidx, stack) \
97 ret STDCALL func typeargs \
101 if (tebidx >= 0 && 0) \
103 table = (PROC *)NtCurrentTeb()->glDispatchTable; \
104 fn = table[tebidx]; \
108 table = (PROC *)NtCurrentTeb()->glTable; \
109 fn = table[icdidx]; \
111 return (ret)((ret(*)typeargs)fn)args; \
117 #endif /* !defined(_M_IX86) */