freedreno/ir3: Define the bindful uniform/nonuniform desc modes for cat6 a6xx.

These come from the disasm tests, and fix our disasm of blob's
uniform/nonuniform cat6 operands.  We also now include human-readable names
for all the modes we know about (though bindless gets distinguished by its
.baseN, like Connor's original disasm).

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4857>
This commit is contained in:
Eric Anholt 2020-05-01 16:26:24 -07:00
parent 97b21110b8
commit 5c81f51c3c
4 changed files with 38 additions and 23 deletions

View File

@ -992,24 +992,37 @@ static void print_instr_cat6_a6xx(struct disasm_ctx *ctx, instr_t *instr)
static const struct {
bool indirect;
bool bindless;
bool uniform;
const char *name;
} desc_features[8] = {
[CAT6_IMM] = { false },
[CAT6_BINDLESS_IMM] = { .bindless = true, },
[CAT6_IMM] = {
.name = "imm"
},
[CAT6_UNIFORM] = {
.indirect = true,
.name = "uniform"
},
[CAT6_NONUNIFORM] = {
.indirect = true,
.name = "nonuniform"
},
[CAT6_BINDLESS_IMM] = {
.bindless = true,
.name = "imm"
},
[CAT6_BINDLESS_UNIFORM] = {
.bindless = true,
.indirect = true,
.uniform = true,
.name = "uniform"
},
[CAT6_BINDLESS_NONUNIFORM] = {
.bindless = true,
.indirect = true,
.name = "nonuniform"
},
};
bool indirect_ssbo = desc_features[cat6->desc_mode].indirect;
bool bindless = desc_features[cat6->desc_mode].bindless;
bool uniform = desc_features[cat6->desc_mode].uniform;
bool type_full = cat6->type != TYPE_U16;
@ -1026,10 +1039,9 @@ static void print_instr_cat6_a6xx(struct disasm_ctx *ctx, instr_t *instr)
}
fprintf(ctx->out, ".%u", cat6->type_size + 1);
fprintf(ctx->out, ".%s", desc_features[cat6->desc_mode].name);
if (bindless)
fprintf(ctx->out, ".base%d", cat6->base);
if (uniform)
fprintf(ctx->out, ".uniform");
fprintf(ctx->out, " ");
src2.reg = (reg_t)(cat6->src2);

View File

