329 lines
13 KiB
C
329 lines
13 KiB
C
|
/******************************Module*Header*******************************\
|
||
|
* Module Name: local.h *
|
||
|
* *
|
||
|
* Definitions needed for client side objects and attribute caching. *
|
||
|
* *
|
||
|
* Modified: 3-Aug-1992 22:35:30 by Gerrit van Wingerden [gerritv] *
|
||
|
* Added client side transform support. *
|
||
|
* *
|
||
|
* Created: 30-May-1991 21:55:01 *
|
||
|
* Author: Charles Whitmer [chuckwh] *
|
||
|
* *
|
||
|
* Copyright (c) 1993 Microsoft Corporation *
|
||
|
\**************************************************************************/
|
||
|
|
||
|
/**************************************************************************\
|
||
|
*
|
||
|
* Local handle macros
|
||
|
*
|
||
|
\**************************************************************************/
|
||
|
|
||
|
// Handle uniqueness is nice to check but an unnecesary performance cost in
|
||
|
// a free build.
|
||
|
|
||
|
// To match the uniqness field: If the handle uniqness == 0, let it through
|
||
|
// anyway. This is a method for WOW to only keep track of the low 16 bits but
|
||
|
// still get reasonable performance. Even if a 32 bit app does this, all it
|
||
|
// can do is hose it self, not the system or another app.
|
||
|
|
||
|
#define INDEX_MASK 0xFFFF
|
||
|
#define UNIQ_SHIFT 16
|
||
|
#define UNIQ_MASK 0xFFFF
|
||
|
#define HIPART(x) *(((USHORT *) &(x))+1)
|
||
|
#define MATCHUNIQ(plhe,h) ((USHORT) plhe->iUniq == HIPART(h))
|
||
|
#define MASKINDEX(h) ((UINT)((UINT_PTR)h & INDEX_MASK))
|
||
|
#define LHANDLE(i) (i+((ULONG)pLocalTable[i].iUniq<<UNIQ_SHIFT))
|
||
|
|
||
|
//!!!XXX -- Do we really need typing? Not really, but we may add more
|
||
|
//!!!XXX later. So eventually we might take it out, but its nice for now.
|
||
|
|
||
|
// Define the types of local objects.
|
||
|
|
||
|
enum LO_TYPE
|
||
|
{
|
||
|
LO_NULL,
|
||
|
LO_RC,
|
||
|
LO_LAST
|
||
|
};
|
||
|
|
||
|
#define INVALID_INDEX 0xFFFFFFFFL
|
||
|
#define COMMIT_COUNT (4096/sizeof(LHE))
|
||
|
#define MAX_HANDLES (16384/COMMIT_COUNT)*COMMIT_COUNT
|
||
|
|
||
|
// Define a Local Handle Entry. Our Local Handle Table, pLocalTable, is an
|
||
|
// array of these.
|
||
|
|
||
|
typedef struct _LHE
|
||
|
{
|
||
|
ULONG_PTR hgre; // GRE Handle.
|
||
|
USHORT cRef; // Reference count of the object.
|
||
|
BYTE iType; // Object type.
|
||
|
BYTE iUniq; // Handle uniqueness field. Always non-zero.
|
||
|
PVOID pv; // Pointer to local object.
|
||
|
ULONG metalink; // Non-zero if object is a "metafile friend".
|
||
|
// Points to a metafile DC object if it's a metafile.
|
||
|
// Also links the free list.
|
||
|
DWORD tidOwner; // Per-thread lock owner.
|
||
|
LONG cLock; // Lock count.
|
||
|
} LHE,*PLHE;
|
||
|
|
||
|
extern LHE *pLocalTable; // Points to handle table.
|
||
|
extern ULONG iFreeLhe; // Identifies a free handle index.
|
||
|
extern ULONG cLheCommitted; // Count of LHEs with committed RAM.
|
||
|
extern CRITICAL_SECTION semLocal; // Semaphore for handle allocation.
|
||
|
extern CRITICAL_SECTION wfo_cs; // Semaphore for wglUseFontOutlines
|
||
|
|
||
|
|
||
|
// Semaphore utilities
|
||
|
|
||
|
#define INITIALIZECRITICALSECTION(psem) InitializeCriticalSection((psem))
|
||
|
#define ENTERCRITICALSECTION(hsem) EnterCriticalSection((hsem))
|
||
|
#define LEAVECRITICALSECTION(hsem) LeaveCriticalSection((hsem))
|
||
|
#define DELETECRITICALSECTION(psem) DeleteCriticalSection((psem))
|
||
|
|
||
|
// Local data structures
|
||
|
|
||
|
// Maximum OpenGL driver name
|
||
|
|
||
|
#define MAX_GLDRIVER_NAME MAX_PATH
|
||
|
|
||
|
// GetCurrentThreadID will never return this value
|
||
|
|
||
|
#define INVALID_THREAD_ID 0
|
||
|
|
||
|
// Driver context function prototypes
|
||
|
|
||
|
typedef BOOL (APIENTRY *PFN_DRVVALIDATEVERSION) (ULONG);
|
||
|
typedef VOID (APIENTRY *PFN_DRVSETCALLBACKPROCS)(INT, PROC *);
|
||
|
|
||
|
// Driver flags.
|
||
|
|
||
|
// Driver wants buffer calls sent to ICD DLL rather than the display
|
||
|
// driver. This is required on Win95.
|
||
|
#define GLDRIVER_CLIENT_BUFFER_CALLS 0x00000001
|
||
|
|
||
|
// Driver does not want glFinish called during swap. Only
|
||
|
// applies to client swap calls.
|
||
|
#define GLDRIVER_NO_FINISH_ON_SWAP 0x00000002
|
||
|
|
||
|
// Driver had registry key rather than just registry value.
|
||
|
// This provides a way to check for new-style registry information.
|
||
|
#define GLDRIVER_FULL_REGISTRY 0x80000000
|
||
|
|
||
|
// Driver data
|
||
|
|
||
|
typedef struct _GLDRIVER {
|
||
|
HINSTANCE hModule; // Module handle
|
||
|
DWORD dwFlags;
|
||
|
|
||
|
// Driver function pointers
|
||
|
|
||
|
// Required
|
||
|
DHGLRC (APIENTRY *pfnDrvCreateContext)(HDC);
|
||
|
BOOL (APIENTRY *pfnDrvDeleteContext)(DHGLRC);
|
||
|
PGLCLTPROCTABLE (APIENTRY *pfnDrvSetContext)(HDC, DHGLRC,
|
||
|
PFN_SETPROCTABLE);
|
||
|
BOOL (APIENTRY *pfnDrvReleaseContext)(DHGLRC);
|
||
|
|
||
|
// Optional
|
||
|
BOOL (APIENTRY *pfnDrvCopyContext)(DHGLRC, DHGLRC, UINT);
|
||
|
DHGLRC (APIENTRY *pfnDrvCreateLayerContext)(HDC, int);
|
||
|
BOOL (APIENTRY *pfnDrvShareLists)(DHGLRC, DHGLRC);
|
||
|
PROC (APIENTRY *pfnDrvGetProcAddress)(LPCSTR);
|
||
|
BOOL (APIENTRY *pfnDrvDescribeLayerPlane)(HDC, INT, INT, UINT,
|
||
|
LPLAYERPLANEDESCRIPTOR);
|
||
|
INT (APIENTRY *pfnDrvSetLayerPaletteEntries)(HDC, INT, INT,
|
||
|
INT,
|
||
|
CONST COLORREF *);
|
||
|
INT (APIENTRY *pfnDrvGetLayerPaletteEntries)(HDC, INT, INT,
|
||
|
INT, COLORREF *);
|
||
|
BOOL (APIENTRY *pfnDrvRealizeLayerPalette)(HDC, INT, BOOL);
|
||
|
BOOL (APIENTRY *pfnDrvSwapLayerBuffers)(HDC, UINT);
|
||
|
DHGLRC (APIENTRY *pfnDrvCreateDirectDrawContext)
|
||
|
(HDC, LPDIRECTDRAWSURFACE, int);
|
||
|
int (APIENTRY *pfnDrvEnumTextureFormats)(int, DDSURFACEDESC *);
|
||
|
BOOL (APIENTRY *pfnDrvBindDirectDrawTexture)
|
||
|
(LPDIRECTDRAWSURFACE);
|
||
|
DWORD (APIENTRY *pfnDrvSwapMultipleBuffers)(UINT,
|
||
|
CONST WGLSWAP *);
|
||
|
|
||
|
// The following functions are only called if driver asks for them.
|
||
|
// This is required on Win95.
|
||
|
LONG (APIENTRY *pfnDrvDescribePixelFormat)(HDC, LONG, ULONG,
|
||
|
PIXELFORMATDESCRIPTOR *);
|
||
|
BOOL (APIENTRY *pfnDrvSetPixelFormat)(HDC, LONG);
|
||
|
BOOL (APIENTRY *pfnDrvSwapBuffers)(HDC);
|
||
|
|
||
|
struct _GLDRIVER *pGLDriver; // Next loaded GL driver
|
||
|
TCHAR tszDllName[MAX_GLDRIVER_NAME+1]; // Null terminated DLL name
|
||
|
} GLDRIVER, *PGLDRIVER;
|
||
|
|
||
|
extern PGLDRIVER APIENTRY pgldrvLoadInstalledDriver(HDC hdc);
|
||
|
|
||
|
|
||
|
/****************************************************************************/
|
||
|
|
||
|
void APIENTRY glDrawRangeElementsWIN( GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices);
|
||
|
|
||
|
void APIENTRY glAddSwapHintRectWIN(IN GLint, IN GLint, IN GLint, IN GLint);
|
||
|
|
||
|
void glColorTableEXT( GLenum target, GLenum internalFormat, GLsizei width, GLenum format, GLenum type, const GLvoid *data);
|
||
|
void glColorSubTableEXT( GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *data);
|
||
|
void glGetColorTableEXT( GLenum target, GLenum format, GLenum type, GLvoid *data);
|
||
|
void glGetColorTableParameterivEXT( GLenum target, GLenum pname, GLint *params);
|
||
|
void glGetColorTableParameterfvEXT( GLenum target, GLenum pname, GLfloat *params);
|
||
|
void APIENTRY glColorTableParameterivEXT(GLenum target,
|
||
|
GLenum pname,
|
||
|
const GLint *params);
|
||
|
void APIENTRY glColorTableParameterfvEXT(GLenum target,
|
||
|
GLenum pname,
|
||
|
const GLfloat *params);
|
||
|
|
||
|
#ifdef GL_WIN_multiple_textures
|
||
|
void APIENTRY glCurrentTextureIndexWIN
|
||
|
(GLuint index);
|
||
|
void APIENTRY glMultiTexCoord1dWIN
|
||
|
(GLbitfield mask, GLdouble s);
|
||
|
void APIENTRY glMultiTexCoord1dvWIN
|
||
|
(GLbitfield mask, const GLdouble *v);
|
||
|
void APIENTRY glMultiTexCoord1fWIN
|
||
|
(GLbitfield mask, GLfloat s);
|
||
|
void APIENTRY glMultiTexCoord1fvWIN
|
||
|
(GLbitfield mask, const GLfloat *v);
|
||
|
void APIENTRY glMultiTexCoord1iWIN
|
||
|
(GLbitfield mask, GLint s);
|
||
|
void APIENTRY glMultiTexCoord1ivWIN
|
||
|
(GLbitfield mask, const GLint *v);
|
||
|
void APIENTRY glMultiTexCoord1sWIN
|
||
|
(GLbitfield mask, GLshort s);
|
||
|
void APIENTRY glMultiTexCoord1svWIN
|
||
|
(GLbitfield mask, const GLshort *v);
|
||
|
void APIENTRY glMultiTexCoord2dWIN
|
||
|
(GLbitfield mask, GLdouble s, GLdouble t);
|
||
|
void APIENTRY glMultiTexCoord2dvWIN
|
||
|
(GLbitfield mask, const GLdouble *v);
|
||
|
void APIENTRY glMultiTexCoord2fWIN
|
||
|
(GLbitfield mask, GLfloat s, GLfloat t);
|
||
|
void APIENTRY glMultiTexCoord2fvWIN
|
||
|
(GLbitfield mask, const GLfloat *v);
|
||
|
void APIENTRY glMultiTexCoord2iWIN
|
||
|
(GLbitfield mask, GLint s, GLint t);
|
||
|
void APIENTRY glMultiTexCoord2ivWIN
|
||
|
(GLbitfield mask, const GLint *v);
|
||
|
void APIENTRY glMultiTexCoord2sWIN
|
||
|
(GLbitfield mask, GLshort s, GLshort t);
|
||
|
void APIENTRY glMultiTexCoord2svWIN
|
||
|
(GLbitfield mask, const GLshort *v);
|
||
|
void APIENTRY glMultiTexCoord3dWIN
|
||
|
(GLbitfield mask, GLdouble s, GLdouble t, GLdouble r);
|
||
|
void APIENTRY glMultiTexCoord3dvWIN
|
||
|
(GLbitfield mask, const GLdouble *v);
|
||
|
void APIENTRY glMultiTexCoord3fWIN
|
||
|
(GLbitfield mask, GLfloat s, GLfloat t, GLfloat r);
|
||
|
void APIENTRY glMultiTexCoord3fvWIN
|
||
|
(GLbitfield mask, const GLfloat *v);
|
||
|
void APIENTRY glMultiTexCoord3iWIN
|
||
|
(GLbitfield mask, GLint s, GLint t, GLint r);
|
||
|
void APIENTRY glMultiTexCoord3ivWIN
|
||
|
(GLbitfield mask, const GLint *v);
|
||
|
void APIENTRY glMultiTexCoord3sWIN
|
||
|
(GLbitfield mask, GLshort s, GLshort t, GLshort r);
|
||
|
void APIENTRY glMultiTexCoord3svWIN
|
||
|
(GLbitfield mask, const GLshort *v);
|
||
|
void APIENTRY glMultiTexCoord4dWIN
|
||
|
(GLbitfield mask, GLdouble s, GLdouble t, GLdouble r, GLdouble q);
|
||
|
void APIENTRY glMultiTexCoord4dvWIN
|
||
|
(GLbitfield mask, const GLdouble *v);
|
||
|
void APIENTRY glMultiTexCoord4fWIN
|
||
|
(GLbitfield mask, GLfloat s, GLfloat t, GLfloat r, GLfloat q);
|
||
|
void APIENTRY glMultiTexCoord4fvWIN
|
||
|
(GLbitfield mask, const GLfloat *v);
|
||
|
void APIENTRY glMultiTexCoord4iWIN
|
||
|
(GLbitfield mask, GLint s, GLint t, GLint r, GLint q);
|
||
|
void APIENTRY glMultiTexCoord4ivWIN
|
||
|
(GLbitfield mask, const GLint *v);
|
||
|
void APIENTRY glMultiTexCoord4sWIN
|
||
|
(GLbitfield mask, GLshort s, GLshort t, GLshort r, GLshort q);
|
||
|
void APIENTRY glMultiTexCoord4svWIN
|
||
|
(GLbitfield mask, const GLshort *v);
|
||
|
void APIENTRY glBindNthTextureWIN
|
||
|
(GLuint index, GLenum target, GLuint texture);
|
||
|
void APIENTRY glNthTexCombineFuncWIN
|
||
|
(GLuint index,
|
||
|
GLenum leftColorFactor, GLenum colorOp, GLenum rightColorFactor,
|
||
|
GLenum leftAlphaFactor, GLenum alphaOp, GLenum rightAlphaFactor);
|
||
|
#endif // GL_WIN_multiple_textures
|
||
|
|
||
|
/****************************************************************************/
|
||
|
|
||
|
// Local RC object
|
||
|
|
||
|
#define LRC_IDENTIFIER 0x2043524C /* 'LRC ' */
|
||
|
|
||
|
typedef struct _LRC {
|
||
|
DHGLRC dhrc; // Driver handle
|
||
|
HGLRC hrc; // Client handle
|
||
|
int iPixelFormat; // Pixel format index
|
||
|
DWORD ident; // LRC_IDENTIFIER
|
||
|
DWORD tidCurrent; // Thread id if the DC is current,
|
||
|
// INVALID_THREAD_ID otherwise
|
||
|
PGLDRIVER pGLDriver; // Driver data
|
||
|
GLWINDOWID gwidCurrent; // Current surface ID
|
||
|
GLWINDOWID gwidCreate; // Creation surface ID
|
||
|
|
||
|
#ifdef GL_METAFILE
|
||
|
GLuint uiGlsCaptureContext; // GLS capturing context for metafile RC's
|
||
|
GLuint uiGlsPlaybackContext; // GLS context for playback
|
||
|
BOOL fCapturing; // GLS is in BeginCapture
|
||
|
|
||
|
// GLS playback scaling factors
|
||
|
int iGlsSubtractX;
|
||
|
int iGlsSubtractY;
|
||
|
int iGlsNumeratorX;
|
||
|
int iGlsNumeratorY;
|
||
|
int iGlsDenominatorX;
|
||
|
int iGlsDenominatorY;
|
||
|
int iGlsAddX;
|
||
|
int iGlsAddY;
|
||
|
GLfloat fGlsScaleX;
|
||
|
GLfloat fGlsScaleY;
|
||
|
#endif
|
||
|
|
||
|
GLubyte *pszExtensions;
|
||
|
|
||
|
#ifdef GL_METAFILE
|
||
|
XFORM xformMeta; // World transform storage during GLS blocks
|
||
|
LPRECTL prclGlsBounds; // Bounds during GLS recording
|
||
|
#endif
|
||
|
|
||
|
struct _DDSURFACEDESC *pddsdTexFormats;
|
||
|
int nDdTexFormats;
|
||
|
} LRC, *PLRC;
|
||
|
|
||
|
// Various dispatch tables available
|
||
|
extern GLCLTPROCTABLE glNullCltProcTable;
|
||
|
extern GLCLTPROCTABLE glCltRGBAProcTable;
|
||
|
extern GLCLTPROCTABLE glCltCIProcTable;
|
||
|
extern GLEXTPROCTABLE glNullExtProcTable;
|
||
|
extern GLEXTPROCTABLE glExtProcTable;
|
||
|
#ifdef GL_METAFILE
|
||
|
extern GLCLTPROCTABLE gcptGlsProcTable;
|
||
|
extern GLEXTPROCTABLE geptGlsExtProcTable;
|
||
|
#endif
|
||
|
|
||
|
// Declare support functions.
|
||
|
|
||
|
ULONG iAllocHandle(ULONG iType,ULONG hgre,PVOID pv);
|
||
|
VOID vFreeHandle(ULONG_PTR h);
|
||
|
LONG cLockHandle(ULONG_PTR h);
|
||
|
VOID vUnlockHandle(ULONG_PTR h);
|
||
|
VOID vCleanupAllLRC(VOID);
|
||
|
VOID vFreeLRC(PLRC plrc);
|
||
|
|
||
|
BOOL bMakeNoCurrent(void);
|
||
|
|
||
|
VOID GLInitializeThread(ULONG ulReason);
|
||
|
|
||
|
// Macro to call glFlush only if a RC is current.
|
||
|
#define GLFLUSH() if (GLTEB_CLTCURRENTRC()) glFlush()
|