From 8a1ef5bd313b106671ac2a0faf49e980f3866ed2 Mon Sep 17 00:00:00 2001 From: Patrick Lerda Date: Fri, 25 Apr 2025 13:34:03 +0200 Subject: [PATCH] r600: enable ARB_transform_feedback_overflow_query This functionality was mostly implemented but not enabled. The functionality which is using SET_PREDICATION seems to not work as expected. This change was tested on palm, barts and cayman, piglit tests (26/28), and khr-gl45 tests (7/13). Signed-off-by: Patrick Lerda Reviewed-by: Gert Wollny Part-of: --- src/gallium/drivers/r600/r600_pipe.c | 1 + src/gallium/drivers/r600/r600_query.c | 14 ++++++++++---- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/src/gallium/drivers/r600/r600_pipe.c b/src/gallium/drivers/r600/r600_pipe.c index d6d3c1b50b8..5e95bd45805 100644 --- a/src/gallium/drivers/r600/r600_pipe.c +++ b/src/gallium/drivers/r600/r600_pipe.c @@ -414,6 +414,7 @@ static void r600_init_screen_caps(struct r600_screen *rscreen) caps->invalidate_buffer = true; caps->surface_reinterpret_blocks = true; caps->query_memory_info = true; + caps->query_so_overflow = family >= CHIP_CEDAR; caps->framebuffer_no_attachment = true; caps->legacy_math_rules = true; caps->can_bind_const_buffer_as_vertex = true; diff --git a/src/gallium/drivers/r600/r600_query.c b/src/gallium/drivers/r600/r600_query.c index 13e9b5699df..2840665d7cd 100644 --- a/src/gallium/drivers/r600/r600_query.c +++ b/src/gallium/drivers/r600/r600_query.c @@ -728,9 +728,12 @@ static void r600_query_hw_do_emit_start(struct r600_common_context *ctx, emit_sample_streamout(cs, va, query->stream); break; case PIPE_QUERY_SO_OVERFLOW_ANY_PREDICATE: - for (unsigned stream = 0; stream < R600_MAX_STREAMS; ++stream) + for (unsigned stream = 0; stream < R600_MAX_STREAMS; ++stream) { emit_sample_streamout(cs, va + 32 * stream, stream); - break; + r600_emit_reloc(ctx, &ctx->gfx, query->buffer.buf, RADEON_USAGE_WRITE | + RADEON_PRIO_QUERY); + } + return; case PIPE_QUERY_TIME_ELAPSED: /* Write the timestamp after the last draw is done. * (bottom-of-pipe) @@ -814,9 +817,12 @@ static void r600_query_hw_do_emit_stop(struct r600_common_context *ctx, break; case PIPE_QUERY_SO_OVERFLOW_ANY_PREDICATE: va += 16; - for (unsigned stream = 0; stream < R600_MAX_STREAMS; ++stream) + for (unsigned stream = 0; stream < R600_MAX_STREAMS; ++stream) { emit_sample_streamout(cs, va + 32 * stream, stream); - break; + r600_emit_reloc(ctx, &ctx->gfx, query->buffer.buf, RADEON_USAGE_WRITE | + RADEON_PRIO_QUERY); + } + return; case PIPE_QUERY_TIME_ELAPSED: va += 8; FALLTHROUGH;