From: Dave Airlie <airl...@redhat.com>

We won't have a var to load from, so don't try to the processing
required if we don't need it.

This avoids crashes in:
dEQP-VK.spirv_assembly.instruction.compute.variable_pointers.compute.workgroup_two_buffers

Signed-off-by: Dave Airlie <airl...@redhat.com>
---
 src/amd/common/ac_nir_to_llvm.c | 27 ++++++++++++++++++---------
 1 file changed, 18 insertions(+), 9 deletions(-)

diff --git a/src/amd/common/ac_nir_to_llvm.c b/src/amd/common/ac_nir_to_llvm.c
index f24b63bb158..cc795324cc5 100644
--- a/src/amd/common/ac_nir_to_llvm.c
+++ b/src/amd/common/ac_nir_to_llvm.c
@@ -1861,23 +1861,32 @@ static LLVMValueRef visit_load_var(struct 
ac_nir_context *ctx,
        nir_variable *var = 
nir_deref_instr_get_variable(nir_instr_as_deref(instr->src[0].ssa->parent_instr));
 
        LLVMValueRef values[8];
-       int idx = var->data.driver_location;
+       int idx = 0;
        int ve = instr->dest.ssa.num_components;
-       unsigned comp = var->data.location_frac;
+       unsigned comp = 0;
        LLVMValueRef indir_index;
        LLVMValueRef ret;
        unsigned const_index;
-       unsigned stride = var->data.compact ? 1 : 4;
-       bool vs_in = ctx->stage == MESA_SHADER_VERTEX &&
-                    var->data.mode == nir_var_shader_in;
-
-       get_deref_offset(ctx, 
nir_instr_as_deref(instr->src[0].ssa->parent_instr), vs_in, NULL, NULL,
-                        &const_index, &indir_index);
+       unsigned stride = 4;
+       int mode = nir_var_shared;
+       
+       if (var) {
+               bool vs_in = ctx->stage == MESA_SHADER_VERTEX &&
+                       var->data.mode == nir_var_shader_in;
+               if (var->data.compact)
+                       stride = 1;
+               idx = var->data.driver_location;
+               comp = var->data.location_frac;
+               mode = var->data.mode;
+
+               get_deref_offset(ctx, 
nir_instr_as_deref(instr->src[0].ssa->parent_instr), vs_in, NULL, NULL,
+                                &const_index, &indir_index);
+       }
 
        if (instr->dest.ssa.bit_size == 64)
                ve *= 2;
 
-       switch (var->data.mode) {
+       switch (mode) {
        case nir_var_shader_in:
                if (ctx->stage == MESA_SHADER_TESS_CTRL ||
                    ctx->stage == MESA_SHADER_TESS_EVAL) {
-- 
2.17.2

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to