diff options
author | Samuel Pitoiset <[email protected]> | 2019-03-15 10:36:00 +0100 |
---|---|---|
committer | Samuel Pitoiset <[email protected]> | 2019-03-15 11:35:52 +0100 |
commit | d5befdbe4ad4523e58074063a3b619f389fb9f1f (patch) | |
tree | 2ba65a5f123f91a52c39772d22dd8032a9b1b242 /src | |
parent | ebc15ecde5b37b6d0fa3adeffa49aae71eb8bd7e (diff) |
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 <[email protected]>
Signed-off-by: Samuel Pitoiset <[email protected]>
Reviewed-by: Bas Nieuwenhuizen <[email protected]>
Diffstat (limited to 'src')
-rw-r--r-- | src/amd/vulkan/radv_nir_to_llvm.c | 23 |
1 files changed, 14 insertions, 9 deletions
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, |