ir3/a7xx: handle alias.rt dst

alias.rt writes to a render target, not a GPR. Render targets are
disassembled as rtN.c.

Signed-off-by: Job Noorman <jnoorman@igalia.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/31222>
This commit is contained in:
Job Noorman 2025-01-22 15:33:47 +01:00 committed by Marge Bot
parent dab47b55ef
commit d9241c6360
5 changed files with 44 additions and 1 deletions

View file

@ -156,6 +156,9 @@ typedef enum ir3_register_flags {
/* Predicate register (p0.c). Cannot be combined with half or shared. */
IR3_REG_PREDICATE = BIT(19),
/* Render target dst. Only used by alias.rt. */
IR3_REG_RT = BIT(20),
} ir3_register_flags;
struct ir3_register {

View file

@ -96,6 +96,9 @@ static int parse_reg(const char *str)
num++;
}
str++;
if (str[0] == 't') {
str++;
}
num += strtol(str, (char **)&str, 10) << 3;
switch (str[1]) {
case 'x': num += 0; break;
@ -170,6 +173,7 @@ static int parse_reg(const char *str)
[h]?"r"[0-9]+"."[xyzw] ir3_yylval.num = parse_reg(yytext); return T_REGISTER;
[h]?"c"[0-9]+"."[xyzw] ir3_yylval.num = parse_reg(yytext); return T_CONSTANT;
"rt"[0-7]"."[xyzw] ir3_yylval.num = parse_reg(yytext); return T_RT;
"a0.x" return T_A0;
"a1.x" return T_A1;
"p0."[xyzw] ir3_yylval.num = parse_reg(yytext); return T_P0;

View file

@ -376,6 +376,7 @@ static void print_token(FILE *file, int type, YYSTYPE value)
%token <str> T_IDENTIFIER
%token <num> T_REGISTER
%token <num> T_CONSTANT
%token <num> T_RT
/* @ headers (@const/@sampler/@uniform/@varying) */
%token <tok> T_A_LOCALSIZE
@ -1443,6 +1444,9 @@ cat7_data_cache: T_OP_DCCLN { new_instr(OPC_DCCLN); }
| T_OP_DCINV { new_instr(OPC_DCINV); }
| T_OP_DCFLU { new_instr(OPC_DCFLU); }
cat7_alias_dst: dst_reg
| T_RT { new_dst($1, IR3_REG_RT); }
cat7_alias_src: src_reg_or_const
| immediate_cat1
@ -1470,7 +1474,7 @@ cat7_instr: cat7_barrier
| T_OP_UNLOCK { new_instr(OPC_UNLOCK); }
| T_OP_ALIAS {
new_instr(OPC_ALIAS);
} '.' cat7_alias_scope '.' cat7_alias_type '.' cat7_alias_table_size_minus_one dst_reg ',' cat7_alias_src
} '.' cat7_alias_scope '.' cat7_alias_type '.' cat7_alias_table_size_minus_one cat7_alias_dst ',' cat7_alias_src
raw_instr: T_RAW {new_instr(OPC_META_RAW)->raw.value = $1;}

View file

@ -508,6 +508,19 @@ static const struct test {
/* dEQP-VK.subgroups.quad.graphics.subgroupquadbroadcast_i16vec2 */
INSTR_7XX(e45100a0_00000002, "alias.tex.b16.0 hr40.x, h(0x2)"),
/* dEQP-VK.glsl.derivate.dfdx.constant.float */
INSTR_7XX(e4508003_00003c00, "alias.rt.f16.0 rt0.w, h(1.000000)"),
INSTR_7XX(f4488000_00000000, "(sy)alias.rt.f16.0 rt0.x, hc0.x"),
/* dEQP-VK.glsl.opaque_type_indexing.ubo.const_literal_fragment */
INSTR_7XX(e44c8008_00000010, "alias.rt.f32.0 rt2.x, c4.x"),
/* dEQP-VK.dynamic_rendering.primary_cmd_buff.suballocation.multisample_resolve.layers_3.r16g16_unorm.samples_4_resolve_level_4 */
INSTR_7XX(e4548008_3f800000, "alias.rt.f32.0 rt2.x, (1.000000)"),
/* dEQP-VK.renderpass.suballocation.multisample_resolve.layers_3.r8g8b8a8_uint.samples_2_baseLayer1 */
INSTR_7XX(e4558007_000000ff, "alias.rt.b32.0 rt1.w, (0xff)"),
INSTR_6XX(ffffffff_ffffffff, "raw 0xFFFFFFFFFFFFFFFF"),
/* clang-format on */
};

View file

@ -284,6 +284,18 @@ SOFTWARE.
<value val="2" display="IMMED"/>
</enum>
<bitset name="#dst-rt" size="5">
<display>
rt{RT}.{SWIZ}
</display>
<field name="SWIZ" low="0" high="1" type="#swiz"/>
<field name="RT" low="2" high="4" type="uint"/>
<encode type="struct ir3_register *">
<map name="RT">src->num >> 2</map>
<map name="SWIZ">src->num &amp; 0x3</map>
</encode>
</bitset>
<bitset name="alias" extends="#instruction">
<doc>
Add an entry to the scope-specific "alias table", when instruction
@ -335,6 +347,13 @@ SOFTWARE.
<param name="TYPE_SIZE"/>
<param name="TYPE"/>
</field>
<override>
<expr>{SCOPE} == 1</expr>
<field low="32" high="36" name="DST" type="#dst-rt"/>
<pattern low="37" high="39">000</pattern>
<derived name="DST_HALF" expr="#false" type="bool" display=""/>
</override>
<field low="32" high="39" name="DST" type="#reg-gpr"/>
<field low="40" high="43" name="TABLE_SIZE_MINUS_ONE" type="uint"/>
<field pos="44" name="SS" type="bool" display="(ss)"/>