unsigned fences;
struct list_head active_list;
+
+ union pipe_query_result accumulated_result;
};
static VkQueryType
/* ignore begin_query for timestamps */
if (query->type == PIPE_QUERY_TIMESTAMP)
return true;
+ util_query_clear_result(&query->accumulated_result, query->type);
begin_query(zink_context(pctx), batch, query);
if (query->use_64bit)
flags |= VK_QUERY_RESULT_64_BIT;
+ if (result != &query->accumulated_result) {
+ memcpy(result, &query->accumulated_result, sizeof(query->accumulated_result));
+ util_query_clear_result(&query->accumulated_result, query->type);
+ } else {
+ assert(query->vkqtype != VK_QUERY_TYPE_TIMESTAMP);
+ flags |= VK_QUERY_RESULT_PARTIAL_BIT;
+ }
+
// union pipe_query_result results[NUM_QUERIES * 2];
/* xfb queries return 2 results */
uint64_t results[NUM_QUERIES * 2];
memset(results, 0, sizeof(results));
int num_results = query->curr_query - query->last_checked_query;
if (query->vkqtype == VK_QUERY_TYPE_TRANSFORM_FEEDBACK_STREAM_EXT) {
- char tf_result[16] = {};
/* this query emits 2 values */
assert(query->curr_query <= ARRAY_SIZE(results) / 2);
VkResult status = vkGetQueryPoolResults(screen->dev, query->query_pool,
flags);
if (status != VK_SUCCESS)
return false;
- memcpy(result, tf_result + (query->type == PIPE_QUERY_PRIMITIVES_GENERATED ? 8 : 0), 8);
/* multiply for correct looping behavior below */
num_results *= 2;
} else {
return false;
}
- util_query_clear_result(result, query->type);
for (int i = 0; i < num_results; ++i) {
switch (query->type) {
case PIPE_QUERY_OCCLUSION_PREDICATE:
else
vkCmdEndQuery(batch->cmdbuf, q->query_pool, q->curr_query);
if (++q->curr_query == q->num_queries) {
+ get_query_result(&ctx->base, (struct pipe_query*)q, false, &q->accumulated_result);
vkCmdResetQueryPool(batch->cmdbuf, q->query_pool, 0, q->num_queries);
q->last_checked_query = q->curr_query = 0;
}