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;