ac/nir,radv,radeonsi/nir: use correct indices for interpolation intrinsics
authorRhys Perry <pendingchaos02@gmail.com>
Wed, 9 Jan 2019 11:09:33 +0000 (11:09 +0000)
committerRhys Perry <pendingchaos02@gmail.com>
Wed, 9 Jan 2019 14:57:07 +0000 (14:57 +0000)
Fixes artifacts in World of Warcraft when Multi-sample Alpha-Test is
enabled with DXVK.
It also fixes artifacts with Fallout 4's god rays with DXVK.
Various piglit interpolateAt*() tests under NIR are also fixed.

v2: formatting fix
    update commit message to include Fallout 4 and the Fixes tag

Fixes: f4e499ec791 ('radv: add initial non-conformant radv vulkan driver')
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=106595
Signed-off-by: Rhys Perry <pendingchaos02@gmail.com>
src/amd/common/ac_nir_to_llvm.c
src/amd/common/ac_shader_abi.h
src/amd/vulkan/radv_nir_to_llvm.c
src/gallium/drivers/radeonsi/si_shader_nir.c

index 89c76175291ec02307f1797928ea5cd768616a71..5023b96f92dae2d681a551626b7067d192cda3a4 100644 (file)
@@ -2838,7 +2838,7 @@ static LLVMValueRef visit_interp(struct ac_nir_context *ctx,
        LLVMValueRef src0 = NULL;
 
        nir_variable *var = nir_deref_instr_get_variable(nir_instr_as_deref(instr->src[0].ssa->parent_instr));
-       int input_index = var->data.location - VARYING_SLOT_VAR0;
+       int input_index = ctx->abi->fs_input_attr_indices[var->data.location - VARYING_SLOT_VAR0];
        switch (instr->intrinsic) {
        case nir_intrinsic_interp_deref_at_centroid:
                location = INTERP_CENTROID;
index 6b9a91c92a9d6cbf2f7afa9c2d5d2db27789a9f6..ee18e6c19235a1d389a3f26237bcacbc91706e82 100644 (file)
@@ -77,6 +77,9 @@ struct ac_shader_abi {
         */
        LLVMValueRef *inputs;
 
+       /* Varying -> attribute number mapping. Also NIR-only */
+       unsigned fs_input_attr_indices[MAX_VARYING];
+
        void (*emit_outputs)(struct ac_shader_abi *abi,
                             unsigned max_outputs,
                             LLVMValueRef *addrs);
index 322b10b67a0a928b0706cfa500775e1be95b0910..cd58167b766a4b433284867378d9d58738437297 100644 (file)
@@ -2239,6 +2239,8 @@ handle_fs_inputs(struct radv_shader_context *ctx,
 
                        if (LLVMIsUndef(interp_param))
                                ctx->shader_info->fs.flat_shaded_mask |= 1u << index;
+                       if (i >= VARYING_SLOT_VAR0)
+                               ctx->abi.fs_input_attr_indices[i - VARYING_SLOT_VAR0] = index;
                        ++index;
                } else if (i == VARYING_SLOT_CLIP_DIST0) {
                        int length = ctx->shader_info->info.ps.num_input_clips_culls;
index 64acf41679b5f95fae66860c145c4faab697ffb2..a1bc4cbd1aa9bad2fa30f3e1f87010aab28940c7 100644 (file)
@@ -1011,6 +1011,9 @@ bool si_nir_build_llvm(struct si_shader_context *ctx, struct nir_shader *nir)
                        LLVMValueRef data[4];
                        unsigned loc = variable->data.location;
 
+                       if (loc >= VARYING_SLOT_VAR0 && nir->info.stage == MESA_SHADER_FRAGMENT)
+                               ctx->abi.fs_input_attr_indices[loc - VARYING_SLOT_VAR0] = input_idx / 4;
+
                        for (unsigned i = 0; i < attrib_count; i++) {
                                /* Packed components share the same location so skip
                                 * them if we have already processed the location.