Signed-off-by: Henri Verbeet <hverbeet(a)codeweavers.com>
---
dlls/wined3d/context.c | 25 +++----
dlls/wined3d/query.c | 148 ++++++++++++++++++++---------------------
dlls/wined3d/wined3d_private.h | 3 +-
3 files changed, 86 insertions(+), 90 deletions(-)
diff --git a/dlls/wined3d/context.c b/dlls/wined3d/context.c
index 0f107502f5c..2e562844194 100644
--- a/dlls/wined3d/context.c
+++ b/dlls/wined3d/context.c
@@ -4259,27 +4259,28 @@ struct wined3d_context *wined3d_context_gl_acquire(const struct wined3d_device *
return context;
}
-struct wined3d_context *context_reacquire(struct wined3d_device *device,
- struct wined3d_context *context)
+struct wined3d_context_gl *wined3d_context_gl_reacquire(struct wined3d_context_gl *context_gl)
{
struct wined3d_context *acquired_context;
+ struct wined3d_device *device;
- wined3d_from_cs(device->cs);
-
- if (!context || context->tid != GetCurrentThreadId())
+ if (!context_gl || context_gl->c.tid != GetCurrentThreadId())
return NULL;
- if (context->current_rt.texture)
+ device = context_gl->c.device;
+ wined3d_from_cs(device->cs);
+
+ if (context_gl->c.current_rt.texture)
{
- wined3d_context_gl_activate(wined3d_context_gl(context),
- context->current_rt.texture, context->current_rt.sub_resource_idx);
- return context;
+ wined3d_context_gl_activate(context_gl, context_gl->c.current_rt.texture,
+ context_gl->c.current_rt.sub_resource_idx);
+ return context_gl;
}
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;
+ if (acquired_context != &context_gl->c)
+ ERR("Acquired context %p instead of %p.\n", acquired_context, &context_gl->c);
+ return wined3d_context_gl(acquired_context);
}
void dispatch_compute(struct wined3d_device *device, const struct wined3d_state *state,
diff --git a/dlls/wined3d/query.c b/dlls/wined3d/query.c
index eeec8e25098..58e757c855b 100644
--- a/dlls/wined3d/query.c
+++ b/dlls/wined3d/query.c
@@ -183,7 +183,7 @@ static enum wined3d_fence_result wined3d_fence_test(const struct wined3d_fence *
struct wined3d_device *device, DWORD flags)
{
const struct wined3d_gl_info *gl_info;
- struct wined3d_context *context;
+ struct wined3d_context_gl *context_gl;
enum wined3d_fence_result ret;
BOOL fence_result;
@@ -195,16 +195,16 @@ static enum wined3d_fence_result wined3d_fence_test(const struct wined3d_fence *
return WINED3D_FENCE_NOT_STARTED;
}
- if (!(context = context_reacquire(device, &fence->context_gl->c)))
+ if (!(context_gl = wined3d_context_gl_reacquire(fence->context_gl)))
{
if (!fence->context_gl->c.gl_info->supported[ARB_SYNC])
{
WARN("Fence tested from wrong thread.\n");
return WINED3D_FENCE_WRONG_THREAD;
}
- context = context_acquire(device, NULL, 0);
+ context_gl = wined3d_context_gl(context_acquire(device, NULL, 0));
}
- gl_info = context->gl_info;
+ gl_info = context_gl->c.gl_info;
if (gl_info->supported[ARB_SYNC])
{
@@ -253,7 +253,7 @@ static enum wined3d_fence_result wined3d_fence_test(const struct wined3d_fence *
ret = WINED3D_FENCE_ERROR;
}
- context_release(context);
+ context_release(&context_gl->c);
return ret;
}
@@ -261,7 +261,7 @@ enum wined3d_fence_result wined3d_fence_wait(const struct wined3d_fence *fence,
struct wined3d_device *device)
{
const struct wined3d_gl_info *gl_info;
- struct wined3d_context *context;
+ struct wined3d_context_gl *context_gl;
enum wined3d_fence_result ret;
TRACE("fence %p, device %p.\n", fence, device);
@@ -273,7 +273,7 @@ enum wined3d_fence_result wined3d_fence_wait(const struct wined3d_fence *fence,
}
gl_info = fence->context_gl->c.gl_info;
- if (!(context = context_reacquire(device, &fence->context_gl->c)))
+ if (!(context_gl = wined3d_context_gl_reacquire(fence->context_gl)))
{
/* 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
@@ -283,9 +283,9 @@ enum wined3d_fence_result wined3d_fence_wait(const struct wined3d_fence *fence,
WARN("Fence finished from wrong thread.\n");
return WINED3D_FENCE_WRONG_THREAD;
}
- context = context_acquire(device, NULL, 0);
+ context_gl = wined3d_context_gl(context_acquire(device, NULL, 0));
}
- gl_info = context->gl_info;
+ gl_info = context_gl->c.gl_info;
if (gl_info->supported[ARB_SYNC])
{
@@ -310,13 +310,13 @@ enum wined3d_fence_result wined3d_fence_wait(const struct wined3d_fence *fence,
ret = WINED3D_FENCE_ERROR;
}
}
- else if (context->gl_info->supported[APPLE_FENCE])
+ else if (gl_info->supported[APPLE_FENCE])
{
GL_EXTCALL(glFinishFenceAPPLE(fence->object.id));
checkGLcall("glFinishFenceAPPLE");
ret = WINED3D_FENCE_OK;
}
- else if (context->gl_info->supported[NV_FENCE])
+ else if (gl_info->supported[NV_FENCE])
{
GL_EXTCALL(glFinishFenceNV(fence->object.id));
checkGLcall("glFinishFenceNV");
@@ -328,23 +328,23 @@ enum wined3d_fence_result wined3d_fence_wait(const struct wined3d_fence *fence,
ret = WINED3D_FENCE_ERROR;
}
- context_release(context);
+ context_release(&context_gl->c);
return ret;
}
void wined3d_fence_issue(struct wined3d_fence *fence, struct wined3d_device *device)
{
- struct wined3d_context *context = NULL;
+ struct wined3d_context_gl *context_gl = NULL;
const struct wined3d_gl_info *gl_info;
- if (fence->context_gl && !(context = context_reacquire(device, &fence->context_gl->c))
+ if (fence->context_gl && !(context_gl = wined3d_context_gl_reacquire(fence->context_gl))
&& !fence->context_gl->c.gl_info->supported[ARB_SYNC])
wined3d_context_gl_free_fence(fence);
- if (!context)
- context = context_acquire(device, NULL, 0);
- gl_info = context->gl_info;
+ if (!context_gl)
+ context_gl = wined3d_context_gl(context_acquire(device, NULL, 0));
+ gl_info = context_gl->c.gl_info;
if (!fence->context_gl)
- wined3d_context_gl_alloc_fence(wined3d_context_gl(context), fence);
+ wined3d_context_gl_alloc_fence(context_gl, fence);
if (gl_info->supported[ARB_SYNC])
{
@@ -365,7 +365,7 @@ void wined3d_fence_issue(struct wined3d_fence *fence, struct wined3d_device *dev
checkGLcall("glSetFenceNV");
}
- context_release(context);
+ context_release(&context_gl->c);
}
static void wined3d_fence_free(struct wined3d_fence *fence)
@@ -531,20 +531,19 @@ HRESULT CDECL wined3d_query_issue(struct wined3d_query *query, DWORD flags)
static BOOL wined3d_occlusion_query_ops_poll(struct wined3d_query *query, DWORD flags)
{
struct wined3d_occlusion_query *oq = wined3d_occlusion_query_from_query(query);
- struct wined3d_device *device = query->device;
const struct wined3d_gl_info *gl_info;
- struct wined3d_context *context;
+ struct wined3d_context_gl *context_gl;
GLuint available;
TRACE("query %p, flags %#x.\n", query, flags);
- if (!(context = context_reacquire(device, &oq->context_gl->c)))
+ if (!(context_gl = wined3d_context_gl_reacquire(oq->context_gl)))
{
FIXME("%p Wrong thread, returning 1.\n", query);
oq->samples = 1;
return TRUE;
}
- gl_info = context->gl_info;
+ gl_info = context_gl->c.gl_info;
GL_EXTCALL(glGetQueryObjectuiv(oq->id, GL_QUERY_RESULT_AVAILABLE, &available));
TRACE("Available %#x.\n", available);
@@ -556,7 +555,7 @@ static BOOL wined3d_occlusion_query_ops_poll(struct wined3d_query *query, DWORD
}
checkGLcall("poll occlusion query");
- context_release(context);
+ context_release(&context_gl->c);
return available;
}
@@ -631,7 +630,7 @@ static BOOL wined3d_occlusion_query_ops_issue(struct wined3d_query *query, DWORD
struct wined3d_occlusion_query *oq = wined3d_occlusion_query_from_query(query);
struct wined3d_device *device = query->device;
const struct wined3d_gl_info *gl_info;
- struct wined3d_context *context;
+ struct wined3d_context_gl *context_gl;
BOOL poll = FALSE;
TRACE("query %p, flags %#x.\n", query, flags);
@@ -642,9 +641,9 @@ static BOOL wined3d_occlusion_query_ops_issue(struct wined3d_query *query, DWORD
{
if (oq->started)
{
- if ((context = context_reacquire(device, &oq->context_gl->c)))
+ if ((context_gl = wined3d_context_gl_reacquire(oq->context_gl)))
{
- gl_info = context->gl_info;
+ gl_info = context_gl->c.gl_info;
GL_EXTCALL(glEndQuery(GL_SAMPLES_PASSED));
checkGLcall("glEndQuery()");
}
@@ -652,23 +651,23 @@ static BOOL wined3d_occlusion_query_ops_issue(struct wined3d_query *query, DWORD
{
FIXME("Wrong thread, can't restart query.\n");
wined3d_context_gl_free_occlusion_query(oq);
- context = context_acquire(device, NULL, 0);
- wined3d_context_gl_alloc_occlusion_query(wined3d_context_gl(context), oq);
+ context_gl = wined3d_context_gl(context_acquire(device, NULL, 0));
+ wined3d_context_gl_alloc_occlusion_query(context_gl, oq);
}
}
else
{
if (oq->context_gl)
wined3d_context_gl_free_occlusion_query(oq);
- context = context_acquire(device, NULL, 0);
- wined3d_context_gl_alloc_occlusion_query(wined3d_context_gl(context), oq);
+ context_gl = wined3d_context_gl(context_acquire(device, NULL, 0));
+ wined3d_context_gl_alloc_occlusion_query(context_gl, oq);
}
- gl_info = context->gl_info;
+ gl_info = context_gl->c.gl_info;
GL_EXTCALL(glBeginQuery(GL_SAMPLES_PASSED, oq->id));
checkGLcall("glBeginQuery()");
- context_release(context);
+ context_release(&context_gl->c);
oq->started = TRUE;
}
if (flags & WINED3DISSUE_END)
@@ -678,14 +677,14 @@ static BOOL wined3d_occlusion_query_ops_issue(struct wined3d_query *query, DWORD
* so avoid generating an error. */
if (oq->started)
{
- if ((context = context_reacquire(device, &oq->context_gl->c)))
+ if ((context_gl = wined3d_context_gl_reacquire(oq->context_gl)))
{
- gl_info = context->gl_info;
+ gl_info = context_gl->c.gl_info;
GL_EXTCALL(glEndQuery(GL_SAMPLES_PASSED));
checkGLcall("glEndQuery()");
- wined3d_query_buffer_queue_result(context, query, oq->id);
+ wined3d_query_buffer_queue_result(&context_gl->c, query, oq->id);
- context_release(context);
+ context_release(&context_gl->c);
poll = TRUE;
}
else
@@ -702,21 +701,20 @@ static BOOL wined3d_occlusion_query_ops_issue(struct wined3d_query *query, DWORD
static BOOL wined3d_timestamp_query_ops_poll(struct wined3d_query *query, DWORD flags)
{
struct wined3d_timestamp_query *tq = wined3d_timestamp_query_from_query(query);
- struct wined3d_device *device = query->device;
const struct wined3d_gl_info *gl_info;
- struct wined3d_context *context;
+ struct wined3d_context_gl *context_gl;
GLuint64 timestamp;
GLuint available;
TRACE("query %p, flags %#x.\n", query, flags);
- if (!(context = context_reacquire(device, &tq->context_gl->c)))
+ if (!(context_gl = wined3d_context_gl_reacquire(tq->context_gl)))
{
FIXME("%p Wrong thread, returning 1.\n", query);
tq->timestamp = 1;
return TRUE;
}
- gl_info = context->gl_info;
+ gl_info = context_gl->c.gl_info;
GL_EXTCALL(glGetQueryObjectuiv(tq->id, GL_QUERY_RESULT_AVAILABLE, &available));
checkGLcall("glGetQueryObjectuiv(GL_QUERY_RESULT_AVAILABLE)");
@@ -730,7 +728,7 @@ static BOOL wined3d_timestamp_query_ops_poll(struct wined3d_query *query, DWORD
tq->timestamp = timestamp;
}
- context_release(context);
+ context_release(&context_gl->c);
return available;
}
@@ -781,20 +779,19 @@ static BOOL wined3d_timestamp_disjoint_query_ops_issue(struct wined3d_query *que
static BOOL wined3d_so_statistics_query_ops_poll(struct wined3d_query *query, DWORD flags)
{
struct wined3d_so_statistics_query *pq = wined3d_so_statistics_query_from_query(query);
- struct wined3d_device *device = query->device;
GLuint written_available, generated_available;
const struct wined3d_gl_info *gl_info;
- struct wined3d_context *context;
+ struct wined3d_context_gl *context_gl;
TRACE("query %p, flags %#x.\n", query, flags);
- if (!(context = context_reacquire(device, &pq->context_gl->c)))
+ if (!(context_gl = wined3d_context_gl_reacquire(pq->context_gl)))
{
FIXME("%p Wrong thread, returning 0 primitives.\n", query);
memset(&pq->statistics, 0, sizeof(pq->statistics));
return TRUE;
}
- gl_info = context->gl_info;
+ gl_info = context_gl->c.gl_info;
GL_EXTCALL(glGetQueryObjectuiv(pq->u.query.written,
GL_QUERY_RESULT_AVAILABLE, &written_available));
@@ -812,7 +809,7 @@ static BOOL wined3d_so_statistics_query_ops_poll(struct wined3d_query *query, DW
}
checkGLcall("poll SO statistics query");
- context_release(context);
+ context_release(&context_gl->c);
return written_available && generated_available;
}
@@ -840,7 +837,7 @@ static BOOL wined3d_so_statistics_query_ops_issue(struct wined3d_query *query, D
struct wined3d_so_statistics_query *pq = wined3d_so_statistics_query_from_query(query);
struct wined3d_device *device = query->device;
const struct wined3d_gl_info *gl_info;
- struct wined3d_context *context;
+ struct wined3d_context_gl *context_gl;
BOOL poll = FALSE;
TRACE("query %p, flags %#x.\n", query, flags);
@@ -849,26 +846,26 @@ static BOOL wined3d_so_statistics_query_ops_issue(struct wined3d_query *query, D
{
if (pq->started)
{
- if ((context = context_reacquire(device, &pq->context_gl->c)))
+ if ((context_gl = wined3d_context_gl_reacquire(pq->context_gl)))
{
- wined3d_so_statistics_query_end(pq, context);
+ wined3d_so_statistics_query_end(pq, &context_gl->c);
}
else
{
FIXME("Wrong thread, can't restart query.\n");
wined3d_context_gl_free_so_statistics_query(pq);
- context = context_acquire(device, NULL, 0);
- wined3d_context_gl_alloc_so_statistics_query(wined3d_context_gl(context), pq);
+ context_gl = wined3d_context_gl(context_acquire(device, NULL, 0));
+ wined3d_context_gl_alloc_so_statistics_query(context_gl, pq);
}
}
else
{
if (pq->context_gl)
wined3d_context_gl_free_so_statistics_query(pq);
- context = context_acquire(device, NULL, 0);
- wined3d_context_gl_alloc_so_statistics_query(wined3d_context_gl(context), pq);
+ context_gl = wined3d_context_gl(context_acquire(device, NULL, 0));
+ wined3d_context_gl_alloc_so_statistics_query(context_gl, pq);
}
- gl_info = context->gl_info;
+ gl_info = context_gl->c.gl_info;
if (gl_info->supported[ARB_TRANSFORM_FEEDBACK3])
{
@@ -886,18 +883,18 @@ static BOOL wined3d_so_statistics_query_ops_issue(struct wined3d_query *query, D
}
checkGLcall("begin query");
- context_release(context);
+ context_release(&context_gl->c);
pq->started = TRUE;
}
if (flags & WINED3DISSUE_END)
{
if (pq->started)
{
- if ((context = context_reacquire(device, &pq->context_gl->c)))
+ if ((context_gl = wined3d_context_gl_reacquire(pq->context_gl)))
{
- wined3d_so_statistics_query_end(pq, context);
+ wined3d_so_statistics_query_end(pq, &context_gl->c);
- context_release(context);
+ context_release(&context_gl->c);
poll = TRUE;
}
else
@@ -914,21 +911,20 @@ static BOOL wined3d_so_statistics_query_ops_issue(struct wined3d_query *query, D
static BOOL wined3d_pipeline_query_ops_poll(struct wined3d_query *query, DWORD flags)
{
struct wined3d_pipeline_statistics_query *pq = wined3d_pipeline_statistics_query_from_query(query);
- struct wined3d_device *device = query->device;
const struct wined3d_gl_info *gl_info;
- struct wined3d_context *context;
+ struct wined3d_context_gl *context_gl;
GLuint available;
int i;
TRACE("query %p, flags %#x.\n", query, flags);
- if (!(context = context_reacquire(device, &pq->context_gl->c)))
+ if (!(context_gl = wined3d_context_gl_reacquire(pq->context_gl)))
{
FIXME("%p Wrong thread.\n", query);
memset(&pq->statistics, 0, sizeof(pq->statistics));
return TRUE;
}
- gl_info = context->gl_info;
+ gl_info = context_gl->c.gl_info;
for (i = 0; i < ARRAY_SIZE(pq->u.id); ++i)
{
@@ -953,7 +949,7 @@ static BOOL wined3d_pipeline_query_ops_poll(struct wined3d_query *query, DWORD f
}
checkGLcall("poll pipeline statistics query");
- context_release(context);
+ context_release(&context_gl->c);
return available;
}
@@ -981,7 +977,7 @@ static BOOL wined3d_pipeline_query_ops_issue(struct wined3d_query *query, DWORD
struct wined3d_pipeline_statistics_query *pq = wined3d_pipeline_statistics_query_from_query(query);
struct wined3d_device *device = query->device;
const struct wined3d_gl_info *gl_info;
- struct wined3d_context *context;
+ struct wined3d_context_gl *context_gl;
BOOL poll = FALSE;
TRACE("query %p, flags %#x.\n", query, flags);
@@ -990,26 +986,26 @@ static BOOL wined3d_pipeline_query_ops_issue(struct wined3d_query *query, DWORD
{
if (pq->started)
{
- if ((context = context_reacquire(device, &pq->context_gl->c)))
+ if ((context_gl = wined3d_context_gl_reacquire(pq->context_gl)))
{
- wined3d_pipeline_statistics_query_end(pq, context);
+ wined3d_pipeline_statistics_query_end(pq, &context_gl->c);
}
else
{
FIXME("Wrong thread, can't restart query.\n");
wined3d_context_gl_free_pipeline_statistics_query(pq);
- context = context_acquire(device, NULL, 0);
- wined3d_context_gl_alloc_pipeline_statistics_query(wined3d_context_gl(context), pq);
+ context_gl = wined3d_context_gl(context_acquire(device, NULL, 0));
+ wined3d_context_gl_alloc_pipeline_statistics_query(context_gl, pq);
}
}
else
{
if (pq->context_gl)
wined3d_context_gl_free_pipeline_statistics_query(pq);
- context = context_acquire(device, NULL, 0);
- wined3d_context_gl_alloc_pipeline_statistics_query(wined3d_context_gl(context), pq);
+ context_gl = wined3d_context_gl(context_acquire(device, NULL, 0));
+ wined3d_context_gl_alloc_pipeline_statistics_query(context_gl, pq);
}
- gl_info = context->gl_info;
+ gl_info = context_gl->c.gl_info;
GL_EXTCALL(glBeginQuery(GL_VERTICES_SUBMITTED_ARB, pq->u.query.vertices));
GL_EXTCALL(glBeginQuery(GL_PRIMITIVES_SUBMITTED_ARB, pq->u.query.primitives));
@@ -1024,17 +1020,17 @@ static BOOL wined3d_pipeline_query_ops_issue(struct wined3d_query *query, DWORD
GL_EXTCALL(glBeginQuery(GL_CLIPPING_OUTPUT_PRIMITIVES_ARB, pq->u.query.clipping_output));
checkGLcall("begin query");
- context_release(context);
+ context_release(&context_gl->c);
pq->started = TRUE;
}
if (flags & WINED3DISSUE_END)
{
if (pq->started)
{
- if ((context = context_reacquire(device, &pq->context_gl->c)))
+ if ((context_gl = wined3d_context_gl_reacquire(pq->context_gl)))
{
- wined3d_pipeline_statistics_query_end(pq, context);
- context_release(context);
+ wined3d_pipeline_statistics_query_end(pq, &context_gl->c);
+ context_release(&context_gl->c);
poll = TRUE;
}
else
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index 753dc8cb663..8272a56203b 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -2096,6 +2096,7 @@ HRESULT wined3d_context_gl_init(struct wined3d_context_gl *context_gl,
struct wined3d_swapchain *swapchain) DECLSPEC_HIDDEN;
void wined3d_context_gl_load_tex_coords(const struct wined3d_context_gl *context_gl,
const struct wined3d_stream_info *si, GLuint *current_bo, const struct wined3d_state *state) DECLSPEC_HIDDEN;
+struct wined3d_context_gl *wined3d_context_gl_reacquire(struct wined3d_context_gl *context_gl) DECLSPEC_HIDDEN;
void wined3d_context_gl_release(struct wined3d_context_gl *context_gl) DECLSPEC_HIDDEN;
void wined3d_context_gl_set_draw_buffer(struct wined3d_context_gl *context_gl, GLenum buffer) DECLSPEC_HIDDEN;
void wined3d_context_gl_texture_update(struct wined3d_context_gl *context_gl,
@@ -2257,8 +2258,6 @@ void context_invalidate_compute_state(struct wined3d_context *context, DWORD sta
void context_invalidate_state(struct wined3d_context *context, DWORD state_id) DECLSPEC_HIDDEN;
void *context_map_bo_address(struct wined3d_context *context, const struct wined3d_bo_address *data,
size_t size, GLenum binding, DWORD flags) DECLSPEC_HIDDEN;
-struct wined3d_context *context_reacquire(struct wined3d_device *device,
- struct wined3d_context *context) DECLSPEC_HIDDEN;
void context_resource_released(const struct wined3d_device *device, struct wined3d_resource *resource) DECLSPEC_HIDDEN;
void context_restore(struct wined3d_context *context, struct wined3d_texture *texture,
unsigned int sub_resource_idx) DECLSPEC_HIDDEN;
--
2.11.0