r600g,radeonsi: don't append to streamout buffers that haven't been used yet
authorMarek Olšák <marek.olsak@amd.com>
Sun, 1 Feb 2015 12:47:01 +0000 (13:47 +0100)
committerMarek Olšák <marek.olsak@amd.com>
Wed, 4 Feb 2015 13:34:13 +0000 (14:34 +0100)
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@lists.freedesktop.org>
Reviewed-by: Glenn Kennard <glenn.kennard@gmail.com>
Reviewed-by: Michel Dänzer <michel.daenzer@amd.com>
src/gallium/drivers/radeon/r600_pipe_common.h
src/gallium/drivers/radeon/r600_streamout.c

index 6224668ea6e0121f90601cfdd41564555b28a92a..46a6bf3077958905cfb50580889454787de80524 100644 (file)
@@ -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;
 };
index c44f0f2171d9c7bec918ca694deadb25e943c4f6..bc8bf97ef89378d4263b55062890b529eda6ca80 100644 (file)
@@ -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;