wined3d: Destroy FBO entries from the context that created them.

EXT_framebuffer_object doesn't specify if FBOs are shareable between GL
contexts, but ARB_framebuffer_object explicitly prohibits it.
This commit is contained in:
Henri Verbeet 2009-10-20 11:05:06 +02:00 committed by Alexandre Julliard
parent e3ca576576
commit 94d33d3e86
2 changed files with 26 additions and 13 deletions

View File

@ -440,6 +440,13 @@ static void context_apply_fbo_entry(struct wined3d_context *context, struct fbo_
/* GL locking is done by the caller */ /* GL locking is done by the caller */
static void context_apply_fbo_state(struct wined3d_context *context) static void context_apply_fbo_state(struct wined3d_context *context)
{ {
struct fbo_entry *entry, *entry2;
LIST_FOR_EACH_ENTRY_SAFE(entry, entry2, &context->fbo_destroy_list, struct fbo_entry, entry)
{
context_destroy_fbo_entry(context, entry);
}
if (context->render_offscreen) if (context->render_offscreen)
{ {
context->current_fbo = context_find_fbo_entry(context); context->current_fbo = context_find_fbo_entry(context);
@ -586,8 +593,6 @@ void context_resource_released(IWineD3DDevice *iface, IWineD3DResource *resource
{ {
case WINED3DRTYPE_SURFACE: case WINED3DRTYPE_SURFACE:
{ {
ActivateContext(This, NULL, CTXUSAGE_RESOURCELOAD);
for (i = 0; i < This->numContexts; ++i) for (i = 0; i < This->numContexts; ++i)
{ {
struct wined3d_context *context = This->contexts[i]; struct wined3d_context *context = This->contexts[i];
@ -596,27 +601,27 @@ void context_resource_released(IWineD3DDevice *iface, IWineD3DResource *resource
if (context->current_rt == (IWineD3DSurface *)resource) context->current_rt = NULL; if (context->current_rt == (IWineD3DSurface *)resource) context->current_rt = NULL;
ENTER_GL();
LIST_FOR_EACH_ENTRY_SAFE(entry, entry2, &context->fbo_list, struct fbo_entry, entry) LIST_FOR_EACH_ENTRY_SAFE(entry, entry2, &context->fbo_list, struct fbo_entry, entry)
{ {
BOOL destroyed = FALSE;
UINT j; UINT j;
for (j = 0; !destroyed && j < GL_LIMITS(buffers); ++j) if (entry->depth_stencil == (IWineD3DSurface *)resource)
{
list_remove(&entry->entry);
list_add_head(&context->fbo_destroy_list, &entry->entry);
continue;
}
for (j = 0; j < GL_LIMITS(buffers); ++j)
{ {
if (entry->render_targets[j] == (IWineD3DSurface *)resource) if (entry->render_targets[j] == (IWineD3DSurface *)resource)
{ {
context_destroy_fbo_entry(context, entry); list_remove(&entry->entry);
destroyed = TRUE; list_add_head(&context->fbo_destroy_list, &entry->entry);
break;
} }
} }
if (!destroyed && entry->depth_stencil == (IWineD3DSurface *)resource)
context_destroy_fbo_entry(context, entry);
} }
LEAVE_GL();
} }
break; break;
@ -653,6 +658,12 @@ static void context_destroy_gl_resources(struct wined3d_context *context)
event_query->context = NULL; event_query->context = NULL;
} }
LIST_FOR_EACH_ENTRY_SAFE(entry, entry2, &context->fbo_destroy_list, struct fbo_entry, entry)
{
if (!context->valid) entry->id = 0;
context_destroy_fbo_entry(context, entry);
}
LIST_FOR_EACH_ENTRY_SAFE(entry, entry2, &context->fbo_list, struct fbo_entry, entry) LIST_FOR_EACH_ENTRY_SAFE(entry, entry2, &context->fbo_list, struct fbo_entry, entry)
{ {
if (!context->valid) entry->id = 0; if (!context->valid) entry->id = 0;
@ -1292,6 +1303,7 @@ struct wined3d_context *CreateContext(IWineD3DDeviceImpl *This, IWineD3DSurfaceI
TRACE("Successfully created new context %p\n", ret); TRACE("Successfully created new context %p\n", ret);
list_init(&ret->fbo_list); list_init(&ret->fbo_list);
list_init(&ret->fbo_destroy_list);
/* Set up the context defaults */ /* Set up the context defaults */
if (!context_set_current(ret)) if (!context_set_current(ret))

View File

@ -1076,6 +1076,7 @@ struct wined3d_context
/* FBOs */ /* FBOs */
UINT fbo_entry_count; UINT fbo_entry_count;
struct list fbo_list; struct list fbo_list;
struct list fbo_destroy_list;
struct fbo_entry *current_fbo; struct fbo_entry *current_fbo;
GLuint src_fbo; GLuint src_fbo;
GLuint dst_fbo; GLuint dst_fbo;