@ -829,11 +829,13 @@ typedef union PACKED {
/* Similar to cat5_desc_mode_t, describes how the descriptor is loaded.
*/
typedef enum {
/* Use old GL binding model with an immediate index.
* TODO: find CAT6_UNIFORM and CAT6_NONUNIFORM
*/
/* Use old GL binding model with an immediate index. */
CAT6_IMM = 0,
CAT6_UNIFORM = 1,
CAT6_NONUNIFORM = 2,
/* Use the bindless model, with an immediate index.
*/
CAT6_BINDLESS_IMM = 4,

View File

@ -572,9 +572,10 @@ static int emit_cat6_a6xx(struct ir3_instruction *instr, void *ptr,
}
cat6->base = instr->cat6.base;
} else {
/* TODO figure out mode for indirect SSBO index in !bindless */
iassert(ssbo->flags & IR3_REG_IMMED);
cat6->desc_mode = CAT6_IMM;
if (ssbo->flags & IR3_REG_IMMED)
cat6->desc_mode = CAT6_IMM;
else
cat6->desc_mode = CAT6_UNIFORM;
}
switch (instr->opc) {

View File

@ -76,8 +76,8 @@ static const struct test {
/* cat6 */
INSTR_6XX(c0c00000_00000000, "stg.f16 g[hr0.x], hr0.x, hr0.x"),
INSTR_6XX(c1100000_c1000000, "stl.f16 l[0], hr0.x, hr48.y"),
INSTR_6XX(c0260000_0063c200, "resinfo.untyped.2d.u32.1 r0.x, r0.x, 0"), /* resinfo.u32.2d.mode0.base0 r0.x, 0 */
INSTR_6XX(c0260000_0063c000, "resinfo.untyped.1d.u32.1 r0.x, r0.x, 0"), /* resinfo.u32.1d.mode0.base0 r0.x, 0 */
INSTR_6XX(c0260000_0063c200, "resinfo.untyped.2d.u32.1.imm r0.x, r0.x, 0"), /* resinfo.u32.2d.mode0.base0 r0.x, 0 */
INSTR_6XX(c0260000_0063c000, "resinfo.untyped.1d.u32.1.imm r0.x, r0.x, 0"), /* resinfo.u32.1d.mode0.base0 r0.x, 0 */
/* discard stuff */
INSTR_6XX(42b400f8_20010004, "cmps.s.eq p0.x, r1.x, 1"),
@ -101,16 +101,16 @@ static const struct test {
* important info they lack(?!), but same goes the other way.
*/
/* dEQP-GLES31.functional.shaders.opaque_type_indexing.ubo.uniform_fragment */
INSTR_6XX(c0260000_00c78040, "ldc.offset0.1 r0.x, r0.x, 0"), /* ldc.1.mode1.base0 r0.x, 0, r0.x */
INSTR_6XX(c0260201_00c78040, "ldc.offset0.1 r0.y, r0.x, 1"), /* ldc.1.mode1.base0 r0.y, 0, r0.y */
INSTR_6XX(c0260000_00c78040, "ldc.offset0.1.uniform r0.x, r0.x, r0.x"), /* ldc.1.mode1.base0 r0.x, 0, r0.x */
INSTR_6XX(c0260201_00c78040, "ldc.offset0.1.uniform r0.y, r0.x, r0.y"), /* ldc.1.mode1.base0 r0.y, 0, r0.y */
/* dEQP-GLES31.functional.shaders.opaque_type_indexing.ubo.dynamically_uniform_fragment */
INSTR_6XX(c0260000_00c78080, "ldc.offset0.1 r0.x, r0.x, 0"), /* ldc.1.mode2.base0 r0.x, 0, r0.x */
INSTR_6XX(c0260201_00c78080, "ldc.offset0.1 r0.y, r0.x, 1"), /* ldc.1.mode2.base0 r0.y, 0, r0.y */
INSTR_6XX(c0260000_00c78080, "ldc.offset0.1.nonuniform r0.x, r0.x, r0.x"), /* ldc.1.mode2.base0 r0.x, 0, r0.x */
INSTR_6XX(c0260201_00c78080, "ldc.offset0.1.nonuniform r0.y, r0.x, r0.y"), /* ldc.1.mode2.base0 r0.y, 0, r0.y */
/* custom shaders, loading .x, .y, .z, .w from an array of vec4 in block 0 */
INSTR_6XX(c0260000_00478000, "ldc.offset0.1 r0.x, r0.x, 0"), /* ldc.1.mode0.base0 r0.x, r0.x, 0 */
INSTR_6XX(c0260000_00478200, "ldc.offset1.1 r0.x, r0.x, 0"), /* ldc.1.mode0.base0 r0.x, r0.x, 0 */
INSTR_6XX(c0260000_00478400, "ldc.offset2.1 r0.x, r0.x, 0"), /* ldc.1.mode0.base0 r0.x, r0.x, 0 */
INSTR_6XX(c0260000_00478600, "ldc.offset3.1 r0.x, r0.x, 0"), /* ldc.1.mode0.base0 r0.x, r0.x, 0 */
INSTR_6XX(c0260000_00478000, "ldc.offset0.1.imm r0.x, r0.x, 0"), /* ldc.1.mode0.base0 r0.x, r0.x, 0 */
INSTR_6XX(c0260000_00478200, "ldc.offset1.1.imm r0.x, r0.x, 0"), /* ldc.1.mode0.base0 r0.x, r0.x, 0 */
INSTR_6XX(c0260000_00478400, "ldc.offset2.1.imm r0.x, r0.x, 0"), /* ldc.1.mode0.base0 r0.x, r0.x, 0 */
INSTR_6XX(c0260000_00478600, "ldc.offset3.1.imm r0.x, r0.x, 0"), /* ldc.1.mode0.base0 r0.x, r0.x, 0 */
/* 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"),