From: Samuel Pitoiset Date: Fri, 15 Mar 2019 09:36:00 +0000 (+0100) Subject: radv: always load 3 channels for formats that need to be shuffled X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=d5befdbe4ad4523e58074063a3b619f389fb9f1f;p=mesa.git radv: always load 3 channels for formats that need to be shuffled This fixes a rendering issue with Hellblade and DXVK. Fixes: a66b186bebf ("radv: use typed buffer loads for vertex input fetches") Reported-by: Philip Rebohle Signed-off-by: Samuel Pitoiset Reviewed-by: Bas Nieuwenhuizen --- diff --git a/src/amd/vulkan/radv_nir_to_llvm.c b/src/amd/vulkan/radv_nir_to_llvm.c index dbe4be907ec..58a3cf18fe1 100644 --- a/src/amd/vulkan/radv_nir_to_llvm.c +++ b/src/amd/vulkan/radv_nir_to_llvm.c @@ -2166,6 +2166,13 @@ handle_vs_input_decl(struct radv_shader_context *ctx, unsigned attrib_offset = ctx->options->key.vs.vertex_attribute_offsets[attrib_index]; unsigned attrib_stride = ctx->options->key.vs.vertex_attribute_strides[attrib_index]; + if (ctx->options->key.vs.post_shuffle & (1 << attrib_index)) { + /* Always load, at least, 3 channels for formats that + * need to be shuffled because X<->Z. + */ + num_channels = MAX2(num_channels, 3); + } + if (attrib_stride != 0 && attrib_offset > attrib_stride) { LLVMValueRef buffer_offset = LLVMConstInt(ctx->ac.i32, @@ -2190,15 +2197,13 @@ handle_vs_input_decl(struct radv_shader_context *ctx, false, false, true); if (ctx->options->key.vs.post_shuffle & (1 << attrib_index)) { - if (num_channels > 1) { - LLVMValueRef c[4]; - c[0] = ac_llvm_extract_elem(&ctx->ac, input, 2); - c[1] = ac_llvm_extract_elem(&ctx->ac, input, 1); - c[2] = ac_llvm_extract_elem(&ctx->ac, input, 0); - c[3] = ac_llvm_extract_elem(&ctx->ac, input, 3); - - input = ac_build_gather_values(&ctx->ac, c, 4); - } + LLVMValueRef c[4]; + c[0] = ac_llvm_extract_elem(&ctx->ac, input, 2); + c[1] = ac_llvm_extract_elem(&ctx->ac, input, 1); + c[2] = ac_llvm_extract_elem(&ctx->ac, input, 0); + c[3] = ac_llvm_extract_elem(&ctx->ac, input, 3); + + input = ac_build_gather_values(&ctx->ac, c, 4); } input = radv_fixup_vertex_input_fetches(ctx, input, num_channels,