radeonsi: Fix draws using user index buffer.
authorMichel Dänzer <michel.daenzer@amd.com>
Fri, 1 Feb 2013 17:49:07 +0000 (18:49 +0100)
committerMichel Dänzer <michel@daenzer.net>
Fri, 1 Feb 2013 17:53:03 +0000 (18:53 +0100)
Was broken since commit bf469f4edc60bd1c5fd770cb231b8d5ab801427f
('gallium: add void *user_buffer in pipe_index_buffer').

Fixes 11 piglit tests and lots of missing geometry e.g. in TORCS.

NOTE: This is a candidate for the 9.1 branch.

src/gallium/drivers/radeonsi/si_state_draw.c

index ef94eae5261a3f553c204f8bf32146df51eac1b8..3704410c9bf22efedb27ab93b3be7e7ea79cbb4a 100644 (file)
@@ -524,10 +524,8 @@ void si_draw_vbo(struct pipe_context *ctx, const struct pipe_draw_info *info)
        struct pipe_index_buffer ib = {};
        uint32_t cp_coher_cntl;
 
-       if ((!info->count && (info->indexed || !info->count_from_stream_output)) ||
-           (info->indexed && !rctx->index_buffer.buffer)) {
+       if (!info->count && (info->indexed || !info->count_from_stream_output))
                return;
-       }
 
        if (!rctx->ps_shader || !rctx->vs_shader)
                return;
@@ -538,13 +536,14 @@ void si_draw_vbo(struct pipe_context *ctx, const struct pipe_draw_info *info)
        if (info->indexed) {
                /* Initialize the index buffer struct. */
                pipe_resource_reference(&ib.buffer, rctx->index_buffer.buffer);
+               ib.user_buffer = rctx->index_buffer.user_buffer;
                ib.index_size = rctx->index_buffer.index_size;
                ib.offset = rctx->index_buffer.offset + info->start * ib.index_size;
 
                /* Translate or upload, if needed. */
                r600_translate_index_buffer(rctx, &ib, info->count);
 
-               if (ib.user_buffer) {
+               if (ib.user_buffer && !ib.buffer) {
                        r600_upload_index_buffer(rctx, &ib, info->count);
                }