From 5000c31573035865ca9889ae290b2c0b1228c267 Mon Sep 17 00:00:00 2001 From: Jarred Davies Date: Tue, 24 Feb 2026 13:07:02 +0000 Subject: [PATCH] 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 Reviewed-by: Frank Binns (cherry picked from commit d1f2ad17dd6c0b4493ec2557ff09094e9033cd63) Part-of: --- .pick_status.json | 2 +- src/imagination/vulkan/pvr_arch_spm.c | 14 ++++++++++---- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/.pick_status.json b/.pick_status.json index f97120be608..1db6d437853 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -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 diff --git a/src/imagination/vulkan/pvr_arch_spm.c b/src/imagination/vulkan/pvr_arch_spm.c index 5bc2ab25df3..5d1bcd95e85 100644 --- a/src/imagination/vulkan/pvr_arch_spm.c +++ b/src/imagination/vulkan/pvr_arch_spm.c @@ -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;