From d905d0fca70165e577833854d30a65647ce774c0 Mon Sep 17 00:00:00 2001 From: Luigi Santivetti Date: Thu, 18 Jul 2024 16:31:14 +0100 Subject: [PATCH] pvr: take zonlyrender into account when setting up ZLS control Signed-off-by: Luigi Santivetti Acked-by: Erik Faye-Lund Part-of: --- src/imagination/vulkan/pvr_cmd_buffer.c | 12 ++++++++++++ src/imagination/vulkan/pvr_job_render.c | 1 + src/imagination/vulkan/pvr_job_render.h | 1 + src/imagination/vulkan/pvr_private.h | 2 ++ 4 files changed, 16 insertions(+) diff --git a/src/imagination/vulkan/pvr_cmd_buffer.c b/src/imagination/vulkan/pvr_cmd_buffer.c index 496f1287457..48e192f7652 100644 --- a/src/imagination/vulkan/pvr_cmd_buffer.c +++ b/src/imagination/vulkan/pvr_cmd_buffer.c @@ -1511,6 +1511,10 @@ static VkResult pvr_sub_cmd_gfx_job_init(const struct pvr_device_info *dev_info, pvr_setup_emit_state(dev_info, hw_render, render_pass_info, &emit_state); + job->z_only_render = !hw_render->eot_surface_count && + !sub_cmd->frag_has_side_effects && + !sub_cmd->has_depth_feedback; + memcpy(job->pbe_reg_words, emit_state.pbe_reg_words, sizeof(job->pbe_reg_words)); @@ -5779,6 +5783,8 @@ pvr_emit_dirty_ppp_state(struct pvr_cmd_buffer *const cmd_buffer, struct pvr_cmd_buffer_state *const state = &cmd_buffer->state; struct vk_dynamic_graphics_state *const dynamic_state = &cmd_buffer->vk.dynamic_graphics_state; + const struct pvr_fragment_shader_state *fragment_state = + &state->gfx_pipeline->shader_state.fragment; VkResult result; /* TODO: The emit_header will be dirty only if @@ -5849,6 +5855,12 @@ pvr_emit_dirty_ppp_state(struct pvr_cmd_buffer *const cmd_buffer, if (result != VK_SUCCESS) return result; + if (state->gfx_pipeline && + fragment_state->pass_type == ROGUE_TA_PASSTYPE_DEPTH_FEEDBACK) { + assert(state->current_sub_cmd->type == PVR_SUB_CMD_TYPE_GRAPHICS); + state->current_sub_cmd->gfx.has_depth_feedback = true; + } + return VK_SUCCESS; } diff --git a/src/imagination/vulkan/pvr_job_render.c b/src/imagination/vulkan/pvr_job_render.c index 6671cf64061..cb2fb62eb81 100644 --- a/src/imagination/vulkan/pvr_job_render.c +++ b/src/imagination/vulkan/pvr_job_render.c @@ -1210,6 +1210,7 @@ static void pvr_frag_state_stream_init(struct pvr_render_ctx *ctx, value.forcezload = value.zloaden || value.sloaden; value.forcezstore = value.zstoreen || value.sstoreen; + value.zonlyrender = job->z_only_render; } stream_ptr += pvr_cmd_length(CR_ISP_ZLSCTL); diff --git a/src/imagination/vulkan/pvr_job_render.h b/src/imagination/vulkan/pvr_job_render.h index 1c7190bed64..51a94d7fcfb 100644 --- a/src/imagination/vulkan/pvr_job_render.h +++ b/src/imagination/vulkan/pvr_job_render.h @@ -84,6 +84,7 @@ struct pvr_render_job { bool has_stencil_attachment : 1; bool requires_spm_scratch_buffer : 1; bool disable_pixel_merging : 1; + bool z_only_render : 1; }; uint32_t pds_pixel_event_data_offset; diff --git a/src/imagination/vulkan/pvr_private.h b/src/imagination/vulkan/pvr_private.h index 4d5ea4daeb7..cf4032ccde3 100644 --- a/src/imagination/vulkan/pvr_private.h +++ b/src/imagination/vulkan/pvr_private.h @@ -512,6 +512,8 @@ struct pvr_sub_cmd_gfx { bool has_occlusion_query; bool wait_on_previous_transfer; + + bool has_depth_feedback; }; struct pvr_sub_cmd_compute {