Lines Matching refs:query
63 struct si_query_sw *query = (struct si_query_sw *)squery;
65 sctx->b.screen->fence_reference(sctx->b.screen, &query->fence, NULL);
66 FREE(query);
115 unreachable("query type does not correspond to winsys id");
121 struct si_query_sw *query = (struct si_query_sw *)squery;
124 switch (query->b.type) {
129 query->begin_result = sctx->num_draw_calls;
132 query->begin_result = sctx->num_decompress_calls;
135 query->begin_result = sctx->num_prim_restart_calls;
138 query->begin_result = sctx->num_compute_calls;
141 query->begin_result = sctx->num_cp_dma_calls;
144 query->begin_result = sctx->num_vs_flushes;
147 query->begin_result = sctx->num_ps_flushes;
150 query->begin_result = sctx->num_cs_flushes;
153 query->begin_result = sctx->num_cb_cache_flushes;
156 query->begin_result = sctx->num_db_cache_flushes;
159 query->begin_result = sctx->num_L2_invalidates;
162 query->begin_result = sctx->num_L2_writebacks;
165 query->begin_result = sctx->num_resident_handles;
168 query->begin_result = sctx->tc ? sctx->tc->num_offloaded_slots : 0;
171 query->begin_result = sctx->tc ? sctx->tc->num_direct_slots : 0;
174 query->begin_result = sctx->tc ? sctx->tc->num_syncs : 0;
190 query->begin_result = 0;
198 enum radeon_value_id ws_id = winsys_id_from_type(query->b.type);
199 query->begin_result = sctx->ws->query_value(sctx->ws, ws_id);
203 ws_id = winsys_id_from_type(query->b.type);
204 query->begin_result = sctx->ws->query_value(sctx->ws, ws_id);
205 query->begin_time = sctx->ws->query_value(sctx->ws, RADEON_NUM_GFX_IBS);
208 ws_id = winsys_id_from_type(query->b.type);
209 query->begin_result = sctx->ws->query_value(sctx->ws, ws_id);
210 query->begin_time = os_time_get_nano();
213 query->begin_result = sctx->tc ? util_queue_get_thread_time_nano(&sctx->tc->queue, 0) : 0;
214 query->begin_time = os_time_get_nano();
237 query->begin_result = si_begin_counter(sctx->screen, query->b.type);
240 query->begin_result = p_atomic_read(&sctx->screen->num_compilations);
243 query->begin_result = p_atomic_read(&sctx->screen->num_shaders_created);
246 query->begin_result = sctx->screen->live_shader_cache.hits;
249 query->begin_result = sctx->screen->live_shader_cache.misses;
252 query->begin_result = sctx->screen->num_memory_shader_cache_hits;
255 query->begin_result = sctx->screen->num_memory_shader_cache_misses;
258 query->begin_result = sctx->screen->num_disk_shader_cache_hits;
261 query->begin_result = sctx->screen->num_disk_shader_cache_misses;
270 unreachable("si_query_sw_begin: bad query type");
278 struct si_query_sw *query = (struct si_query_sw *)squery;
281 switch (query->b.type) {
285 sctx->b.flush(&sctx->b, &query->fence, PIPE_FLUSH_DEFERRED);
288 query->end_result = sctx->num_draw_calls;
291 query->end_result = sctx->num_decompress_calls;
294 query->end_result = sctx->num_prim_restart_calls;
297 query->end_result = sctx->num_compute_calls;
300 query->end_result = sctx->num_cp_dma_calls;
303 query->end_result = sctx->num_vs_flushes;
306 query->end_result = sctx->num_ps_flushes;
309 query->end_result = sctx->num_cs_flushes;
312 query->end_result = sctx->num_cb_cache_flushes;
315 query->end_result = sctx->num_db_cache_flushes;
318 query->end_result = sctx->num_L2_invalidates;
321 query->end_result = sctx->num_L2_writebacks;
324 query->end_result = sctx->num_resident_handles;
327 query->end_result = sctx->tc ? sctx->tc->num_offloaded_slots : 0;
330 query->end_result = sctx->tc ? sctx->tc->num_direct_slots : 0;
333 query->end_result = sctx->tc ? sctx->tc->num_syncs : 0;
354 enum radeon_value_id ws_id = winsys_id_from_type(query->b.type);
355 query->end_result = sctx->ws->query_value(sctx->ws, ws_id);
359 ws_id = winsys_id_from_type(query->b.type);
360 query->end_result = sctx->ws->query_value(sctx->ws, ws_id);
361 query->end_time = sctx->ws->query_value(sctx->ws, RADEON_NUM_GFX_IBS);
364 ws_id = winsys_id_from_type(query->b.type);
365 query->end_result = sctx->ws->query_value(sctx->ws, ws_id);
366 query->end_time = os_time_get_nano();
369 query->end_result = sctx->tc ? util_queue_get_thread_time_nano(&sctx->tc->queue, 0) : 0;
370 query->end_time = os_time_get_nano();
393 query->end_result = si_end_counter(sctx->screen, query->b.type, query->begin_result);
394 query->begin_result = 0;
397 query->end_result = p_atomic_read(&sctx->screen->num_compilations);
400 query->end_result = p_atomic_read(&sctx->screen->num_shaders_created);
403 query->end_result = sctx->last_tex_ps_draw_ratio;
406 query->end_result = sctx->screen->live_shader_cache.hits;
409 query->end_result = sctx->screen->live_shader_cache.misses;
412 query->end_result = sctx->screen->num_memory_shader_cache_hits;
415 query->end_result = sctx->screen->num_memory_shader_cache_misses;
418 query->end_result = sctx->screen->num_disk_shader_cache_hits;
421 query->end_result = sctx->screen->num_disk_shader_cache_misses;
430 unreachable("si_query_sw_end: bad query type");
439 struct si_query_sw *query = (struct si_query_sw *)squery;
441 switch (query->b.type) {
451 result->b = screen->fence_finish(screen, ctx, query->fence, wait ? PIPE_TIMEOUT_INFINITE : 0);
457 (query->end_result - query->begin_result) / (query->end_time - query->begin_time);
462 (query->end_result - query->begin_result) * 100 / (query->end_time - query->begin_time);
481 result->u64 = query->end_result - query->begin_result;
483 switch (query->b.type) {
505 struct si_query_sw *query;
507 query = CALLOC_STRUCT(si_query_sw);
508 if (!query)
511 query->b.type = query_type;
512 query->b.ops = &sw_query_ops;
514 return (struct pipe_query *)query;
521 /* Release all query buffers. */
534 /* Discard all query buffers except for the oldest. */
596 struct si_query_hw *query = (struct si_query_hw *)squery;
598 si_query_buffer_destroy(sctx->screen, &query->buffer);
599 si_resource_reference(&query->workaround_buf, NULL);
605 struct si_query_hw *query = container_of(qbuf, struct si_query_hw, buffer);
616 if (query->b.type == PIPE_QUERY_OCCLUSION_COUNTER ||
617 query->b.type == PIPE_QUERY_OCCLUSION_PREDICATE ||
618 query->b.type == PIPE_QUERY_OCCLUSION_PREDICATE_CONSERVATIVE) {
625 num_results = qbuf->buf->b.b.width0 / query->result_size;
680 static void si_query_hw_do_emit_start(struct si_context *sctx, struct si_query_hw *query,
682 static void si_query_hw_do_emit_stop(struct si_context *sctx, struct si_query_hw *query,
699 struct si_query_hw *query = CALLOC_STRUCT(si_query_hw);
700 if (!query)
703 query->b.type = query_type;
704 query->b.ops = &query_hw_ops;
705 query->ops = &query_hw_default_hw_ops;
711 query->result_size = 16 * sscreen->info.max_render_backends;
712 query->result_size += 16; /* for the fence + alignment */
713 query->b.num_cs_dw_suspend = 6 + si_cp_write_fence_dwords(sscreen);
716 query->result_size = 24;
717 query->b.num_cs_dw_suspend = 8 + si_cp_write_fence_dwords(sscreen);
720 query->result_size = 16;
721 query->b.num_cs_dw_suspend = 8 + si_cp_write_fence_dwords(sscreen);
722 query->flags = SI_QUERY_HW_FLAG_NO_START;
729 query->result_size = 32;
730 query->b.num_cs_dw_suspend = 6;
731 query->stream = index;
735 query->result_size = 32 * SI_MAX_STREAMS;
736 query->b.num_cs_dw_suspend = 6 * SI_MAX_STREAMS;
739 query->result_size = si_query_pipestats_num_results(sscreen) * 16;
740 query->result_size += 8; /* for the fence + alignment */
741 query->b.num_cs_dw_suspend = 6 + si_cp_write_fence_dwords(sscreen);
742 query->index = index;
745 query->flags |= SI_QUERY_EMULATE_GS_COUNTERS;
749 FREE(query);
753 return (struct pipe_query *)query;
806 static void si_query_hw_do_emit_start(struct si_context *sctx, struct si_query_hw *query,
811 switch (query->b.type) {
841 emit_sample_streamout(cs, va, query->stream);
849 EOP_DATA_SEL_TIMESTAMP, NULL, va, 0, query->b.type);
852 if (sctx->screen->use_ngg && query->flags & SI_QUERY_EMULATE_GS_COUNTERS) {
865 sbuf.buffer_offset = query->buffer.results_end;
873 va += si_query_pipestat_end_dw_offset(sctx->screen, query->index) * 4;
895 radeon_add_to_buffer_list(sctx, &sctx->gfx_cs, query->buffer.buf,
899 static void si_query_hw_emit_start(struct si_context *sctx, struct si_query_hw *query)
903 if (!query->buffer.buf && query->flags & SI_QUERY_EMULATE_GS_COUNTERS)
904 si_resource_reference(&query->buffer.buf, sctx->pipeline_stats_query_buf);
907 if ((!(query->flags & SI_QUERY_EMULATE_GS_COUNTERS) || !sctx->pipeline_stats_query_buf) &&
908 !si_query_buffer_alloc(sctx, &query->buffer, query->ops->prepare_buffer, query->result_size))
911 if (query->flags & SI_QUERY_EMULATE_GS_COUNTERS)
912 si_resource_reference(&sctx->pipeline_stats_query_buf, query->buffer.buf);
914 si_update_occlusion_query_state(sctx, query->b.type, 1);
915 si_update_prims_generated_query_state(sctx, query->b.type, 1);
917 if (query->b.type == PIPE_QUERY_PIPELINE_STATISTICS)
922 va = query->buffer.buf->gpu_address + query->buffer.results_end;
923 query->ops->emit_start(sctx, query, query->buffer.buf, va);
926 static void si_query_hw_do_emit_stop(struct si_context *sctx, struct si_query_hw *query,
932 switch (query->b.type) {
955 emit_sample_streamout(cs, va, query->stream);
967 EOP_DATA_SEL_TIMESTAMP, NULL, va, 0, query->b.type);
971 unsigned sample_size = (query->result_size - 8) / 2;
976 if (sctx->screen->use_ngg && query->flags & SI_QUERY_EMULATE_GS_COUNTERS) {
998 radeon_add_to_buffer_list(sctx, &sctx->gfx_cs, query->buffer.buf,
1003 EOP_DATA_SEL_VALUE_32BIT, query->buffer.buf, fence_va, 0x80000000,
1004 query->b.type);
1008 static void si_query_hw_emit_stop(struct si_context *sctx, struct si_query_hw *query)
1013 if (query->flags & SI_QUERY_HW_FLAG_NO_START) {
1015 if (!si_query_buffer_alloc(sctx, &query->buffer, query->ops->prepare_buffer,
1016 query->result_size))
1020 if (!query->buffer.buf)
1023 /* emit end query */
1024 va = query->buffer.buf->gpu_address + query->buffer.results_end;
1026 query->ops->emit_stop(sctx, query, query->buffer.buf, va);
1028 query->buffer.results_end += query->result_size;
1030 si_update_occlusion_query_state(sctx, query->b.type, -1);
1031 si_update_prims_generated_query_state(sctx, query->b.type, -1);
1033 if (query->b.type == PIPE_QUERY_PIPELINE_STATISTICS)
1064 struct si_query_hw *query = (struct si_query_hw *)ctx->render_cond;
1065 if (!query)
1072 if (ctx->screen->use_ngg_streamout && (query->b.type == PIPE_QUERY_SO_OVERFLOW_PREDICATE ||
1073 query->b.type == PIPE_QUERY_SO_OVERFLOW_ANY_PREDICATE)) {
1074 struct gfx10_sh_query *gfx10_query = (struct gfx10_sh_query *)query;
1124 if (query->workaround_buf) {
1127 switch (query->b.type) {
1157 if (query->workaround_buf) {
1158 uint64_t va = query->workaround_buf->gpu_address + query->workaround_offset;
1159 emit_set_predicate(ctx, query->workaround_buf, va, op);
1166 for (qbuf = &query->buffer; qbuf; qbuf = qbuf->previous) {
1173 if (query->b.type == PIPE_QUERY_SO_OVERFLOW_ANY_PREDICATE) {
1185 results_base += query->result_size;
1210 static void si_destroy_query(struct pipe_context *ctx, struct pipe_query *query)
1213 struct si_query *squery = (struct si_query *)query;
1218 static bool si_begin_query(struct pipe_context *ctx, struct pipe_query *query)
1221 struct si_query *squery = (struct si_query *)query;
1228 struct si_query_hw *query = (struct si_query_hw *)squery;
1230 if (query->flags & SI_QUERY_HW_FLAG_NO_START) {
1235 if (!(query->flags & SI_QUERY_HW_FLAG_BEGIN_RESUMES))
1236 si_query_buffer_reset(sctx, &query->buffer);
1238 si_resource_reference(&query->workaround_buf, NULL);
1240 si_query_hw_emit_start(sctx, query);
1241 if (!query->buffer.buf)
1244 list_addtail(&query->b.active_list, &sctx->active_queries);
1245 sctx->num_cs_dw_queries_suspend += query->b.num_cs_dw_suspend;
1249 static bool si_end_query(struct pipe_context *ctx, struct pipe_query *query)
1252 struct si_query *squery = (struct si_query *)query;
1259 struct si_query_hw *query = (struct si_query_hw *)squery;
1261 if (query->flags & SI_QUERY_HW_FLAG_NO_START)
1262 si_query_buffer_reset(sctx, &query->buffer);
1264 si_query_hw_emit_stop(sctx, query);
1266 if (!(query->flags & SI_QUERY_HW_FLAG_NO_START)) {
1267 list_delinit(&query->b.active_list);
1268 sctx->num_cs_dw_queries_suspend -= query->b.num_cs_dw_suspend;
1271 if (!query->buffer.buf)
1360 static void si_query_hw_add_result(struct si_screen *sscreen, struct si_query_hw *query,
1365 switch (query->b.type) {
1443 void si_query_hw_suspend(struct si_context *sctx, struct si_query *query)
1445 si_query_hw_emit_stop(sctx, (struct si_query_hw *)query);
1448 void si_query_hw_resume(struct si_context *sctx, struct si_query *query)
1450 si_query_hw_emit_start(sctx, (struct si_query_hw *)query);
1464 static bool si_get_query_result(struct pipe_context *ctx, struct pipe_query *query, bool wait,
1468 struct si_query *squery = (struct si_query *)query;
1473 static void si_get_query_result_resource(struct pipe_context *ctx, struct pipe_query *query,
1478 struct si_query *squery = (struct si_query *)query;
1483 static void si_query_hw_clear_result(struct si_query_hw *query, union pipe_query_result *result)
1485 util_query_clear_result(result, query->b.type);
1492 struct si_query_hw *query = (struct si_query_hw *)squery;
1495 query->ops->clear_result(query, result);
1497 for (qbuf = &query->buffer; qbuf; qbuf = qbuf->previous) {
1511 query->ops->add_result(sscreen, query, map + results_base, result);
1512 results_base += query->result_size;
1530 struct si_query_hw *query = (struct si_query_hw *)squery;
1556 if (query->buffer.previous) {
1564 si_get_hw_query_params(sctx, query, index >= 0 ? index : 0, ¶ms);
1567 consts.result_stride = query->result_size;
1590 if (query->b.type == PIPE_QUERY_OCCLUSION_PREDICATE ||
1591 query->b.type == PIPE_QUERY_OCCLUSION_PREDICATE_CONSERVATIVE)
1593 else if (query->b.type == PIPE_QUERY_SO_OVERFLOW_PREDICATE ||
1594 query->b.type == PIPE_QUERY_SO_OVERFLOW_ANY_PREDICATE)
1596 else if (query->b.type == PIPE_QUERY_TIMESTAMP || query->b.type == PIPE_QUERY_TIME_ELAPSED)
1613 for (qbuf = &query->buffer; qbuf; qbuf = qbuf_prev) {
1614 if (query->b.type != PIPE_QUERY_TIMESTAMP) {
1616 consts.result_count = qbuf->results_end / query->result_size;
1618 if (qbuf != &query->buffer)
1627 params.start_offset += qbuf->results_end - query->result_size;
1645 if ((flags & PIPE_QUERY_WAIT) && qbuf == &query->buffer) {
1652 va = qbuf->buf->gpu_address + qbuf->results_end - query->result_size;
1666 static void si_render_condition(struct pipe_context *ctx, struct pipe_query *query, bool condition,
1670 struct si_query_hw *squery = (struct si_query_hw *)query;
1673 if (query) {
1701 ctx->get_query_result_resource(ctx, query, true, PIPE_QUERY_TYPE_U64, 0,
1712 sctx->render_cond = query;
1715 sctx->render_cond_enabled = query;
1717 si_set_atom_dirty(sctx, atom, query != NULL);
1722 struct si_query *query;
1724 LIST_FOR_EACH_ENTRY (query, &sctx->active_queries, active_list)
1725 query->ops->suspend(sctx, query);
1730 struct si_query *query;
1735 LIST_FOR_EACH_ENTRY (query, &sctx->active_queries, active_list)
1736 query->ops->resume(sctx, query);