263 lines
8.3 KiB
C
263 lines
8.3 KiB
C
|
/******************************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 <gldrv.h> // 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__ */
|