From d996622cfad484817c1038caded20032759ec93b Mon Sep 17 00:00:00 2001 From: Zack Rusin Date: Tue, 23 Apr 2013 18:47:08 -0400 Subject: [PATCH] draw/llvm: fix viewport transformations MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit 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 Reviewed-by: José Fonseca Reviewed-by: Roland Scheidegger --- 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 71e2c32..d2821a1 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]); } } -- 2.7.4