summaryrefslogtreecommitdiff
path: root/src/gallium/drivers
diff options
context:
space:
mode:
authorVincent Lejeune <vljn@ovi.com>2013-10-21 18:48:21 +0200
committerVincent Lejeune <vljn@ovi.com>2013-11-06 17:36:22 +0100
commit1184f8fd34ac00fe4be495f00a4d2e0820eac153 (patch)
tree48ba8bb90acf10450df5e560032cf171cbd0ef29 /src/gallium/drivers
parent36f1c6e3db6b8010ce4f06ed33e69f628b67e293 (diff)
r600/llvm: Fix texbuf for pre EG gen
Diffstat (limited to 'src/gallium/drivers')
-rw-r--r--src/gallium/drivers/r600/r600_llvm.c29
1 files changed, 29 insertions, 0 deletions
diff --git a/src/gallium/drivers/r600/r600_llvm.c b/src/gallium/drivers/r600/r600_llvm.c
index 34dd3addbb0..d7fa5f88d3a 100644
--- a/src/gallium/drivers/r600/r600_llvm.c
+++ b/src/gallium/drivers/r600/r600_llvm.c
@@ -427,6 +427,35 @@ static void llvm_emit_tex(
emit_data->output[0] = build_intrinsic(gallivm->builder,
"llvm.R600.load.texbuf",
emit_data->dst_type, args, 2, LLVMReadNoneAttribute);
+ if (ctx->chip_class >= EVERGREEN)
+ return;
+ ctx->uses_tex_buffers = true;
+ LLVMDumpValue(emit_data->output[0]);
+ emit_data->output[0] = LLVMBuildBitCast(gallivm->builder,
+ emit_data->output[0], LLVMVectorType(bld_base->base.int_elem_type, 4),
+ "");
+ LLVMValueRef Mask = llvm_load_const_buffer(bld_base,
+ lp_build_const_int32(gallivm, 0),
+ LLVM_R600_BUFFER_INFO_CONST_BUFFER);
+ Mask = LLVMBuildBitCast(gallivm->builder, Mask,
+ LLVMVectorType(bld_base->base.int_elem_type, 4), "");
+ emit_data->output[0] = lp_build_emit_llvm_binary(bld_base, TGSI_OPCODE_AND,
+ emit_data->output[0],
+ Mask);
+ LLVMValueRef WComponent = LLVMBuildExtractElement(gallivm->builder,
+ emit_data->output[0], lp_build_const_int32(gallivm, 3), "");
+ Mask = llvm_load_const_buffer(bld_base, lp_build_const_int32(gallivm, 1),
+ LLVM_R600_BUFFER_INFO_CONST_BUFFER);
+ Mask = LLVMBuildExtractElement(gallivm->builder, Mask,
+ lp_build_const_int32(gallivm, 0), "");
+ Mask = LLVMBuildBitCast(gallivm->builder, Mask,
+ bld_base->base.int_elem_type, "");
+ WComponent = lp_build_emit_llvm_binary(bld_base, TGSI_OPCODE_OR,
+ WComponent, Mask);
+ emit_data->output[0] = LLVMBuildInsertElement(gallivm->builder,
+ emit_data->output[0], WComponent, lp_build_const_int32(gallivm, 3), "");
+ emit_data->output[0] = LLVMBuildBitCast(gallivm->builder,
+ emit_data->output[0], LLVMVectorType(bld_base->base.elem_type, 4), "");
}
return;
default: