/******************************Module*Header*******************************\ * Module Name: glteb.h * * TEB related structures. * * Created: 12/27/1993 * Author: Hock San Lee [hockl] * * Copyright (c) 1993-96 Microsoft Corporation \**************************************************************************/ #ifndef __GLTEB_H__ #define __GLTEB_H__ #include // Dispatch table sizes #include "oleauto.h" #include "exttable.h" // OpenGL reserves a few entries in the NT TEB and allocates TLS storage to // keep thread local states. // // In Win95, the NT TEB storage is not available in the TEB and is made // part of its TLS storage. // // For code simplicity, a special NT_CURRENT_TEB macro is used to access // fields that are defined in NT TEB. Another macro CURRENT_GLTEBINFO is // used to access the other fields. This convention should be followed. // Shared section size #define SHARED_SECTION_SIZE 8192 // Number of entries in the extended dispatch table #define GL_EXT_PROC_TABLE_SIZE (sizeof(GLEXTDISPATCHTABLE)/sizeof(PROC)) // Offset of entries for extension functions. This offset must // be greater than all possible non-extension entries #define GL_EXT_PROC_TABLE_OFFSET OPENGL_VERSION_110_ENTRIES typedef struct _GLTEBINFO { // glCltDispatchTable must be the first field for the assembly code to work. // We pad the table with an extra entry if necessary to make glMsgBatchInfo // start at a qword boundary. PVOID glCltDispatchTable[(OPENGL_VERSION_110_ENTRIES+GL_EXT_PROC_TABLE_SIZE+1)/2*2]; // This field must be qword aligned! BYTE glMsgBatchInfo[SHARED_SECTION_SIZE]; #ifdef _WIN95_ // These fields must match the NT TEB definitions! PVOID glDispatchTable[233]; // fast dispatch table ULONG glReserved1[29]; // POLYARRAY structure PVOID glReserved2; // pointer to POLYMATERIAL structure PVOID glSectionInfo; // generic server GC PVOID glSection; // Not used PVOID glTable; // Used only for NT x86 PVOID glCurrentRC; // generic client RC PVOID glContext; // reserved by OpenGL ICD drivers #endif // _WIN95_ } GLTEBINFO, *PGLTEBINFO; extern DWORD dwTlsOffset; #if !defined(_WIN95_) #if defined(_WIN64) #define TeglDispatchTable 0x9f0 #define TeglReserved1 0x1138 #define TeglReserved2 0x1220 #define TeglSectionInfo 0x1228 #define TeglSection 0x1230 #define TeglTable 0x1238 #define TeglCurrentRC 0x1240 #define TeglContext 0x1248 #else #define TeglDispatchTable 0x7c4 #define TeglReserved1 0xb68 #define TeglPaTeb 0xbb0 #define TeglReserved2 0xbdc #define TeglSectionInfo 0xbe0 #define TeglSection 0xbe4 #define TeglTable 0xbe8 #define TeglCurrentRC 0xbec #define TeglContext 0xbf0 #endif #endif #if defined(_WIN95_) || !defined(_X86_) // Use NT_CURRENT_TEB to access the fields defined in NT TEB only! // Do not use it to access other fields such as glCltDispatchTable and // glMsgBatchInfo. // Use CURRENT_GLTEBINFO to access the fields *not* defined in NT TEB only! // E.g. glCltDispatchTable and glMsgBatchInfo. #ifdef _WIN95_ #define NT_CURRENT_TEB() \ (*(PGLTEBINFO *)((PBYTE)NtCurrentTeb()+dwTlsOffset)) #else #define NT_CURRENT_TEB() \ (NtCurrentTeb()) #endif #define CURRENT_GLTEBINFO() \ (*(PGLTEBINFO *)((PBYTE)NtCurrentTeb()+dwTlsOffset)) #define SET_CURRENT_GLTEBINFO(pglti) \ (*(PGLTEBINFO *)((PBYTE)NtCurrentTeb()+dwTlsOffset) = (pglti)) // Cached POLYARRAY structure. #define GLTEB_CLTPOLYARRAY() \ ((struct _POLYARRAY *)(NT_CURRENT_TEB()->glReserved1)) // Pointer to POLYMATERIAL structure. #define GLTEB_CLTPOLYMATERIAL() \ ((POLYMATERIAL *)(NT_CURRENT_TEB()->glReserved2)) #define GLTEB_SET_CLTPOLYMATERIAL(pm) \ (NT_CURRENT_TEB()->glReserved2 = (PVOID)(pm)) // Table containing OpenGL function pointers for faster dispatch. Use this // table where possible. #define GLTEB_CLTDISPATCHTABLE_FAST() \ ((PGLDISPATCHTABLE_FAST)(NT_CURRENT_TEB()->glDispatchTable)) // Client side RC structure. #ifdef _WIN95_ #define GLTEB_CLTCURRENTRC() \ (NT_CURRENT_TEB() ? (PLRC)NT_CURRENT_TEB()->glCurrentRC : (PLRC)0) #else #define GLTEB_CLTCURRENTRC() \ ((PLRC)NT_CURRENT_TEB()->glCurrentRC) #endif #define GLTEB_SET_CLTCURRENTRC(RC) \ (NT_CURRENT_TEB()->glCurrentRC = (PVOID)(RC)) // Client driver private data. #define GLTEB_CLTDRIVERSLOT() \ (NT_CURRENT_TEB()->glContext) #define GLTEB_SET_CLTDRIVERSLOT(pv) \ (NT_CURRENT_TEB()->glContext = (pv)) #define GLTEB_SRVCONTEXT() \ ((struct __GLcontextRec *)(NT_CURRENT_TEB()->glSectionInfo)) #define GLTEB_SET_SRVCONTEXT(Context) \ (NT_CURRENT_TEB()->glSectionInfo = (PVOID)(Context)) #else // _WIN95_ || !_X86_ #pragma warning(disable:4035) // Function doesn't return a value #define NT_CURRENT_TEB() \ (NtCurrentTeb()) __inline PGLTEBINFO CURRENT_GLTEBINFO(void) { __asm mov eax, [dwTlsOffset] __asm mov eax, fs:[eax] } __inline void SET_CURRENT_GLTEBINFO(PGLTEBINFO pglti) { __asm mov eax, pglti __asm mov edx, [dwTlsOffset] __asm mov fs:[edx], eax } // Cached POLYARRAY structure. // Returns cached linear pointer into TEB __inline struct _POLYARRAY *GLTEB_CLTPOLYARRAY(void) { __asm mov eax, fs:[TeglPaTeb] } // Pointer to POLYMATERIAL structure. __inline struct _POLYMATERIAL *GLTEB_CLTPOLYMATERIAL(void) { __asm mov eax, fs:[TeglReserved2] } __inline void GLTEB_SET_CLTPOLYMATERIAL(struct _POLYMATERIAL *pm) { __asm mov eax, pm __asm mov fs:[TeglReserved2], eax } // Table containing OpenGL function pointers for faster dispatch. Use this // table where possible. // Returns cached linear pointer into TEB __inline struct _GLDISPATCHTABLE_FAST *GLTEB_CLTDISPATCHTABLE_FAST(void) { __asm mov eax, fs:[TeglTable] } // Client side RC structure. __inline struct _LRC *GLTEB_CLTCURRENTRC(void) { __asm mov eax, fs:[TeglCurrentRC] } __inline void GLTEB_SET_CLTCURRENTRC(struct _LRC *RC) { __asm mov eax, RC __asm mov fs:[TeglCurrentRC], eax } // Client driver private data. __inline PVOID GLTEB_CLTDRIVERSLOT(void) { __asm mov eax, fs:[TeglContext] } __inline void GLTEB_SET_CLTDRIVERSLOT(PVOID pv) { __asm mov eax, pv __asm mov fs:[TeglContext], eax } __inline struct __GLcontextRec *GLTEB_SRVCONTEXT(void) { __asm mov eax, fs:[TeglSectionInfo] } __inline void GLTEB_SET_SRVCONTEXT(struct __GLcontextRec *Context) { __asm mov eax, Context __asm mov fs:[TeglSectionInfo], eax } #pragma warning(default:4035) // Reset to default #endif // _WIN95_ || !_X86_ // Table containing all OpenGL API function pointers. #define GLTEB_CLTDISPATCHTABLE() \ ((PGLDISPATCHTABLE)(CURRENT_GLTEBINFO()->glCltDispatchTable)) // Table containing all generic implementation's extension function pointers. #define GLTEB_EXTDISPATCHTABLE() \ ((PGLEXTDISPATCHTABLE)(CURRENT_GLTEBINFO()->glCltDispatchTable+GL_EXT_PROC_TABLE_OFFSET)) // Command buffer for batching. #define GLTEB_SHAREDMEMORYSECTION() \ ((GLMSGBATCHINFO *) (CURRENT_GLTEBINFO()->glMsgBatchInfo)) // OpenGL function return value subbatch storage #define GLTEB_RETURNVALUE() \ GLTEB_SHAREDMEMORYSECTION()->ReturnValue // Initialize both glCltDispatchTable and glDispatchTable with the new // function pointers. // glCltDispatchTable contains all OpenGL API function pointers followed // by the generic implementation's extension function pointers. // glDispatchTable contains a subset of OpenGL function pointers for "fast" // dispatch. extern void vInitTebCache(PVOID); extern void SetCltProcTable(struct _GLCLTPROCTABLE *pgcpt, struct _GLEXTPROCTABLE *pgept, BOOL fForce); extern void GetCltProcTable(struct _GLCLTPROCTABLE *pgcpt, struct _GLEXTPROCTABLE *pgept, BOOL fForce); #endif /* __GLTEB_H__ */