mirror of
https://github.com/reactos/reactos.git
synced 2026-07-06 21:54:22 +08:00
[OPENGL32]
Fixes for ICD reference counting. By Jerome Gardou See issue #5257 for more details. svn path=/trunk/; revision=47780
This commit is contained in:
@@ -472,8 +472,6 @@ OPENGL32_LoadICD( LPCWSTR driver )
|
||||
{
|
||||
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 @@ OPENGL32_LoadICD( LPCWSTR driver )
|
||||
|
||||
/* 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 @@ OPENGL32_UnloadICD( GLDRIVERDATA *icd )
|
||||
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 */
|
||||
|
||||
@@ -27,7 +27,6 @@ typedef struct _OPENGL_INFO
|
||||
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 @@ BOOL
|
||||
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 @@ ROSGL_ICDForHDC( HDC hdc )
|
||||
NULL) != NULL)
|
||||
{
|
||||
/* Too bad, somebody else was faster... */
|
||||
OPENGL32_UnloadICD(drvdata);
|
||||
DBGTRACE("ICD is already set!\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -686,6 +688,9 @@ rosglCreateLayerContext( HDC hdc, int layer )
|
||||
/* 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)
|
||||
|
||||
Reference in New Issue
Block a user