This adds a new level of gathering ("post-analysis") because
we have to bump the number of interp when the layer is needed.

Signed-off-by: Samuel Pitoiset <[email protected]>
---
 src/amd/common/ac_nir_to_llvm.c |  1 -
 src/amd/common/ac_nir_to_llvm.h |  1 -
 src/amd/common/ac_shader_info.c | 35 +++++++++++++++++++++++++++++++++++
 src/amd/common/ac_shader_info.h |  1 +
 src/amd/vulkan/radv_pipeline.c  |  2 +-
 src/amd/vulkan/radv_shader.c    |  2 +-
 6 files changed, 38 insertions(+), 4 deletions(-)

diff --git a/src/amd/common/ac_nir_to_llvm.c b/src/amd/common/ac_nir_to_llvm.c
index 358e3f04fd..ff954be97c 100644
--- a/src/amd/common/ac_nir_to_llvm.c
+++ b/src/amd/common/ac_nir_to_llvm.c
@@ -5611,7 +5611,6 @@ handle_fs_inputs(struct radv_shader_context *ctx,
                                                  ctx->abi.frag_pos[3]);
                }
        }
-       ctx->shader_info->fs.num_interp = index;
        ctx->shader_info->fs.input_mask = ctx->input_mask >> VARYING_SLOT_VAR0;
 
        if (ctx->shader_info->info.needs_multiview_view_index)
diff --git a/src/amd/common/ac_nir_to_llvm.h b/src/amd/common/ac_nir_to_llvm.h
index 983189eb93..42a58e7d79 100644
--- a/src/amd/common/ac_nir_to_llvm.h
+++ b/src/amd/common/ac_nir_to_llvm.h
@@ -175,7 +175,6 @@ struct ac_shader_variant_info {
                        uint64_t outputs_written;
                } vs;
                struct {
-                       unsigned num_interp;
                        uint32_t input_mask;
                        uint32_t flat_shaded_mask;
                        bool can_discard;
diff --git a/src/amd/common/ac_shader_info.c b/src/amd/common/ac_shader_info.c
index 60e3d62e79..2a99cecdd7 100644
--- a/src/amd/common/ac_shader_info.c
+++ b/src/amd/common/ac_shader_info.c
@@ -213,6 +213,7 @@ static void
 gather_info_input_decl_ps(const nir_shader *nir, const nir_variable *var,
                          struct ac_shader_info *info)
 {
+       unsigned attrib_count = glsl_count_attribute_slots(var->type, false);
        const struct glsl_type *type = glsl_without_array(var->type);
        int idx = var->data.location;
 
@@ -251,6 +252,13 @@ gather_info_input_decl_ps(const nir_shader *nir, const 
nir_variable *var,
        } else {
                info->ps.input_interp_mode[idx] = INTERP_MODE_FLAT;
        }
+
+       if (idx >= VARYING_SLOT_VAR0 ||
+           idx == VARYING_SLOT_PNTC ||
+           idx == VARYING_SLOT_PRIMITIVE_ID ||
+           idx == VARYING_SLOT_LAYER) {
+               info->ps.num_interp += attrib_count;
+       }
 }
 
 static void
@@ -303,6 +311,31 @@ gather_info_output_decl(const nir_shader *nir, const 
nir_variable *var,
        }
 }
 
+static void
+gather_info_shader_ps(const nir_shader *nir, struct ac_shader_info *info)
+{
+       if (!info->ps.layer_input &&
+           (info->ps.uses_input_attachments ||
+            info->needs_multiview_view_index)) {
+               /* VARYING_SLOT_LAYER is needed for subpass attachments, but do
+                * not count it twice if it's already declared in the shader.
+                */
+               info->ps.num_interp++;
+       }
+}
+
+static void
+gather_info_shader(const nir_shader *nir, struct ac_shader_info *info)
+{
+       switch (nir->info.stage) {
+       case MESA_SHADER_FRAGMENT:
+               gather_info_shader_ps(nir, info);
+               break;
+       default:
+               break;
+       }
+}
+
 void
 ac_nir_shader_info_pass(const struct nir_shader *nir,
                        const struct ac_nir_compiler_options *options,
@@ -323,4 +356,6 @@ ac_nir_shader_info_pass(const struct nir_shader *nir,
 
        nir_foreach_variable(variable, &nir->outputs)
                gather_info_output_decl(nir, variable, info);
+
+       gather_info_shader(nir, info);
 }
diff --git a/src/amd/common/ac_shader_info.h b/src/amd/common/ac_shader_info.h
index d02841adfe..12493aead7 100644
--- a/src/amd/common/ac_shader_info.h
+++ b/src/amd/common/ac_shader_info.h
@@ -46,6 +46,7 @@ struct ac_shader_info {
                uint8_t output_usage_mask[VARYING_SLOT_VAR31 + 1];
        } tes;
        struct {
+               unsigned num_interp;
                bool force_persample;
                bool needs_sample_positions;
                bool uses_input_attachments;
diff --git a/src/amd/vulkan/radv_pipeline.c b/src/amd/vulkan/radv_pipeline.c
index f8f09a7e16..87de1021c0 100644
--- a/src/amd/vulkan/radv_pipeline.c
+++ b/src/amd/vulkan/radv_pipeline.c
@@ -2851,7 +2851,7 @@ radv_pipeline_generate_fragment_shader(struct 
radeon_winsys_cs *cs,
                               ps->config.spi_ps_input_addr);
 
        radeon_set_context_reg(cs, R_0286D8_SPI_PS_IN_CONTROL,
-                              S_0286D8_NUM_INTERP(ps->info.fs.num_interp));
+                              
S_0286D8_NUM_INTERP(ps->info.info.ps.num_interp));
 
        radeon_set_context_reg(cs, R_0286E0_SPI_BARYC_CNTL, 
pipeline->graphics.spi_baryc_cntl);
 
diff --git a/src/amd/vulkan/radv_shader.c b/src/amd/vulkan/radv_shader.c
index 85672e600d..4ff209c1ab 100644
--- a/src/amd/vulkan/radv_shader.c
+++ b/src/amd/vulkan/radv_shader.c
@@ -614,7 +614,7 @@ generate_shader_stats(struct radv_device *device,
 
        if (stage == MESA_SHADER_FRAGMENT) {
                lds_per_wave = conf->lds_size * lds_increment +
-                              align(variant->info.fs.num_interp * 48,
+                              align(variant->info.info.ps.num_interp * 48,
                                     lds_increment);
        }
 
-- 
2.16.2

_______________________________________________
mesa-dev mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to