- _mesa_HashDeleteAll(shared->DisplayList, delete_displaylist_cb, ctx);
- _mesa_DeleteHashTable(shared->DisplayList);
-
-#if FEATURE_ARB_shader_objects
- _mesa_HashWalk(shared->ShaderObjects, free_shader_program_data_cb, ctx);
- _mesa_HashDeleteAll(shared->ShaderObjects, delete_shader_cb, ctx);
- _mesa_DeleteHashTable(shared->ShaderObjects);
-#endif
-
- _mesa_HashDeleteAll(shared->Programs, delete_program_cb, ctx);
- _mesa_DeleteHashTable(shared->Programs);
-
-#if FEATURE_ARB_vertex_program
- _mesa_reference_vertprog(ctx, &shared->DefaultVertexProgram, NULL);
-#endif
-
-#if FEATURE_ARB_fragment_program
- _mesa_reference_fragprog(ctx, &shared->DefaultFragmentProgram, NULL);
-#endif
-
-#if FEATURE_ATI_fragment_shader
- _mesa_HashDeleteAll(shared->ATIShaders, delete_fragshader_cb, ctx);
- _mesa_DeleteHashTable(shared->ATIShaders);
- _mesa_delete_ati_fragment_shader(ctx, shared->DefaultFragmentShader);
-#endif
-
-#if FEATURE_ARB_vertex_buffer_object || FEATURE_ARB_pixel_buffer_object
- _mesa_HashDeleteAll(shared->BufferObjects, delete_bufferobj_cb, ctx);
- _mesa_DeleteHashTable(shared->BufferObjects);
-#endif
-
-#if FEATURE_EXT_framebuffer_object
- _mesa_HashDeleteAll(shared->FrameBuffers, delete_framebuffer_cb, ctx);
- _mesa_DeleteHashTable(shared->FrameBuffers);
- _mesa_HashDeleteAll(shared->RenderBuffers, delete_renderbuffer_cb, ctx);
- _mesa_DeleteHashTable(shared->RenderBuffers);
-#endif
-
-#if FEATURE_ARB_vertex_buffer_object
- _mesa_reference_buffer_object(ctx, &shared->NullBufferObj, NULL);
-#endif
-
-#if FEATURE_ARB_sync
- {
- struct simple_node *node;
- struct simple_node *temp;
-
- foreach_s(node, temp, & shared->SyncObjects) {
- _mesa_unref_sync_object(ctx, (struct gl_sync_object *) node);
+ if (shared->DisplayList) {
+ _mesa_HashDeleteAll(shared->DisplayList, delete_displaylist_cb, ctx);
+ _mesa_DeleteHashTable(shared->DisplayList);
+ }
+
+ if (shared->BitmapAtlas) {
+ _mesa_HashDeleteAll(shared->BitmapAtlas, delete_bitmap_atlas_cb, ctx);
+ _mesa_DeleteHashTable(shared->BitmapAtlas);
+ }
+
+ if (shared->ShaderObjects) {
+ _mesa_HashWalk(shared->ShaderObjects, free_shader_program_data_cb, ctx);
+ _mesa_HashDeleteAll(shared->ShaderObjects, delete_shader_cb, ctx);
+ _mesa_DeleteHashTable(shared->ShaderObjects);
+ }
+
+ if (shared->Programs) {
+ _mesa_HashDeleteAll(shared->Programs, delete_program_cb, ctx);
+ _mesa_DeleteHashTable(shared->Programs);
+ }
+
+ if (shared->DefaultVertexProgram)
+ _mesa_reference_program(ctx, &shared->DefaultVertexProgram, NULL);
+
+ if (shared->DefaultFragmentProgram)
+ _mesa_reference_program(ctx, &shared->DefaultFragmentProgram, NULL);
+
+ if (shared->DefaultFragmentShader)
+ _mesa_delete_ati_fragment_shader(ctx, shared->DefaultFragmentShader);
+
+ if (shared->ATIShaders) {
+ _mesa_HashDeleteAll(shared->ATIShaders, delete_fragshader_cb, ctx);
+ _mesa_DeleteHashTable(shared->ATIShaders);
+ }
+
+ if (shared->BufferObjects) {
+ _mesa_HashDeleteAll(shared->BufferObjects, delete_bufferobj_cb, ctx);
+ _mesa_DeleteHashTable(shared->BufferObjects);
+ }
+
+ if (shared->FrameBuffers) {
+ _mesa_HashDeleteAll(shared->FrameBuffers, delete_framebuffer_cb, ctx);
+ _mesa_DeleteHashTable(shared->FrameBuffers);
+ }
+
+ if (shared->RenderBuffers) {
+ _mesa_HashDeleteAll(shared->RenderBuffers, delete_renderbuffer_cb, ctx);
+ _mesa_DeleteHashTable(shared->RenderBuffers);
+ }
+
+ if (shared->SyncObjects) {
+ set_foreach(shared->SyncObjects, entry) {
+ _mesa_unref_sync_object(ctx, (struct gl_sync_object *) entry->key, 1);