ac: add ac_build_fract()
authorSamuel Pitoiset <samuel.pitoiset@gmail.com>
Fri, 2 Mar 2018 14:01:30 +0000 (15:01 +0100)
committerSamuel Pitoiset <samuel.pitoiset@gmail.com>
Mon, 5 Mar 2018 10:04:30 +0000 (11:04 +0100)
Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Reviewed-by: Timothy Arceri <tarceri@itsqueeze.com>
src/amd/common/ac_llvm_build.c
src/amd/common/ac_llvm_build.h
src/amd/common/ac_nir_to_llvm.c
src/gallium/drivers/radeonsi/si_shader_tgsi_alu.c

index 15144addb9b6b69fb74561f56bc1cb1e628884d6..1a245bd8e68d53b66219b7316f066e3696b6fe9b 100644 (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,
index 0a49ad8ca13554ed8baccef94389513e708d01ef..1a480ebbcab6da394303565a53fcfce7eaaf517d 100644 (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,
index 40ddf28974201a3ba7143b44de8674035799a305..a2c0706102a6e34e6c9d8b9533d0a5ed416e6d5b 100644 (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];
+
+       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);
 }
 
index cec33c38b4e4c165c1fc70a7fe8318bac3594c33..c9ebc90d9153cc91c0983624336e377929f7a08d 100644 (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,