From 75f21895de7c945d8fa9105a5d84a9c568488511 Mon Sep 17 00:00:00 2001 From: Dave Airlie Date: Wed, 11 Dec 2019 13:29:45 +1000 Subject: [PATCH] gallivm: fixup base_vertex support base vertex should be 0 for non-indexed draws according to the piglit tests. Reviewed-by: Roland Scheidegger --- src/gallium/auxiliary/draw/draw_llvm.c | 7 ++++--- src/gallium/auxiliary/gallivm/lp_bld_nir.c | 1 + src/gallium/auxiliary/gallivm/lp_bld_nir_soa.c | 3 +++ 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/gallium/auxiliary/draw/draw_llvm.c b/src/gallium/auxiliary/draw/draw_llvm.c index 2c78e4709d9..ca5cd6a3726 100644 --- a/src/gallium/auxiliary/draw/draw_llvm.c +++ b/src/gallium/auxiliary/draw/draw_llvm.c @@ -1999,12 +1999,13 @@ draw_llvm_generate(struct draw_llvm *llvm, struct draw_llvm_variant *variant) * the primitive was split (we split rendering into chunks of at * most 4095-vertices) we need to back out the original start * index out of our vertex id here. + * for ARB_shader_draw_parameters, base_vertex should be 0 for non-indexed draws. */ - system_values.basevertex = lp_build_broadcast_scalar(&blduivec, - vertex_id_offset); + LLVMValueRef base_vertex = lp_build_select(&bld, have_elts, vertex_id_offset, lp_build_const_int32(gallivm, 0));; + system_values.basevertex = lp_build_broadcast_scalar(&blduivec, base_vertex); system_values.vertex_id = true_index_array; system_values.vertex_id_nobase = LLVMBuildSub(builder, true_index_array, - system_values.basevertex, ""); + lp_build_broadcast_scalar(&blduivec, vertex_id_offset), ""); ptr_aos = (const LLVMValueRef (*)[TGSI_NUM_CHANNELS]) inputs; generate_vs(variant, diff --git a/src/gallium/auxiliary/gallivm/lp_bld_nir.c b/src/gallium/auxiliary/gallivm/lp_bld_nir.c index e5fe9eec6eb..c21ca55f6ed 100644 --- a/src/gallium/auxiliary/gallivm/lp_bld_nir.c +++ b/src/gallium/auxiliary/gallivm/lp_bld_nir.c @@ -1162,6 +1162,7 @@ static void visit_intrinsic(struct lp_build_nir_context *bld_base, case nir_intrinsic_load_primitive_id: case nir_intrinsic_load_instance_id: case nir_intrinsic_load_base_instance: + case nir_intrinsic_load_base_vertex: case nir_intrinsic_load_work_group_id: case nir_intrinsic_load_local_invocation_id: case nir_intrinsic_load_num_work_groups: diff --git a/src/gallium/auxiliary/gallivm/lp_bld_nir_soa.c b/src/gallium/auxiliary/gallivm/lp_bld_nir_soa.c index b0c034645f3..4d4408bacb3 100644 --- a/src/gallium/auxiliary/gallivm/lp_bld_nir_soa.c +++ b/src/gallium/auxiliary/gallivm/lp_bld_nir_soa.c @@ -925,6 +925,9 @@ static void emit_sysval_intrin(struct lp_build_nir_context *bld_base, case nir_intrinsic_load_base_instance: result[0] = lp_build_broadcast_scalar(&bld_base->uint_bld, bld->system_values.base_instance); break; + case nir_intrinsic_load_base_vertex: + result[0] = bld->system_values.basevertex; + break; case nir_intrinsic_load_vertex_id: result[0] = bld->system_values.vertex_id; break; -- 2.30.2