ir3: Support assembling/disassembling ray_intersection and resbase

These instructions are used for ray tracing.

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/28447>
This commit is contained in:
Connor Abbott
2024-02-12 10:07:19 +00:00
committed by Marge Bot
parent 3a5cb40c1f
commit b6ae20f2d6
7 changed files with 74 additions and 2 deletions
+2
View File
@@ -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),
+3
View File
@@ -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),
+3
View File
@@ -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: */
+7
View File
@@ -623,6 +623,7 @@ static void print_token(FILE *file, int type, YYSTYPE value)
%token <tok> T_OP_STLW
%token <tok> T_OP_RESFMT
%token <tok> T_OP_RESINFO
%token <tok> T_OP_RESBASE
%token <tok> T_OP_ATOMIC_ADD
%token <tok> T_OP_ATOMIC_SUB
%token <tok> T_OP_ATOMIC_XCHG
@@ -681,6 +682,7 @@ static void print_token(FILE *file, int type, YYSTYPE value)
%token <tok> T_OP_STC
%token <tok> T_OP_STSC
%token <tok> T_OP_SHFL
%token <tok> T_OP_RAY_INTERSECTION
/* category 7: */
%token <tok> 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; }
+5
View File
@@ -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"),
+53 -2
View File
@@ -989,6 +989,44 @@ SOFTWARE.
<pattern low="54" high="58">11010</pattern> <!-- OPC -->
</bitset>
<bitset name="ray_intersection" extends="#instruction-cat6">
<doc>
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.
</doc>
<display>
{SY}{JP}{NAME} {DST}, [{SRC1}], {SRC2}, {SRC3}, {SRC4}
</display>
<gen min="700"/>
<pattern low="54" high="58">01110</pattern> <!-- OPC -->
<pattern pos="0">1</pattern>
<field low="1" high="8" name="SRC2" type="#reg-gpr"/>
<pattern low="9" high="12">xxxx</pattern>
<field pos="13" name="SRC1_CONST" type="bool"/>
<field low="14" high="21" name="SRC1" type="#cat6-src-const-or-gpr">
<param name="SRC1_CONST" as="SRC_CONST"/>
</field>
<pattern low="22" high="23">xx</pattern>
<field low="24" high="31" name="SRC3" type="#reg-gpr"/>
<field low="32" high="39" name="DST" type="#reg-gpr"/>
<pattern pos="40">x</pattern>
<field low="41" high="48" name="SRC4" type="#reg-gpr"/>
<pattern low="49" high="53">xxxxx</pattern>
<encode>
<map name="SRC1_CONST">!!(src->srcs[0]->flags &amp; IR3_REG_CONST)</map>
</encode>
</bitset>
<!--
New a6xx+ encodings for potentially bindless image/ssbo:
-->
@@ -1156,7 +1194,7 @@ SOFTWARE.
<pattern low="52" high="53">1x</pattern>
</bitset>
<bitset name="resinfo.b" extends="#instruction-cat6-a6xx">
<bitset name="#instruction-cat6-a6xx-ibo-1src" extends="#instruction-cat6-a6xx">
<doc>
RESourceINFO - returns image/ssbo dimensions (3 components)
</doc>
@@ -1170,7 +1208,6 @@ SOFTWARE.
<pattern pos="0" >0</pattern>
<field low="9" high="10" name="D_MINUS_ONE" type="uint"/>
<field pos="11" name="TYPED" type="#cat6-typed"/>
<pattern low="14" high="19">001111</pattern> <!-- OPC -->
<pattern low="20" high="23">0110</pattern>
<pattern low="24" high="31">xxxxxxxx</pattern> <!-- SRC2 -->
<field low="32" high="39" name="DST" type="#reg-gpr"/>
@@ -1188,6 +1225,20 @@ SOFTWARE.
</encode>
</bitset>
<bitset name="resinfo.b" extends="#instruction-cat6-a6xx-ibo-1src">
<doc>
RESourceINFO - returns image/ssbo dimensions (3 components)
</doc>
<pattern low="14" high="19">001111</pattern> <!-- OPC -->
</bitset>
<bitset name="resbase" extends="#instruction-cat6-a6xx-ibo-1src">
<doc>
RESourceBASE - returns the address of the bindless descriptor
</doc>
<pattern low="14" high="19">001100</pattern> <!-- OPC -->
</bitset>
<bitset name="#instruction-cat6-a6xx-ibo-base" extends="#instruction-cat6-a6xx-base">
<doc>
IBO (ie. Image/SSBO) instructions
+1
View File
@@ -68,6 +68,7 @@ TODO:
<map name="SRC1">src->srcs[0]</map>
<map name="SRC2">src->srcs[1]</map>
<map name="SRC3">src->srcs[2]</map>
<map name="SRC4">src->srcs[3]</map>
<map name="REPEAT">src->repeat</map>
<map name="SS">!!(src->flags &amp; IR3_INSTR_SS)</map>
<map name="JP">!!(src->flags &amp; IR3_INSTR_JP)</map>