Query support for opengl-driver-info escape before calling it and some other minor changes.
Modified: trunk/reactos/lib/opengl32/opengl32.c
Modified: trunk/reactos/lib/opengl32/opengl32.h
Modified: trunk/reactos/lib/opengl32/wgl.c

Modified: trunk/reactos/lib/opengl32/opengl32.c
--- trunk/reactos/lib/opengl32/opengl32.c	2005-09-13 14:34:48 UTC (rev 17830)
+++ trunk/reactos/lib/opengl32/opengl32.c	2005-09-13 14:46:00 UTC (rev 17831)
@@ -78,10 +78,11 @@
 static void
 OPENGL32_ThreadDetach()
 {
-	/* FIXME - do we need to release some HDC or something? */
 	GLTHREADDATA* lpData = NULL;
 	PROC *dispatchTable = NULL;
 
+	rosglMakeCurrent( NULL, NULL );
+
 	lpData = (GLTHREADDATA*)TlsGetValue( OPENGL32_tls );
 	if (lpData != NULL)
 	{

Modified: trunk/reactos/lib/opengl32/opengl32.h
--- trunk/reactos/lib/opengl32/opengl32.h	2005-09-13 14:34:48 UTC (rev 17830)
+++ trunk/reactos/lib/opengl32/opengl32.h	2005-09-13 14:46:00 UTC (rev 17831)
@@ -33,10 +33,12 @@
 /* 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. */
-# define DEBUG_OPENGL32_TRACE       /* prints much information about whats going on */
+/* enable breakpoints */
+/*# define DEBUG_OPENGL32_BRKPTS*/
+/* dumps the list of (un)supported glXXX functions when an ICD is loaded. */
+# define DEBUG_OPENGL32_ICD_EXPORTS
+/* prints much information about whats going on */
+# define DEBUG_OPENGL32_TRACE
 #endif /* !NDEBUG */
 
 /* debug macros */
@@ -196,8 +198,8 @@
 /* function prototypes */
 GLDRIVERDATA *OPENGL32_LoadICD( LPCWSTR driver );
 BOOL OPENGL32_UnloadICD( GLDRIVERDATA *icd );
+BOOL APIENTRY rosglMakeCurrent( HDC hdc, HGLRC hglrc );
 
-
 /* empty gl functions from gl.c */
 int STDCALL glEmptyFunc0();
 int STDCALL glEmptyFunc4( long );

Modified: trunk/reactos/lib/opengl32/wgl.c
--- trunk/reactos/lib/opengl32/wgl.c	2005-09-13 14:34:48 UTC (rev 17830)
+++ trunk/reactos/lib/opengl32/wgl.c	2005-09-13 14:46:00 UTC (rev 17831)
@@ -26,13 +26,13 @@
 #endif
 
 
-#define EXT_GET_DRIVERINFO		0x1101 /*!< ExtEscape code to get driver info */
-typedef struct tagEXTDRIVERINFO
+#define EXT_QUERY_OPENGLDRIVERINFO	0x1101 /*!< ExtEscape code to get driver info */
+typedef struct tagEXT_OPENGLDRIVERINFO
 {
 	DWORD version;          /*!< Driver interface version */
 	DWORD driver_version;	/*!< Driver version */
 	WCHAR driver_name[256]; /*!< Driver name */
-} EXTDRIVERINFO;
+} EXT_OPENGLDRIVERINFO;
 
 
 /*! \brief Append OpenGL Rendering Context (GLRC) to list
@@ -93,11 +93,12 @@
 			if (p->next == glrc)
 			{
 				p->next = glrc->next;
-				return;
+				break;
 			}
 			p = p->next;
 		}
-		DBGPRINT( "Error: GLRC 0x%08x not found in list!", glrc );
+		if (p == NULL)
+			DBGPRINT( "Error: GLRC 0x%08x not found in list!", glrc );
 	}
 
 	/* release mutex */
@@ -165,6 +166,7 @@
 ROSGL_ContainsContext( GLRC *glrc )
 {
 	GLRC *p;
+        BOOL found = FALSE;
 
 	/* synchronize */
 	if (WaitForSingleObject( OPENGL32_processdata.glrc_mutex, INFINITE ) ==
@@ -178,7 +180,10 @@
 	while (p != NULL)
 	{
 		if (p == glrc)
-			return TRUE;
+		{
+			found = TRUE;
+			break;
+		}
 		p = p->next;
 	}
 
@@ -186,7 +191,7 @@
 	if (!ReleaseMutex( OPENGL32_processdata.glrc_mutex ))
 		DBGPRINT( "Error: ReleaseMutex() failed (%d)", GetLastError() );
 
-	return FALSE;
+	return found;
 }
 
 
@@ -206,6 +211,14 @@
 {
 	GLDCDATA *data;
 
+	/* check hdc */
+	if (GetObjectType( hdc ) != OBJ_DC && GetObjectType( hdc ) != OBJ_MEMDC)
+	{
+		DBGPRINT( "Error: hdc is not a DC handle!" );
+		SetLastError( ERROR_INVALID_HANDLE );
+		return FALSE;
+	}
+
 	/* synchronize */
 	if (WaitForSingleObject( OPENGL32_processdata.dcdata_mutex, INFINITE ) ==
 	    WAIT_FAILED)
@@ -281,17 +294,24 @@
 	if (dcdata->icd == NULL)
 	{
 		LPCWSTR driverName;
-		EXTDRIVERINFO info;
+		EXT_OPENGLDRIVERINFO info;
 
 		driverName = _wgetenv( L"OPENGL32_DRIVER" );
 		if (driverName == NULL)
 		{
-			DWORD dwInput = 0;
+			DWORD dwInput;
 			LONG ret;
 
 			/* get driver name */
-			ret = ExtEscape( hdc, EXT_GET_DRIVERINFO, sizeof (dwInput), (LPCSTR)&dwInput,
-			                 sizeof (EXTDRIVERINFO), (LPSTR)&info );
+			dwInput = EXT_QUERY_OPENGLDRIVERINFO;
+			ret = ExtEscape( hdc, QUERYESCSUPPORT, sizeof (dwInput), (LPCSTR)&dwInput, 0, NULL );
+			if (ret > 0)
+			{
+				dwInput = 0;
+				ret = ExtEscape( hdc, EXT_QUERY_OPENGLDRIVERINFO, sizeof (dwInput),
+				                 (LPCSTR)&dwInput, sizeof (EXT_OPENGLDRIVERINFO),
+				                 (LPSTR)&info );
+			}
 			if (ret <= 0)
 			{
 				HKEY hKey;
@@ -299,11 +319,10 @@
 
 				if (ret < 0)
 				{
-					DBGPRINT( "Warning: ExtEscape to get the drivername failed!!! (%d)", GetLastError() );
+					DBGPRINT( "Warning: ExtEscape to get the drivername failed! (%d)", GetLastError() );
 					if (MessageBox( WindowFromDC( hdc ), L"Couldn't get installable client driver name!\nUsing default driver.",
 					                L"OPENGL32.dll: Warning", MB_OKCANCEL | MB_ICONWARNING ) == IDCANCEL)
 					{
-						SetLastError( 0 );
 						return NULL;
 					}
 				}
@@ -337,12 +356,12 @@
 		dcdata->icd = OPENGL32_LoadICD( info.driver_name );
 		if (dcdata->icd == NULL)
 		{
-                        WCHAR Buffer[256];
-                        snwprintf(Buffer, sizeof(Buffer)/sizeof(WCHAR),
-                                  L"Couldn't load driver \"%s\".", driverName);
+			WCHAR Buffer[256];
+			snwprintf(Buffer, sizeof(Buffer)/sizeof(WCHAR),
+			          L"Couldn't load driver \"%s\".", driverName);
 			MessageBox(WindowFromDC( hdc ), Buffer,
 			           L"OPENGL32.dll: Warning",
-                                   MB_OK | MB_ICONWARNING);
+			           MB_OK | MB_ICONWARNING);
                 }
 	}
 
@@ -381,7 +400,7 @@
 		size = sizeof (PROC) * table->num_funcs;
 		memcpy( tebTable, table->dispatch_table, size );
 		memset( tebTable + table->num_funcs, 0,
-				sizeof (table->dispatch_table) - size );
+		        sizeof (table->dispatch_table) - size );
 	}
 	else
 	{
@@ -390,19 +409,19 @@
 	}
 
 	/* put in empty functions as long as we dont have a fallback */
-	#define X(func, ret, typeargs, args, icdidx, tebidx, stack)            \
-		if (tebTable[icdidx] == NULL)                                      \
-		{                                                                  \
-			if (table != NULL)                                             \
-				DBGPRINT( "Warning: GL proc '%s' is NULL", #func );        \
-			tebTable[icdidx] = (PROC)glEmptyFunc##stack;                   \
+	#define X(func, ret, typeargs, args, icdidx, tebidx, stack)                 \
+		if (tebTable[icdidx] == NULL)                                       \
+		{                                                                   \
+			if (table != NULL)                                          \
+				DBGPRINT( "Warning: GL proc '%s' is NULL", #func ); \
+			tebTable[icdidx] = (PROC)glEmptyFunc##stack;                \
 		}
 	GLFUNCS_MACRO
 	#undef X
 
 	/* fill teb->glDispatchTable for fast calls */
-	#define X(func, ret, typeargs, args, icdidx, tebidx, stack)            \
-		if (tebidx >= 0)                                                   \
+	#define X(func, ret, typeargs, args, icdidx, tebidx, stack)         \
+		if (tebidx >= 0)                                            \
 			tebDispatchTable[tebidx] = tebTable[icdidx];
 	GLFUNCS_MACRO
 	#undef X
@@ -453,7 +472,7 @@
 	/* check input */
 	if (pfd->nSize != sizeof (PIXELFORMATDESCRIPTOR) || pfd->nVersion != 1)
 	{
-		SetLastError( 0 ); /* FIXME: use appropriate errorcode */
+		SetLastError( ERROR_INVALID_PARAMETER );
 		return 0;
 	}
 
@@ -544,18 +563,21 @@
 	if (!ROSGL_ContainsContext( src ))
 	{
 		DBGPRINT( "Error: src GLRC not found!" );
-		return FALSE; /* FIXME: SetLastError() */
+		SetLastError( ERROR_INVALID_HANDLE );
+		return FALSE;
 	}
 	if (!ROSGL_ContainsContext( dst ))
 	{
 		DBGPRINT( "Error: dst GLRC not found!" );
-		return FALSE; /* FIXME: SetLastError() */
+		SetLastError( ERROR_INVALID_HANDLE );
+		return FALSE;
 	}
 
 	/* I think this is only possible within one ICD */
 	if (src->icd != src->icd)
 	{
 		DBGPRINT( "Error: src and dst GLRC use different ICDs!" );
+		SetLastError( ERROR_INVALID_HANDLE );
 		return FALSE;
 	}
 
@@ -599,6 +621,7 @@
 	icd = ROSGL_ICDForHDC( hdc );
 	if (icd == NULL)
 	{
+		ROSGL_DeleteContext( glrc );
 		DBGPRINT( "Couldn't get ICD by HDC :-(" );
 		/* FIXME: fallback? */
 		return NULL;
@@ -663,14 +686,16 @@
 	if (!ROSGL_ContainsContext( glrc ))
 	{
 		DBGPRINT( "Error: hglrc not found!" );
-		return FALSE; /* FIXME: SetLastError() */
+		SetLastError( ERROR_INVALID_HANDLE );
+		return FALSE;
 	}
 
 	/* make sure GLRC is not current for some thread */
 	if (glrc->is_current)
 	{
 		DBGPRINT( "Error: GLRC is current for DC 0x%08x", glrc->hdc );
-		return FALSE; /* FIXME: SetLastError() */
+		SetLastError( ERROR_INVALID_FUNCTION );
+		return FALSE;
 	}
 
 	/* release ICD's context */
@@ -694,6 +719,7 @@
                          UINT nBytes, LPLAYERPLANEDESCRIPTOR plpd )
 {
 	UNIMPLEMENTED;
+	SetLastError( ERROR_CALL_NOT_IMPLEMENTED );
 	return FALSE;
 }
 
@@ -722,6 +748,10 @@
 		if (ret == 0)
 			DBGPRINT( "Error: DrvDescribePixelFormat(format=%d) failed (%d)", iFormat, GetLastError() );
 	}
+	else
+	{
+		SetLastError( ERROR_INVALID_FUNCTION );
+	}
 
 	return ret;
 }
@@ -763,6 +793,7 @@
                              int cEntries, COLORREF *pcr )
 {
 	UNIMPLEMENTED;
+	SetLastError( ERROR_CALL_NOT_IMPLEMENTED );
 	return 0;
 }
 
@@ -807,37 +838,26 @@
 APIENTRY
 rosglGetProcAddress( LPCSTR proc )
 {
+	PROC func;
+	GLDRIVERDATA *icd;
+
 	if (OPENGL32_threaddata->glrc == NULL)
 	{
 		DBGPRINT( "Error: No current GLRC!" );
+		SetLastError( ERROR_INVALID_FUNCTION );
 		return NULL;
 	}
 
-	if (proc[0] == 'g' && proc[1] == 'l' && proc[2] != 'u') /* glXXX */
+	icd = OPENGL32_threaddata->glrc->icd;
+	func = icd->DrvGetProcAddress( proc );
+	if (func != NULL)
 	{
-		PROC glXXX = NULL;
-		GLDRIVERDATA *icd = OPENGL32_threaddata->glrc->icd;
-		glXXX = icd->DrvGetProcAddress( proc );
-		if (glXXX)
-		{
-			DBGPRINT( "Info: Proc \"%s\" loaded from ICD.", proc );
-			return glXXX;
-		}
-
-		/* FIXME: go through own functions? */
-		DBGPRINT( "Warning: Unsupported GL extension: %s", proc );
+		DBGPRINT( "Info: Proc \"%s\" loaded from ICD.", proc );
+		return func;
 	}
-	if (proc[0] == 'w' && proc[1] == 'g' && proc[2] == 'l') /* wglXXX */
-	{
-		/* FIXME: support wgl extensions? (there are such IIRC) */
-		DBGPRINT( "Warning: Unsupported WGL extension: %s", proc );
-	}
-	if (proc[0] == 'g' && proc[1] == 'l' && proc[2] == 'u') /* gluXXX */
-	{
-		/* FIXME: do we support these as well? */
-		DBGPRINT( "Warning: GLU extension %s requested, returning NULL", proc );
-	}
 
+	/* FIXME: Should we return wgl/gl 1.1 functions? */
+	SetLastError( ERROR_PROC_NOT_FOUND );
 	return NULL;
 }
 
@@ -882,6 +902,7 @@
 		if (GetObjectType( hdc ) != OBJ_DC && GetObjectType( hdc ) != OBJ_MEMDC)
 		{
 			DBGPRINT( "Error: hdc is not a DC handle!" );
+			SetLastError( ERROR_INVALID_HANDLE );
 			return FALSE;
 		}
 
@@ -889,20 +910,23 @@
 		if (!ROSGL_ContainsContext( glrc ))
 		{
 			DBGPRINT( "Error: hglrc not found!" );
-			return FALSE; /* FIXME: SetLastError() */
+			SetLastError( ERROR_INVALID_HANDLE );
+			return FALSE;
 		}
 
 		/* check if it is available */
 		if (glrc->is_current && glrc->thread_id != GetCurrentThreadId()) /* used by another thread */
 		{
 			DBGPRINT( "Error: hglrc is current for thread 0x%08x", glrc->thread_id );
-			return FALSE; /* FIXME: SetLastError() */
+			SetLastError( ERROR_INVALID_HANDLE );
+			return FALSE;
 		}
 
 		/* call the ICD */
 		if (glrc->hglrc != NULL)
 		{
 			DBGPRINT( "Info: Calling DrvSetContext!" );
+			SetLastError( ERROR_SUCCESS );
 			icdTable = glrc->icd->DrvSetContext( hdc, glrc->hglrc,
 			                                     ROSGL_SetContextCallBack );
 			if (icdTable == NULL)
@@ -936,6 +960,7 @@
 rosglRealizeLayerPalette( HDC hdc, int iLayerPlane, BOOL bRealize )
 {
 	UNIMPLEMENTED;
+	SetLastError( ERROR_CALL_NOT_IMPLEMENTED );
 	return FALSE;
 }
 
@@ -946,6 +971,7 @@
                              int cEntries, CONST COLORREF *pcr )
 {
 	UNIMPLEMENTED;
+	SetLastError( ERROR_CALL_NOT_IMPLEMENTED );
 	return 0;
 }
 
@@ -1018,18 +1044,21 @@
 	if (!ROSGL_ContainsContext( glrc1 ))
 	{
 		DBGPRINT( "Error: hglrc1 not found!" );
-		return FALSE; /* FIXME: SetLastError() */
+		SetLastError( ERROR_INVALID_HANDLE );
+		return FALSE;
 	}
 	if (!ROSGL_ContainsContext( glrc2 ))
 	{
 		DBGPRINT( "Error: hglrc2 not found!" );
-		return FALSE; /* FIXME: SetLastError() */
+		SetLastError( ERROR_INVALID_HANDLE );
+		return FALSE;
 	}
 
 	/* I think this is only possible within one ICD */
 	if (glrc1->icd != glrc2->icd)
 	{
 		DBGPRINT( "Error: hglrc1 and hglrc2 use different ICDs!" );
+		SetLastError( ERROR_INVALID_HANDLE );
 		return FALSE;
 	}
 
@@ -1063,6 +1092,7 @@
 	}
 
 	/* FIXME: implement own functionality? */
+	SetLastError( ERROR_INVALID_FUNCTION );
 	return FALSE;
 }
 
