r600g: clear compressed_depthtex/colortex_mask when binding buffer texture
authorNicolai Hähnle <nicolai.haehnle@amd.com>
Fri, 11 Mar 2016 02:19:56 +0000 (21:19 -0500)
committerNicolai Hähnle <nicolai.haehnle@amd.com>
Fri, 11 Mar 2016 13:00:15 +0000 (08:00 -0500)
Found by inspection of the source based on a bisected bug report.

This bug has been in the code for a long time, but the more recent PBO upload
feature exposed it because it leads to more uses of buffer textures.

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=94388
Reviewed-by: Marek Olšák <marek.olsak@amd.com>
Cc: "11.0 11.1 11.2" <mesa-stable@lists.freedesktop.org>
src/gallium/drivers/r600/r600_state_common.c

index 40ceb8d78199cebd1499cd7228e786917406e024..2211e07ceba968a14c5f90d371c2fdac82f7c6ae 100644 (file)
@@ -645,21 +645,21 @@ static void r600_set_sampler_views(struct pipe_context *pipe, unsigned shader,
                if (rviews[i]) {
                        struct r600_texture *rtex =
                                (struct r600_texture*)rviews[i]->base.texture;
+                       bool is_buffer = rviews[i]->base.texture->target == PIPE_BUFFER;
 
-                       if (rviews[i]->base.texture->target != PIPE_BUFFER) {
-                               if (rtex->is_depth && !rtex->is_flushing_texture) {
-                                       dst->views.compressed_depthtex_mask |= 1 << i;
-                               } else {
-                                       dst->views.compressed_depthtex_mask &= ~(1 << i);
-                               }
+                       if (!is_buffer && rtex->is_depth && !rtex->is_flushing_texture) {
+                               dst->views.compressed_depthtex_mask |= 1 << i;
+                       } else {
+                               dst->views.compressed_depthtex_mask &= ~(1 << i);
+                       }
 
-                               /* Track compressed colorbuffers. */
-                               if (rtex->cmask.size) {
-                                       dst->views.compressed_colortex_mask |= 1 << i;
-                               } else {
-                                       dst->views.compressed_colortex_mask &= ~(1 << i);
-                               }
+                       /* Track compressed colorbuffers. */
+                       if (!is_buffer && rtex->cmask.size) {
+                               dst->views.compressed_colortex_mask |= 1 << i;
+                       } else {
+                               dst->views.compressed_colortex_mask &= ~(1 << i);
                        }
+
                        /* Changing from array to non-arrays textures and vice versa requires
                         * updating TEX_ARRAY_OVERRIDE in sampler states on R6xx-R7xx. */
                        if (rctx->b.chip_class <= R700 &&