[Mesa-dev] [PATCH] draw/llvm: fix generation of the VS with GS present
Roland Scheidegger
sroland at vmware.com
Tue Mar 4 08:57:30 PST 2014
Am 04.03.2014 05:08, schrieb Zack Rusin:
> draw_current_shader_* functions return a final output when considering
> both the geometry shader and the vertex shader. But when code generating
> vertex shader we can not be using output slots from the geometry shader
> because, obviously, those can be completely different. This fixes a
> number of very non-obvious crashes.
> A side-effect of this bug was that sometimes the vertex shading code
> could save some random outputs as position/clip when the geometry
> shader was writing them and vertex shader had different outputs at
> those slots (sometimes writing garbage and sometimes something correct).
> ---
> src/gallium/auxiliary/draw/draw_llvm.c | 14 +++++++-------
> 1 file changed, 7 insertions(+), 7 deletions(-)
>
> diff --git a/src/gallium/auxiliary/draw/draw_llvm.c b/src/gallium/auxiliary/draw/draw_llvm.c
> index 0bbb680..53d13f3 100644
> --- a/src/gallium/auxiliary/draw/draw_llvm.c
> +++ b/src/gallium/auxiliary/draw/draw_llvm.c
> @@ -1104,7 +1104,7 @@ generate_viewport(struct draw_llvm_variant *variant,
> int i;
> struct gallivm_state *gallivm = variant->gallivm;
> struct lp_type f32_type = vs_type;
> - const unsigned pos = draw_current_shader_position_output(variant->llvm->draw);
> + const unsigned pos = variant->llvm->draw->vs.position_output;
> LLVMTypeRef vs_type_llvm = lp_build_vec_type(gallivm, vs_type);
> LLVMValueRef out3 = LLVMBuildLoad(builder, outputs[pos][3], ""); /*w0 w1 .. wn*/
> LLVMValueRef const1 = lp_build_const_vec(gallivm, f32_type, 1.0); /*1.0 1.0 1.0 1.0*/
> @@ -1173,14 +1173,14 @@ generate_clipmask(struct draw_llvm *llvm,
> LLVMValueRef plane1, planes, plane_ptr, sum;
> struct lp_type f32_type = vs_type;
> struct lp_type i32_type = lp_int_type(vs_type);
> - const unsigned pos = draw_current_shader_position_output(llvm->draw);
> - const unsigned cv = draw_current_shader_clipvertex_output(llvm->draw);
> + const unsigned pos = llvm->draw->vs.position_output;
> + const unsigned cv = llvm->draw->vs.clipvertex_output;
> int num_written_clipdistance = llvm->draw->vs.vertex_shader->info.num_written_clipdistance;
> bool have_cd = false;
> unsigned cd[2];
>
> - cd[0] = draw_current_shader_clipdistance_output(llvm->draw, 0);
> - cd[1] = draw_current_shader_clipdistance_output(llvm->draw, 1);
> + cd[0] = llvm->draw->vs.clipdistance_output[0];
> + cd[1] = llvm->draw->vs.clipdistance_output[1];
>
> if (cd[0] != pos || cd[1] != pos)
> have_cd = true;
> @@ -1551,8 +1551,8 @@ draw_llvm_generate(struct draw_llvm *llvm, struct draw_llvm_variant *variant,
> key->clip_z ||
> key->clip_user);
> LLVMValueRef variant_func;
> - const unsigned pos = draw_current_shader_position_output(llvm->draw);
> - const unsigned cv = draw_current_shader_clipvertex_output(llvm->draw);
> + const unsigned pos = llvm->draw->vs.position_output;
> + const unsigned cv = llvm->draw->vs.clipvertex_output;
> boolean have_clipdist = FALSE;
> struct lp_bld_tgsi_system_values system_values;
>
>
Both patches make sense to me, good catch!
Roland
More information about the mesa-dev
mailing list