Am 24.04.2013 00:58, schrieb Zack Rusin: > This was a very serious bug. We were always doing the viewport > transformations on the first output of the vertex shader. That means > that every application that was storing position in anything but > OUT[0] was outputing untransformed vertices and had broken output > for whatever it was storing at OUT[0]. Correctly take into > consideration where the vertex position is actually stored. > > Signed-off-by: Zack Rusin <za...@vmware.com> > --- > src/gallium/auxiliary/draw/draw_llvm.c | 9 +++++---- > 1 file changed, 5 insertions(+), 4 deletions(-) > > diff --git a/src/gallium/auxiliary/draw/draw_llvm.c > b/src/gallium/auxiliary/draw/draw_llvm.c > index 594b0ec..bdd24be 100644 > --- a/src/gallium/auxiliary/draw/draw_llvm.c > +++ b/src/gallium/auxiliary/draw/draw_llvm.c > @@ -996,18 +996,19 @@ 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); > LLVMTypeRef vs_type_llvm = lp_build_vec_type(gallivm, vs_type); > - LLVMValueRef out3 = LLVMBuildLoad(builder, outputs[0][3], ""); /*w0 w1 .. > wn*/ > + 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*/ > LLVMValueRef vp_ptr = draw_jit_context_viewport(gallivm, context_ptr); > > /* for 1/w convention*/ > out3 = LLVMBuildFDiv(builder, const1, out3, ""); > - LLVMBuildStore(builder, out3, outputs[0][3]); > + LLVMBuildStore(builder, out3, outputs[pos][3]); > > /* Viewport Mapping */ > for (i=0; i<3; i++) { > - LLVMValueRef out = LLVMBuildLoad(builder, outputs[0][i], ""); /*x0 x1 > .. xn*/ > + LLVMValueRef out = LLVMBuildLoad(builder, outputs[pos][i], ""); /*x0 > x1 .. xn*/ > LLVMValueRef scale; > LLVMValueRef trans; > LLVMValueRef scale_i; > @@ -1033,7 +1034,7 @@ generate_viewport(struct draw_llvm_variant *variant, > out = LLVMBuildFAdd(builder, out, trans, ""); > > /* store transformed outputs */ > - LLVMBuildStore(builder, out, outputs[0][i]); > + LLVMBuildStore(builder, out, outputs[pos][i]); > } > > } >
The change itself looks good but I think there's quite some more assumptions that position must be output zero elsewhere. Roland _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev