pvr: Order tile buffer EOT emits to be last

Tile buffer emits required a load from the tile buffer into the
output regs, so they must be placed at the end of the EOT program
as to not corrupt the output register emits.

This commit orders the emit state to place output register emits
first, and tile buffer emits last.

dEQP test fixed:
  dEQP-VK.renderpass.suballocation.attachment.4.422
  ... and others from the dEQP-VK.renderpass.suballocation.*

Signed-off-by: Karmjit Mahil <Karmjit.Mahil@imgtec.com>
Reviewed-by: Frank Binns <frank.binns@imgtec.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/25584>
This commit is contained in:
Karmjit Mahil
2023-10-02 16:26:58 +01:00
committed by Marge Bot
parent 9d1fc4de72
commit bfcb88ea99
+48 -36
View File
@@ -1319,47 +1319,59 @@ pvr_setup_emit_state(const struct pvr_device_info *dev_info,
return;
}
static_assert(USC_MRT_RESOURCE_TYPE_OUTPUT_REG + 1 ==
USC_MRT_RESOURCE_TYPE_MEMORY,
"The loop below needs adjusting.");
emit_state->emit_count = 0;
for (uint32_t i = 0; i < hw_render->eot_surface_count; i++) {
const struct pvr_framebuffer *framebuffer = render_pass_info->framebuffer;
const struct pvr_renderpass_hwsetup_eot_surface *surface =
&hw_render->eot_surfaces[i];
const struct pvr_image_view *iview =
render_pass_info->attachments[surface->attachment_idx];
const struct usc_mrt_resource *mrt_resource =
&hw_render->eot_setup.mrt_resources[surface->mrt_idx];
uint32_t samples = 1;
for (uint32_t resource_type = USC_MRT_RESOURCE_TYPE_OUTPUT_REG;
resource_type <= USC_MRT_RESOURCE_TYPE_MEMORY;
resource_type++) {
for (uint32_t i = 0; i < hw_render->eot_surface_count; i++) {
const struct pvr_framebuffer *framebuffer =
render_pass_info->framebuffer;
const struct pvr_renderpass_hwsetup_eot_surface *surface =
&hw_render->eot_surfaces[i];
const struct pvr_image_view *iview =
render_pass_info->attachments[surface->attachment_idx];
const struct usc_mrt_resource *mrt_resource =
&hw_render->eot_setup.mrt_resources[surface->mrt_idx];
uint32_t samples = 1;
if (surface->need_resolve) {
const struct pvr_image_view *resolve_src =
render_pass_info->attachments[surface->src_attachment_idx];
/* Attachments that are the destination of resolve operations must
* be loaded before their next use.
*/
render_pass_info->enable_bg_tag = true;
render_pass_info->process_empty_tiles = true;
if (surface->resolve_type != PVR_RESOLVE_TYPE_PBE)
if (mrt_resource->type != resource_type)
continue;
samples = (uint32_t)resolve_src->vk.image->samples;
if (surface->need_resolve) {
const struct pvr_image_view *resolve_src =
render_pass_info->attachments[surface->src_attachment_idx];
/* Attachments that are the destination of resolve operations must
* be loaded before their next use.
*/
render_pass_info->enable_bg_tag = true;
render_pass_info->process_empty_tiles = true;
if (surface->resolve_type != PVR_RESOLVE_TYPE_PBE)
continue;
samples = (uint32_t)resolve_src->vk.image->samples;
}
assert(emit_state->emit_count < ARRAY_SIZE(emit_state->pbe_cs_words));
assert(emit_state->emit_count < ARRAY_SIZE(emit_state->pbe_reg_words));
pvr_setup_pbe_state(dev_info,
framebuffer,
emit_state->emit_count,
mrt_resource,
iview,
&render_pass_info->render_area,
surface->need_resolve,
samples,
emit_state->pbe_cs_words[emit_state->emit_count],
emit_state->pbe_reg_words[emit_state->emit_count]);
emit_state->emit_count += 1;
}
assert(emit_state->emit_count < ARRAY_SIZE(emit_state->pbe_cs_words));
assert(emit_state->emit_count < ARRAY_SIZE(emit_state->pbe_reg_words));
pvr_setup_pbe_state(dev_info,
framebuffer,
emit_state->emit_count,
mrt_resource,
iview,
&render_pass_info->render_area,
surface->need_resolve,
samples,
emit_state->pbe_cs_words[emit_state->emit_count],
emit_state->pbe_reg_words[emit_state->emit_count]);
emit_state->emit_count += 1;
}
assert(emit_state->emit_count == hw_render->pbe_emits);