panfrost/val: Emit varying descriptors based on the VS varying layout

Signed-off-by: Lorenzo Rossi <lorenzo.rossi@collabora.com>
Reviewed-by: Faith Ekstrand <faith.ekstrand@collabora.com>
Acked-by: Eric R. Smith <eric.smith@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/38681>
This commit is contained in:
Lorenzo Rossi 2026-02-20 22:25:19 +01:00 committed by Marge Bot
parent 0c4d2c8722
commit 5518549708
3 changed files with 27 additions and 32 deletions

View file

@ -3068,10 +3068,12 @@ panfrost_val_emit_varying_descriptors(struct panfrost_batch *batch)
struct panfrost_compiled_shader *fs =
batch->ctx->prog[MESA_SHADER_FRAGMENT];
const uint32_t vs_out_mask = vs->info.varyings.fixed_varyings;
const uint32_t fs_in_mask = fs->info.varyings.fixed_varyings;
const uint32_t fs_in_slots = fs->info.varyings.input_count +
util_bitcount(fs_in_mask);
const struct pan_varying_layout *vs_layout = &vs->info.varyings.formats;
const struct pan_varying_layout *fs_format = &fs->info.varyings.formats;
pan_varying_layout_require_layout(vs_layout);
pan_varying_layout_require_format(fs_format);
const uint32_t fs_in_slots = fs_format->count;
struct pan_ptr bufs =
pan_pool_alloc_desc_array(&batch->pool.base, fs_in_slots, ATTRIBUTE);
@ -3079,31 +3081,37 @@ panfrost_val_emit_varying_descriptors(struct panfrost_batch *batch)
batch->nr_varying_attribs[MESA_SHADER_FRAGMENT] = fs_in_slots;
const uint32_t varying_size = panfrost_vertex_attribute_stride(vs, fs);
for (uint32_t i = 0; i < fs_in_slots; i++) {
const struct pan_shader_varying *var = &fs->info.varyings.input[i];
const struct pan_varying_slot *fs_slot =
pan_varying_layout_slot_at(fs_format, i);
uint32_t index = 0;
if (var->location >= VARYING_SLOT_VAR0) {
unsigned nr_special = util_bitcount(vs_out_mask);
unsigned general_index = (var->location - VARYING_SLOT_VAR0);
index = nr_special + general_index;
} else {
index = util_bitcount(vs_out_mask & BITFIELD_MASK(var->location));
if (!fs_slot || fs_slot->section != PAN_VARYING_SECTION_GENERIC)
continue;
unsigned offset = 0;
enum pipe_format format = PIPE_FORMAT_NONE;
const struct pan_varying_slot *vs_slot =
pan_varying_layout_find_slot(vs_layout, fs_slot->location);
if (vs_slot) {
offset = vs_slot->offset;
/* Trust the bit-size from VS */
nir_alu_type base_type = nir_alu_type_get_base_type(fs_slot->alu_type);
nir_alu_type bit_size = nir_alu_type_get_type_size(vs_slot->alu_type);
format = pan_varying_format(base_type | bit_size, vs_slot->ncomps);
}
pan_pack(&descs[i], ATTRIBUTE, cfg) {
cfg.attribute_type = MALI_ATTRIBUTE_TYPE_VERTEX_PACKET;
cfg.offset_enable = false;
cfg.format = GENX(pan_format_from_pipe_format)(var->format)->hw;
cfg.format = GENX(pan_format_from_pipe_format)(format)->hw;
cfg.table = 61;
cfg.frequency = MALI_ATTRIBUTE_FREQUENCY_VERTEX;
cfg.offset = 1024 + (index * 16);
cfg.offset = 1024 + offset;
/* On v12+, the hardware-controlled buffer is at index 1 for varyings */
cfg.buffer_index = PAN_ARCH >= 12 ? 1 : 0;
cfg.attribute_stride = varying_size;
cfg.packet_stride = varying_size + 16;
cfg.attribute_stride = vs_layout->generic_size_B;
cfg.packet_stride = vs_layout->generic_size_B + 16;
}
}

View file

@ -257,19 +257,6 @@ panfrost_get_varying_shader(struct panfrost_batch *batch)
}
#endif
static inline unsigned
panfrost_vertex_attribute_stride(struct panfrost_compiled_shader *vs,
struct panfrost_compiled_shader *fs)
{
unsigned v = vs->info.varyings.output_count;
unsigned f = fs->info.varyings.input_count;
unsigned slots = MAX2(v, f);
slots += util_bitcount(vs->info.varyings.fixed_varyings);
/* Assumes 16 byte slots. We could do better. */
return slots * 16;
}
static inline uint64_t
panfrost_emit_resources(struct panfrost_batch *batch,
mesa_shader_stage stage)

View file

@ -1184,7 +1184,7 @@ csf_emit_draw_state(struct panfrost_batch *batch,
}
cs_move32_to(b, cs_sr_reg32(b, IDVS, VARY_SIZE),
panfrost_vertex_attribute_stride(vs, fs));
vs->info.varyings.formats.generic_size_B);
cs_move64_to(b, cs_sr_reg64(b, IDVS, BLEND_DESC),
batch->blend | MAX2(batch->key.nr_cbufs, 1));
cs_move64_to(b, cs_sr_reg64(b, IDVS, ZSD), batch->depth_stencil);