[OPENGL32]
authorKamil Hornicek <kamil.hornicek@reactos.org>
Mon, 14 Jun 2010 13:11:51 +0000 (13:11 +0000)
committerKamil Hornicek <kamil.hornicek@reactos.org>
Mon, 14 Jun 2010 13:11:51 +0000 (13:11 +0000)
Fixes for ICD reference counting. By Jerome Gardou
See issue #5257 for more details.

svn path=/trunk/; revision=47780

reactos/dll/win32/opengl32/opengl32.c
reactos/dll/win32/opengl32/wgl.c

index 2dd3312..cf46007 100644 (file)
@@ -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 */
index 953305b..aadf186 100644 (file)
@@ -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)