panfrost: Use packs for varying buffers

In addition to better aesthetics, this automatically fixed multiple
instances of accidental CPU readback of GPU buffers -- in a hot path,
too!

Signed-off-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Reviewed-by: Tomeu Vizoso <tomeu.vizoso@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/6326>
This commit is contained in:
Alyssa Rosenzweig 2020-08-14 15:50:13 -04:00 committed by Marge Bot
parent 9732b64862
commit ec58cda5da
1 changed files with 36 additions and 35 deletions

View File

@ -1516,20 +1516,20 @@ panfrost_emit_vertex_data(struct panfrost_batch *batch,
}
static mali_ptr
panfrost_emit_varyings(struct panfrost_batch *batch, union mali_attr *slot,
unsigned stride, unsigned count)
panfrost_emit_varyings(struct panfrost_batch *batch,
struct mali_attribute_buffer_packed *slot,
unsigned stride, unsigned count)
{
/* Fill out the descriptor */
slot->stride = stride;
slot->size = stride * count;
slot->shift = slot->extra_flags = 0;
unsigned size = stride * count;
mali_ptr ptr = panfrost_pool_alloc(&batch->pool, size).gpu;
struct panfrost_transfer transfer = panfrost_pool_alloc(&batch->pool,
slot->size);
pan_pack(slot, ATTRIBUTE_BUFFER, cfg) {
cfg.stride = stride;
cfg.size = size;
cfg.pointer = ptr;
}
slot->elements = transfer.gpu | MALI_ATTR_LINEAR;
return transfer.gpu;
return ptr;
}
static unsigned
@ -1540,16 +1540,14 @@ panfrost_streamout_offset(unsigned stride, unsigned offset,
}
static void
panfrost_emit_streamout(struct panfrost_batch *batch, union mali_attr *slot,
unsigned stride, unsigned offset, unsigned count,
panfrost_emit_streamout(struct panfrost_batch *batch,
struct mali_attribute_buffer_packed *slot,
unsigned stride_words, unsigned offset, unsigned count,
struct pipe_stream_output_target *target)
{
/* Fill out the descriptor */
slot->stride = stride * 4;
slot->shift = slot->extra_flags = 0;
unsigned stride = stride_words * 4;
unsigned max_size = target->buffer_size;
unsigned expected_size = slot->stride * count;
unsigned expected_size = stride * count;
/* Grab the BO and bind it to the batch */
struct panfrost_bo *bo = pan_resource(target->buffer)->bo;
@ -1564,9 +1562,13 @@ panfrost_emit_streamout(struct panfrost_batch *batch, union mali_attr *slot,
PAN_BO_ACCESS_FRAGMENT);
/* We will have an offset applied to get alignment */
mali_ptr addr = bo->gpu + target->buffer_offset + (offset * slot->stride);
slot->elements = (addr & ~63) | MALI_ATTR_LINEAR;
slot->size = MIN2(max_size, expected_size) + (addr & 63);
mali_ptr addr = bo->gpu + target->buffer_offset + (offset * stride);
pan_pack(slot, ATTRIBUTE_BUFFER, cfg) {
cfg.pointer = (addr & ~63);
cfg.stride = stride;
cfg.size = MIN2(max_size, expected_size) + (addr & 63);
}
}
static bool
@ -1919,20 +1921,18 @@ panfrost_emit_varying(
}
static void
pan_emit_special_input(union mali_attr *varyings,
pan_emit_special_input(struct mali_attribute_buffer_packed *out,
unsigned present,
enum pan_special_varying v,
mali_ptr addr)
unsigned special)
{
if (present & (1 << v)) {
/* Ensure we write exactly once for performance and with fields
* zeroed appropriately to avoid flakes */
unsigned idx = pan_varying_index(present, v);
union mali_attr s = {
.elements = addr
};
varyings[pan_varying_index(present, v)] = s;
pan_pack(out + idx, ATTRIBUTE_BUFFER, cfg) {
cfg.special = special;
cfg.type = 0;
}
}
}
@ -2005,8 +2005,9 @@ panfrost_emit_varying_descriptor(struct panfrost_batch *batch,
unsigned xfb_base = pan_xfb_base(present);
struct panfrost_transfer T = panfrost_pool_alloc(&batch->pool,
sizeof(union mali_attr) * (xfb_base + ctx->streamout.num_targets));
union mali_attr *varyings = (union mali_attr *) T.cpu;
MALI_ATTRIBUTE_BUFFER_LENGTH * (xfb_base + ctx->streamout.num_targets));
struct mali_attribute_buffer_packed *varyings =
(struct mali_attribute_buffer_packed *) T.cpu;
/* Emit the stream out buffers */
@ -2036,9 +2037,9 @@ panfrost_emit_varying_descriptor(struct panfrost_batch *batch,
2, vertex_count);
}
pan_emit_special_input(varyings, present, PAN_VARY_PNTCOORD, MALI_VARYING_POINT_COORD);
pan_emit_special_input(varyings, present, PAN_VARY_FACE, MALI_VARYING_FRONT_FACING);
pan_emit_special_input(varyings, present, PAN_VARY_FRAGCOORD, MALI_VARYING_FRAG_COORD);
pan_emit_special_input(varyings, present, PAN_VARY_PNTCOORD, MALI_ATTRIBUTE_SPECIAL_POINT_COORD);
pan_emit_special_input(varyings, present, PAN_VARY_FACE, MALI_ATTRIBUTE_SPECIAL_FRONT_FACING);
pan_emit_special_input(varyings, present, PAN_VARY_FRAGCOORD, MALI_ATTRIBUTE_SPECIAL_FRAG_COORD);
vertex_postfix->varyings = T.gpu;
tiler_postfix->varyings = T.gpu;