[Mesa-dev] [PATCH] draw/llvm: fix generation of the VS with GS present

Jose Fonseca jfonseca at vmware.com
Tue Mar 4 04:20:39 PST 2014


Makes sense. Good catch.

BTW, both changes seem candidate for stable branch.

Jose

----- Original Message -----
> 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;
>  
> --
> 1.9.0
> 


More information about the mesa-dev mailing list