ac: add ac_build_fract()

Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Reviewed-by: Timothy Arceri <tarceri@itsqueeze.com>
This commit is contained in:
Samuel Pitoiset 2018-03-02 15:01:30 +01:00
parent fe0647df5a
commit 459e33900f
4 changed files with 39 additions and 34 deletions

View file

@ -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,

View file

@ -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,

View file

@ -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];
values[0] = emit_ffract(&ctx->ac, ctx->abi->frag_pos[0], 32);
values[1] = emit_ffract(&ctx->ac, ctx->abi->frag_pos[1], 32);
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] = 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);
}

View file

@ -400,22 +400,19 @@ static void emit_frac(const struct lp_build_tgsi_action *action,
struct lp_build_emit_data *emit_data)
{
struct si_shader_context *ctx = si_shader_context(bld_base);
char *intr;
unsigned bitsize;
if (emit_data->info->opcode == TGSI_OPCODE_FRC)
intr = "llvm.floor.f32";
bitsize = 32;
else if (emit_data->info->opcode == TGSI_OPCODE_DFRAC)
intr = "llvm.floor.f64";
bitsize = 64;
else {
assert(0);
return;
}
LLVMValueRef floor = lp_build_intrinsic(ctx->ac.builder, intr, emit_data->dst_type,
&emit_data->args[0], 1,
LP_FUNC_ATTR_READNONE);
emit_data->output[emit_data->chan] = LLVMBuildFSub(ctx->ac.builder,
emit_data->args[0], floor, "");
emit_data->output[emit_data->chan] =
ac_build_fract(&ctx->ac, emit_data->args[0], bitsize);
}
static void emit_f2i(const struct lp_build_tgsi_action *action,