Lines Matching defs:buffer
47 /* Queries without buffer handling or suspend/resume. */
517 void si_query_buffer_destroy(struct si_screen *sscreen, struct si_query_buffer *buffer)
519 struct si_query_buffer *prev = buffer->previous;
529 si_resource_reference(&buffer->buf, NULL);
532 void si_query_buffer_reset(struct si_context *sctx, struct si_query_buffer *buffer)
535 while (buffer->previous) {
536 struct si_query_buffer *qbuf = buffer->previous;
537 buffer->previous = qbuf->previous;
539 si_resource_reference(&buffer->buf, NULL);
540 buffer->buf = qbuf->buf; /* move ownership */
543 buffer->results_end = 0;
545 if (!buffer->buf)
548 /* Discard even the oldest buffer if it can't be mapped without a stall. */
549 if (si_cs_is_buffer_referenced(sctx, buffer->buf->buf, RADEON_USAGE_READWRITE) ||
550 !sctx->ws->buffer_wait(sctx->ws, buffer->buf->buf, 0, RADEON_USAGE_READWRITE)) {
551 si_resource_reference(&buffer->buf, NULL);
553 buffer->unprepared = true;
557 bool si_query_buffer_alloc(struct si_context *sctx, struct si_query_buffer *buffer,
561 bool unprepared = buffer->unprepared;
562 buffer->unprepared = false;
564 if (!buffer->buf || buffer->results_end + size > buffer->buf->b.b.width0) {
565 if (buffer->buf) {
567 memcpy(qbuf, buffer, sizeof(*qbuf));
568 buffer->previous = qbuf;
570 buffer->results_end = 0;
578 buffer->buf = si_resource(pipe_buffer_create(&screen->b, 0, PIPE_USAGE_STAGING, buf_size));
579 if (unlikely(!buffer->buf))
585 if (unlikely(!prepare_buffer(sctx, buffer))) {
586 si_resource_reference(&buffer->buf, NULL);
598 si_query_buffer_destroy(sctx->screen, &query->buffer);
605 struct si_query_hw *query = container_of(qbuf, struct si_query_hw, buffer);
608 /* The caller ensures that the buffer is currently unused by the GPU. */
681 struct si_resource *buffer, uint64_t va);
683 struct si_resource *buffer, uint64_t va);
684 static void si_query_hw_add_result(struct si_screen *sscreen, struct si_query_hw *, void *buffer,
807 struct si_resource *buffer, uint64_t va)
864 sbuf.buffer = &buffer->b.b;
865 sbuf.buffer_offset = query->buffer.results_end;
866 sbuf.buffer_size = buffer->bo_size;
895 radeon_add_to_buffer_list(sctx, &sctx->gfx_cs, query->buffer.buf,
903 if (!query->buffer.buf && query->flags & SI_QUERY_EMULATE_GS_COUNTERS)
904 si_resource_reference(&query->buffer.buf, sctx->pipeline_stats_query_buf);
908 !si_query_buffer_alloc(sctx, &query->buffer, query->ops->prepare_buffer, query->result_size))
912 si_resource_reference(&sctx->pipeline_stats_query_buf, query->buffer.buf);
922 va = query->buffer.buf->gpu_address + query->buffer.results_end;
923 query->ops->emit_start(sctx, query, query->buffer.buf, va);
927 struct si_resource *buffer, uint64_t va)
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,
1015 if (!si_query_buffer_alloc(sctx, &query->buffer, query->ops->prepare_buffer,
1020 if (!query->buffer.buf)
1021 return; // previous buffer allocation failure
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;
1166 for (qbuf = &query->buffer; qbuf; qbuf = qbuf->previous) {
1236 si_query_buffer_reset(sctx, &query->buffer);
1241 if (!query->buffer.buf)
1262 si_query_buffer_reset(sctx, &query->buffer);
1271 if (!query->buffer.buf)
1361 void *buffer, union pipe_query_result *result)
1369 result->u64 += si_query_read_result(buffer + results_base, 0, 2, true);
1377 result->b = result->b || si_query_read_result(buffer + results_base, 0, 2, true) != 0;
1382 result->u64 += si_query_read_result(buffer, 0, 2, false);
1385 result->u64 = *(uint64_t *)buffer;
1394 result->u64 += si_query_read_result(buffer, 2, 6, true);
1398 result->u64 += si_query_read_result(buffer, 0, 4, true);
1401 result->so_statistics.num_primitives_written += si_query_read_result(buffer, 2, 6, true);
1402 result->so_statistics.primitives_storage_needed += si_query_read_result(buffer, 0, 4, true);
1405 result->b = result->b || si_query_read_result(buffer, 2, 6, true) !=
1406 si_query_read_result(buffer, 0, 4, true);
1410 result->b = result->b || si_query_read_result(buffer, 2, 6, true) !=
1411 si_query_read_result(buffer, 0, 4, true);
1412 buffer = (char *)buffer + 32;
1418 si_query_read_result(buffer, si_query_pipestat_dw_offset(i),
1497 for (qbuf = &query->buffer; qbuf; qbuf = qbuf->previous) {
1556 if (query->buffer.previous) {
1574 ssbo[1].buffer = tmp_buffer;
1613 for (qbuf = &query->buffer; qbuf; qbuf = qbuf_prev) {
1618 if (qbuf != &query->buffer)
1632 ssbo[0].buffer = &qbuf->buf->b.b;
1637 ssbo[2].buffer = resource;
1645 if ((flags & PIPE_QUERY_WAIT) && qbuf == &query->buffer) {
1685 (squery->buffer.previous || squery->buffer.results_end > squery->result_size)))) {
1778 X("buffer-wait-time", BUFFER_WAIT_TIME, MICROSECONDS, CUMULATIVE),
1789 X("back-buffer-ps-draw-ratio", BACK_BUFFER_PS_DRAW_RATIO, UINT64, AVERAGE),