Lines Matching refs:query

44 	/* if backend_map query is supported by the kernel */
279 static boolean r600_query_result(struct r600_context *ctx, struct r600_query *query, boolean wait)
281 unsigned results_base = query->results_start;
284 map = ctx->ws->buffer_map(query->buffer->cs_buf, ctx->cs,
291 switch (query->type) {
293 while (results_base != query->results_end) {
294 query->result.u64 +=
296 results_base = (results_base + 16) % query->buffer->b.b.width0;
300 while (results_base != query->results_end) {
301 query->result.b = query->result.b ||
303 results_base = (results_base + 16) % query->buffer->b.b.width0;
307 while (results_base != query->results_end) {
308 query->result.u64 +=
310 results_base = (results_base + query->result_size) % query->buffer->b.b.width0;
320 while (results_base != query->results_end) {
321 query->result.u64 +=
323 results_base = (results_base + query->result_size) % query->buffer->b.b.width0;
328 while (results_base != query->results_end) {
329 query->result.u64 +=
331 results_base = (results_base + query->result_size) % query->buffer->b.b.width0;
335 while (results_base != query->results_end) {
336 query->result.so.num_primitives_written +=
338 query->result.so.primitives_storage_needed +=
340 results_base = (results_base + query->result_size) % query->buffer->b.b.width0;
344 while (results_base != query->results_end) {
345 query->result.b = query->result.b ||
348 results_base = (results_base + query->result_size) % query->buffer->b.b.width0;
355 query->results_start = query->results_end;
356 ctx->ws->buffer_unmap(query->buffer->cs_buf);
360 void r600_query_begin(struct r600_context *ctx, struct r600_query *query)
367 si_need_cs_space(ctx, query->num_cs_dw * 2, TRUE);
369 new_results_end = (query->results_end + query->result_size) % query->buffer->b.b.width0;
371 /* collect current results if query buffer is full */
372 if (new_results_end == query->results_start) {
373 r600_query_result(ctx, query, TRUE);
376 switch (query->type) {
379 results = ctx->ws->buffer_map(query->buffer->cs_buf, ctx->cs, PIPE_TRANSFER_WRITE);
381 results = (uint32_t*)((char*)results + query->results_end);
382 memset(results, 0, query->result_size);
391 ctx->ws->buffer_unmap(query->buffer->cs_buf);
400 results = ctx->ws->buffer_map(query->buffer->cs_buf, ctx->cs, PIPE_TRANSFER_WRITE);
401 results = (uint32_t*)((char*)results + query->results_end);
402 memset(results, 0, query->result_size);
403 ctx->ws->buffer_unmap(query->buffer->cs_buf);
409 /* emit begin query */
410 va = r600_resource_va(&ctx->screen->screen, (void*)query->buffer);
411 va += query->results_end;
413 switch (query->type) {
427 cs->buf[cs->cdw++] = query->results_end;
442 cs->buf[cs->cdw++] = r600_context_bo_reloc(ctx, query->buffer, RADEON_USAGE_WRITE);
444 ctx->num_cs_dw_queries_suspend += query->num_cs_dw;
447 void r600_query_end(struct r600_context *ctx, struct r600_query *query)
452 va = r600_resource_va(&ctx->screen->screen, (void*)query->buffer);
453 /* emit end query */
454 switch (query->type) {
457 va += query->results_end + 8;
469 cs->buf[cs->cdw++] = query->results_end + query->result_size/2;
473 va += query->results_end + query->result_size/2;
485 cs->buf[cs->cdw++] = r600_context_bo_reloc(ctx, query->buffer, RADEON_USAGE_WRITE);
487 query->results_end = (query->results_end + query->result_size) % query->buffer->b.b.width0;
488 ctx->num_cs_dw_queries_suspend -= query->num_cs_dw;
491 void r600_query_predication(struct r600_context *ctx, struct r600_query *query, int operation,
504 unsigned results_base = query->results_start;
508 /* find count of the query data blocks */
509 count = (query->buffer->b.b.width0 + query->results_end - query->results_start) % query->buffer->b.b.width0;
510 count /= query->result_size;
516 va = r600_resource_va(&ctx->screen->screen, (void*)query->buffer);
519 while (results_base != query->results_end) {
524 cs->buf[cs->cdw++] = r600_context_bo_reloc(ctx, query->buffer,
526 results_base = (results_base + query->result_size) % query->buffer->b.b.width0;
536 struct r600_query *query;
539 query = CALLOC_STRUCT(r600_query);
540 if (query == NULL)
543 query->type = query_type;
548 query->result_size = 16 * ctx->max_db;
549 query->num_cs_dw = 6;
552 query->result_size = 16;
553 query->num_cs_dw = 8;
560 query->result_size = 32;
561 query->num_cs_dw = 6;
565 FREE(query);
570 buffer_size -= buffer_size % query->result_size;
576 query->buffer = si_resource_create_custom(&ctx->screen->screen,
579 if (!query->buffer) {
580 FREE(query);
583 return query;
586 void r600_context_query_destroy(struct r600_context *ctx, struct r600_query *query)
588 si_resource_reference(&query->buffer, NULL);
589 free(query);
593 struct r600_query *query,
601 if (!r600_query_result(ctx, query, wait))
604 switch (query->type) {
608 *result_u64 = query->result.u64;
612 *result_b = query->result.b;
615 *result_u64 = (1000000 * query->result.u64) / ctx->screen->info.r600_clock_crystal_freq;
618 *result_so = query->result.so;
628 struct r600_query *query;
630 LIST_FOR_EACH_ENTRY(query, &ctx->active_query_list, list) {
631 r600_query_end(ctx, query);
638 struct r600_query *query;
642 LIST_FOR_EACH_ENTRY(query, &ctx->active_query_list, list) {
643 r600_query_begin(ctx, query);