• Home
  • Raw
  • Download

Lines Matching full:query

57    /* Everytime the gallium query needs
58 * another vulkan query, add a new start.
67 bool active; /* query is considered active by vk */
68 bool needs_reset; /* query is considered active by vk and cannot be destroyed */
69 bool dead; /* query should be destroyed when its fence finishes */
70 bool needs_update; /* query needs to update its qbos */
71 bool needs_rast_discard_workaround; /* query needs discard disabled */
80 struct zink_batch_usage *batch_uses; //batch that the query was started in
185 /* if xfb is active, we need to use an xfb query, otherwise we need pipeline statistics */ in find_or_allocate_qp()
277 debug_printf("unknown query: %s\n", in get_num_results()
279 unreachable("zink: unknown query type"); in get_num_results()
325 debug_printf("unknown query: %s\n", in convert_query_type()
327 unreachable("zink: unknown query type"); in convert_query_type()
332 needs_stats_list(struct zink_query *query) in needs_stats_list() argument
334 return is_emulated_primgen(query) || in needs_stats_list()
335 query->type == PIPE_QUERY_SO_OVERFLOW_ANY_PREDICATE || in needs_stats_list()
336 query->type == PIPE_QUERY_SO_OVERFLOW_PREDICATE; in needs_stats_list()
340 is_time_query(struct zink_query *query) in is_time_query() argument
342 return query->type == PIPE_QUERY_TIMESTAMP || query->type == PIPE_QUERY_TIME_ELAPSED; in is_time_query()
346 is_so_overflow_query(struct zink_query *query) in is_so_overflow_query() argument
348 …return query->type == PIPE_QUERY_SO_OVERFLOW_ANY_PREDICATE || query->type == PIPE_QUERY_SO_OVERFLO… in is_so_overflow_query()
352 is_bool_query(struct zink_query *query) in is_bool_query() argument
354 return is_so_overflow_query(query) || in is_bool_query()
355 query->type == PIPE_QUERY_OCCLUSION_PREDICATE || in is_bool_query()
356 query->type == PIPE_QUERY_OCCLUSION_PREDICATE_CONSERVATIVE || in is_bool_query()
357 query->type == PIPE_QUERY_GPU_FINISHED; in is_bool_query()
361 qbo_append(struct pipe_screen *screen, struct zink_query *query) in qbo_append() argument
363 if (query->curr_qbo && query->curr_qbo->list.next) in qbo_append()
368 int num_buffers = get_num_queries(query); in qbo_append()
374 …(query->type == PIPE_QUERY_TIMESTAMP ? 1 : NUM_QUERIES) * get_num_results(query) * sizeof(uint64_t… in qbo_append()
378 list_addtail(&qbo->list, &query->buffers); in qbo_append()
379 query->buffer_count++; in qbo_append()
412 destroy_query(struct zink_context *ctx, struct zink_query *query) in destroy_query() argument
415 assert(zink_screen_usage_check_completion(screen, query->batch_uses)); in destroy_query()
418 struct zink_query_start *starts = query->starts.data; in destroy_query()
419 unsigned num_starts = query->starts.capacity / sizeof(struct zink_query_start); in destroy_query()
426 util_dynarray_fini(&query->starts); in destroy_query()
427 LIST_FOR_EACH_ENTRY_SAFE(qbo, next, &query->buffers, list) { in destroy_query()
432 pipe_resource_reference((struct pipe_resource**)&query->predicate, NULL); in destroy_query()
433 FREE(query); in destroy_query()
465 /* try and find the active query for this */ in query_pool_get_range()
503 struct zink_query *query = CALLOC_STRUCT(zink_query); in zink_create_query() local
505 if (!query) in zink_create_query()
507 list_inithead(&query->buffers); in zink_create_query()
509 query->index = index; in zink_create_query()
510 query->type = query_type; in zink_create_query()
512 if (query->type >= PIPE_QUERY_DRIVER_SPECIFIC) in zink_create_query()
513 return (struct pipe_query *)query; in zink_create_query()
515 if (query->type == PIPE_QUERY_GPU_FINISHED || query->type == PIPE_QUERY_TIMESTAMP_DISJOINT) in zink_create_query()
516 return (struct pipe_query *)query; in zink_create_query()
517 query->vkqtype = convert_query_type(screen, query_type, &query->precise); in zink_create_query()
518 if (query->vkqtype == -1) in zink_create_query()
521 util_dynarray_init(&query->starts, NULL); in zink_create_query()
523 assert(!query->precise || query->vkqtype == VK_QUERY_TYPE_OCCLUSION); in zink_create_query()
526 if (query->vkqtype == VK_QUERY_TYPE_PRIMITIVES_GENERATED_EXT && index && in zink_create_query()
528 query->vkqtype = VK_QUERY_TYPE_PIPELINE_STATISTICS; in zink_create_query()
530 if (query->vkqtype == VK_QUERY_TYPE_PRIMITIVES_GENERATED_EXT) { in zink_create_query()
531query->needs_rast_discard_workaround = !screen->info.primgen_feats.primitivesGeneratedQueryWithRas… in zink_create_query()
533 query->needs_rast_discard_workaround = true; in zink_create_query()
536 if (!qbo_append(pctx->screen, query)) in zink_create_query()
539 query->needs_reset = true; in zink_create_query()
540 query->predicate_dirty = true; in zink_create_query()
541 if (query->type == PIPE_QUERY_TIMESTAMP) { in zink_create_query()
542 query->active = true; in zink_create_query()
544 reset_qbo(query); in zink_create_query()
546 return (struct pipe_query *)query; in zink_create_query()
548 destroy_query(zink_context(pctx), query); in zink_create_query()
556 struct zink_query *query = (struct zink_query *)q; in zink_destroy_query() local
558 /* only destroy if this query isn't active on any batches, in zink_destroy_query()
561 if (query->batch_uses) { in zink_destroy_query()
562 query->dead = true; in zink_destroy_query()
566 destroy_query(zink_context(pctx), query); in zink_destroy_query()
570 zink_prune_query(struct zink_batch_state *bs, struct zink_query *query) in zink_prune_query() argument
572 if (!zink_batch_usage_matches(query->batch_uses, bs)) in zink_prune_query()
574 query->batch_uses = NULL; in zink_prune_query()
575 if (query->dead) in zink_prune_query()
576 destroy_query(bs->ctx, query); in zink_prune_query()
580 check_query_results(struct zink_query *query, union pipe_query_result *result, in check_query_results() argument
584 int result_size = get_num_results(query); in check_query_results()
586 util_dynarray_foreach(&query->starts, struct zink_query_start, start) { in check_query_results()
589 switch (query->type) { in check_query_results()
601 if (query->type != PIPE_QUERY_TIME_ELAPSED || i) in check_query_results()
609 if (query->vkqtype == VK_QUERY_TYPE_PRIMITIVES_GENERATED_EXT) in check_query_results()
611 else if (start->have_xfb || query->index) in check_query_results()
618 /* A query pool created with this type will capture 2 integers - in check_query_results()
627 /* A query pool created with this type will capture 2 integers - in check_query_results()
636 switch (query->index) { in check_query_results()
647 debug_printf("unhandled query type: %s\n", in check_query_results()
648 util_str_query_type(query->type, true)); in check_query_results()
649 unreachable("unexpected query type"); in check_query_results()
661 struct zink_query *query = (struct zink_query *)q; in get_query_result() local
666 if (query->base.flushed) in get_query_result()
670 util_query_clear_result(result, query->type); in get_query_result()
672 int num_starts = get_num_starts(query); in get_query_result()
676 int result_size = get_num_results(query) * sizeof(uint64_t); in get_query_result()
677 int num_maps = get_num_queries(query); in get_query_result()
681 LIST_FOR_EACH_ENTRY(qbo, &query->buffers, list) { in get_query_result()
683 bool is_timestamp = query->type == PIPE_QUERY_TIMESTAMP; in get_query_result()
696 if (query->type == PIPE_QUERY_SO_OVERFLOW_ANY_PREDICATE) { in get_query_result()
698 check_query_results(query, result, num_starts, results[i], NULL); in get_query_result()
701 check_query_results(query, result, num_starts, results[0], results[1]); in get_query_result()
707 if (query->type == PIPE_QUERY_SO_OVERFLOW_ANY_PREDICATE && result->b) in get_query_result()
711 if (is_time_query(query)) in get_query_result()
727 struct zink_query *query = (struct zink_query*)pquery; in force_cpu_read() local
730 if (query->needs_update) in force_cpu_read()
731 update_qbo(ctx, query); in force_cpu_read()
735 debug_printf("zink: getting query result failed\n"); in force_cpu_read()
746 if (is_bool_query(query)) in force_cpu_read()
753 if (is_bool_query(query)) in force_cpu_read()
762 copy_pool_results_to_buffer(struct zink_context *ctx, struct zink_query *query, VkQueryPool pool, in copy_pool_results_to_buffer() argument
767 unsigned base_result_size = get_num_results(query) * type_size; in copy_pool_results_to_buffer()
772 …NULL_HANDLE, "update_qbo(%s: id=%u, num_results=%d)", vk_QueryType_to_str(query->vkqtype), query_i… in copy_pool_results_to_buffer()
775 /* if it's a single query that doesn't need special handling, we can copy it and be done */ in copy_pool_results_to_buffer()
789 copy_results_to_buffer(struct zink_context *ctx, struct zink_query *query, struct zink_resource *re… in copy_results_to_buffer() argument
791 struct zink_query_start *start = util_dynarray_top_ptr(&query->starts, struct zink_query_start); in copy_results_to_buffer()
792 …copy_pool_results_to_buffer(ctx, query, start->vkq[0]->pool->query_pool, start->vkq[0]->query_id, … in copy_results_to_buffer()
860 … each such query command to all query commands previously submitted to the same queue. There in update_qbo()
918 /* A query must either begin and end inside the same subpass of a render pass in begin_query()
921 - 18.2. Query Operation in begin_query()
967 struct zink_query *query = (struct zink_query *)q; in zink_begin_query() local
971 reset_qbo(query); in zink_begin_query()
973 if (query->type < PIPE_QUERY_DRIVER_SPECIFIC && query->vkqtype == VK_QUERY_TYPE_OCCLUSION) in zink_begin_query()
975 …if (query->type == PIPE_QUERY_PIPELINE_STATISTICS_SINGLE && query->index == PIPE_STAT_QUERY_PS_INV… in zink_begin_query()
978 query->predicate_dirty = true; in zink_begin_query()
980 util_dynarray_clear(&query->starts); in zink_begin_query()
981 query->start_offset = 0; in zink_begin_query()
983 if (ctx->in_rp || (query->type == PIPE_QUERY_TIME_ELAPSED)) { in zink_begin_query()
984 begin_query(ctx, query); in zink_begin_query()
987 list_addtail(&query->active_list, &ctx->suspended_queries); in zink_begin_query()
988 query->suspended = true; in zink_begin_query()
989 if (query->type == PIPE_QUERY_PRIMITIVES_GENERATED) in zink_begin_query()
990 ctx->primitives_generated_suspended = query->needs_rast_discard_workaround; in zink_begin_query()
1057 struct zink_query *query = (struct zink_query *)q; in zink_end_query() local
1059 if (query->type == PIPE_QUERY_TIMESTAMP_DISJOINT || query->type >= PIPE_QUERY_DRIVER_SPECIFIC) in zink_end_query()
1062 if (query->type == PIPE_QUERY_GPU_FINISHED) { in zink_end_query()
1063 pctx->flush(pctx, &query->fence, PIPE_FLUSH_DEFERRED); in zink_end_query()
1070 if (query->vkqtype == VK_QUERY_TYPE_OCCLUSION) in zink_end_query()
1072 …if (query->type == PIPE_QUERY_PIPELINE_STATISTICS_SINGLE && query->index == PIPE_STAT_QUERY_PS_INV… in zink_end_query()
1075 …bool unset_null_fs = query->type == PIPE_QUERY_PRIMITIVES_GENERATED && (ctx->primitives_generated_… in zink_end_query()
1076 if (query->type == PIPE_QUERY_PRIMITIVES_GENERATED) in zink_end_query()
1079 if (list_is_linked(&query->stats_list)) in zink_end_query()
1080 list_delinit(&query->stats_list); in zink_end_query()
1081 if (query->suspended) { in zink_end_query()
1082 list_delinit(&query->active_list); in zink_end_query()
1083 query->suspended = false; in zink_end_query()
1085 if (is_time_query(query)) { in zink_end_query()
1086 update_query_id(ctx, query); in zink_end_query()
1087 if (query->needs_reset) in zink_end_query()
1088 reset_qbos(ctx, query); in zink_end_query()
1089 reset_query_range(ctx, query); in zink_end_query()
1090 … struct zink_query_start *start = util_dynarray_top_ptr(&query->starts, struct zink_query_start); in zink_end_query()
1094 zink_batch_usage_set(&query->batch_uses, ctx->bs); in zink_end_query()
1095 _mesa_set_add(&ctx->bs->active_queries, query); in zink_end_query()
1096 query->needs_update = true; in zink_end_query()
1097 } else if (query->active) { in zink_end_query()
1098 /* this should be a tc-optimized query end that doesn't split a renderpass */ in zink_end_query()
1099 if (!query->started_in_rp) in zink_end_query()
1101 end_query(ctx, query); in zink_end_query()
1116 struct zink_query *query = (void*)q; in zink_get_query_result() local
1120 if (query->type == PIPE_QUERY_TIMESTAMP_DISJOINT) { in zink_get_query_result()
1126 if (query->type == PIPE_QUERY_GPU_FINISHED) { in zink_get_query_result()
1129 result->b = pscreen->fence_finish(pscreen, query->base.flushed ? NULL : pctx, in zink_get_query_result()
1130 query->fence, wait ? OS_TIMEOUT_INFINITE : 0); in zink_get_query_result()
1134 if (query->type == ZINK_QUERY_RENDER_PASSES) { in zink_get_query_result()
1140 if (query->needs_update) { in zink_get_query_result()
1142 update_qbo(ctx, query); in zink_get_query_result()
1145 if (zink_batch_usage_is_unflushed(query->batch_uses)) { in zink_get_query_result()
1153 if (!wait && !zink_screen_usage_check_completion_fast(screen, query->batch_uses)) { in zink_get_query_result()
1154 if (query->result_check_counter++ < NOWAIT_CHECK_THRESHOLD) in zink_get_query_result()
1157 …if (query->buffer_count == 1 && get_num_results(query) == 1 && query->type != PIPE_QUERY_TIME_ELAP… in zink_get_query_result()
1158 … struct zink_query_start *start = util_dynarray_top_ptr(&query->starts, struct zink_query_start); in zink_get_query_result()
1162 if (is_time_query(query)) in zink_get_query_result()
1167 if (!zink_screen_usage_check_completion(screen, query->batch_uses)) in zink_get_query_result()
1175 suspend_query(struct zink_context *ctx, struct zink_query *query) in suspend_query() argument
1177 /* if a query isn't active here then we don't need to reactivate it on the next batch */ in suspend_query()
1178 if (query->active && !is_time_query(query)) in suspend_query()
1179 end_query(ctx, query); in suspend_query()
1180 if (query->needs_update && !ctx->in_rp) in suspend_query()
1181 update_qbo(ctx, query); in suspend_query()
1188 struct zink_query *query = (void*)entry->key; in suspend_queries() local
1189 if (query->suspended || (rp_only && !query->started_in_rp)) in suspend_queries()
1191 if (query->active && !is_time_query(query)) { in suspend_queries()
1195 list_addtail(&query->active_list, &ctx->suspended_queries); in suspend_queries()
1196 query->suspended = true; in suspend_queries()
1197 if (query->type == PIPE_QUERY_PRIMITIVES_GENERATED) in suspend_queries()
1198 ctx->primitives_generated_suspended = query->needs_rast_discard_workaround; in suspend_queries()
1200 suspend_query(ctx, query); in suspend_queries()
1213 struct zink_query *query, *next; in zink_resume_queries() local
1214 LIST_FOR_EACH_ENTRY_SAFE(query, next, &ctx->suspended_queries, active_list) { in zink_resume_queries()
1215 list_delinit(&query->active_list); in zink_resume_queries()
1216 query->suspended = false; in zink_resume_queries()
1217 if (query->type == PIPE_QUERY_PRIMITIVES_GENERATED) in zink_resume_queries()
1219 if (query->needs_update && !ctx->in_rp) in zink_resume_queries()
1220 update_qbo(ctx, query); in zink_resume_queries()
1221 begin_query(ctx, query); in zink_resume_queries()
1228 struct zink_query *query, *next; in zink_resume_cs_query() local
1229 LIST_FOR_EACH_ENTRY_SAFE(query, next, &ctx->suspended_queries, active_list) { in zink_resume_cs_query()
1230 …if (query->type == PIPE_QUERY_PIPELINE_STATISTICS_SINGLE && query->index == PIPE_STAT_QUERY_CS_INV… in zink_resume_cs_query()
1231 list_delinit(&query->active_list); in zink_resume_cs_query()
1232 query->suspended = false; in zink_resume_cs_query()
1233 begin_query(ctx, query); in zink_resume_cs_query()
1247 struct zink_query *query; in zink_query_update_gs_states() local
1252 LIST_FOR_EACH_ENTRY(query, &ctx->primitives_generated_queries, stats_list) { in zink_query_update_gs_states()
1253 …struct zink_query_start *last_start = util_dynarray_top_ptr(&query->starts, struct zink_query_star… in zink_query_update_gs_states()
1254 assert(query->active); in zink_query_update_gs_states()
1255 if (query->has_draws) { in zink_query_update_gs_states()
1264 query = ctx->vertices_query; in zink_query_update_gs_states()
1265 …struct zink_query_start *last_start = util_dynarray_top_ptr(&query->starts, struct zink_query_star… in zink_query_update_gs_states()
1266 assert(query->active); in zink_query_update_gs_states()
1276 LIST_FOR_EACH_ENTRY(query, &ctx->primitives_generated_queries, stats_list) { in zink_query_update_gs_states()
1277 …struct zink_query_start *last_start = util_dynarray_top_ptr(&query->starts, struct zink_query_star… in zink_query_update_gs_states()
1280 query->has_draws = true; in zink_query_update_gs_states()
1283 query = ctx->vertices_query; in zink_query_update_gs_states()
1284 …struct zink_query_start *last_start = util_dynarray_top_ptr(&query->starts, struct zink_query_star… in zink_query_update_gs_states()
1286 query->has_draws = true; in zink_query_update_gs_states()
1306 zink_query_sync(struct zink_context *ctx, struct zink_query *query) in zink_query_sync() argument
1308 if (query->needs_update) in zink_query_sync()
1309 update_qbo(ctx, query); in zink_query_sync()
1322 begin_info.buffer = ctx->render_condition.query->predicate->obj->buffer; in zink_start_conditional_render()
1324 ctx->render_condition.query->predicate->obj->unordered_read = false; in zink_start_conditional_render()
1326 zink_batch_reference_resource_rw(ctx, ctx->render_condition.query->predicate, false); in zink_start_conditional_render()
1347 struct zink_query *query = (struct zink_query *)pquery; in zink_render_condition() local
1352 if (query == NULL) { in zink_render_condition()
1358 ctx->render_condition.query = NULL; in zink_render_condition()
1362 if (!query->predicate) { in zink_render_condition()
1370 query->predicate = zink_resource(pres); in zink_render_condition()
1372 if (query->predicate_dirty) { in zink_render_condition()
1373 struct zink_resource *res = query->predicate; in zink_render_condition()
1379 int num_results = get_num_starts(query); in zink_render_condition()
1381 if (!is_emulated_primgen(query) && in zink_render_condition()
1382 !is_so_overflow_query(query) && in zink_render_condition()
1384 copy_results_to_buffer(ctx, query, res, 0, num_results, flags); in zink_render_condition()
1394 query->predicate_dirty = false; in zink_render_condition()
1398 ctx->render_condition.query = query; in zink_render_condition()
1414 struct zink_query *query = (struct zink_query*)pquery; in zink_get_query_result_resource() local
1418 unsigned num_queries = get_num_starts(query); in zink_get_query_result_resource()
1420 …/* it's possible that a query may have no data at all: write out zeroes to the buffer and return */ in zink_get_query_result_resource()
1422 unsigned src_offset = result_size * get_num_results(query); in zink_get_query_result_resource()
1437 VkQueryResultFlags flag = is_time_query(query) ? 0 : VK_QUERY_RESULT_PARTIAL_BIT; in zink_get_query_result_resource()
1438 if (zink_batch_usage_check_completion(ctx, query->batch_uses)) { in zink_get_query_result_resource()
1439 … struct zink_query_start *start = util_dynarray_top_ptr(&query->starts, struct zink_query_start); in zink_get_query_result_resource()
1451 …copy_results_to_buffer(ctx, query, zink_resource(staging), 0, 1, size_flags | VK_QUERY_RESULT_WITH… in zink_get_query_result_resource()
1452 …uffer(ctx, res, zink_resource(staging), offset, result_size * get_num_results(query), result_size); in zink_get_query_result_resource()
1459 each such query command to all query commands previously submitted to the same queue. There in zink_get_query_result_resource()
1467 if (!is_time_query(query) && !is_bool_query(query)) { in zink_get_query_result_resource()
1468 if (num_queries == 1 && !is_emulated_primgen(query) && in zink_get_query_result_resource()
1469 query->type != PIPE_QUERY_PRIMITIVES_EMITTED && in zink_get_query_result_resource()
1470 !is_bool_query(query)) { in zink_get_query_result_resource()
1472 if (query->needs_update) in zink_get_query_result_resource()
1473 update_qbo(ctx, query); in zink_get_query_result_resource()
1475 zink_copy_buffer(ctx, res, zink_resource(query->curr_qbo->buffers[0]), offset, in zink_get_query_result_resource()
1476 get_buffer_offset(query), in zink_get_query_result_resource()
1480 copy_results_to_buffer(ctx, query, res, offset, 1, size_flags); in zink_get_query_result_resource()