summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarek Olšák <marek.olsak@amd.com>2016-10-02 21:56:00 +0200
committerMarek Olšák <marek.olsak@amd.com>2016-10-04 16:12:14 +0200
commitb2a694f079d6fc7c313c4e5882ea4154b307f984 (patch)
tree510abfdec12983b562726425d0a6bba429e2614b
parentb57aef8033edefa6f2802ae5a6340d218d9ffd48 (diff)
radeonsi: use DDX/DDY directly in si_llvm_emit_ddxy_interp
We can finally do this, because the opcodes are scalar now. Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com> Reviewed-by: Edward O'Callaghan <funfunctor@folklore1984.net>
-rw-r--r--src/gallium/drivers/radeonsi/si_shader.c56
1 files changed, 7 insertions, 49 deletions
diff --git a/src/gallium/drivers/radeonsi/si_shader.c b/src/gallium/drivers/radeonsi/si_shader.c
index c150ae4dc11..7844ebdc892 100644
--- a/src/gallium/drivers/radeonsi/si_shader.c
+++ b/src/gallium/drivers/radeonsi/si_shader.c
@@ -5074,56 +5074,14 @@ static LLVMValueRef si_llvm_emit_ddxy_interp(
{
struct si_shader_context *ctx = si_shader_context(bld_base);
struct gallivm_state *gallivm = bld_base->base.gallivm;
- LLVMValueRef store_ptr, load_ptr_x, load_ptr_y, load_ptr_ddx, load_ptr_ddy, temp, temp2;
- LLVMValueRef tl, tr, bl, result[4], thread_id;
- unsigned c;
-
- thread_id = get_thread_id(ctx);
- store_ptr = build_gep0(ctx, ctx->lds, thread_id);
-
- temp = LLVMBuildAnd(gallivm->builder, thread_id,
- lp_build_const_int32(gallivm, TID_MASK_LEFT), "");
-
- temp2 = LLVMBuildAnd(gallivm->builder, thread_id,
- lp_build_const_int32(gallivm, TID_MASK_TOP), "");
-
- load_ptr_x = build_gep0(ctx, ctx->lds, temp);
-
- load_ptr_y = build_gep0(ctx, ctx->lds, temp2);
-
- load_ptr_ddx = build_gep0(ctx, ctx->lds,
- LLVMBuildAdd(gallivm->builder, temp,
- lp_build_const_int32(gallivm, 1), ""));
-
- load_ptr_ddy = build_gep0(ctx, ctx->lds,
- LLVMBuildAdd(gallivm->builder, temp2,
- lp_build_const_int32(gallivm, 2), ""));
-
- for (c = 0; c < 2; ++c) {
- LLVMValueRef store_val;
- LLVMValueRef c_ll = lp_build_const_int32(gallivm, c);
-
- store_val = LLVMBuildExtractElement(gallivm->builder,
- interp_ij, c_ll, "");
- LLVMBuildStore(gallivm->builder,
- store_val,
- store_ptr);
-
- tl = LLVMBuildLoad(gallivm->builder, load_ptr_x, "");
- tl = LLVMBuildBitCast(gallivm->builder, tl, ctx->f32, "");
-
- tr = LLVMBuildLoad(gallivm->builder, load_ptr_ddx, "");
- tr = LLVMBuildBitCast(gallivm->builder, tr, ctx->f32, "");
-
- result[c] = LLVMBuildFSub(gallivm->builder, tr, tl, "");
-
- tl = LLVMBuildLoad(gallivm->builder, load_ptr_y, "");
- tl = LLVMBuildBitCast(gallivm->builder, tl, ctx->f32, "");
-
- bl = LLVMBuildLoad(gallivm->builder, load_ptr_ddy, "");
- bl = LLVMBuildBitCast(gallivm->builder, bl, ctx->f32, "");
+ LLVMValueRef result[4], a;
+ unsigned i;
- result[c + 2] = LLVMBuildFSub(gallivm->builder, bl, tl, "");
+ for (i = 0; i < 2; i++) {
+ a = LLVMBuildExtractElement(gallivm->builder, interp_ij,
+ LLVMConstInt(ctx->i32, i, 0), "");
+ result[i] = lp_build_emit_llvm_unary(bld_base, TGSI_OPCODE_DDX, a);
+ result[2+i] = lp_build_emit_llvm_unary(bld_base, TGSI_OPCODE_DDY, a);
}
return lp_build_gather_values(gallivm, result, 4);