radv/gfx10: fix exporting the subpass view index for GS
authorSamuel Pitoiset <samuel.pitoiset@gmail.com>
Thu, 11 Jul 2019 15:02:12 +0000 (17:02 +0200)
committerSamuel Pitoiset <samuel.pitoiset@gmail.com>
Fri, 12 Jul 2019 06:19:20 +0000 (08:19 +0200)
This fixes dEQP-VK.multiview.*geometry*.

Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Reviewed-by: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
src/amd/vulkan/radv_nir_to_llvm.c

index 11498bc27aa364b601f02d9570cadd669ff3c3e7..7da061f7f338e3a06bd5e6901743b4b7c86d1e19 100644 (file)
@@ -3583,11 +3583,12 @@ static void gfx10_ngg_gs_emit_epilogue_2(struct radv_shader_context *ctx)
        ac_build_ifcc(&ctx->ac, tmp, 5145);
        {
                struct radv_vs_output_info *outinfo = &ctx->shader_info->vs.outinfo;
+               bool export_view_index = ctx->options->key.has_multiview_view_index;
                struct radv_shader_output_values *outputs;
                unsigned noutput = 0;
 
                /* Allocate a temporary array for the output values. */
-               unsigned num_outputs = util_bitcount64(ctx->output_mask);
+               unsigned num_outputs = util_bitcount64(ctx->output_mask) + export_view_index;
                outputs = calloc(num_outputs, sizeof(outputs[0]));
 
                memset(outinfo->vs_output_param_offset, AC_EXP_PARAM_UNDEFINED,
@@ -3642,6 +3643,19 @@ static void gfx10_ngg_gs_emit_epilogue_2(struct radv_shader_context *ctx)
                        noutput++;
                }
 
+               /* 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;
+                       outputs[noutput].values[0] = ac_to_float(&ctx->ac, ctx->abi.view_index);
+                       for (unsigned j = 1; j < 4; j++)
+                               outputs[noutput].values[j] = ctx->ac.f32_0;
+                       noutput++;
+               }
+
                radv_llvm_export_vs(ctx, outputs, noutput, outinfo, false);
                FREE(outputs);
        }