diff --git a/src/freedreno/ir3/ir3.h b/src/freedreno/ir3/ir3.h index 2f0829005a7..8c2a9289ec6 100644 --- a/src/freedreno/ir3/ir3.h +++ b/src/freedreno/ir3/ir3.h @@ -413,6 +413,9 @@ typedef enum ir3_instruction_flags { * non-resident page. Only allowed for cat5 texture loads and ldib. */ IR3_INSTR_RCK = BIT(24), + + /* Clamp computed LOD using the given minimum. Only for cat5. */ + IR3_INSTR_CLP = BIT(25), } ir3_instruction_flags; struct ir3_instruction { diff --git a/src/freedreno/ir3/ir3_lexer.l b/src/freedreno/ir3/ir3_lexer.l index 73bca2947cb..ca793e34436 100644 --- a/src/freedreno/ir3/ir3_lexer.l +++ b/src/freedreno/ir3/ir3_lexer.l @@ -494,6 +494,7 @@ static int parse_reg(const char *str) "u" return 'u'; "v" return 'v'; "rck" return T_RCK; +"clp" return T_CLP; "base"[0-9]+ ir3_yylval.num = strtol(yytext+4, NULL, 10); return T_BASE; "offset"[0-9]+ ir3_yylval.num = strtol(yytext+6, NULL, 10); return T_OFFSET; "uniform" return T_UNIFORM; diff --git a/src/freedreno/ir3/ir3_parser.y b/src/freedreno/ir3/ir3_parser.y index 6b10a57d39d..84d72be219a 100644 --- a/src/freedreno/ir3/ir3_parser.y +++ b/src/freedreno/ir3/ir3_parser.y @@ -770,6 +770,7 @@ static void print_token(FILE *file, int type, YYSTYPE value) %token T_NONUNIFORM %token T_IMM %token T_RCK +%token T_CLP %token T_NAN %token T_INF @@ -1231,6 +1232,7 @@ cat5_flag: '.' T_3D { instr->flags |= IR3_INSTR_3D; } | '.' T_BASE { instr->flags |= IR3_INSTR_B; instr->cat5.tex_base = $2; } | '.' T_W { instr->cat5.cluster_size = $2; } | '.' T_RCK { instr->flags |= IR3_INSTR_RCK; } +| '.' T_CLP { instr->flags |= IR3_INSTR_CLP; } cat5_flags: | cat5_flag cat5_flags diff --git a/src/freedreno/ir3/tests/disasm.c b/src/freedreno/ir3/tests/disasm.c index 46d9cba086b..85121ce2a2f 100644 --- a/src/freedreno/ir3/tests/disasm.c +++ b/src/freedreno/ir3/tests/disasm.c @@ -457,6 +457,9 @@ static const struct test { /* dEQP-GLES31.functional.shaders.opaque_type_indexing.sampler.const_literal.fragment.sampler2d */ INSTR_6XX(a0c01f04_0cc00005, "sam (f32)(xyzw)r1.x, r0.z, s#6, t#6"), + /* custom */ + INSTR_6XX(a0c01f04_0cc40005, "sam.clp (f32)(xyzw)r1.x, r0.z, r0.x, s#6, t#6"), + /* dEQP-GLES31.functional.shaders.opaque_type_indexing.sampler.uniform.fragment.sampler2d */ INSTR_4XX(a0c81f02_00800001, "sam.s2en.uniform (f32)(xyzw)r0.z, r0.x, hr1.x"), /* sam.s2en.mode0 (f32)(xyzw)r0.z, r0.x, hr1.x */ /* same for 5xx */ INSTR_6XX(a0c81f07_0100000b, "sam.s2en.uniform (f32)(xyzw)r1.w, r1.y, hr2.x"), /* sam.s2en.mode0 (f32)(xyzw)r1.w, r1.y, hr2.x */ @@ -465,6 +468,9 @@ static const struct test { INSTR_4XX(a0c81f02_80800001, "sam.s2en.nonuniform (f32)(xyzw)r0.z, r0.x, hr1.x"), /* sam.s2en.uniform (f32)(xyzw)r0.z, r0.x, hr1.x */ /* same for 5xx */ INSTR_6XX(a0c81f07_8100000b, "sam.s2en.nonuniform (f32)(xyzw)r1.w, r1.y, hr2.x"), /* sam.s2en.mode4 (f32)(xyzw)r1.w, r1.y, hr2.x */ + /* custom */ + INSTR_6XX(a1083f06_c0240805, "samb.base0.clp (u32)(xyzw)r1.z, r0.z, r1.x, s#1, t#0"), /* sam.s2en.mode4.clp (f32)(xyzw)r1.w, r1.y, hr2.x */ + /* NonUniform: */ /* dEQP-VK.descriptor_indexing.storage_buffer */ INSTR_6XX(c0260c0a_0a61b180, "ldib.b.untyped.1d.u32.4.nonuniform.base0 r2.z, r2.z, r1.z"), diff --git a/src/freedreno/isa/ir3-cat5.xml b/src/freedreno/isa/ir3-cat5.xml index 483bc9db3c3..df9f574fa9f 100644 --- a/src/freedreno/isa/ir3-cat5.xml +++ b/src/freedreno/isa/ir3-cat5.xml @@ -56,7 +56,7 @@ SOFTWARE. The "normal" case, ie. not s2en (indirect) and/or bindless - {SY}{JP}{NAME}{3D}{A}{O}{P}{SV}{1D}{RCK} {TYPE}({WRMASK}){DST_HALF}{DST}{SRC1}{SRC2}{SAMP}{TEX} + {SY}{JP}{NAME}{3D}{A}{O}{P}{SV}{1D}{CLP}{RCK} {TYPE}({WRMASK}){DST_HALF}{DST}{SRC1}{SRC2}{SAMP}{TEX} @@ -69,6 +69,7 @@ SOFTWARE. + @@ -510,6 +514,7 @@ SOFTWARE. 0 0 + @@ -635,7 +640,7 @@ SOFTWARE. - {O} || ({NUM_SRC} > 1) + {O} || {CLP} || ({NUM_SRC} > 1) , {HALF}{SRC} diff --git a/src/freedreno/tests/reference/crash.log b/src/freedreno/tests/reference/crash.log index ccc3bbe7443..38a1ca6566b 100644 --- a/src/freedreno/tests/reference/crash.log +++ b/src/freedreno/tests/reference/crash.log @@ -3400,7 +3400,7 @@ shader-blocks: :7:0001:0001[edc6145bx_11fa09c3x] no match: edc6145b11fa09c3 :2:0002:0002[41440087x_008c504ax] ceil.f hr33.w, (neg)hc18.z ; dontcare bits in ceil.f: 00040000008c0000 :0:0003:0003[14183488x_d5c04509x] no match: 14183488d5c04509 - :5:0004:0004[a52373bdx_8ff7c071x] no match: a52373bd8ff7c071 + :5:0004:0004[a52373bdx_8ff7c071x] samgp0.3d.a.p.clp.rck (xy)r47.y, r14.x, r56.x, s#15, t#71 ; dontcare bits in samgp0: 0000000000020000, WARNING: unexpected bits[19:20] in #instruction-cat5-tex-base: 0000000000000002 vs 0000000000000000 :1:0005:0005[39301c43x_1d826d16x] no match: 39301c431d826d16 ----------------------------------------------- 8192 (0x2000) bytes diff --git a/src/freedreno/tests/reference/prefetch-test.log b/src/freedreno/tests/reference/prefetch-test.log index 7a46fa74f63..4db4cfd3219 100644 --- a/src/freedreno/tests/reference/prefetch-test.log +++ b/src/freedreno/tests/reference/prefetch-test.log @@ -140888,7 +140888,7 @@ shader-blocks: :0:0051:0063[19d70515x_81d857bex] no match: 19d7051581d857be :3:0052:0064[7972f999x_e4df0ecbx] (sy)(ss)(jp)(rpt1)(ul)mad.s16 r38.y, (r)hc, (neg)hr57.y, (neg)(r)(last)hr55.w :6:0053:0066[dda7eb4fx_f96f6ddfx] no match: dda7eb4ff96f6ddf - :5:0054:0067[a4e7fe75x_ab4ffb7fx] no match: a4e7fe75ab4ffb7f + :5:0054:0067[a4e7fe75x_ab4ffb7fx] gather4a.3d.a.p.s.clp.rck (yzw)r29.y, r47.w, r63.y, s#10, t#85 ; dontcare bits in gather4a: 0000000000020000, WARNING: unexpected bits[19:20] in #instruction-cat5-tex-base: 0000000000000001 vs 0000000000000000, WARNING: unexpected bits[47:47] in #instruction-cat5: 0000000000000001 vs 0000000000000000 :6:0055:0068[d1937f77x_effcfeefx] no match: d1937f77effcfeef :0:0056:0069[1134c8d0x_34200204x] (sy)jump #874512900 ; dontcare bits in jump: 0034c8d000000000 :5:0057:0070[ac44c0eax_60215b2ex] (jp)gather4g.s (s16)()hr58.z, hr37.w, s#1, t#48 ; WARNING: unexpected bits[47:47] in #instruction-cat5: 0000000000000001 vs 0000000000000000, WARNING: unexpected bits[0:7] in #cat5-src2: 00000000000000ad vs 0000000000000000