diff options
author | Marek Olšák <marek.olsak@amd.com> | 2016-10-02 21:56:00 +0200 |
---|---|---|
committer | Marek Olšák <marek.olsak@amd.com> | 2016-10-04 16:12:14 +0200 |
commit | b2a694f079d6fc7c313c4e5882ea4154b307f984 (patch) | |
tree | 510abfdec12983b562726425d0a6bba429e2614b | |
parent | b57aef8033edefa6f2802ae5a6340d218d9ffd48 (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.c | 56 |
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 c150ae4dc1..7844ebdc89 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); |