Lines Matching refs:query
60 struct r600_query_sw *query = (struct r600_query_sw *)rquery;
62 rscreen->b.fence_reference(&rscreen->b, &query->fence, NULL);
63 FREE(query);
88 default: unreachable("query type does not correspond to winsys id");
95 struct r600_query_sw *query = (struct r600_query_sw *)rquery;
98 switch(query->b.type) {
103 query->begin_result = rctx->num_draw_calls;
106 query->begin_result = rctx->num_decompress_calls;
109 query->begin_result = rctx->num_mrt_draw_calls;
112 query->begin_result = rctx->num_prim_restart_calls;
115 query->begin_result = rctx->num_spill_draw_calls;
118 query->begin_result = rctx->num_compute_calls;
121 query->begin_result = rctx->num_spill_compute_calls;
124 query->begin_result = rctx->num_dma_calls;
127 query->begin_result = rctx->num_cp_dma_calls;
130 query->begin_result = rctx->num_vs_flushes;
133 query->begin_result = rctx->num_ps_flushes;
136 query->begin_result = rctx->num_cs_flushes;
139 query->begin_result = rctx->num_cb_cache_flushes;
142 query->begin_result = rctx->num_db_cache_flushes;
145 query->begin_result = rctx->num_resident_handles;
148 query->begin_result = rctx->tc ? rctx->tc->num_offloaded_slots : 0;
151 query->begin_result = rctx->tc ? rctx->tc->num_direct_slots : 0;
154 query->begin_result = rctx->tc ? rctx->tc->num_syncs : 0;
167 query->begin_result = 0;
175 enum radeon_value_id ws_id = winsys_id_from_type(query->b.type);
176 query->begin_result = rctx->ws->query_value(rctx->ws, ws_id);
180 ws_id = winsys_id_from_type(query->b.type);
181 query->begin_result = rctx->ws->query_value(rctx->ws, ws_id);
182 query->begin_time = rctx->ws->query_value(rctx->ws,
186 ws_id = winsys_id_from_type(query->b.type);
187 query->begin_result = rctx->ws->query_value(rctx->ws, ws_id);
188 query->begin_time = os_time_get_nano();
191 query->begin_result =
193 query->begin_time = os_time_get_nano();
216 query->begin_result = r600_begin_counter(rctx->screen,
217 query->b.type);
220 query->begin_result = p_atomic_read(&rctx->screen->num_compilations);
223 query->begin_result = p_atomic_read(&rctx->screen->num_shaders_created);
226 query->begin_result =
236 unreachable("r600_query_sw_begin: bad query type");
245 struct r600_query_sw *query = (struct r600_query_sw *)rquery;
248 switch(query->b.type) {
252 rctx->b.flush(&rctx->b, &query->fence, PIPE_FLUSH_DEFERRED);
255 query->end_result = rctx->num_draw_calls;
258 query->end_result = rctx->num_decompress_calls;
261 query->end_result = rctx->num_mrt_draw_calls;
264 query->end_result = rctx->num_prim_restart_calls;
267 query->end_result = rctx->num_spill_draw_calls;
270 query->end_result = rctx->num_compute_calls;
273 query->end_result = rctx->num_spill_compute_calls;
276 query->end_result = rctx->num_dma_calls;
279 query->end_result = rctx->num_cp_dma_calls;
282 query->end_result = rctx->num_vs_flushes;
285 query->end_result = rctx->num_ps_flushes;
288 query->end_result = rctx->num_cs_flushes;
291 query->end_result = rctx->num_cb_cache_flushes;
294 query->end_result = rctx->num_db_cache_flushes;
297 query->end_result = rctx->num_resident_handles;
300 query->end_result = rctx->tc ? rctx->tc->num_offloaded_slots : 0;
303 query->end_result = rctx->tc ? rctx->tc->num_direct_slots : 0;
306 query->end_result = rctx->tc ? rctx->tc->num_syncs : 0;
325 enum radeon_value_id ws_id = winsys_id_from_type(query->b.type);
326 query->end_result = rctx->ws->query_value(rctx->ws, ws_id);
330 ws_id = winsys_id_from_type(query->b.type);
331 query->end_result = rctx->ws->query_value(rctx->ws, ws_id);
332 query->end_time = rctx->ws->query_value(rctx->ws,
336 ws_id = winsys_id_from_type(query->b.type);
337 query->end_result = rctx->ws->query_value(rctx->ws, ws_id);
338 query->end_time = os_time_get_nano();
341 query->end_result =
343 query->end_time = os_time_get_nano();
366 query->end_result = r600_end_counter(rctx->screen,
367 query->b.type,
368 query->begin_result);
369 query->begin_result = 0;
372 query->end_result = p_atomic_read(&rctx->screen->num_compilations);
375 query->end_result = p_atomic_read(&rctx->screen->num_shaders_created);
378 query->end_result =
388 unreachable("r600_query_sw_end: bad query type");
399 struct r600_query_sw *query = (struct r600_query_sw *)rquery;
401 switch (query->b.type) {
412 result->b = screen->fence_finish(screen, ctx, query->fence,
418 result->u64 = (query->end_result - query->begin_result) /
419 (query->end_time - query->begin_time);
423 result->u64 = (query->end_result - query->begin_result) * 100 /
424 (query->end_time - query->begin_time);
443 result->u64 = query->end_result - query->begin_result;
445 switch (query->b.type) {
470 struct r600_query_sw *query;
472 query = CALLOC_STRUCT(r600_query_sw);
473 if (!query)
476 query->b.type = query_type;
477 query->b.ops = &sw_query_ops;
479 return (struct pipe_query *)query;
485 struct r600_query_hw *query = (struct r600_query_hw *)rquery;
486 struct r600_query_buffer *prev = query->buffer.previous;
488 /* Release all query buffers. */
496 r600_resource_reference(&query->buffer.buf, NULL);
501 struct r600_query_hw *query)
503 unsigned buf_size = MAX2(query->result_size,
516 if (!query->ops->prepare_buffer(rscreen, query, buf)) {
525 struct r600_query_hw *query,
537 if (query->b.type == PIPE_QUERY_OCCLUSION_COUNTER ||
538 query->b.type == PIPE_QUERY_OCCLUSION_PREDICATE ||
539 query->b.type == PIPE_QUERY_OCCLUSION_PREDICATE_CONSERVATIVE) {
546 num_results = buffer->b.b.width0 / query->result_size;
578 struct r600_query_hw *query,
582 struct r600_query_hw *query,
600 struct r600_query_hw *query)
602 query->buffer.buf = r600_new_query_buffer(rscreen, query);
603 if (!query->buffer.buf)
613 struct r600_query_hw *query = CALLOC_STRUCT(r600_query_hw);
614 if (!query)
617 query->b.type = query_type;
618 query->b.ops = &query_hw_ops;
619 query->ops = &query_hw_default_hw_ops;
625 query->result_size = 16 * rscreen->info.max_render_backends;
626 query->result_size += 16; /* for the fence + alignment */
627 query->num_cs_dw_begin = 6;
628 query->num_cs_dw_end = 6 + r600_gfx_write_fence_dwords(rscreen);
631 query->result_size = 24;
632 query->num_cs_dw_begin = 8;
633 query->num_cs_dw_end = 8 + r600_gfx_write_fence_dwords(rscreen);
636 query->result_size = 16;
637 query->num_cs_dw_end = 8 + r600_gfx_write_fence_dwords(rscreen);
638 query->flags = R600_QUERY_HW_FLAG_NO_START;
645 query->result_size = 32;
646 query->num_cs_dw_begin = 6;
647 query->num_cs_dw_end = 6;
648 query->stream = index;
652 query->result_size = 32 * R600_MAX_STREAMS;
653 query->num_cs_dw_begin = 6 * R600_MAX_STREAMS;
654 query->num_cs_dw_end = 6 * R600_MAX_STREAMS;
658 query->result_size = (rscreen->gfx_level >= EVERGREEN ? 11 : 8) * 16;
659 query->result_size += 8; /* for the fence + alignment */
660 query->num_cs_dw_begin = 6;
661 query->num_cs_dw_end = 6 + r600_gfx_write_fence_dwords(rscreen);
665 FREE(query);
669 if (!r600_query_hw_init(rscreen, query)) {
670 FREE(query);
674 return (struct pipe_query *)query;
727 struct r600_query_hw *query,
733 switch (query->b.type) {
746 emit_sample_streamout(cs, va, query->stream);
758 NULL, va, 0, query->b.type);
769 r600_emit_reloc(ctx, &ctx->gfx, query->buffer.buf, RADEON_USAGE_WRITE |
774 struct r600_query_hw *query)
778 if (!query->buffer.buf)
781 r600_update_occlusion_query_state(ctx, query->b.type, 1);
782 r600_update_prims_generated_query_state(ctx, query->b.type, 1);
784 ctx->need_gfx_cs_space(&ctx->b, query->num_cs_dw_begin + query->num_cs_dw_end,
787 /* Get a new query buffer if needed. */
788 if (query->buffer.results_end + query->result_size > query->buffer.buf->b.b.width0) {
790 *qbuf = query->buffer;
791 query->buffer.results_end = 0;
792 query->buffer.previous = qbuf;
793 query->buffer.buf = r600_new_query_buffer(ctx->screen, query);
794 if (!query->buffer.buf)
798 /* emit begin query */
799 va = query->buffer.buf->gpu_address + query->buffer.results_end;
801 query->ops->emit_start(ctx, query, query->buffer.buf, va);
803 ctx->num_cs_dw_queries_suspend += query->num_cs_dw_end;
807 struct r600_query_hw *query,
814 switch (query->b.type) {
831 emit_sample_streamout(cs, va, query->stream);
844 0, query->b.type);
848 unsigned sample_size = (query->result_size - 8) / 2;
862 r600_emit_reloc(ctx, &ctx->gfx, query->buffer.buf, RADEON_USAGE_WRITE |
868 query->buffer.buf, fence_va, 0x80000000,
869 query->b.type);
873 struct r600_query_hw *query)
877 if (!query->buffer.buf)
881 if (query->flags & R600_QUERY_HW_FLAG_NO_START) {
882 ctx->need_gfx_cs_space(&ctx->b, query->num_cs_dw_end, false);
885 /* emit end query */
886 va = query->buffer.buf->gpu_address + query->buffer.results_end;
888 query->ops->emit_stop(ctx, query, query->buffer.buf, va);
890 query->buffer.results_end += query->result_size;
892 if (!(query->flags & R600_QUERY_HW_FLAG_NO_START))
893 ctx->num_cs_dw_queries_suspend -= query->num_cs_dw_end;
895 r600_update_occlusion_query_state(ctx, query->b.type, -1);
896 r600_update_prims_generated_query_state(ctx, query->b.type, -1);
915 struct r600_query_hw *query = (struct r600_query_hw *)ctx->render_cond;
920 if (!query)
927 switch (query->b.type) {
952 for (qbuf = &query->buffer; qbuf; qbuf = qbuf->previous) {
959 if (query->b.type == PIPE_QUERY_SO_OVERFLOW_ANY_PREDICATE) {
971 results_base += query->result_size;
989 static void r600_destroy_query(struct pipe_context *ctx, struct pipe_query *query)
992 struct r600_query *rquery = (struct r600_query *)query;
998 struct pipe_query *query)
1001 struct r600_query *rquery = (struct r600_query *)query;
1007 struct r600_query_hw *query)
1009 struct r600_query_buffer *prev = query->buffer.previous;
1011 /* Discard the old query buffers. */
1019 query->buffer.results_end = 0;
1020 query->buffer.previous = NULL;
1023 if (r600_rings_is_buffer_referenced(rctx, query->buffer.buf->buf, RADEON_USAGE_READWRITE) ||
1024 !rctx->ws->buffer_wait(rctx->ws, query->buffer.buf->buf, 0, RADEON_USAGE_READWRITE)) {
1025 r600_resource_reference(&query->buffer.buf, NULL);
1026 query->buffer.buf = r600_new_query_buffer(rctx->screen, query);
1028 if (!query->ops->prepare_buffer(rctx->screen, query, query->buffer.buf))
1029 r600_resource_reference(&query->buffer.buf, NULL);
1036 struct r600_query_hw *query = (struct r600_query_hw *)rquery;
1038 if (query->flags & R600_QUERY_HW_FLAG_NO_START) {
1043 if (!(query->flags & R600_QUERY_HW_FLAG_BEGIN_RESUMES))
1044 r600_query_hw_reset_buffers(rctx, query);
1046 r600_query_hw_emit_start(rctx, query);
1047 if (!query->buffer.buf)
1050 list_addtail(&query->list, &rctx->active_queries);
1054 static bool r600_end_query(struct pipe_context *ctx, struct pipe_query *query)
1057 struct r600_query *rquery = (struct r600_query *)query;
1065 struct r600_query_hw *query = (struct r600_query_hw *)rquery;
1067 if (query->flags & R600_QUERY_HW_FLAG_NO_START)
1068 r600_query_hw_reset_buffers(rctx, query);
1070 r600_query_hw_emit_stop(rctx, query);
1072 if (!(query->flags & R600_QUERY_HW_FLAG_NO_START))
1073 list_delinit(&query->list);
1075 if (!query->buffer.buf)
1172 struct r600_query_hw *query,
1178 switch (query->b.type) {
1299 struct pipe_query *query, bool wait,
1303 struct r600_query *rquery = (struct r600_query *)query;
1309 struct pipe_query *query,
1317 struct r600_query *rquery = (struct r600_query *)query;
1323 static void r600_query_hw_clear_result(struct r600_query_hw *query,
1326 util_query_clear_result(result, query->b.type);
1334 struct r600_query_hw *query = (struct r600_query_hw *)rquery;
1337 query->ops->clear_result(query, result);
1339 for (qbuf = &query->buffer; qbuf; qbuf = qbuf->previous) {
1354 query->ops->add_result(rscreen, query, map + results_base,
1356 results_base += query->result_size;
1370 * One compute grid with a single thread is launched for every query result
1372 * accumulates data from the query result buffer, and writes the result either
1398 * BUFFER[0] = query result buffer
1608 struct r600_query_hw *query = (struct r600_query_hw *)rquery;
1636 if (query->buffer.previous) {
1645 r600_get_hw_query_params(rctx, query, index >= 0 ? index : 0, ¶ms);
1648 consts.result_stride = query->result_size;
1673 if (query->b.type == PIPE_QUERY_OCCLUSION_PREDICATE ||
1674 query->b.type == PIPE_QUERY_OCCLUSION_PREDICATE_CONSERVATIVE)
1676 else if (query->b.type == PIPE_QUERY_SO_OVERFLOW_PREDICATE ||
1677 query->b.type == PIPE_QUERY_SO_OVERFLOW_ANY_PREDICATE)
1679 else if (query->b.type == PIPE_QUERY_TIMESTAMP ||
1680 query->b.type == PIPE_QUERY_TIME_ELAPSED)
1697 for (qbuf = &query->buffer; qbuf; qbuf = qbuf_prev) {
1698 if (query->b.type != PIPE_QUERY_TIMESTAMP) {
1700 consts.result_count = qbuf->results_end / query->result_size;
1702 if (qbuf != &query->buffer)
1711 params.start_offset += qbuf->results_end - query->result_size;
1731 if ((flags & PIPE_QUERY_WAIT) && qbuf == &query->buffer) {
1738 va = qbuf->buf->gpu_address + qbuf->results_end - query->result_size;
1753 struct pipe_query *query,
1758 struct r600_query_hw *rquery = (struct r600_query_hw *)query;
1764 if (query) {
1772 rctx->render_cond = query;
1776 rctx->set_atom_dirty(rctx, atom, query != NULL);
1781 struct r600_query_hw *query;
1783 LIST_FOR_EACH_ENTRY(query, &ctx->active_queries, list) {
1784 r600_query_hw_emit_stop(ctx, query);
1792 struct r600_query_hw *query;
1795 LIST_FOR_EACH_ENTRY(query, query_list, list) {
1797 num_dw += query->num_cs_dw_begin + query->num_cs_dw_end;
1801 * resumed query, which raises the bar in need_cs_space for
1804 num_dw += query->num_cs_dw_end;
1806 /* primitives generated query */
1816 struct r600_query_hw *query;
1824 LIST_FOR_EACH_ENTRY(query, &ctx->active_queries, list) {
1825 r600_query_hw_emit_start(ctx, query);
1844 * there's 8, trying to read results from query buffers never
1855 * if backend_map query is supported by the kernel.