summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarek Olšák <marek.olsak@amd.com>2020-11-25 02:13:27 -0500
committerMarek Olšák <marek.olsak@amd.com>2020-12-01 15:33:03 -0500
commitd7ee265a956d17396b716a261434f21f35f48688 (patch)
tree622e7c0058ded9e474fb14e41f4736382f93efdb
parent80a0f8aba384c7e3b64492740898ef8a5b575db0 (diff)
ac,radeonsi: fix load_first_vertex
GL doesn't use it, so this change is not necessary, but it's better this way. There is also a small cleanup using si_unpack_param. Acked-by: Pierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer@amd.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/7721>
-rw-r--r--src/amd/llvm/ac_nir_to_llvm.c3
-rw-r--r--src/amd/llvm/ac_shader_abi.h2
-rw-r--r--src/amd/vulkan/radv_nir_to_llvm.c2
-rw-r--r--src/gallium/drivers/radeonsi/si_shader_llvm_vs.c11
4 files changed, 10 insertions, 8 deletions
diff --git a/src/amd/llvm/ac_nir_to_llvm.c b/src/amd/llvm/ac_nir_to_llvm.c
index 28de09cef84..f6969eae9d9 100644
--- a/src/amd/llvm/ac_nir_to_llvm.c
+++ b/src/amd/llvm/ac_nir_to_llvm.c
@@ -3316,7 +3316,8 @@ static void visit_intrinsic(struct ac_nir_context *ctx, nir_intrinsic_instr *ins
}
case nir_intrinsic_load_base_vertex:
case nir_intrinsic_load_first_vertex:
- result = ctx->abi->load_base_vertex(ctx->abi);
+ result = ctx->abi->load_base_vertex(ctx->abi,
+ instr->intrinsic == nir_intrinsic_load_base_vertex);
break;
case nir_intrinsic_load_local_group_size:
result = ctx->abi->load_local_group_size(ctx->abi);
diff --git a/src/amd/llvm/ac_shader_abi.h b/src/amd/llvm/ac_shader_abi.h
index 92450fb4d6d..bea4dfc8c25 100644
--- a/src/amd/llvm/ac_shader_abi.h
+++ b/src/amd/llvm/ac_shader_abi.h
@@ -145,7 +145,7 @@ struct ac_shader_abi {
LLVMValueRef (*load_sample_mask_in)(struct ac_shader_abi *abi);
- LLVMValueRef (*load_base_vertex)(struct ac_shader_abi *abi);
+ LLVMValueRef (*load_base_vertex)(struct ac_shader_abi *abi, bool non_indexed_is_zero);
LLVMValueRef (*emit_fbfetch)(struct ac_shader_abi *abi);
diff --git a/src/amd/vulkan/radv_nir_to_llvm.c b/src/amd/vulkan/radv_nir_to_llvm.c
index 1b982e8e6b3..5c29c61a227 100644
--- a/src/amd/vulkan/radv_nir_to_llvm.c
+++ b/src/amd/vulkan/radv_nir_to_llvm.c
@@ -863,7 +863,7 @@ load_patch_vertices_in(struct ac_shader_abi *abi)
}
-static LLVMValueRef radv_load_base_vertex(struct ac_shader_abi *abi)
+static LLVMValueRef radv_load_base_vertex(struct ac_shader_abi *abi, bool non_indexed_is_zero)
{
struct radv_shader_context *ctx = radv_shader_context_from_abi(abi);
return ac_get_arg(&ctx->ac, ctx->args->ac.base_vertex);
diff --git a/src/gallium/drivers/radeonsi/si_shader_llvm_vs.c b/src/gallium/drivers/radeonsi/si_shader_llvm_vs.c
index d41abdaff79..603381f46f0 100644
--- a/src/gallium/drivers/radeonsi/si_shader_llvm_vs.c
+++ b/src/gallium/drivers/radeonsi/si_shader_llvm_vs.c
@@ -1054,18 +1054,19 @@ void si_llvm_build_vs_prolog(struct si_shader_context *ctx, union si_shader_part
si_llvm_build_ret(ctx, ret);
}
-static LLVMValueRef get_base_vertex(struct ac_shader_abi *abi)
+static LLVMValueRef get_base_vertex(struct ac_shader_abi *abi, bool non_indexed_is_zero)
{
struct si_shader_context *ctx = si_shader_context_from_abi(abi);
+ /* This doesn't happen with GL: */
+ if (!non_indexed_is_zero)
+ return ac_get_arg(&ctx->ac, ctx->args.base_vertex);
+
/* For non-indexed draws, the base vertex set by the driver
* (for direct draws) or the CP (for indirect draws) is the
* first vertex ID, but GLSL expects 0 to be returned.
*/
- LLVMValueRef vs_state = ac_get_arg(&ctx->ac, ctx->vs_state_bits);
- LLVMValueRef indexed;
-
- indexed = LLVMBuildLShr(ctx->ac.builder, vs_state, ctx->ac.i32_1, "");
+ LLVMValueRef indexed = si_unpack_param(ctx, ctx->vs_state_bits, 1, 1);
indexed = LLVMBuildTrunc(ctx->ac.builder, indexed, ctx->ac.i1, "");
return LLVMBuildSelect(ctx->ac.builder, indexed, ac_get_arg(&ctx->ac, ctx->args.base_vertex),