[Mesa-dev] [PATCH 3/9] freedreno/ir3: resync instr-a3xx.h/disasm-a3xx.c
Francesco Ansanelli
francians at gmail.com
Wed Apr 19 18:12:14 UTC 2017
2017-04-19 0:15 GMT+02:00 Rob Clark <robdclark at gmail.com>:
> Sync to the same files from freedreno.git to correct decoding of ldgb/
> stgb instructions.
>
> Signed-off-by: Rob Clark <robdclark at gmail.com>
> ---
> src/gallium/drivers/freedreno/a2xx/disasm-a2xx.c | 2 +-
> src/gallium/drivers/freedreno/disasm.h | 3 +
> src/gallium/drivers/freedreno/ir3/disasm-a3xx.c | 83
> +++++++++++++++++++++---
> src/gallium/drivers/freedreno/ir3/instr-a3xx.h | 77
> ++++++++++++++++++++--
> src/gallium/drivers/freedreno/ir3/ir3.h | 2 +-
> src/gallium/drivers/freedreno/ir3/ir3_nir.c | 4 +-
> src/gallium/drivers/freedreno/ir3/ir3_shader.c | 10 ++-
> 7 files changed, 161 insertions(+), 20 deletions(-)
>
> diff --git a/src/gallium/drivers/freedreno/a2xx/disasm-a2xx.c
> b/src/gallium/drivers/freedreno/a2xx/disasm-a2xx.c
> index fc309e8..c380450 100644
> --- a/src/gallium/drivers/freedreno/a2xx/disasm-a2xx.c
> +++ b/src/gallium/drivers/freedreno/a2xx/disasm-a2xx.c
> @@ -111,7 +111,7 @@ static void print_export_comment(uint32_t num, enum
> shader_t type)
> case 0: name = "gl_FragColor"; break;
> }
> break;
> - case SHADER_COMPUTE:
> + default:
> unreachable("not reached");
> }
> /* if we had a symbol table here, we could look
> diff --git a/src/gallium/drivers/freedreno/disasm.h b/src/gallium/drivers/
> freedreno/disasm.h
> index e81dd1c..bac1215 100644
> --- a/src/gallium/drivers/freedreno/disasm.h
> +++ b/src/gallium/drivers/freedreno/disasm.h
> @@ -26,6 +26,9 @@
>
> enum shader_t {
> SHADER_VERTEX,
> + SHADER_TCS,
> + SHADER_TES,
> + SHADER_GEOM,
> SHADER_FRAGMENT,
> SHADER_COMPUTE,
> };
> diff --git a/src/gallium/drivers/freedreno/ir3/disasm-a3xx.c
> b/src/gallium/drivers/freedreno/ir3/disasm-a3xx.c
> index e29d156..4685ed6 100644
> --- a/src/gallium/drivers/freedreno/ir3/disasm-a3xx.c
> +++ b/src/gallium/drivers/freedreno/ir3/disasm-a3xx.c
> @@ -159,16 +159,16 @@ static void print_instr_cat0(instr_t *instr)
> break;
> case OPC_BR:
> printf(" %sp0.%c, #%d", cat0->inv ? "!" : "",
> - component[cat0->comp], cat0->a3xx.immed);
> + component[cat0->comp], cat0->a5xx.immed);
> break;
> case OPC_JUMP:
> case OPC_CALL:
> - printf(" #%d", cat0->a3xx.immed);
> + printf(" #%d", cat0->a5xx.immed);
> break;
> }
>
> - if ((debug & PRINT_VERBOSE) && (cat0->a3xx.dummy1|cat0->
> dummy2|cat0->dummy3|cat0->dummy4))
> - printf("\t{0: %x,%x,%x,%x}", cat0->a3xx.dummy1,
> cat0->dummy2, cat0->dummy3, cat0->dummy4);
> + if ((debug & PRINT_VERBOSE) && (cat0->dummy2|cat0->dummy3|
> cat0->dummy4))
> + printf("\t{0: %x,%x,%x}", cat0->dummy2, cat0->dummy3,
> cat0->dummy4);
> }
>
> static void print_instr_cat1(instr_t *instr)
> @@ -506,7 +506,6 @@ static void print_instr_cat6(instr_t *instr)
> case OPC_STP:
> case OPC_STI:
> case OPC_STLW:
> - case OPC_STGB_4D_4:
> case OPC_STIB:
> dst.full = true;
> src1.full = type_size(cat6->type) == 32;
> @@ -523,6 +522,18 @@ static void print_instr_cat6(instr_t *instr)
> case OPC_PREFETCH:
> case OPC_RESINFO:
> break;
> + case OPC_LDGB:
> + printf(".%s", cat6->ldgb.typed ? "typed" : "untyped");
> + printf(".%dd", cat6->ldgb.d + 1);
> + printf(".%s", type[cat6->type]);
> + printf(".%d", cat6->ldgb.type_size + 1);
> + break;
> + case OPC_STGB:
> + printf(".%s", cat6->stgb.typed ? "typed" : "untyped");
> + printf(".%dd", cat6->stgb.d + 1);
> + printf(".%s", type[cat6->type]);
> + printf(".%d", cat6->stgb.type_size + 1);
> + break;
> case OPC_ATOMIC_ADD:
> case OPC_ATOMIC_SUB:
> case OPC_ATOMIC_XCHG:
> @@ -558,6 +569,7 @@ static void print_instr_cat6(instr_t *instr)
> break;
>
> case OPC_LDG:
> + case OPC_LDC:
> ss = 'g';
> break;
> case OPC_LDP:
> @@ -589,6 +601,61 @@ static void print_instr_cat6(instr_t *instr)
> break;
> }
>
> + if (_OPC(6, cat6->opc) == OPC_STGB) {
> + struct reginfo src3;
> +
> + memset(&src3, 0, sizeof(src3));
> +
> + src1.reg = (reg_t)(cat6->stgb.src1);
> + src2.reg = (reg_t)(cat6->stgb.src2);
> + src2.im = cat6->stgb.src2_im;
> + src3.reg = (reg_t)(cat6->stgb.src3);
> + src3.im = cat6->stgb.src3_im;
> + src3.full = true;
> +
> + printf("g[%u], ", cat6->stgb.dst_ssbo);
> + print_src(&src1);
> + printf(", ");
> + print_src(&src2);
> + printf(", ");
> + print_src(&src3);
> +
> + if (debug & PRINT_VERBOSE)
> + printf(" (pad0=%x, pad3=%x)", cat6->stgb.pad0,
> cat6->stgb.pad3);
> +
> + return;
> + }
> +
> + if ((_OPC(6, cat6->opc) == OPC_LDGB) || is_atomic(_OPC(6,
> cat6->opc))) {
> +
> + src1.reg = (reg_t)(cat6->ldgb.src1);
> + src1.im = cat6->ldgb.src1_im;
> + src2.reg = (reg_t)(cat6->ldgb.src2);
> + src2.im = cat6->ldgb.src2_im;
> + dst.reg = (reg_t)(cat6->ldgb.dst);
> +
> + print_src(&dst);
> + printf(", ");
> + printf("g[%u], ", cat6->ldgb.src_ssbo);
> + print_src(&src1);
> + printf(", ");
> + print_src(&src2);
> +
> + if (is_atomic(_OPC(6, cat6->opc))) {
> + struct reginfo src3;
> + memset(&src3, 0, sizeof(src3));
> + src3.reg = (reg_t)(cat6->ldgb.src3);
> + src3.full = true;
> +
> + printf(", ");
> + print_src(&src3);
> + }
> +
> + if (debug & PRINT_VERBOSE)
> + printf(" (pad0=%x, pad3=%x, mustbe0=%x)",
> cat6->ldgb.pad0, cat6->ldgb.pad3, cat6->ldgb.mustbe0);
> +
> + return;
> + }
> if (cat6->dst_off) {
> dst.reg = (reg_t)(cat6->c.dst);
> dstoff = cat6->c.off;
> @@ -806,10 +873,10 @@ static const struct opc_info {
> OPC(6, OPC_ATOMIC_AND, atomic.and),
> OPC(6, OPC_ATOMIC_OR, atomic.or),
> OPC(6, OPC_ATOMIC_XOR, atomic.xor),
> - OPC(6, OPC_LDGB_TYPED_4D, ldgb.typed.3d),
> - OPC(6, OPC_STGB_4D_4, stgb.4d.4),
> + OPC(6, OPC_LDGB, ldgb),
> + OPC(6, OPC_STGB, stgb),
> OPC(6, OPC_STIB, stib),
> - OPC(6, OPC_LDC_4, ldc.4),
> + OPC(6, OPC_LDC, ldc),
> OPC(6, OPC_LDLV, ldlv),
>
>
> diff --git a/src/gallium/drivers/freedreno/ir3/instr-a3xx.h
> b/src/gallium/drivers/freedreno/ir3/instr-a3xx.h
> index 0d369b6..b429b3b 100644
> --- a/src/gallium/drivers/freedreno/ir3/instr-a3xx.h
> +++ b/src/gallium/drivers/freedreno/ir3/instr-a3xx.h
> @@ -189,10 +189,10 @@ typedef enum {
> OPC_ATOMIC_AND = _OPC(6, 24),
> OPC_ATOMIC_OR = _OPC(6, 25),
> OPC_ATOMIC_XOR = _OPC(6, 26),
> - OPC_LDGB_TYPED_4D = _OPC(6, 27),
> - OPC_STGB_4D_4 = _OPC(6, 28),
> + OPC_LDGB = _OPC(6, 27),
> + OPC_STGB = _OPC(6, 28),
> OPC_STIB = _OPC(6, 29),
> - OPC_LDC_4 = _OPC(6, 30),
> + OPC_LDC = _OPC(6, 30),
> OPC_LDLV = _OPC(6, 31),
>
> /* meta instructions (category -1): */
> @@ -639,18 +639,63 @@ typedef struct PACKED {
>
> uint32_t dst : 8;
> uint32_t mustbe0 : 1;
> - uint32_t pad0 : 23;
> + uint32_t idx : 8;
> + uint32_t pad0 : 15;
> } instr_cat6d_t;
>
> -/* I think some of the other cat6 instructions use additional
> - * sub-encodings..
> +/* ldgb and atomics.. atomics use 3rd src and pad0=1, pad3=3. For
> + * ldgb pad0=0, pad3=2
> */
> +typedef struct PACKED {
> + /* dword0: */
> + uint32_t pad0 : 1;
> + uint32_t src3 : 8;
> + uint32_t d : 2;
> + uint32_t typed : 1;
> + uint32_t type_size : 2;
> + uint32_t src1 : 8;
> + uint32_t src1_im : 1;
> + uint32_t src2_im : 1;
> + uint32_t src2 : 8;
> +
> + /* dword1: */
> + uint32_t dst : 8;
> + uint32_t mustbe0 : 1;
> + uint32_t src_ssbo : 8;
> + uint32_t pad2 : 3; // type
> + uint32_t pad3 : 2;
> + uint32_t pad4 : 10; // opc/jmp_tgt/sync/opc_cat
> +} instr_cat6ldgb_t;
> +
> +/* stgb, pad0=0, pad3=2
> + */
> +typedef struct PACKED {
> + /* dword0: */
> + uint32_t mustbe1 : 1; // ???
> + uint32_t src1 : 8;
> + uint32_t d : 2;
> + uint32_t typed : 1;
> + uint32_t type_size : 2;
> + uint32_t pad0 : 9;
> + uint32_t src2_im : 1;
> + uint32_t src2 : 8;
> +
> + /* dword1: */
> + uint32_t src3 : 8;
> + uint32_t src3_im : 1;
> + uint32_t dst_ssbo : 8;
> + uint32_t pad2 : 3; // type
> + uint32_t pad3 : 2;
> + uint32_t pad4 : 10; // opc/jmp_tgt/sync/opc_cat
> +} instr_cat6stgb_t;
>
> typedef union PACKED {
> instr_cat6a_t a;
> instr_cat6b_t b;
> instr_cat6c_t c;
> instr_cat6d_t d;
> + instr_cat6ldgb_t ldgb;
> + instr_cat6stgb_t stgb;
> struct PACKED {
> /* dword0: */
> uint32_t src_off : 1;
> @@ -733,4 +778,24 @@ static inline bool is_madsh(opc_t opc)
> }
> }
>
> Hi Rob,
I suggest to put function name on a new line..
+static inline bool is_atomic(opc_t opc)
> +{
> + switch (opc) {
> + case OPC_ATOMIC_ADD:
> + case OPC_ATOMIC_SUB:
> + case OPC_ATOMIC_XCHG:
> + case OPC_ATOMIC_INC:
> + case OPC_ATOMIC_DEC:
> + case OPC_ATOMIC_CMPXCHG:
> + case OPC_ATOMIC_MIN:
> + case OPC_ATOMIC_MAX:
> + case OPC_ATOMIC_AND:
> + case OPC_ATOMIC_OR:
> + case OPC_ATOMIC_XOR:
> + return true;
> + default:
> + return false;
> + }
> +}
> +
> #endif /* INSTR_A3XX_H_ */
> diff --git a/src/gallium/drivers/freedreno/ir3/ir3.h
> b/src/gallium/drivers/freedreno/ir3/ir3.h
> index bbe903d..8d75ec1 100644
> --- a/src/gallium/drivers/freedreno/ir3/ir3.h
> +++ b/src/gallium/drivers/freedreno/ir3/ir3.h
> @@ -621,7 +621,7 @@ static inline bool is_load(struct ir3_instruction
> *instr)
> case OPC_LDP:
> case OPC_L2G:
> case OPC_LDLW:
> - case OPC_LDC_4:
> + case OPC_LDC:
> case OPC_LDLV:
> /* probably some others too.. */
> return true;
> diff --git a/src/gallium/drivers/freedreno/ir3/ir3_nir.c
> b/src/gallium/drivers/freedreno/ir3/ir3_nir.c
> index 336fa95..d0083d8 100644
> --- a/src/gallium/drivers/freedreno/ir3/ir3_nir.c
> +++ b/src/gallium/drivers/freedreno/ir3/ir3_nir.c
> @@ -114,7 +114,6 @@ ir3_optimize_nir(struct ir3_shader *shader, nir_shader
> *s,
> if (key) {
> switch (shader->type) {
> case SHADER_FRAGMENT:
> - case SHADER_COMPUTE:
> tex_options.saturate_s = key->fsaturate_s;
> tex_options.saturate_t = key->fsaturate_t;
> tex_options.saturate_r = key->fsaturate_r;
> @@ -124,6 +123,9 @@ ir3_optimize_nir(struct ir3_shader *shader, nir_shader
> *s,
> tex_options.saturate_t = key->vsaturate_t;
> tex_options.saturate_r = key->vsaturate_r;
> break;
> + default:
> + /* TODO */
> + break;
>
how about assert?
With or without these changes LGTM.
> }
> }
>
> diff --git a/src/gallium/drivers/freedreno/ir3/ir3_shader.c
> b/src/gallium/drivers/freedreno/ir3/ir3_shader.c
> index 1d54d53..9133317 100644
> --- a/src/gallium/drivers/freedreno/ir3/ir3_shader.c
> +++ b/src/gallium/drivers/freedreno/ir3/ir3_shader.c
> @@ -223,7 +223,6 @@ ir3_shader_variant(struct ir3_shader *shader, struct
> ir3_shader_key key,
> */
> switch (shader->type) {
> case SHADER_FRAGMENT:
> - case SHADER_COMPUTE:
> key.binning_pass = false;
> if (key.has_per_samp) {
> key.vsaturate_s = 0;
> @@ -243,6 +242,9 @@ ir3_shader_variant(struct ir3_shader *shader, struct
> ir3_shader_key key,
> key.fastc_srgb = 0;
> }
> break;
> + default:
> + /* TODO */
> + break;
> }
>
> for (v = shader->variants; v; v = v->next)
> @@ -418,7 +420,8 @@ ir3_shader_disasm(struct ir3_shader_variant *so,
> uint32_t *bin)
> }
> debug_printf("\n");
> break;
> - case SHADER_COMPUTE:
> + default:
> + /* TODO */
> break;
> }
>
> @@ -462,7 +465,8 @@ ir3_shader_disasm(struct ir3_shader_variant *so,
> uint32_t *bin)
> if (so->frag_face)
> debug_printf("; fragface: hr0.x\n");
> break;
> - case SHADER_COMPUTE:
> + default:
> + /* TODO */
> break;
> }
>
> --
> 2.9.3
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20170419/4854ae71/attachment-0001.html>
More information about the mesa-dev
mailing list