diff options
author | Samuel Pitoiset <[email protected]> | 2019-09-18 16:21:57 +0200 |
---|---|---|
committer | Samuel Pitoiset <[email protected]> | 2019-09-18 17:16:36 +0200 |
commit | 68820007fddbb5b79f1b2b08e66ef14092053a95 (patch) | |
tree | 164fa93ed65c0f0f5c0d1c26044d5d11e2cc485e /src/amd/vulkan | |
parent | 7999e10cab93fe854fbc7accd4d8cf2e60726b75 (diff) |
radv: fix loading 64-bit GS inputs
We have to load 2 32-bit integer and to cast correctly.
This fixes crashes with gs-double-interpolator.vk_shader_test.
Cc: 19.2 <[email protected]>
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=111734
Signed-off-by: Samuel Pitoiset <[email protected]>
Reviewed-by: Bas Nieuwenhuizen <[email protected]>
Diffstat (limited to 'src/amd/vulkan')
-rw-r--r-- | src/amd/vulkan/radv_nir_to_llvm.c | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/src/amd/vulkan/radv_nir_to_llvm.c b/src/amd/vulkan/radv_nir_to_llvm.c index f8d9cb79544..4cc30aa23ad 100644 --- a/src/amd/vulkan/radv_nir_to_llvm.c +++ b/src/amd/vulkan/radv_nir_to_llvm.c @@ -1602,6 +1602,18 @@ load_tes_input(struct ac_shader_abi *abi, } static LLVMValueRef +radv_emit_fetch_64bit(struct radv_shader_context *ctx, + LLVMTypeRef type, LLVMValueRef a, LLVMValueRef b) +{ + LLVMValueRef values[2] = { + ac_to_integer(&ctx->ac, a), + ac_to_integer(&ctx->ac, b), + }; + LLVMValueRef result = ac_build_gather_values(&ctx->ac, values, 2); + return LLVMBuildBitCast(ctx->ac.builder, result, type, ""); +} + +static LLVMValueRef load_gs_input(struct ac_shader_abi *abi, unsigned location, unsigned driver_location, @@ -1629,6 +1641,14 @@ load_gs_input(struct ac_shader_abi *abi, dw_addr = LLVMBuildAdd(ctx->ac.builder, dw_addr, LLVMConstInt(ctx->ac.i32, param * 4 + i + const_index, 0), ""); value[i] = ac_lds_load(&ctx->ac, dw_addr); + + if (ac_get_type_size(type) == 8) { + dw_addr = LLVMBuildAdd(ctx->ac.builder, dw_addr, + LLVMConstInt(ctx->ac.i32, param * 4 + i + const_index + 1, 0), ""); + LLVMValueRef tmp = ac_lds_load(&ctx->ac, dw_addr); + + value[i] = radv_emit_fetch_64bit(ctx, type, value[i], tmp); + } } else { LLVMValueRef soffset = LLVMConstInt(ctx->ac.i32, @@ -1640,6 +1660,21 @@ load_gs_input(struct ac_shader_abi *abi, ctx->ac.i32_0, vtx_offset, soffset, 0, ac_glc, true, false); + + if (ac_get_type_size(type) == 8) { + soffset = LLVMConstInt(ctx->ac.i32, + (param * 4 + i + const_index + 1) * 256, + false); + + LLVMValueRef tmp = + ac_build_buffer_load(&ctx->ac, + ctx->esgs_ring, 1, + ctx->ac.i32_0, + vtx_offset, soffset, + 0, ac_glc, true, false); + + value[i] = radv_emit_fetch_64bit(ctx, type, value[i], tmp); + } } if (ac_get_type_size(type) == 2) { |