summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSamuel Pitoiset <samuel.pitoiset@gmail.com>2019-09-18 16:21:57 +0200
committerSamuel Pitoiset <samuel.pitoiset@gmail.com>2019-09-18 17:16:36 +0200
commit68820007fddbb5b79f1b2b08e66ef14092053a95 (patch)
tree164fa93ed65c0f0f5c0d1c26044d5d11e2cc485e
parent7999e10cab93fe854fbc7accd4d8cf2e60726b75 (diff)
downloadmesa-68820007fddbb5b79f1b2b08e66ef14092053a95.tar.gz
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 <mesa-stable@lists.freedesktop.org> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=111734 Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com> Reviewed-by: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
-rw-r--r--src/amd/vulkan/radv_nir_to_llvm.c35
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) {