From 9c4b4e8809f1e6e076c01ba7b11dc1636c2a26b4 Mon Sep 17 00:00:00 2001 From: Axel Davy Date: Sun, 13 Nov 2016 16:28:33 +0100 Subject: [PATCH] st/nine: Avoid flushing the queue for queries GetData Use the newly introduced counter to know when we don't need synchronization. Signed-off-by: Axel Davy --- src/gallium/state_trackers/nine/nine_state.c | 33 +++++++++++++++++++--------- src/gallium/state_trackers/nine/nine_state.h | 6 ++--- src/gallium/state_trackers/nine/query9.c | 12 +++++----- src/gallium/state_trackers/nine/query9.h | 1 + 4 files changed, 33 insertions(+), 19 deletions(-) diff --git a/src/gallium/state_trackers/nine/nine_state.c b/src/gallium/state_trackers/nine/nine_state.c index 56a3152..d09dabc 100644 --- a/src/gallium/state_trackers/nine/nine_state.c +++ b/src/gallium/state_trackers/nine/nine_state.c @@ -2712,16 +2712,16 @@ CSMT_ITEM_DO_WAIT(nine_context_destroy_query, context->pipe->destroy_query(context->pipe, query); } -CSMT_ITEM_NO_WAIT(nine_context_begin_query, - ARG_REF(struct pipe_query, query)) +CSMT_ITEM_NO_WAIT_WITH_COUNTER(nine_context_begin_query, + ARG_REF(struct pipe_query, query)) { struct nine_context *context = &device->context; (void) context->pipe->begin_query(context->pipe, query); } -CSMT_ITEM_NO_WAIT(nine_context_end_query, - ARG_REF(struct pipe_query, query)) +CSMT_ITEM_NO_WAIT_WITH_COUNTER(nine_context_end_query, + ARG_REF(struct pipe_query, query)) { struct nine_context *context = &device->context; @@ -2730,15 +2730,28 @@ CSMT_ITEM_NO_WAIT(nine_context_end_query, boolean nine_context_get_query_result(struct NineDevice9 *device, struct pipe_query *query, - boolean flush, boolean wait, + unsigned *counter, boolean flush, boolean wait, union pipe_query_result *result) { - struct nine_context *context = &device->context; + struct pipe_context *pipe; + boolean ret; - (void) flush; - if (device->csmt_active) - nine_csmt_process(device); - return context->pipe->get_query_result(context->pipe, query, wait, result); + if (wait) { + if (device->csmt_active) + nine_csmt_process(device); + } else if (p_atomic_read(counter) > 0) { + if (flush && device->csmt_active) + nine_queue_flush(device->csmt_ctx->pool); + DBG("Pending begin/end. Returning\n"); + return false; + } + + pipe = nine_context_get_pipe_acquire(device); + ret = pipe->get_query_result(pipe, query, wait, result); + nine_context_get_pipe_release(device); + + DBG("Query result %s\n", ret ? "found" : "not yet available"); + return ret; } /* State defaults */ diff --git a/src/gallium/state_trackers/nine/nine_state.h b/src/gallium/state_trackers/nine/nine_state.h index 421f8f9..6578be3 100644 --- a/src/gallium/state_trackers/nine/nine_state.h +++ b/src/gallium/state_trackers/nine/nine_state.h @@ -546,14 +546,14 @@ void nine_context_destroy_query(struct NineDevice9 *device, struct pipe_query *query); void -nine_context_begin_query(struct NineDevice9 *device, struct pipe_query *query); +nine_context_begin_query(struct NineDevice9 *device, unsigned *counter, struct pipe_query *query); void -nine_context_end_query(struct NineDevice9 *device, struct pipe_query *query); +nine_context_end_query(struct NineDevice9 *device, unsigned *counter, struct pipe_query *query); boolean nine_context_get_query_result(struct NineDevice9 *device, struct pipe_query *query, - boolean flush, boolean wait, + unsigned *counter, boolean flush, boolean wait, union pipe_query_result *result); void nine_state_restore_non_cso(struct NineDevice9 *device); diff --git a/src/gallium/state_trackers/nine/query9.c b/src/gallium/state_trackers/nine/query9.c index 6bba4a7..d98db9e 100644 --- a/src/gallium/state_trackers/nine/query9.c +++ b/src/gallium/state_trackers/nine/query9.c @@ -139,7 +139,7 @@ NineQuery9_dtor( struct NineQuery9 *This ) if (This->pq) { if (This->state == NINE_QUERY_STATE_RUNNING) - nine_context_end_query(device, This->pq); + nine_context_end_query(device, &This->counter, This->pq); nine_context_destroy_query(device, This->pq); } @@ -177,15 +177,15 @@ NineQuery9_Issue( struct NineQuery9 *This, if (dwIssueFlags == D3DISSUE_BEGIN) { if (This->state == NINE_QUERY_STATE_RUNNING) - nine_context_end_query(device, This->pq); - nine_context_begin_query(device, This->pq); + nine_context_end_query(device, &This->counter, This->pq); + nine_context_begin_query(device, &This->counter, This->pq); This->state = NINE_QUERY_STATE_RUNNING; } else { if (This->state != NINE_QUERY_STATE_RUNNING && This->type != D3DQUERYTYPE_EVENT && This->type != D3DQUERYTYPE_TIMESTAMP) - nine_context_begin_query(device, This->pq); - nine_context_end_query(device, This->pq); + nine_context_begin_query(device, &This->counter, This->pq); + nine_context_end_query(device, &This->counter, This->pq); This->state = NINE_QUERY_STATE_ENDED; } return D3D_OK; @@ -240,7 +240,7 @@ NineQuery9_GetData( struct NineQuery9 *This, /* Note: We ignore dwGetDataFlags, because get_query_result will * flush automatically if needed */ - ok = nine_context_get_query_result(device, This->pq, + ok = nine_context_get_query_result(device, This->pq, &This->counter, !!(dwGetDataFlags & D3DGETDATA_FLUSH), wait_query_result, &presult); diff --git a/src/gallium/state_trackers/nine/query9.h b/src/gallium/state_trackers/nine/query9.h index 6397a4c..cc6c717 100644 --- a/src/gallium/state_trackers/nine/query9.h +++ b/src/gallium/state_trackers/nine/query9.h @@ -40,6 +40,7 @@ struct NineQuery9 D3DQUERYTYPE type; enum nine_query_state state; boolean instant; /* true if D3DISSUE_BEGIN is not needed / invalid */ + unsigned counter; /* Number of pending Begin/End (0 if internal multithreading off) */ }; static inline struct NineQuery9 * NineQuery9( void *data ) -- 2.7.4