pvr: Add missing support for tile buffers to SPM EOT programs

Configure the EOT setup for SPM EOT programs so that the generated
programs load the tile buffer into the output buffer before doing
the emit

Partial fix for:
dEQP-VK.renderpass.*.attachment_allocation.input_output.71

Backport-to: 26.0

Signed-off-by: Nick Hamilton <nick.hamilton@imgtec.com>
Reviewed-by: Frank Binns <frank.binns@imgtec.com>
(cherry picked from commit d1f2ad17dd)

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/40092>
This commit is contained in:
Jarred Davies 2026-02-24 13:07:02 +00:00 committed by Eric Engestrom
parent 022e34b5f3
commit 5000c31573
2 changed files with 11 additions and 5 deletions

View file

@ -494,7 +494,7 @@
"description": "pvr: Add missing support for tile buffers to SPM EOT programs",
"nominated": true,
"nomination_type": 4,
"resolution": 0,
"resolution": 1,
"main_sha": null,
"because_sha": null,
"notes": null

View file

@ -469,6 +469,7 @@ VkResult pvr_arch_spm_init_eot_state(
};
uint32_t pbe_state_words[PVR_MAX_COLOR_ATTACHMENTS]
[ROGUE_NUM_PBESTATE_STATE_WORDS];
uint64_t tile_buffer_addrs[PVR_MAX_COLOR_ATTACHMENTS] = {0};
const struct pvr_device_info *dev_info = &device->pdevice->dev_info;
uint32_t total_render_target_used = 0;
struct pvr_pds_upload pds_eot_program;
@ -553,13 +554,12 @@ VkResult pvr_arch_spm_init_eot_state(
total_render_target_used++;
/* Store off-chip tile data (i.e. tile buffers). */
const struct pvr_device_tile_buffer_state *tile_buffer_state =
&device->tile_buffer_state;
for (uint32_t i = 0; i < hw_render->tile_buffers_count; i++) {
continue;
assert(!"Add support for tile buffers in EOT");
pvr_finishme("Add support for tile buffers in EOT");
assert(total_render_target_used < PVR_MAX_COLOR_ATTACHMENTS);
assert(i < tile_buffer_state->buffer_count);
mem_stored = pvr_spm_setup_pbe_state(
dev_info,
@ -571,6 +571,8 @@ VkResult pvr_arch_spm_init_eot_state(
pbe_state_words[total_render_target_used],
spm_eot_state->pbe_reg_words[total_render_target_used]);
tile_buffer_addrs[total_render_target_used] = tile_buffer_state->buffers[i]->vma->dev_addr.addr;
next_scratch_buffer_addr =
PVR_DEV_ADDR_OFFSET(next_scratch_buffer_addr, mem_stored);
@ -582,8 +584,12 @@ VkResult pvr_arch_spm_init_eot_state(
.emit_count = total_render_target_used,
.shared_words = false,
.state_words = pbe_state_words[0],
.num_output_regs = hw_render->output_regs_count,
.msaa_samples = hw_render->sample_count,
};
memcpy(props.tile_buffer_addrs, tile_buffer_addrs, sizeof(tile_buffer_addrs));
eot = pvr_usc_eot(device->pdevice->pco_ctx, &props, dev_info);
usc_temp_count = pco_shader_data(eot)->common.temps;