Author: khornicek
Date: Mon Jun 14 13:11:51 2010
New Revision: 47780
URL:
http://svn.reactos.org/svn/reactos?rev=47780&view=rev
Log:
[OPENGL32]
Fixes for ICD reference counting. By Jerome Gardou
See issue #5257 for more details.
Modified:
trunk/reactos/dll/win32/opengl32/opengl32.c
trunk/reactos/dll/win32/opengl32/wgl.c
Modified: trunk/reactos/dll/win32/opengl32/opengl32.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/opengl32/opengl3…
==============================================================================
--- trunk/reactos/dll/win32/opengl32/opengl32.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/opengl32/opengl32.c [iso-8859-1] Mon Jun 14 13:11:51 2010
@@ -472,8 +472,6 @@
{
if (!_wcsicmp( driver, icd->driver_name )) /* found */
{
- icd->refcount++;
-
/* release mutex */
if (!ReleaseMutex( OPENGL32_processdata.driver_mutex ))
DBGPRINT( "Error: ReleaseMutex() failed (%d)", GetLastError()
);
@@ -484,8 +482,6 @@
/* not found - try to load */
icd = OPENGL32_LoadDriver( driver );
- if (icd != NULL)
- icd->refcount = 1;
/* release mutex */
if (!ReleaseMutex( OPENGL32_processdata.driver_mutex ))
@@ -513,7 +509,7 @@
return FALSE; /* FIXME: do we have to expect such an error and handle it? */
}
- if (--icd->refcount == 0)
+ if (icd->refcount == 0)
ret = OPENGL32_UnloadDriver( icd );
/* release mutex */
Modified: trunk/reactos/dll/win32/opengl32/wgl.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/opengl32/wgl.c?r…
==============================================================================
--- trunk/reactos/dll/win32/opengl32/wgl.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/opengl32/wgl.c [iso-8859-1] Mon Jun 14 13:11:51 2010
@@ -27,7 +27,6 @@
WCHAR DriverName[256]; /*!< Driver name */
} OPENGL_INFO, *POPENGL_INFO;
-
/*! \brief Append OpenGL Rendering Context (GLRC) to list
*
* \param glrc [IN] Pointer to GLRC to append to list
@@ -179,8 +178,11 @@
ROSGL_DeleteContext( GLRC *glrc )
{
/* unload icd */
- if (glrc->icd != NULL)
+ if ((glrc->icd != NULL) &&
(!InterlockedDecrement((LONG*)&glrc->icd->refcount)))
+ {
+ /* This is the last context, remove the ICD*/
ROSGL_DeleteDCDataForICD( glrc->icd );
+ }
/* remove from list */
ROSGL_RemoveContext( glrc );
@@ -413,7 +415,7 @@
NULL) != NULL)
{
/* Too bad, somebody else was faster... */
- OPENGL32_UnloadICD(drvdata);
+ DBGTRACE("ICD is already set!\n");
}
}
}
@@ -686,6 +688,9 @@
/* FIXME: fallback? */
return NULL;
}
+ /* Don't forget to refcount it, icd will be released when last context is deleted
*/
+ InterlockedIncrement((LONG*)&icd->refcount);
+
/* create context */
if (icd->DrvCreateLayerContext != NULL)