Module: Mesa
Branch: main
Commit: 8b87c985b0c20bcc8793ce370627b5b9558b8c49
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=8b87c985b0c20bcc8793ce370627b5b9558b8c49

Author: Samuel Pitoiset <[email protected]>
Date:   Thu Nov 16 17:02:41 2023 +0100

radv: prepare the PS epilog key for exporting MRTZ on RDNA3

Signed-off-by: Samuel Pitoiset <[email protected]>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/26413>

---

 src/amd/compiler/aco_shader_info.h      | 3 ++-
 src/amd/vulkan/radv_aco_shader_info.h   | 1 +
 src/amd/vulkan/radv_cmd_buffer.c        | 9 +++++++++
 src/amd/vulkan/radv_pipeline_graphics.c | 4 ++++
 src/amd/vulkan/radv_private.h           | 4 ++++
 src/amd/vulkan/radv_shader.h            | 4 ++++
 6 files changed, 24 insertions(+), 1 deletion(-)

diff --git a/src/amd/compiler/aco_shader_info.h 
b/src/amd/compiler/aco_shader_info.h
index 493d6bf3336..847bda02751 100644
--- a/src/amd/compiler/aco_shader_info.h
+++ b/src/amd/compiler/aco_shader_info.h
@@ -73,11 +73,12 @@ struct aco_ps_epilog_info {
 
    bool mrt0_is_dual_src;
 
+   bool alpha_to_coverage_via_mrtz;
+
    /* OpenGL only */
    uint16_t color_types;
    bool clamp_color;
    bool alpha_to_one;
-   bool alpha_to_coverage_via_mrtz;
    bool skip_null_export;
    unsigned broadcast_last_cbuf;
    enum compare_func alpha_func;
diff --git a/src/amd/vulkan/radv_aco_shader_info.h 
b/src/amd/vulkan/radv_aco_shader_info.h
index b8f0579e660..19206d33b84 100644
--- a/src/amd/vulkan/radv_aco_shader_info.h
+++ b/src/amd/vulkan/radv_aco_shader_info.h
@@ -115,6 +115,7 @@ radv_aco_convert_ps_epilog_key(struct aco_ps_epilog_info 
*aco_info, const struct
    ASSIGN_FIELD(color_is_int8);
    ASSIGN_FIELD(color_is_int10);
    ASSIGN_FIELD(mrt0_is_dual_src);
+   ASSIGN_FIELD(alpha_to_coverage_via_mrtz);
 
    memcpy(aco_info->colors, radv_args->colors, sizeof(aco_info->colors));
 
diff --git a/src/amd/vulkan/radv_cmd_buffer.c b/src/amd/vulkan/radv_cmd_buffer.c
index c2946712ffa..f26205836d7 100644
--- a/src/amd/vulkan/radv_cmd_buffer.c
+++ b/src/amd/vulkan/radv_cmd_buffer.c
@@ -4174,6 +4174,7 @@ radv_emit_color_blend(struct radv_cmd_buffer *cmd_buffer)
 static struct radv_shader_part *
 lookup_ps_epilog(struct radv_cmd_buffer *cmd_buffer)
 {
+   const struct radv_shader *ps = 
cmd_buffer->state.shaders[MESA_SHADER_FRAGMENT];
    const struct radv_rendering_state *render = &cmd_buffer->state.render;
    const struct radv_dynamic_state *d = &cmd_buffer->state.dynamic;
    struct radv_device *device = cmd_buffer->device;
@@ -4207,6 +4208,14 @@ lookup_ps_epilog(struct radv_cmd_buffer *cmd_buffer)
       state.need_src_alpha |= 0x1;
    }
 
+   if (ps && ps->info.ps.exports_mrtz_via_epilog) {
+      assert(device->physical_device->rad_info.gfx_level >= GFX11);
+      state.export_depth = ps->info.ps.writes_z;
+      state.export_stencil = ps->info.ps.writes_stencil;
+      state.export_sample_mask = ps->info.ps.writes_sample_mask;
+      state.alpha_to_coverage_via_mrtz = d->vk.ms.alpha_to_coverage_enable;
+   }
+
    struct radv_ps_epilog_key key = radv_generate_ps_epilog_key(device, &state, 
true);
    return radv_shader_part_cache_get(device, &device->ps_epilogs, 
&cmd_buffer->ps_epilogs, &key);
 }
diff --git a/src/amd/vulkan/radv_pipeline_graphics.c 
b/src/amd/vulkan/radv_pipeline_graphics.c
index 90e184148a8..25b1361a352 100644
--- a/src/amd/vulkan/radv_pipeline_graphics.c
+++ b/src/amd/vulkan/radv_pipeline_graphics.c
@@ -1738,6 +1738,10 @@ radv_generate_ps_epilog_key(const struct radv_device 
*device, const struct radv_
    key.color_is_int10 = device->physical_device->rad_info.gfx_level < GFX8 ? 
is_int10 : 0;
    key.enable_mrt_output_nan_fixup = 
device->instance->enable_mrt_output_nan_fixup ? is_float32 : 0;
    key.mrt0_is_dual_src = state->mrt0_is_dual_src;
+   key.export_depth = state->export_depth;
+   key.export_stencil = state->export_stencil;
+   key.export_sample_mask = state->export_sample_mask;
+   key.alpha_to_coverage_via_mrtz = state->alpha_to_coverage_via_mrtz;
 
    return key;
 }
diff --git a/src/amd/vulkan/radv_private.h b/src/amd/vulkan/radv_private.h
index 85996eb944f..ea1232a382d 100644
--- a/src/amd/vulkan/radv_private.h
+++ b/src/amd/vulkan/radv_private.h
@@ -2019,6 +2019,10 @@ struct radv_ps_epilog_state {
    uint32_t color_blend_enable;
 
    bool mrt0_is_dual_src;
+   bool export_depth;
+   bool export_stencil;
+   bool export_sample_mask;
+   bool alpha_to_coverage_via_mrtz;
    uint8_t need_src_alpha;
 };
 
diff --git a/src/amd/vulkan/radv_shader.h b/src/amd/vulkan/radv_shader.h
index f7fc60bbb46..b8acd184f9a 100644
--- a/src/amd/vulkan/radv_shader.h
+++ b/src/amd/vulkan/radv_shader.h
@@ -74,6 +74,10 @@ struct radv_ps_epilog_key {
    uint8_t enable_mrt_output_nan_fixup;
 
    bool mrt0_is_dual_src;
+   bool export_depth;
+   bool export_stencil;
+   bool export_sample_mask;
+   bool alpha_to_coverage_via_mrtz;
 };
 
 struct radv_pipeline_key {

Reply via email to