-/* $Id: opengl32.h,v 1.3 2004/02/01 17:18:48 royce Exp $
+/* $Id: opengl32.h,v 1.14 2004/02/12 23:56:15 royce Exp $
*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
* FILE: lib/opengl32/opengl32.h
* PURPOSE: OpenGL32 lib
- * PROGRAMMER: Royce Mitchell III
+ * PROGRAMMER: Royce Mitchell III, Anich Gregor (blight)
* UPDATE HISTORY:
* Feb 1, 2004: Created
*/
#ifndef OPENGL32_PRIVATE_H
#define OPENGL32_PRIVATE_H
-#define GLFUNCS_MACRO \
- X(glAccum) \
- X(glAddSwapHintRectWIN) \
- X(glArrayElement) \
- X(glBegin) \
- X(glBindTexture)
-
-enum glfunc_indices
+#ifdef __cplusplus
+extern "C" {
+#endif//__cplusplus
+
+/* gl function list */
+#include "glfuncs.h"
+
+/* ICD index list/types */
+#include "icdtable.h"
+
+/* debug flags */
+#if !defined(NDEBUG)
+# define DEBUG_OPENGL32
+# define DEBUG_OPENGL32_BRKPTS /* enable breakpoints */
+# define DEBUG_OPENGL32_ICD_EXPORTS /* dumps the list of (un)supported glXXX
+ functions when an ICD is loaded. */
+#endif /* !NDEBUG */
+
+/* debug macros */
+#ifdef _MSC_VER
+inline void DBGPRINT ( ... ) {}
+#else
+# ifdef DEBUG_OPENGL32
+ULONG DbgPrint(PCH Format,...);
+# include <debug.h>
+# define DBGPRINT( fmt, args... ) \
+ DPRINT( "OpenGL32.DLL: %s: "fmt"\n", __FUNCTION__, ##args )
+# else
+# define DBGPRINT( ... ) do {} while (0)
+# endif
+#endif
+
+#ifdef DEBUG_OPENGL32_BRKPTS
+# if defined(__GNUC__)
+# define DBGBREAK() __asm__( "int $3" );
+# elif defined(_MSC_VER)
+# define DBGBREAK() __asm { int 3 }
+# else
+# error Unsupported compiler!
+# endif
+#endif
+
+/* function/data attributes */
+#define EXPORT __declspec(dllexport)
+#ifdef _MSC_VER
+# define NAKED __declspec(naked)
+# define SHARED
+# ifndef STDCALL
+# define STDCALL __stdcall
+# endif/*STDCALL*/
+#else /* GCC */
+# define NAKED __attribute__((naked))
+# define SHARED __attribute__((section("shared"), shared))
+#endif
+
+#ifdef APIENTRY
+#undef APIENTRY
+#endif//APIENTRY
+#define APIENTRY EXPORT __stdcall
+
+/* gl function list */
+#include "glfuncs.h"
+
+/* GL data types - x86 typedefs */
+typedef unsigned int GLenum;
+typedef unsigned char GLboolean;
+typedef unsigned int GLbitfield;
+typedef signed char GLbyte;
+typedef short GLshort;
+typedef int GLint;
+typedef int GLsizei;
+typedef unsigned char GLubyte;
+typedef unsigned short GLushort;
+typedef unsigned int GLuint;
+typedef unsigned short GLhalf;
+typedef float GLfloat;
+typedef float GLclampf;
+typedef double GLdouble;
+typedef double GLclampd;
+typedef void GLvoid;
+
+/* Called by the driver to set the dispatch table */
+typedef DWORD APIENTRY (*SetContextCallBack)( const ICDTable * );
+
+/* OpenGL ICD data */
+typedef struct tagGLDRIVERDATA
{
- GLIDX_INVALID = -1,
-#define X(X) GLIDX_##X,
- GLFUNCS_MACRO
-#undef X
- GLIDX_COUNT
-};
-
-extern const char* OPENGL32_funcnames[GLIDX_COUNT];
-
-typedef
-void
-WINAPI
-(*PGLACCUM) (
- GLenum op,
- GLfloat value );
-
-typedef
-void
-WINAPI
-(*PGLADDSWAPHINTRECTWIN) (
- GLint x,
- GLint y,
- GLsizei width,
- GLsizei height );
-
-typedef
-void
-WINAPI
-(*PGLARRAYELEMENT) ( GLint index );
-
-typedef
-void
-WINAPI
-(*PGLBEGIN) ( GLenum mode );
-
-typedef
-void
-WINAPI
-(*PGLBINDTEXTURE) ( GLenum target, GLuint texture )
-
-
-typedef
-void
-WINAPI
-(*PGLEND) ( void );
-
-typedef struct tagGLFUNCLIST
+ HMODULE handle; /* DLL handle */
+ UINT refcount; /* number of references to this ICD */
+ WCHAR driver_name[256]; /* name of display driver */
+
+ WCHAR dll[256]; /* Dll value from registry */
+ DWORD version; /* Version value from registry */
+ DWORD driver_version; /* DriverVersion value from registry */
+ DWORD flags; /* Flags value from registry */
+
+ BOOL APIENTRY (*DrvCopyContext)( HGLRC, HGLRC, UINT );
+ HGLRC APIENTRY (*DrvCreateContext)( HDC );
+ HGLRC APIENTRY (*DrvCreateLayerContext)( HDC, int );
+ BOOL APIENTRY (*DrvDeleteContext)( HGLRC );
+ BOOL APIENTRY (*DrvDescribeLayerPlane)( HDC, int, int, UINT, LPLAYERPLANEDESCRIPTOR );
+ int APIENTRY (*DrvDescribePixelFormat)( IN HDC, IN int, IN UINT, OUT LPPIXELFORMATDESCRIPTOR );
+ int APIENTRY (*DrvGetLayerPaletteEntries)( HDC, int, int, int, COLORREF * );
+ PROC APIENTRY (*DrvGetProcAddress)( LPCSTR lpProcName );
+ void APIENTRY (*DrvReleaseContext)();
+ BOOL APIENTRY (*DrvRealizeLayerPalette)( HDC, int, BOOL );
+ PICDTable APIENTRY (*DrvSetContext)( HDC hdc, HGLRC hglrc, SetContextCallBack callback );
+ int APIENTRY (*DrvSetLayerPaletteEntries)( HDC, int, int, int, CONST COLORREF * );
+ BOOL APIENTRY (*DrvSetPixelFormat)( IN HDC, IN int, IN CONST PIXELFORMATDESCRIPTOR * );
+ BOOL APIENTRY (*DrvShareLists)( HGLRC, HGLRC );
+ BOOL APIENTRY (*DrvSwapBuffers)( HDC );
+ BOOL APIENTRY (*DrvSwapLayerBuffers)( HDC, UINT );
+ BOOL APIENTRY (*DrvValidateVersion)( DWORD );
+
+ struct tagGLDRIVERDATA *next; /* next ICD -- linked list */
+} GLDRIVERDATA;
+
+/* Out private OpenGL context (saved in TLS) */
+typedef struct tagGLRC
{
- PGLACCUM glAccum;
- PGLADDSWAPHINTRECTWIN glAddSwapHintRectWIN;
- PGLARRAYELEMENT glArrayElement;
- PGLBEGIN glBegin;
- PGLBINDTEXTURE glBindTexture;
+ GLDRIVERDATA *icd; /* driver used for this context */
+ HDC hdc; /* DC handle */
+ BOOL is_current; /* wether this context is current for some DC */
+ DWORD thread_id; /* thread holding this context */
+
+ HGLRC hglrc; /* GLRC from DrvCreateContext */
- PGLEND glEnd;
-} GLFUNCLIST;
+ struct tagGLRC *next; /* linked list */
+} GLRC;
+/* Process data */
typedef struct tagGLPROCESSDATA
{
- int funclist_count;
- GLFUNCLIST* lists; // array of GLFUNCLIST pointers
+ GLDRIVERDATA *driver_list; /* list of loaded drivers */
+ HANDLE driver_mutex; /* mutex to protect driver list */
+ GLRC *glrc_list; /* list of GL rendering contexts */
+ HANDLE glrc_mutex; /* mutex to protect glrc list */
+ HDC cachedHdc; /* cached HDC from last SetPixelFormat */
+ INT cachedFormat; /* cached format from last SetPixelFormat */
} GLPROCESSDATA;
+/* TLS data */
typedef struct tagGLTHREADDATA
{
- HDC hdc; // current HDC
- GLFUNCLIST* list; // *current* func list
- /* FIXME - what else do we need here? */
-}; GLTHREADDATA;
+ GLRC *glrc; /* current GL rendering context */
+} GLTHREADDATA;
extern DWORD OPENGL32_tls;
extern GLPROCESSDATA OPENGL32_processdata;
+#define OPENGL32_threaddata ((GLTHREADDATA *)TlsGetValue( OPENGL32_tls ))
+
+/* function prototypes */
+GLDRIVERDATA *OPENGL32_LoadICDForHDC( HDC hdc );
+GLDRIVERDATA *OPENGL32_LoadICD( LPCWSTR driver );
+BOOL OPENGL32_UnloadICD( GLDRIVERDATA *icd );
+DWORD OPENGL32_RegEnumDrivers( DWORD idx, LPWSTR name, LPDWORD cName );
+DWORD OPENGL32_RegGetDriverInfo( LPCWSTR driver, GLDRIVERDATA *icd );
+
+/* empty gl functions from gl.c */
+int STDCALL glEmptyFunc0();
+int STDCALL glEmptyFunc4( long );
+int STDCALL glEmptyFunc8( long, long );
+int STDCALL glEmptyFunc12( long, long, long );
+int STDCALL glEmptyFunc16( long, long, long, long );
+int STDCALL glEmptyFunc20( long, long, long, long, long );
+int STDCALL glEmptyFunc24( long, long, long, long, long, long );
+int STDCALL glEmptyFunc28( long, long, long, long, long, long, long );
+int STDCALL glEmptyFunc32( long, long, long, long, long, long, long, long );
+int STDCALL glEmptyFunc36( long, long, long, long, long, long, long, long,
+ long );
+int STDCALL glEmptyFunc40( long, long, long, long, long, long, long, long,
+ long, long );
+int STDCALL glEmptyFunc44( long, long, long, long, long, long, long, long,
+ long, long, long );
+int STDCALL glEmptyFunc48( long, long, long, long, long, long, long, long,
+ long, long, long, long );
+int STDCALL glEmptyFunc52( long, long, long, long, long, long, long, long,
+ long, long, long, long, long );
+int STDCALL glEmptyFunc56( long, long, long, long, long, long, long, long,
+ long, long, long, long, long, long );
+
+#define X(func,ret,typeargs,args,icdidx,tebidx,stack) EXPORT ret STDCALL func typeargs;
+GLFUNCS_MACRO
+#undef X
+
+#ifdef __cplusplus
+}; // extern "C"
+#endif//__cplusplus
#endif//OPENGL32_PRIVATE_H
+
+/* EOF */