Mesa (10.4): r600g, radeonsi: don't append to streamout buffers that haven' t been used yet

Emil Velikov evelikov at kemper.freedesktop.org
Wed Feb 18 22:22:17 UTC 2015


Module: Mesa
Branch: 10.4
Commit: 5c623ff07125a6c1cc4d4bfc80fe3201509daf6b
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=5c623ff07125a6c1cc4d4bfc80fe3201509daf6b

Author: Marek Olšák <marek.olsak at amd.com>
Date:   Sun Feb  1 13:47:01 2015 +0100

r600g,radeonsi: don't append to streamout buffers that haven't been used yet

The FILLED_SIZE counter is uninitialized at the beginning, so we can't use it.
Instead, use offset = 0, which is what we always do when not appending.

This unexpectedly fixes spec/ARB_texture_multisample/sample-position/*.
Yes, the test does use transform feedback.

Cc: 10.3 10.4 <mesa-stable at lists.freedesktop.org>
Reviewed-by: Glenn Kennard <glenn.kennard at gmail.com>
Reviewed-by: Michel Dänzer <michel.daenzer at amd.com>
(cherry picked from commit 658f1d4cfeeea84268715c07f871721df8f1b729)

---

 src/gallium/drivers/radeon/r600_pipe_common.h |    1 +
 src/gallium/drivers/radeon/r600_streamout.c   |    4 +++-
 2 files changed, 4 insertions(+), 1 deletion(-)

diff --git a/src/gallium/drivers/radeon/r600_pipe_common.h b/src/gallium/drivers/radeon/r600_pipe_common.h
index a699f45..cacf54b 100644
--- a/src/gallium/drivers/radeon/r600_pipe_common.h
+++ b/src/gallium/drivers/radeon/r600_pipe_common.h
@@ -294,6 +294,7 @@ struct r600_so_target {
 	/* The buffer where BUFFER_FILLED_SIZE is stored. */
 	struct r600_resource	*buf_filled_size;
 	unsigned		buf_filled_size_offset;
+	bool			buf_filled_size_valid;
 
 	unsigned		stride_in_dw;
 };
diff --git a/src/gallium/drivers/radeon/r600_streamout.c b/src/gallium/drivers/radeon/r600_streamout.c
index e2413c2..945735b 100644
--- a/src/gallium/drivers/radeon/r600_streamout.c
+++ b/src/gallium/drivers/radeon/r600_streamout.c
@@ -237,7 +237,7 @@ static void r600_emit_streamout_begin(struct r600_common_context *rctx, struct r
 			}
 		}
 
-		if (rctx->streamout.append_bitmask & (1 << i)) {
+		if (rctx->streamout.append_bitmask & (1 << i) && t[i]->buf_filled_size_valid) {
 			uint64_t va = t[i]->buf_filled_size->gpu_address +
 				      t[i]->buf_filled_size_offset;
 
@@ -302,6 +302,8 @@ void r600_emit_streamout_end(struct r600_common_context *rctx)
 		 * buffer bound. This ensures that the primitives-emitted query
 		 * won't increment. */
 		r600_write_context_reg(cs, R_028AD0_VGT_STRMOUT_BUFFER_SIZE_0 + 16*i, 0);
+
+		t[i]->buf_filled_size_valid = true;
 	}
 
 	rctx->streamout.begin_emitted = false;




More information about the mesa-commit mailing list