From 851587f2813a839224947136eb74e95303d78813 Mon Sep 17 00:00:00 2001 From: Alyssa Rosenzweig Date: Wed, 9 Jun 2021 13:42:26 -0400 Subject: [PATCH] panfrost: Set valid_buffer_range for GPU writes 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 Cc: mesa-stable Part-of: --- src/gallium/drivers/panfrost/pan_cmdstream.c | 23 +++++++++++++++----- src/gallium/drivers/panfrost/pan_compute.c | 3 +++ 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/src/gallium/drivers/panfrost/pan_cmdstream.c b/src/gallium/drivers/panfrost/pan_cmdstream.c index ae8697c2dc5..1efdff9b7bf 100644 --- a/src/gallium/drivers/panfrost/pan_cmdstream.c +++ b/src/gallium/drivers/panfrost/pan_cmdstream.c @@ -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); } } diff --git a/src/gallium/drivers/panfrost/pan_compute.c b/src/gallium/drivers/panfrost/pan_compute.c index 2c9cdf7b58c..0ce8838145d 100644 --- a/src/gallium/drivers/panfrost/pan_compute.c +++ b/src/gallium/drivers/panfrost/pan_compute.c @@ -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)); }