summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVincent Lejeune <[email protected]>2013-04-30 15:58:00 +0200
committerVincent Lejeune <[email protected]>2013-05-04 23:38:50 +0200
commitb42fe195a2578473c433695fe417253e8786c4c6 (patch)
tree7e3cae14e61217c4250fed3b464e9737a20d15cf
parentc4150123aa9c2a71a62fed800d7c4424e9b948f2 (diff)
r600g/llvm: Undefines unrequired texture coord values
This is a port of "r600g:mask unused source components for SAMPLE" patch from Vadim Girlin.
-rw-r--r--src/gallium/drivers/r600/r600_llvm.c29
1 files changed, 28 insertions, 1 deletions
diff --git a/src/gallium/drivers/r600/r600_llvm.c b/src/gallium/drivers/r600/r600_llvm.c
index 83d73405f83..2ff109c4075 100644
--- a/src/gallium/drivers/r600/r600_llvm.c
+++ b/src/gallium/drivers/r600/r600_llvm.c
@@ -429,9 +429,36 @@ static void llvm_emit_tex(
}
}
+ if (emit_data->inst->Instruction.Opcode == TGSI_OPCODE_TEX) {
+ LLVMValueRef Vector[4] = {
+ LLVMBuildExtractElement(gallivm->builder, emit_data->args[0],
+ lp_build_const_int32(gallivm, 0), ""),
+ LLVMBuildExtractElement(gallivm->builder, emit_data->args[0],
+ lp_build_const_int32(gallivm, 1), ""),
+ LLVMBuildExtractElement(gallivm->builder, emit_data->args[0],
+ lp_build_const_int32(gallivm, 2), ""),
+ LLVMBuildExtractElement(gallivm->builder, emit_data->args[0],
+ lp_build_const_int32(gallivm, 3), ""),
+ };
+ switch (emit_data->inst->Texture.Texture) {
+ case TGSI_TEXTURE_2D:
+ case TGSI_TEXTURE_RECT:
+ Vector[2] = Vector[3] = LLVMGetUndef(bld_base->base.elem_type);
+ break;
+ case TGSI_TEXTURE_1D:
+ Vector[1] = Vector[2] = Vector[3] = LLVMGetUndef(bld_base->base.elem_type);
+ break;
+ default:
+ break;
+ }
+ args[0] = lp_build_gather_values(gallivm, Vector, 4);
+ } else {
+ args[0] = emit_data->args[0];
+ }
+
assert(emit_data->arg_count + 2 <= Elements(args));
- for (c = 0; c < emit_data->arg_count; ++c)
+ for (c = 1; c < emit_data->arg_count; ++c)
args[c] = emit_data->args[c];
sampler_src = emit_data->inst->Instruction.NumSrcRegs-1;