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/opengl32... ============================================================================== --- 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?re... ============================================================================== --- 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)