radeonsi: fix VM faults due NULL internal const buffers on CIK
authorMarek Olšák <marek.olsak@amd.com>
Thu, 18 Aug 2016 13:25:51 +0000 (15:25 +0200)
committerMarek Olšák <marek.olsak@amd.com>
Wed, 24 Aug 2016 13:39:57 +0000 (15:39 +0200)
They are harmless, but the interrupts do decrease performance.

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=97039

Cc: 12.0 <mesa-stable@lists.freedesktop.org>
src/gallium/drivers/radeonsi/si_pipe.c

index 131d3a217398befc571d8523bf3f426af1f07ccb..67c3a260ef0cb6de017bbe1a5631de6be380b640 100644 (file)
@@ -251,8 +251,8 @@ static struct pipe_context *si_create_context(struct pipe_screen *screen,
        si_begin_new_cs(sctx);
        r600_query_init_backend_mask(&sctx->b); /* this emits commands and must be last */
 
-       /* CIK cannot unbind a constant buffer (S_BUFFER_LOAD is buggy
-        * with a NULL buffer). We need to use a dummy buffer instead. */
+       /* CIK cannot unbind a constant buffer (S_BUFFER_LOAD doesn't skip loads
+        * if NUM_RECORDS == 0). We need to use a dummy buffer instead. */
        if (sctx->b.chip_class == CIK) {
                sctx->null_const_buf.buffer = pipe_buffer_create(screen, PIPE_BIND_CONSTANT_BUFFER,
                                                                 PIPE_USAGE_DEFAULT, 16);
@@ -267,6 +267,15 @@ static struct pipe_context *si_create_context(struct pipe_screen *screen,
                        }
                }
 
+               si_set_rw_buffer(sctx, SI_HS_CONST_DEFAULT_TESS_LEVELS,
+                                &sctx->null_const_buf);
+               si_set_rw_buffer(sctx, SI_VS_CONST_CLIP_PLANES,
+                                &sctx->null_const_buf);
+               si_set_rw_buffer(sctx, SI_PS_CONST_POLY_STIPPLE,
+                                &sctx->null_const_buf);
+               si_set_rw_buffer(sctx, SI_PS_CONST_SAMPLE_POSITIONS,
+                                &sctx->null_const_buf);
+
                /* Clear the NULL constant buffer, because loads should return zeros. */
                sctx->b.clear_buffer(&sctx->b.b, sctx->null_const_buf.buffer, 0,
                                     sctx->null_const_buf.buffer->width0, 0,