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 <alyssa@collabora.com>
Cc: mesa-stable
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/11123>
This commit is contained in:
Alyssa Rosenzweig 2021-06-09 13:42:26 -04:00 committed by Marge Bot
parent a9a8d74d1f
commit 851587f281
2 changed files with 21 additions and 5 deletions

View 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);
}
}

View 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));
}