[OPENGL32]
[reactos.git] / reactos / dll / win32 / opengl32 / wgl.c
index 953305b..9584ba5 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");
             }
         }
     }
@@ -452,13 +454,12 @@ ROSGL_SetContextCallBack( const ICDTable *table )
         /* save table */
         size = sizeof (PROC) * table->num_funcs;
         memcpy( tebTable, table->dispatch_table, size );
-        memset( tebTable + table->num_funcs, 0,
-                sizeof (table->dispatch_table) - size );
+        memset( tebTable + table->num_funcs, 0, DISPATCH_TABLE_SIZE - size );
     }
     else
     {
         DBGPRINT( "Unsetting current context" );
-        memset( tebTable, 0, sizeof (table->dispatch_table) );
+        memset( tebTable, 0, DISPATCH_TABLE_SIZE );
     }
 
     /* put in empty functions as long as we dont have a fallback */
@@ -686,6 +687,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)