188 lines
6.1 KiB
C
188 lines
6.1 KiB
C
|
/******************************Module*Header*******************************\
|
||
|
* Module Name: glp.h
|
||
|
*
|
||
|
* GL system routines shared between the front and back end
|
||
|
*
|
||
|
* Created: 12-Nov-1993 17:36:00
|
||
|
* Author: Gilman Wong [gilmanw]
|
||
|
*
|
||
|
* Copyright (c) 1992-1995 Microsoft Corporation
|
||
|
*
|
||
|
\**************************************************************************/
|
||
|
|
||
|
#ifndef _glp_
|
||
|
#define _glp_
|
||
|
|
||
|
// Calls into the back end
|
||
|
typedef struct GLGENwindowRec GLGENwindow;
|
||
|
|
||
|
// Fake object type for DirectDraw. BITMAP is used because it
|
||
|
// shouldn't come up in the places we use GetObjectType.
|
||
|
#define OBJ_DDRAW OBJ_BITMAP
|
||
|
|
||
|
// Surface flags
|
||
|
|
||
|
// HDC available
|
||
|
#define GLSURF_HDC 0x00000001
|
||
|
// DirectDraw surfaces available
|
||
|
#define GLSURF_DIRECTDRAW 0x00000002
|
||
|
// Metafile-based
|
||
|
#define GLSURF_METAFILE 0x00000004
|
||
|
// Direct memory access possible
|
||
|
#define GLSURF_DIRECT_ACCESS 0x00000008
|
||
|
// Screen surface, only set for HDC surfaces
|
||
|
#define GLSURF_SCREEN 0x00000010
|
||
|
// Direct DC surface
|
||
|
#define GLSURF_DIRECTDC 0x00000020
|
||
|
// Surface is in video memory
|
||
|
#define GLSURF_VIDEO_MEMORY 0x00000040
|
||
|
|
||
|
// Special surface types
|
||
|
|
||
|
// Memory DC
|
||
|
#define GLSURF_IS_MEMDC(dwFlags) \
|
||
|
(((dwFlags) & (GLSURF_HDC | GLSURF_DIRECTDC | GLSURF_METAFILE)) == \
|
||
|
GLSURF_HDC)
|
||
|
// Non-memory, non-info DC
|
||
|
#define GLSURF_IS_DIRECTDC(dwFlags) \
|
||
|
(((dwFlags) & (GLSURF_HDC | GLSURF_DIRECTDC | GLSURF_METAFILE)) == \
|
||
|
(GLSURF_HDC | GLSURF_DIRECTDC))
|
||
|
// Direct DC for the screen
|
||
|
#define GLSURF_IS_SCREENDC(dwFlags) \
|
||
|
(((dwFlags) & (GLSURF_HDC | GLSURF_DIRECTDC | GLSURF_METAFILE | \
|
||
|
GLSURF_SCREEN)) == \
|
||
|
(GLSURF_HDC | GLSURF_DIRECTDC | GLSURF_SCREEN))
|
||
|
|
||
|
typedef struct IDirectDrawSurface *LPDIRECTDRAWSURFACE;
|
||
|
|
||
|
typedef struct _GLDDSURF
|
||
|
{
|
||
|
LPDIRECTDRAWSURFACE pdds;
|
||
|
DDSURFACEDESC ddsd;
|
||
|
DWORD dwBitDepth;
|
||
|
} GLDDSURF;
|
||
|
|
||
|
typedef struct _GLDDSURFACES
|
||
|
{
|
||
|
GLDDSURF gddsFront;
|
||
|
GLDDSURF gddsZ;
|
||
|
} GLDDSURFACES;
|
||
|
|
||
|
typedef struct _GLSURF
|
||
|
{
|
||
|
DWORD dwFlags;
|
||
|
int iLayer;
|
||
|
int ipfd;
|
||
|
|
||
|
PIXELFORMATDESCRIPTOR pfd;
|
||
|
|
||
|
// Needed for ExtEscape calls for hardware even for surfaces, like
|
||
|
// DirectDraw surfaces, which don't need a DC for access
|
||
|
HDC hdc;
|
||
|
|
||
|
// Source-specific fields
|
||
|
union
|
||
|
{
|
||
|
HWND hwnd;
|
||
|
GLDDSURFACES dd;
|
||
|
};
|
||
|
} GLSURF;
|
||
|
|
||
|
DWORD APIENTRY DdbdToCount(DWORD ddbd);
|
||
|
// The documentation says that depths returned in DDPIXELFORMATs are
|
||
|
// DDBD_ constants, but they seem to be real numbers. Hide the conversion
|
||
|
// necessary in case it needs to change.
|
||
|
#define DdPixDepthToCount(ddpd) (ddpd)
|
||
|
BYTE APIENTRY DdPixelDepth(DDSURFACEDESC *pddsd);
|
||
|
|
||
|
void APIENTRY MaskToBitsAndShift(DWORD dwMask, BYTE *pbBits, BYTE *pbShift);
|
||
|
BOOL APIENTRY InitDeviceSurface(HDC hdc, int ipfd, int iLayer,
|
||
|
DWORD dwObjectType, BOOL bUpdatePfd,
|
||
|
GLSURF *pgsurf);
|
||
|
|
||
|
BOOL APIENTRY IsDirectDrawDevice(HDC hdc);
|
||
|
|
||
|
BOOL APIENTRY glsrvAttention(PVOID, PVOID, PVOID, HANDLE);
|
||
|
PVOID APIENTRY glsrvCreateContext(struct _GLWINDOWID *, GLSURF *);
|
||
|
BOOL APIENTRY glsrvMakeCurrent(struct _GLWINDOWID *, PVOID, GLGENwindow *);
|
||
|
VOID APIENTRY glsrvLoseCurrent(PVOID);
|
||
|
BOOL APIENTRY glsrvDeleteContext(PVOID);
|
||
|
BOOL APIENTRY glsrvSwapBuffers(HDC, GLGENwindow *);
|
||
|
VOID APIENTRY glsrvThreadExit(void);
|
||
|
VOID APIENTRY glsrvCleanupWindow(PVOID, GLGENwindow *);
|
||
|
ULONG APIENTRY glsrvShareLists(PVOID, PVOID);
|
||
|
BOOL APIENTRY glsrvCopyContext(PVOID, PVOID, UINT);
|
||
|
BOOL APIENTRY glsrvBindDirectDrawTexture(struct __GLcontextRec *, int,
|
||
|
LPDIRECTDRAWSURFACE *,
|
||
|
DDSURFACEDESC *, ULONG);
|
||
|
void APIENTRY glsrvUnbindDirectDrawTexture(struct __GLcontextRec *);
|
||
|
|
||
|
BOOL APIENTRY __wglGetBitfieldColorFormat(HDC hdc, UINT cColorBits,
|
||
|
PIXELFORMATDESCRIPTOR *ppfd,
|
||
|
BOOL bDescribeSurf);
|
||
|
|
||
|
BOOL APIENTRY wglIsDirectDevice(HDC hdc);
|
||
|
|
||
|
// Cleans up any orphaned window information
|
||
|
VOID APIENTRY wglValidateWindows(void);
|
||
|
|
||
|
// GL metafile support function
|
||
|
DWORD APIENTRY wglObjectType(HDC hdc);
|
||
|
|
||
|
// Find pixel format counts
|
||
|
VOID APIENTRY wglNumHardwareFormats(HDC hdc, DWORD dwType,
|
||
|
int *piMcd, int *piIcd);
|
||
|
|
||
|
// Calls from the back end to the front end
|
||
|
int WINAPI __DrvDescribePixelFormat(HDC hdc, int ipfd, UINT cjpfd,
|
||
|
LPPIXELFORMATDESCRIPTOR ppfd);
|
||
|
BOOL WINAPI __DrvSetPixelFormat(HDC hdc, int ipfd, PVOID *pwnd);
|
||
|
BOOL WINAPI __DrvSwapBuffers(HDC hdc, BOOL bFinish);
|
||
|
|
||
|
extern CRITICAL_SECTION gcsPixelFormat;
|
||
|
|
||
|
extern CRITICAL_SECTION gcsPaletteWatcher;
|
||
|
extern DWORD tidPaletteWatcherThread;
|
||
|
extern ULONG ulPaletteWatcherCount;
|
||
|
extern HWND hwndPaletteWatcher;
|
||
|
|
||
|
extern DWORD dwPlatformId;
|
||
|
#define NT_PLATFORM ( dwPlatformId == VER_PLATFORM_WIN32_NT )
|
||
|
#define WIN95_PLATFORM ( dwPlatformId == VER_PLATFORM_WIN32_WINDOWS )
|
||
|
|
||
|
extern LONG lThreadsAttached;
|
||
|
|
||
|
typedef HRESULT (WINAPI *PFN_GETSURFACEFROMDC)(HDC, LPDIRECTDRAWSURFACE *,
|
||
|
HDC *);
|
||
|
extern PFN_GETSURFACEFROMDC pfnGetSurfaceFromDC;
|
||
|
|
||
|
#ifdef GL_METAFILE
|
||
|
// OpenGL metafile support routines in GDI, dynamically linked
|
||
|
// so the DLL can be run on platforms without metafile support
|
||
|
extern BOOL (APIENTRY *pfnGdiAddGlsRecord)(HDC hdc, DWORD cb, BYTE *pb,
|
||
|
LPRECTL prclBounds);
|
||
|
extern BOOL (APIENTRY *pfnGdiAddGlsBounds)(HDC hdc, LPRECTL prclBounds);
|
||
|
extern BOOL (APIENTRY *pfnGdiIsMetaPrintDC)(HDC hdc);
|
||
|
|
||
|
#if DBG
|
||
|
// Use NULL-checking thunks in debug mode to check erroneous DLL usage
|
||
|
BOOL APIENTRY GlGdiAddGlsRecord(HDC hdc, DWORD cb, BYTE *pb,
|
||
|
LPRECTL prclBounds);
|
||
|
BOOL APIENTRY GlGdiAddGlsBounds(HDC hdc, LPRECTL prclBounds);
|
||
|
BOOL APIENTRY GlGdiIsMetaPrintDC(HDC hdc);
|
||
|
#else
|
||
|
// Call directly through points in retail builds
|
||
|
#define GlGdiAddGlsRecord(hdc, cb, pb, prcl) \
|
||
|
pfnGdiAddGlsRecord(hdc, cb, pb, prcl)
|
||
|
#define GlGdiAddGlsBounds(hdc, prcl) \
|
||
|
pfnGdiAddGlsBounds(hdc, prcl)
|
||
|
#define GlGdiIsMetaPrintDC(hdc) \
|
||
|
pfnGdiIsMetaPrintDC(hdc)
|
||
|
#endif
|
||
|
#endif
|
||
|
|
||
|
#include <alloc.h>
|
||
|
#include <debug.h>
|
||
|
|
||
|
#endif // _glp_
|