diff options
Diffstat (limited to 'src/amd')
-rw-r--r-- | src/amd/common/ac_llvm_build.c | 22 | ||||
-rw-r--r-- | src/amd/common/ac_llvm_build.h | 3 | ||||
-rw-r--r-- | src/amd/common/ac_nir_to_llvm.c | 35 |
3 files changed, 34 insertions, 26 deletions
diff --git a/src/amd/common/ac_llvm_build.c b/src/amd/common/ac_llvm_build.c index 15144addb9b..1a245bd8e68 100644 --- a/src/amd/common/ac_llvm_build.c +++ b/src/amd/common/ac_llvm_build.c @@ -1686,6 +1686,28 @@ void ac_build_waitcnt(struct ac_llvm_context *ctx, unsigned simm16) ctx->voidt, args, 1, 0); } +LLVMValueRef ac_build_fract(struct ac_llvm_context *ctx, LLVMValueRef src0, + unsigned bitsize) +{ + LLVMTypeRef type; + char *intr; + + if (bitsize == 32) { + intr = "llvm.floor.f32"; + type = ctx->f32; + } else { + intr = "llvm.floor.f64"; + type = ctx->f64; + } + + LLVMValueRef params[] = { + src0, + }; + LLVMValueRef floor = ac_build_intrinsic(ctx, intr, type, params, 1, + AC_FUNC_ATTR_READNONE); + return LLVMBuildFSub(ctx->builder, src0, floor, ""); +} + void ac_get_image_intr_name(const char *base_name, LLVMTypeRef data_type, LLVMTypeRef coords_type, diff --git a/src/amd/common/ac_llvm_build.h b/src/amd/common/ac_llvm_build.h index 0a49ad8ca13..1a480ebbcab 100644 --- a/src/amd/common/ac_llvm_build.h +++ b/src/amd/common/ac_llvm_build.h @@ -335,6 +335,9 @@ LLVMValueRef ac_build_bfe(struct ac_llvm_context *ctx, LLVMValueRef input, void ac_build_waitcnt(struct ac_llvm_context *ctx, unsigned simm16); +LLVMValueRef ac_build_fract(struct ac_llvm_context *ctx, LLVMValueRef src0, + unsigned bitsize); + void ac_get_image_intr_name(const char *base_name, LLVMTypeRef data_type, LLVMTypeRef coords_type, diff --git a/src/amd/common/ac_nir_to_llvm.c b/src/amd/common/ac_nir_to_llvm.c index 40ddf289742..a2c0706102a 100644 --- a/src/amd/common/ac_nir_to_llvm.c +++ b/src/amd/common/ac_nir_to_llvm.c @@ -1385,29 +1385,6 @@ static LLVMValueRef emit_isign(struct ac_llvm_context *ctx, return val; } -static LLVMValueRef emit_ffract(struct ac_llvm_context *ctx, - LLVMValueRef src0, unsigned bitsize) -{ - LLVMTypeRef type; - char *intr; - - if (bitsize == 32) { - intr = "llvm.floor.f32"; - type = ctx->f32; - } else { - intr = "llvm.floor.f64"; - type = ctx->f64; - } - - LLVMValueRef fsrc0 = ac_to_float(ctx, src0); - LLVMValueRef params[] = { - fsrc0, - }; - LLVMValueRef floor = ac_build_intrinsic(ctx, intr, type, params, 1, - AC_FUNC_ATTR_READNONE); - return LLVMBuildFSub(ctx->builder, fsrc0, floor, ""); -} - static LLVMValueRef emit_uint_carry(struct ac_llvm_context *ctx, const char *intrin, LLVMValueRef src0, LLVMValueRef src1) @@ -1853,7 +1830,9 @@ static void visit_alu(struct ac_nir_context *ctx, const nir_alu_instr *instr) ac_to_float_type(&ctx->ac, def_type),src[0]); break; case nir_op_ffract: - result = emit_ffract(&ctx->ac, src[0], instr->dest.dest.ssa.bit_size); + src[0] = ac_to_float(&ctx->ac, src[0]); + result = ac_build_fract(&ctx->ac, src[0], + instr->dest.dest.ssa.bit_size); break; case nir_op_fsin: result = emit_intrin_1f_param(&ctx->ac, "llvm.sin", @@ -4104,9 +4083,13 @@ static LLVMValueRef load_sample_position(struct ac_shader_abi *abi, static LLVMValueRef load_sample_pos(struct ac_nir_context *ctx) { LLVMValueRef values[2]; + LLVMValueRef pos[2]; + + pos[0] = ac_to_float(&ctx->ac, ctx->abi->frag_pos[0]); + pos[1] = ac_to_float(&ctx->ac, ctx->abi->frag_pos[1]); - values[0] = emit_ffract(&ctx->ac, ctx->abi->frag_pos[0], 32); - values[1] = emit_ffract(&ctx->ac, ctx->abi->frag_pos[1], 32); + values[0] = ac_build_fract(&ctx->ac, pos[0], 32); + values[1] = ac_build_fract(&ctx->ac, pos[1], 32); return ac_build_gather_values(&ctx->ac, values, 2); } |