From: Dave Airlie Date: Wed, 11 Dec 2019 03:29:45 +0000 (+1000) Subject: gallivm: fixup base_vertex support X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=75f21895de7c945d8fa9105a5d84a9c568488511;p=mesa.git gallivm: fixup base_vertex support base vertex should be 0 for non-indexed draws according to the piglit tests. Reviewed-by: Roland Scheidegger --- 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;