From b6ae20f2d617cc586865f650ed882b2010644368 Mon Sep 17 00:00:00 2001 From: Connor Abbott Date: Mon, 12 Feb 2024 10:07:19 +0000 Subject: [PATCH] ir3: Support assembling/disassembling ray_intersection and resbase These instructions are used for ray tracing. Part-of: --- src/freedreno/ir3/disasm-a3xx.c | 2 ++ src/freedreno/ir3/instr-a3xx.h | 3 ++ src/freedreno/ir3/ir3_lexer.l | 3 ++ src/freedreno/ir3/ir3_parser.y | 7 ++++ src/freedreno/ir3/tests/disasm.c | 5 +++ src/freedreno/isa/ir3-cat6.xml | 55 ++++++++++++++++++++++++++++++-- src/freedreno/isa/ir3.xml | 1 + 7 files changed, 74 insertions(+), 2 deletions(-) diff --git a/src/freedreno/ir3/disasm-a3xx.c b/src/freedreno/ir3/disasm-a3xx.c index 64d0dbf4606..a362c8fd952 100644 --- a/src/freedreno/ir3/disasm-a3xx.c +++ b/src/freedreno/ir3/disasm-a3xx.c @@ -328,6 +328,7 @@ static const struct opc_info { OPC(6, OPC_STLW, stlw), OPC(6, OPC_RESFMT, resfmt), OPC(6, OPC_RESINFO, resinfo), + OPC(6, OPC_RESBASE, resbase), OPC(6, OPC_ATOMIC_ADD, atomic.add), OPC(6, OPC_ATOMIC_SUB, atomic.sub), OPC(6, OPC_ATOMIC_XCHG, atomic.xchg), @@ -389,6 +390,7 @@ static const struct opc_info { OPC(6, OPC_LDC_K, ldc.k), OPC(6, OPC_LDG_K, ldg.k), OPC(6, OPC_SHFL, shfl), + OPC(6, OPC_RAY_INTERSECTION, ray_intersection), OPC(6, OPC_SPILL_MACRO, spill.macro), OPC(6, OPC_RELOAD_MACRO, reload.macro), diff --git a/src/freedreno/ir3/instr-a3xx.h b/src/freedreno/ir3/instr-a3xx.h index c64bf5bc349..5807c817bab 100644 --- a/src/freedreno/ir3/instr-a3xx.h +++ b/src/freedreno/ir3/instr-a3xx.h @@ -348,6 +348,9 @@ typedef enum { */ OPC_PUSH_CONSTS_LOAD_MACRO = _OPC(6, 84), + OPC_RAY_INTERSECTION = _OPC(6, 90), + OPC_RESBASE = _OPC(6, 91), + /* category 7: */ OPC_BAR = _OPC(7, 0), OPC_FENCE = _OPC(7, 1), diff --git a/src/freedreno/ir3/ir3_lexer.l b/src/freedreno/ir3/ir3_lexer.l index cfbb164e3da..962ca66e2eb 100644 --- a/src/freedreno/ir3/ir3_lexer.l +++ b/src/freedreno/ir3/ir3_lexer.l @@ -363,6 +363,7 @@ static int parse_reg(const char *str) "stlw" return TOKEN(T_OP_STLW); "resfmt" return TOKEN(T_OP_RESFMT); "resinfo" return TOKEN(T_OP_RESINFO); +"resbase" return TOKEN(T_OP_RESBASE); "atomic.add" return TOKEN(T_OP_ATOMIC_ADD); "atomic.sub" return TOKEN(T_OP_ATOMIC_SUB); "atomic.xchg" return TOKEN(T_OP_ATOMIC_XCHG); @@ -423,6 +424,8 @@ static int parse_reg(const char *str) "stsc" return TOKEN(T_OP_STSC); "shfl" return TOKEN(T_OP_SHFL); +"ray_intersection" return TOKEN(T_OP_RAY_INTERSECTION); + ("b16"|"b32"){1} ir3_yylval.str = yytext; return T_INSTR_TYPE; /* category 7: */ diff --git a/src/freedreno/ir3/ir3_parser.y b/src/freedreno/ir3/ir3_parser.y index 7ba386aaa71..192dfe56aa1 100644 --- a/src/freedreno/ir3/ir3_parser.y +++ b/src/freedreno/ir3/ir3_parser.y @@ -623,6 +623,7 @@ static void print_token(FILE *file, int type, YYSTYPE value) %token T_OP_STLW %token T_OP_RESFMT %token T_OP_RESINFO +%token T_OP_RESBASE %token T_OP_ATOMIC_ADD %token T_OP_ATOMIC_SUB %token T_OP_ATOMIC_XCHG @@ -681,6 +682,7 @@ static void print_token(FILE *file, int type, YYSTYPE value) %token T_OP_STC %token T_OP_STSC %token T_OP_SHFL +%token T_OP_RAY_INTERSECTION /* category 7: */ %token T_OP_BAR @@ -1344,6 +1346,7 @@ cat6_reg_or_immed: src | integer { new_src(0, IR3_REG_IMMED)->iim_val = $1; } cat6_bindless_ibo_opc_1src: T_OP_RESINFO_B { new_instr(OPC_RESINFO); } +| T_OP_RESBASE { new_instr(OPC_RESBASE); } cat6_bindless_ibo_opc_2src: T_OP_ATOMIC_B_ADD { new_instr(OPC_ATOMIC_B_ADD); dummy_dst(); } | T_OP_ATOMIC_B_SUB { new_instr(OPC_ATOMIC_B_SUB); dummy_dst(); } @@ -1401,6 +1404,9 @@ cat6_shfl_mode: T_MOD_XOR { instr->cat6.shfl_mode = SHFL_XOR; } cat6_shfl: T_OP_SHFL { new_instr(OPC_SHFL); } '.' cat6_shfl_mode cat6_type dst ',' src ',' cat6_reg_or_immed +cat6_ray_intersection: T_OP_RAY_INTERSECTION { + new_instr(OPC_RAY_INTERSECTION); + } dst_reg ',' '[' src_reg_or_const ']' ',' src_reg ',' src_reg ',' src_reg cat6_todo: T_OP_G2L { new_instr(OPC_G2L); } | T_OP_L2G { new_instr(OPC_L2G); } @@ -1418,6 +1424,7 @@ cat6_instr: cat6_load | cat6_bindless_ibo | cat6_stc | cat6_shfl +| cat6_ray_intersection | cat6_todo cat7_scope: '.' 'w' { instr->cat7.w = true; } diff --git a/src/freedreno/ir3/tests/disasm.c b/src/freedreno/ir3/tests/disasm.c index fc4d40571eb..2b20acee091 100644 --- a/src/freedreno/ir3/tests/disasm.c +++ b/src/freedreno/ir3/tests/disasm.c @@ -214,6 +214,11 @@ static const struct test { INSTR_5XX(c0ce0100_02800000, "stg.u8_32 g[r0.x], r0.x, 2"), INSTR_5XX(c0c00100_02800000, "stg.f16 g[r0.x], hr0.x, 2"), + /* dEQP-VK.ray_query.builtin.objectraydirection.geom.aabbs */ + INSTR_7XX(c380941e_0703c079, "ray_intersection r7.z, [r3.w], r15.x, r1.w, r18.z"), + /* dEQP-VK.ray_query.builtin.rayqueryterminate.geom.triangles */ + INSTR_7XX(c0260207_00630100, "resbase.untyped.1d.u32.1.imm.base0 r1.w, 1"), /* resbase.u32.1d.mode4.base0 r1.w, 1 */ + /* Customely crafted */ INSTR_6XX(c0d61104_01800228, "stg.a.u32 g[r2.x+(r1.x+1)<<2], r5.x, 1"), INSTR_6XX(c0d61104_01802628, "stg.a.u32 g[r2.x+r1.x<<4+3<<2], r5.x, 1"), diff --git a/src/freedreno/isa/ir3-cat6.xml b/src/freedreno/isa/ir3-cat6.xml index 4a6078596a1..d5b47122fb5 100644 --- a/src/freedreno/isa/ir3-cat6.xml +++ b/src/freedreno/isa/ir3-cat6.xml @@ -989,6 +989,44 @@ SOFTWARE. 11010 + + + Instruction for intersecting a ray. Unlike other instructions, + this supports an arbitrary pointer as the descriptor address. + SRC1 is a 64-bit pointer to the acceleration structure + descriptor. + + + {SY}{JP}{NAME} {DST}, [{SRC1}], {SRC2}, {SRC3}, {SRC4} + + + + 01110 + + 1 + + + xxxx + + + + + + + xx + + + + x + + + xxxxx + + + !!(src->srcs[0]->flags & IR3_REG_CONST) + + + @@ -1156,7 +1194,7 @@ SOFTWARE. 1x - + RESourceINFO - returns image/ssbo dimensions (3 components) @@ -1170,7 +1208,6 @@ SOFTWARE. 0 - 001111 0110 xxxxxxxx @@ -1188,6 +1225,20 @@ SOFTWARE. + + + RESourceINFO - returns image/ssbo dimensions (3 components) + + 001111 + + + + + RESourceBASE - returns the address of the bindless descriptor + + 001100 + + IBO (ie. Image/SSBO) instructions diff --git a/src/freedreno/isa/ir3.xml b/src/freedreno/isa/ir3.xml index fc95e90298d..adc4de06ff5 100644 --- a/src/freedreno/isa/ir3.xml +++ b/src/freedreno/isa/ir3.xml @@ -68,6 +68,7 @@ TODO: src->srcs[0] src->srcs[1] src->srcs[2] + src->srcs[3] src->repeat !!(src->flags & IR3_INSTR_SS) !!(src->flags & IR3_INSTR_JP)