ac: implement AMD_gcn_shader extended instructions
authorDaniel Schürmann <daniel.schuermann@campus.tu-berlin.de>
Fri, 23 Feb 2018 12:55:00 +0000 (13:55 +0100)
committerBas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
Wed, 7 Mar 2018 22:09:58 +0000 (23:09 +0100)
Co-authored-by: Dave Airlie <airlied@redhat.com>
Signed-off-by: Daniel Schürmann <daniel.schuermann@campus.tu-berlin.de>
Reviewed-by: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
src/amd/common/ac_nir_to_llvm.c

index d02238dba7d1c79a2d58cf38112591bb6866d4f6..0fbce5bbfd6f5f6bff4d6446f0814c43ab707b3e 100644 (file)
@@ -1603,6 +1603,10 @@ static void visit_alu(struct ac_nir_context *ctx, const nir_alu_instr *instr)
        case nir_op_unpack_half_2x16:
                src_components = 1;
                break;
+       case nir_op_cube_face_coord:
+       case nir_op_cube_face_index:
+               src_components = 3;
+               break;
        default:
                src_components = num_components;
                break;
@@ -2015,6 +2019,30 @@ static void visit_alu(struct ac_nir_context *ctx, const nir_alu_instr *instr)
                break;
        }
 
+       case nir_op_cube_face_coord: {
+               src[0] = ac_to_float(&ctx->ac, src[0]);
+               LLVMValueRef results[2];
+               LLVMValueRef in[3];
+               for (unsigned chan = 0; chan < 3; chan++)
+                       in[chan] = ac_llvm_extract_elem(&ctx->ac, src[0], chan);
+               results[0] = ac_build_intrinsic(&ctx->ac, "llvm.amdgcn.cubetc",
+                                               ctx->ac.f32, in, 3, AC_FUNC_ATTR_READNONE);
+               results[1] = ac_build_intrinsic(&ctx->ac, "llvm.amdgcn.cubesc",
+                                               ctx->ac.f32, in, 3, AC_FUNC_ATTR_READNONE);
+               result = ac_build_gather_values(&ctx->ac, results, 2);
+               break;
+       }
+
+       case nir_op_cube_face_index: {
+               src[0] = ac_to_float(&ctx->ac, src[0]);
+               LLVMValueRef in[3];
+               for (unsigned chan = 0; chan < 3; chan++)
+                       in[chan] = ac_llvm_extract_elem(&ctx->ac, src[0], chan);
+               result = ac_build_intrinsic(&ctx->ac,  "llvm.amdgcn.cubeid",
+                                               ctx->ac.f32, in, 3, AC_FUNC_ATTR_READNONE);
+               break;
+       }
+
        default:
                fprintf(stderr, "Unknown NIR alu instr: ");
                nir_print_instr(&instr->instr, stderr);