panfrost: Set valid_buffer_range for GPU writes
authorAlyssa Rosenzweig <alyssa@collabora.com>
Wed, 9 Jun 2021 17:42:26 +0000 (13:42 -0400)
committerMarge Bot <eric+marge@anholt.net>
Thu, 10 Jun 2021 18:06:11 +0000 (18:06 +0000)
Transform feedback, SSBO writes, and image writes in particular can
affect this and have bad interactions. Fixes
KHR-GLES31.core.shader_atomic_counters.basic-usage-vs

Signed-off-by: Alyssa Rosenzweig <alyssa@collabora.com>
Cc: mesa-stable
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/11123>

src/gallium/drivers/panfrost/pan_cmdstream.c
src/gallium/drivers/panfrost/pan_compute.c

index ae8697c..1efdff9 100644 (file)
@@ -903,12 +903,16 @@ panfrost_upload_ssbo_sysval(struct panfrost_batch *batch,
         struct pipe_shader_buffer sb = ctx->ssbo[st][ssbo_id];
 
         /* Compute address */
-        struct panfrost_bo *bo = pan_resource(sb.buffer)->image.data.bo;
+        struct panfrost_resource *rsrc = pan_resource(sb.buffer);
+        struct panfrost_bo *bo = rsrc->image.data.bo;
 
         panfrost_batch_add_bo(batch, bo,
                               PAN_BO_ACCESS_SHARED | PAN_BO_ACCESS_RW |
                               panfrost_bo_access_for_stage(st));
 
+        util_range_add(&rsrc->base, &rsrc->valid_buffer_range,
+                        sb.buffer_offset, sb.buffer_size);
+
         /* Upload address and size as sysval */
         uniform->du[0] = bo->ptr.gpu + sb.buffer_offset;
         uniform->u[2] = sb.buffer_size;
@@ -1545,6 +1549,11 @@ emit_image_bufs(struct panfrost_batch *batch, enum pipe_shader_type shader,
                         flags |= PAN_BO_ACCESS_WRITE;
                         unsigned level = is_buffer ? 0 : image->u.tex.level;
                         BITSET_SET(rsrc->valid.data, level);
+
+                        if (is_buffer) {
+                                util_range_add(&rsrc->base, &rsrc->valid_buffer_range,
+                                                0, rsrc->base.width0);
+                        }
                 }
                 panfrost_batch_add_bo(batch, rsrc->image.data.bo, flags);
 
@@ -1894,7 +1903,8 @@ panfrost_emit_streamout(struct panfrost_batch *batch,
         unsigned expected_size = stride * count;
 
         /* Grab the BO and bind it to the batch */
-        struct panfrost_bo *bo = pan_resource(target->buffer)->image.data.bo;
+        struct panfrost_resource *rsrc = pan_resource(target->buffer);
+        struct panfrost_bo *bo = rsrc->image.data.bo;
 
         /* Varyings are WRITE from the perspective of the VERTEX but READ from
          * the perspective of the TILER and FRAGMENT.
@@ -1905,12 +1915,15 @@ panfrost_emit_streamout(struct panfrost_batch *batch,
                               PAN_BO_ACCESS_VERTEX_TILER |
                               PAN_BO_ACCESS_FRAGMENT);
 
-        mali_ptr addr = bo->ptr.gpu + panfrost_xfb_offset(stride, target);
+        unsigned offset = panfrost_xfb_offset(stride, target);
 
         pan_pack(slot, ATTRIBUTE_BUFFER, cfg) {
-                cfg.pointer = (addr & ~63);
+                cfg.pointer = bo->ptr.gpu + (offset & ~63);
                 cfg.stride = stride;
-                cfg.size = MIN2(max_size, expected_size) + (addr & 63);
+                cfg.size = MIN2(max_size, expected_size) + (offset & 63);
+
+                util_range_add(&rsrc->base, &rsrc->valid_buffer_range,
+                                offset, cfg.size);
         }
 }
 
index 2c9cdf7..0ce8838 100644 (file)
@@ -236,6 +236,9 @@ panfrost_set_global_binding(struct pipe_context *pctx,
                 panfrost_batch_add_bo(batch, rsrc->image.data.bo,
                                       PAN_BO_ACCESS_SHARED | PAN_BO_ACCESS_RW);
 
+                util_range_add(&rsrc->base, &rsrc->valid_buffer_range,
+                                0, rsrc->base.width0);
+
                 /* The handle points to uint32_t, but space is allocated for 64 bits */
                 memcpy(handles[i], &rsrc->image.data.bo->ptr.gpu, sizeof(mali_ptr));
         }