@@ -1072,6 +1102,7 @@
 rosglSwapLayerBuffers( HDC hdc, UINT fuPlanes )
 {
 	UNIMPLEMENTED;
+	SetLastError( ERROR_CALL_NOT_IMPLEMENTED );
 	return FALSE;
 }
 
@@ -1081,6 +1112,7 @@
 rosglUseFontBitmapsA( HDC hdc, DWORD  first, DWORD count, DWORD listBase )
 {
 	UNIMPLEMENTED;
+	SetLastError( ERROR_CALL_NOT_IMPLEMENTED );
 	return FALSE;
 }
 
@@ -1090,6 +1122,7 @@
 rosglUseFontBitmapsW( HDC hdc, DWORD  first, DWORD count, DWORD listBase )
 {
 	UNIMPLEMENTED;
+	SetLastError( ERROR_CALL_NOT_IMPLEMENTED );
 	return FALSE;
 }
 
@@ -1101,6 +1134,7 @@
                        GLYPHMETRICSFLOAT *pgmf )
 {
 	UNIMPLEMENTED;
+	SetLastError( ERROR_CALL_NOT_IMPLEMENTED );
 	return FALSE;
 }
 
@@ -1112,6 +1146,7 @@
                        GLYPHMETRICSFLOAT *pgmf )
 {
 	UNIMPLEMENTED;
+	SetLastError( ERROR_CALL_NOT_IMPLEMENTED );
 	return FALSE;
 }