radv: gather layer in the shader info pass
authorSamuel Pitoiset <samuel.pitoiset@gmail.com>
Tue, 3 Sep 2019 16:09:00 +0000 (18:09 +0200)
committerSamuel Pitoiset <samuel.pitoiset@gmail.com>
Fri, 6 Sep 2019 13:52:19 +0000 (15:52 +0200)
Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Reviewed-by: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
src/amd/vulkan/radv_nir_to_llvm.c
src/amd/vulkan/radv_shader_info.c

index e2d3447879f9eb8f0b9511fe57e08923ede0cd4d..334ee1883b48e4381052faba630379f3b32c9d2d 100644 (file)
@@ -2788,10 +2788,6 @@ handle_vs_outputs_post(struct radv_shader_context *ctx,
               sizeof(outinfo->vs_output_param_offset));
        outinfo->pos_exports = 0;
 
-       if (ctx->output_mask & (1ull << VARYING_SLOT_LAYER)) {
-               outinfo->writes_layer = true;
-       }
-
        if (ctx->shader_info->so.num_outputs &&
            !ctx->is_gs_copy_shader) {
                /* The GS copy shader emission already emits streamout. */
@@ -3506,10 +3502,6 @@ static void gfx10_ngg_gs_emit_epilogue_2(struct radv_shader_context *ctx)
                tmp = LLVMBuildZExt(builder, tmp, ctx->ac.i32, "");
                const LLVMValueRef vertexptr = ngg_gs_vertex_ptr(ctx, tmp);
 
-               if (ctx->output_mask & (1ull << VARYING_SLOT_LAYER)) {
-                       outinfo->writes_layer = true;
-               }
-
                unsigned out_idx = 0;
                gep_idx[1] = ctx->ac.i32_0;
                for (unsigned i = 0; i < AC_LLVM_MAX_OUTPUTS; ++i) {
@@ -3544,8 +3536,6 @@ static void gfx10_ngg_gs_emit_epilogue_2(struct radv_shader_context *ctx)
 
                /* Export ViewIndex. */
                if (export_view_index) {
-                       outinfo->writes_layer = true;
-
                        outputs[noutput].slot_name = VARYING_SLOT_LAYER;
                        outputs[noutput].slot_index = 0;
                        outputs[noutput].usage_mask = 0x1;
index 614a20d5921f3fe97c738dbb85f1f57b3a6a238c..ce9823f8485965468d0269366954b3ffd2e4504c 100644 (file)
@@ -574,6 +574,9 @@ gather_info_output_decl(const nir_shader *nir, const nir_variable *var,
                case VARYING_SLOT_VIEWPORT:
                        vs_info->writes_viewport_index = true;
                        break;
+               case VARYING_SLOT_LAYER:
+                       vs_info->writes_layer = true;
+                       break;
                default:
                        break;
                }
@@ -667,6 +670,23 @@ radv_nir_shader_info_pass(const struct nir_shader *nir,
                }
        }
 
+       /* Make sure to export the LayerID if the subpass has multiviews. */
+       if (options->key.has_multiview_view_index) {
+               switch (nir->info.stage) {
+               case MESA_SHADER_VERTEX:
+                       info->vs.outinfo.writes_layer = true;
+                       break;
+               case MESA_SHADER_TESS_EVAL:
+                       info->tes.outinfo.writes_layer = true;
+                       break;
+               case MESA_SHADER_GEOMETRY:
+                       info->vs.outinfo.writes_layer = true;
+                       break;
+               default:
+                       break;
+               }
+       }
+
        if (nir->info.stage == MESA_SHADER_FRAGMENT)
                info->ps.num_interp = nir->num_inputs;