diff --git a/dlls/wined3d/context.c b/dlls/wined3d/context.c index 8427eb7f4fe..2e9b38ae300 100644 --- a/dlls/wined3d/context.c +++ b/dlls/wined3d/context.c @@ -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; +} diff --git a/dlls/wined3d/query.c b/dlls/wined3d/query.c index 371f7d32c4e..1927e7e2e07 100644 --- a/dlls/wined3d/query.c +++ b/dlls/wined3d/query.c @@ -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)); diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index 82aecf72be4..c824e2be094 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -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;