diff --git a/src/freedreno/decode/cffdec.c b/src/freedreno/decode/cffdec.c index 65dcd49ca07..6989eefdc8c 100644 --- a/src/freedreno/decode/cffdec.c +++ b/src/freedreno/decode/cffdec.c @@ -2381,6 +2381,45 @@ cp_start_bin(uint32_t *dwords, uint32_t sizedwords, int level) } } +static void +cp_fixed_stride_draw_table(uint32_t *dwords, uint32_t sizedwords, int level) +{ + uint64_t ibaddr; + uint32_t ibsize; + uint32_t loopcount; + uint32_t *ptr = NULL; + + loopcount = dwords[3]; + ibaddr = dwords[0]; + ibaddr |= ((uint64_t)dwords[1]) << 32; + ibsize = dwords[2] >> 20; + + /* map gpuaddr back to hostptr: */ + ptr = hostptr(ibaddr); + + if (ptr) { + /* If the GPU hung within the target IB, the trigger point will be + * just after the current CP_START_BIN. Because the IB is + * executed but never returns. Account for this by checking if + * the IB returned: + */ + highlight_gpuaddr(gpuaddr(&dwords[5])); + + ib++; + for (uint32_t i = 0; i < loopcount; i++) { + ibs[ib].base = ibaddr; + ibs[ib].size = ibsize; + printl(3, "%sdraw %u\n", levels[level], i); + dump_commands(ptr, ibsize, level); + ibaddr += ibsize; + ptr += ibsize; + } + ib--; + } else { + fprintf(stderr, "could not find: %016" PRIx64 " (%d)\n", ibaddr, ibsize); + } +} + static void cp_wfi(uint32_t *dwords, uint32_t sizedwords, int level) { @@ -2894,6 +2933,8 @@ static const struct type3_op { CP(START_BIN, cp_start_bin), + CP(FIXED_STRIDE_DRAW_TABLE, cp_fixed_stride_draw_table), + /* for a7xx */ CP(THREAD_CONTROL, cp_set_thread_control), CP(CONTEXT_REG_BUNCH2, cp_context_reg_bunch2), diff --git a/src/freedreno/registers/adreno/adreno_pm4.xml b/src/freedreno/registers/adreno/adreno_pm4.xml index b769afbd1a3..0859d101dd4 100644 --- a/src/freedreno/registers/adreno/adreno_pm4.xml +++ b/src/freedreno/registers/adreno/adreno_pm4.xml @@ -625,6 +625,13 @@ xsi:schemaLocation="http://nouveau.freedesktop.org/ rules-ng.xsd"> + + + Executes an array of fixed-size command buffers where each + buffer is assumed to have one draw call, skipping buffers with + non-visible draw calls. + + @@ -1981,5 +1988,17 @@ opcode: CP_LOAD_STATE4 (30) (4 dwords) + + + + + + + + + + + +