diff options
author | Bas Nieuwenhuizen <[email protected]> | 2018-01-02 00:04:14 +0100 |
---|---|---|
committer | Juan A. Suarez Romero <[email protected]> | 2018-01-12 21:38:10 +0100 |
commit | 3561eabf8793bac5e0a6505a37dcee1f4b6f38ab (patch) | |
tree | 4cf7d01ad30a91d09f4e945829f6edadf6b13b16 /src | |
parent | 5fe6c5fdfbd52cdf6b6b59c2c451fbc38debd15b (diff) |
ac/nir: Handle loading data from compact arrays.
Fixes: f4e499ec791 "radv: add initial non-conformant radv vulkan driver"
Reviewed-by: Dave Airlie <[email protected]>
(cherry picked from commit c99426ea831f9e38624bbd1d2f0bc54bdfaf2b6b)
Diffstat (limited to 'src')
-rw-r--r-- | src/amd/common/ac_nir_to_llvm.c | 13 |
1 files changed, 7 insertions, 6 deletions
diff --git a/src/amd/common/ac_nir_to_llvm.c b/src/amd/common/ac_nir_to_llvm.c index f76534486c4..6d3abff11f7 100644 --- a/src/amd/common/ac_nir_to_llvm.c +++ b/src/amd/common/ac_nir_to_llvm.c @@ -3073,6 +3073,7 @@ static LLVMValueRef visit_load_var(struct ac_nir_context *ctx, LLVMValueRef indir_index; LLVMValueRef ret; unsigned const_index; + unsigned stride = instr->variables[0]->var->data.compact ? 1 : 4; bool vs_in = ctx->stage == MESA_SHADER_VERTEX && instr->variables[0]->var->data.mode == nir_var_shader_in; get_deref_offset(ctx, instr->variables[0], vs_in, NULL, NULL, @@ -3098,13 +3099,13 @@ static LLVMValueRef visit_load_var(struct ac_nir_context *ctx, count -= chan / 4; LLVMValueRef tmp_vec = ac_build_gather_values_extended( &ctx->ac, ctx->abi->inputs + idx + chan, count, - 4, false, true); + stride, false, true); values[chan] = LLVMBuildExtractElement(ctx->ac.builder, tmp_vec, indir_index, ""); } else - values[chan] = ctx->abi->inputs[idx + chan + const_index * 4]; + values[chan] = ctx->abi->inputs[idx + chan + const_index * stride]; } break; case nir_var_local: @@ -3115,13 +3116,13 @@ static LLVMValueRef visit_load_var(struct ac_nir_context *ctx, count -= chan / 4; LLVMValueRef tmp_vec = ac_build_gather_values_extended( &ctx->ac, ctx->locals + idx + chan, count, - 4, true, true); + stride, true, true); values[chan] = LLVMBuildExtractElement(ctx->ac.builder, tmp_vec, indir_index, ""); } else { - values[chan] = LLVMBuildLoad(ctx->ac.builder, ctx->locals[idx + chan + const_index * 4], ""); + values[chan] = LLVMBuildLoad(ctx->ac.builder, ctx->locals[idx + chan + const_index * stride], ""); } } break; @@ -3143,14 +3144,14 @@ static LLVMValueRef visit_load_var(struct ac_nir_context *ctx, count -= chan / 4; LLVMValueRef tmp_vec = ac_build_gather_values_extended( &ctx->ac, ctx->outputs + idx + chan, count, - 4, true, true); + stride, true, true); values[chan] = LLVMBuildExtractElement(ctx->ac.builder, tmp_vec, indir_index, ""); } else { values[chan] = LLVMBuildLoad(ctx->ac.builder, - ctx->outputs[idx + chan + const_index * 4], + ctx->outputs[idx + chan + const_index * stride], ""); } } |