wined3d: Try harder to reacquire context.

Signed-off-by: Józef Kucia <jkucia@codeweavers.com>
Signed-off-by: Henri Verbeet <hverbeet@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Józef Kucia 2018-02-27 10:17:37 +01:00 committed by Alexandre Julliard
parent d8c0bc8245
commit 7b62a970e9
1 changed files with 34 additions and 21 deletions

View File

@ -4170,6 +4170,26 @@ static void context_setup_target(struct wined3d_context *context,
context_set_render_offscreen(context, render_offscreen); context_set_render_offscreen(context, render_offscreen);
} }
static void context_activate(struct wined3d_context *context,
struct wined3d_texture *texture, unsigned int sub_resource_idx)
{
context_enter(context);
context_update_window(context);
context_setup_target(context, texture, sub_resource_idx);
if (!context->valid)
return;
if (context != context_get_current())
{
if (!context_set_current(context))
ERR("Failed to activate the new context.\n");
}
else if (context->needs_set)
{
context_set_gl_context(context);
}
}
struct wined3d_context *context_acquire(const struct wined3d_device *device, struct wined3d_context *context_acquire(const struct wined3d_device *device,
struct wined3d_texture *texture, unsigned int sub_resource_idx) struct wined3d_texture *texture, unsigned int sub_resource_idx)
{ {
@ -4228,21 +4248,7 @@ struct wined3d_context *context_acquire(const struct wined3d_device *device,
context = swapchain_get_context(device->swapchains[0]); context = swapchain_get_context(device->swapchains[0]);
} }
context_enter(context); context_activate(context, texture, sub_resource_idx);
context_update_window(context);
context_setup_target(context, texture, sub_resource_idx);
if (!context->valid)
return context;
if (context != current_context)
{
if (!context_set_current(context))
ERR("Failed to activate the new context.\n");
}
else if (context->needs_set)
{
context_set_gl_context(context);
}
return context; return context;
} }
@ -4250,16 +4256,23 @@ struct wined3d_context *context_acquire(const struct wined3d_device *device,
struct wined3d_context *context_reacquire(const struct wined3d_device *device, struct wined3d_context *context_reacquire(const struct wined3d_device *device,
struct wined3d_context *context) struct wined3d_context *context)
{ {
struct wined3d_context *current_context; struct wined3d_context *acquired_context;
wined3d_from_cs(device->cs);
if (!context || context->tid != GetCurrentThreadId()) if (!context || context->tid != GetCurrentThreadId())
return NULL; return NULL;
current_context = context_acquire(device, context->current_rt.texture, if (context->current_rt.texture)
context->current_rt.sub_resource_idx); {
if (current_context != context) context_activate(context, context->current_rt.texture, context->current_rt.sub_resource_idx);
ERR("Acquired context %p instead of %p.\n", current_context, context); return context;
return current_context; }
acquired_context = context_acquire(device, NULL, 0);
if (acquired_context != context)
ERR("Acquired context %p instead of %p.\n", acquired_context, context);
return acquired_context;
} }
void dispatch_compute(struct wined3d_device *device, const struct wined3d_state *state, void dispatch_compute(struct wined3d_device *device, const struct wined3d_state *state,