wined3d: Introduce context_reacquire() helper function.

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 2017-04-05 15:38:05 +02:00 committed by Alexandre Julliard
parent c6168a526e
commit 8b9ece6797
3 changed files with 55 additions and 51 deletions

View File

@ -3832,3 +3832,18 @@ struct wined3d_context *context_acquire(const struct wined3d_device *device,
return context;
}
struct wined3d_context *context_reacquire(const struct wined3d_device *device,
struct wined3d_context *context)
{
struct wined3d_context *current_context;
if (context->tid != GetCurrentThreadId())
return NULL;
current_context = context_acquire(device, context->current_rt.texture,
context->current_rt.sub_resource_idx);
if (current_context != context)
ERR("Acquired context %p instead of %p.\n", current_context, context);
return current_context;
}

View File

@ -68,27 +68,28 @@ void wined3d_event_query_destroy(struct wined3d_event_query *query)
static enum wined3d_event_query_result wined3d_event_query_test(const struct wined3d_event_query *query,
const struct wined3d_device *device, DWORD flags)
{
struct wined3d_context *context;
const struct wined3d_gl_info *gl_info;
enum wined3d_event_query_result ret;
struct wined3d_context *context;
BOOL fence_result;
TRACE("query %p, device %p, flags %#x.\n", query, device, flags);
if (!query->context)
{
TRACE("Query not started\n");
TRACE("Query not started.\n");
return WINED3D_EVENT_QUERY_NOT_STARTED;
}
if (!query->context->gl_info->supported[ARB_SYNC] && query->context->tid != GetCurrentThreadId())
if (!(context = context_reacquire(device, query->context)))
{
WARN("Event query tested from wrong thread\n");
return WINED3D_EVENT_QUERY_WRONG_THREAD;
if (!query->context->gl_info->supported[ARB_SYNC])
{
WARN("Event query tested from wrong thread.\n");
return WINED3D_EVENT_QUERY_WRONG_THREAD;
}
context = context_acquire(device, NULL, 0);
}
context = context_acquire(device, query->context->current_rt.texture,
query->context->current_rt.sub_resource_idx);
gl_info = context->gl_info;
if (gl_info->supported[ARB_SYNC])
@ -141,30 +142,32 @@ static enum wined3d_event_query_result wined3d_event_query_test(const struct win
enum wined3d_event_query_result wined3d_event_query_finish(const struct wined3d_event_query *query,
const struct wined3d_device *device)
{
struct wined3d_context *context;
const struct wined3d_gl_info *gl_info;
enum wined3d_event_query_result ret;
struct wined3d_context *context;
TRACE("query %p, device %p.\n", query, device);
if (!query->context)
{
TRACE("Query not started\n");
TRACE("Query not started.\n");
return WINED3D_EVENT_QUERY_NOT_STARTED;
}
gl_info = query->context->gl_info;
if (query->context->tid != GetCurrentThreadId() && !gl_info->supported[ARB_SYNC])
if (!(context = context_reacquire(device, query->context)))
{
/* A glFinish does not reliably wait for draws in other contexts. The caller has
* to find its own way to cope with the thread switch
*/
WARN("Event query finished from wrong thread\n");
return WINED3D_EVENT_QUERY_WRONG_THREAD;
if (!gl_info->supported[ARB_SYNC])
{
WARN("Event query finished from wrong thread.\n");
return WINED3D_EVENT_QUERY_WRONG_THREAD;
}
context = context_acquire(device, NULL, 0);
}
context = context_acquire(device, query->context->current_rt.texture,
query->context->current_rt.sub_resource_idx);
gl_info = context->gl_info;
if (gl_info->supported[ARB_SYNC])
{
@ -216,24 +219,21 @@ void wined3d_event_query_issue(struct wined3d_event_query *query, const struct w
if (query->context)
{
if (!query->context->gl_info->supported[ARB_SYNC] && query->context->tid != GetCurrentThreadId())
if (!(context = context_reacquire(device, query->context))
&& !query->context->gl_info->supported[ARB_SYNC])
{
context_free_event_query(query);
context = context_acquire(device, NULL, 0);
context_alloc_event_query(context, query);
}
else
{
context = context_acquire(device, query->context->current_rt.texture,
query->context->current_rt.sub_resource_idx);
}
if (!context)
context = context_acquire(device, NULL, 0);
}
else
{
context = context_acquire(device, NULL, 0);
context_alloc_event_query(context, query);
}
gl_info = context->gl_info;
if (gl_info->supported[ARB_SYNC])
@ -378,15 +378,12 @@ static BOOL wined3d_occlusion_query_ops_poll(struct wined3d_query *query, DWORD
TRACE("query %p, flags %#x.\n", query, flags);
if (oq->context->tid != GetCurrentThreadId())
if (!(context = context_reacquire(device, oq->context)))
{
FIXME("%p Wrong thread, returning 1.\n", query);
oq->samples = 1;
return TRUE;
}
context = context_acquire(device, oq->context->current_rt.texture,
oq->context->current_rt.sub_resource_idx);
gl_info = context->gl_info;
GL_EXTCALL(glGetQueryObjectuiv(oq->id, GL_QUERY_RESULT_AVAILABLE, &available));
@ -494,28 +491,24 @@ static void wined3d_occlusion_query_ops_issue(struct wined3d_query *query, DWORD
{
if (query->state == QUERY_BUILDING)
{
if (oq->context->tid != GetCurrentThreadId())
if ((context = context_reacquire(device, oq->context)))
{
FIXME("Wrong thread, can't restart query.\n");
context_free_occlusion_query(oq);
context = context_acquire(query->device, NULL, 0);
context_alloc_occlusion_query(context, oq);
GL_EXTCALL(glEndQuery(GL_SAMPLES_PASSED));
checkGLcall("glEndQuery()");
}
else
{
context = context_acquire(device, oq->context->current_rt.texture,
oq->context->current_rt.sub_resource_idx);
GL_EXTCALL(glEndQuery(GL_SAMPLES_PASSED));
checkGLcall("glEndQuery()");
FIXME("Wrong thread, can't restart query.\n");
context_free_occlusion_query(oq);
context = context_acquire(device, NULL, 0);
context_alloc_occlusion_query(context, oq);
}
}
else
{
if (oq->context)
context_free_occlusion_query(oq);
context = context_acquire(query->device, NULL, 0);
context = context_acquire(device, NULL, 0);
context_alloc_occlusion_query(context, oq);
}
@ -531,20 +524,17 @@ static void wined3d_occlusion_query_ops_issue(struct wined3d_query *query, DWORD
* so avoid generating an error. */
if (query->state == QUERY_BUILDING)
{
if (oq->context->tid != GetCurrentThreadId())
if ((context = context_reacquire(device, oq->context)))
{
FIXME("Wrong thread, can't end query.\n");
}
else
{
context = context_acquire(device, oq->context->current_rt.texture,
oq->context->current_rt.sub_resource_idx);
GL_EXTCALL(glEndQuery(GL_SAMPLES_PASSED));
checkGLcall("glEndQuery()");
context_release(context);
}
else
{
FIXME("Wrong thread, can't end query.\n");
}
}
}
}
@ -560,15 +550,12 @@ static BOOL wined3d_timestamp_query_ops_poll(struct wined3d_query *query, DWORD
TRACE("query %p, flags %#x.\n", query, flags);
if (tq->context->tid != GetCurrentThreadId())
if (!(context = context_reacquire(device, tq->context)))
{
FIXME("%p Wrong thread, returning 1.\n", query);
tq->timestamp = 1;
return TRUE;
}
context = context_acquire(device, tq->context->current_rt.texture,
tq->context->current_rt.sub_resource_idx);
gl_info = context->gl_info;
GL_EXTCALL(glGetQueryObjectuiv(tq->id, GL_QUERY_RESULT_AVAILABLE, &available));

View File

@ -1933,6 +1933,8 @@ void context_gl_resource_released(struct wined3d_device *device,
GLuint name, BOOL rb_namespace) DECLSPEC_HIDDEN;
void context_invalidate_compute_state(struct wined3d_context *context, DWORD state_id) DECLSPEC_HIDDEN;
void context_invalidate_state(struct wined3d_context *context, DWORD state_id) DECLSPEC_HIDDEN;
struct wined3d_context *context_reacquire(const struct wined3d_device *device,
struct wined3d_context *context) DECLSPEC_HIDDEN;
void context_release(struct wined3d_context *context) DECLSPEC_HIDDEN;
void context_resource_released(const struct wined3d_device *device,
struct wined3d_resource *resource, enum wined3d_resource_type type) DECLSPEC_HIDDEN;