From 8bae8ca723ddf7368457996c0e265c395bf14eec Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Thu, 10 Sep 2020 11:30:49 -0400 Subject: [PATCH] zink: always use 64bit flag for query results this is just much, much easier to handle, and it also lets us fix some lingering bugs with query handling that led to inconsistent results Acked-by: Dave Airlie Part-of: --- src/gallium/drivers/zink/zink_query.c | 23 +++++++---------------- 1 file changed, 7 insertions(+), 16 deletions(-) diff --git a/src/gallium/drivers/zink/zink_query.c b/src/gallium/drivers/zink/zink_query.c index a8f6a7d8776..0058d06c33b 100644 --- a/src/gallium/drivers/zink/zink_query.c +++ b/src/gallium/drivers/zink/zink_query.c @@ -22,7 +22,6 @@ struct zink_query { VkQueryType vkqtype; unsigned index; - bool use_64bit; bool precise; bool xfb_running; bool xfb_overflow; @@ -81,31 +80,25 @@ timestamp_to_nanoseconds(struct zink_screen *screen, uint64_t *timestamp) } static VkQueryType -convert_query_type(unsigned query_type, bool *use_64bit, bool *precise) +convert_query_type(unsigned query_type, bool *precise) { - *use_64bit = false; *precise = false; switch (query_type) { case PIPE_QUERY_OCCLUSION_COUNTER: *precise = true; - *use_64bit = true; /* fallthrough */ case PIPE_QUERY_OCCLUSION_PREDICATE: case PIPE_QUERY_OCCLUSION_PREDICATE_CONSERVATIVE: return VK_QUERY_TYPE_OCCLUSION; case PIPE_QUERY_TIME_ELAPSED: case PIPE_QUERY_TIMESTAMP: - *use_64bit = true; return VK_QUERY_TYPE_TIMESTAMP; case PIPE_QUERY_PIPELINE_STATISTICS_SINGLE: - *use_64bit = true; - /* fallthrough */ case PIPE_QUERY_PRIMITIVES_GENERATED: return VK_QUERY_TYPE_PIPELINE_STATISTICS; case PIPE_QUERY_SO_OVERFLOW_ANY_PREDICATE: case PIPE_QUERY_SO_OVERFLOW_PREDICATE: case PIPE_QUERY_PRIMITIVES_EMITTED: - *use_64bit = true; return VK_QUERY_TYPE_TRANSFORM_FEEDBACK_STREAM_EXT; default: debug_printf("unknown query: %s\n", @@ -163,7 +156,7 @@ zink_create_query(struct pipe_context *pctx, query->index = index; query->type = query_type; - query->vkqtype = convert_query_type(query_type, &query->use_64bit, &query->precise); + query->vkqtype = convert_query_type(query_type, &query->precise); if (query->vkqtype == -1) return NULL; @@ -290,7 +283,7 @@ check_query_results(struct zink_query *query, union pipe_query_result *result, result->u64 += xfb_results[i + 1]; else /* if a given draw had a geometry shader, we need to use the second result */ - result->u64 += ((uint32_t*)results)[i + query->have_gs[query->last_start + i / 2]]; + result->u64 += results[i + query->have_gs[query->last_start + i / 2]]; break; case PIPE_QUERY_PRIMITIVES_EMITTED: /* A query pool created with this type will capture 2 integers - @@ -335,8 +328,7 @@ get_query_result(struct pipe_context *pctx, if (wait) flags |= VK_QUERY_RESULT_WAIT_BIT; - if (query->use_64bit) - flags |= VK_QUERY_RESULT_64_BIT; + flags |= VK_QUERY_RESULT_64_BIT; if (result != &query->accumulated_result) { if (query->type == PIPE_QUERY_TIMESTAMP || @@ -370,7 +362,7 @@ get_query_result(struct pipe_context *pctx, last_start, num_results, sizeof(results), results, - sizeof(uint64_t), + sizeof(uint64_t) * result_size, flags); if (status != VK_SUCCESS) return false; @@ -397,7 +389,7 @@ get_query_result(struct pipe_context *pctx, query->last_start, num_results, sizeof(results), results, - sizeof(uint64_t), + sizeof(uint64_t) * 2, flags); if (status != VK_SUCCESS) return false; @@ -733,8 +725,7 @@ zink_render_condition(struct pipe_context *pctx, if (mode == PIPE_RENDER_COND_WAIT || mode == PIPE_RENDER_COND_BY_REGION_WAIT) flags |= VK_QUERY_RESULT_WAIT_BIT; - if (query->use_64bit) - flags |= VK_QUERY_RESULT_64_BIT; + flags |= VK_QUERY_RESULT_64_BIT; int num_results = query->curr_query - query->last_start; if (query->type != PIPE_QUERY_PRIMITIVES_GENERATED && !is_so_overflow_query(query)) {