diff options
author | Marek Olšák <marek.olsak@amd.com> | 2020-11-25 02:13:27 -0500 |
---|---|---|
committer | Marek Olšák <marek.olsak@amd.com> | 2020-12-01 15:33:03 -0500 |
commit | d7ee265a956d17396b716a261434f21f35f48688 (patch) | |
tree | 622e7c0058ded9e474fb14e41f4736382f93efdb | |
parent | 80a0f8aba384c7e3b64492740898ef8a5b575db0 (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.c | 3 | ||||
-rw-r--r-- | src/amd/llvm/ac_shader_abi.h | 2 | ||||
-rw-r--r-- | src/amd/vulkan/radv_nir_to_llvm.c | 2 | ||||
-rw-r--r-- | src/gallium/drivers/radeonsi/si_shader_llvm_vs.c | 11 |
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), |