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:
@@ -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),
|
||||
|
||||
@@ -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),
|
||||
|
||||
@@ -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: */
|
||||
|
||||
@@ -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; }
|
||||
|
||||
@@ -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"),
|
||||
|
||||
@@ -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 & 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
|
||||
|
||||
@@ -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 & IR3_INSTR_SS)</map>
|
||||
<map name="JP">!!(src->flags & IR3_INSTR_JP)</map>
|
||||
|
||||
Reference in New Issue
Block a user