mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-09 02:28:10 +02:00
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:
parent
a9a8d74d1f
commit
851587f281
2 changed files with 21 additions and 5 deletions
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue