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
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 );
NULL) != NULL)
{
/* Too bad, somebody else was faster... */
- OPENGL32_UnloadICD(drvdata);
+ DBGTRACE("ICD is already set!\n");
}
}
}
/* 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 */
/* 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)