diff --git a/src/freedreno/vulkan/tu_pipeline.c b/src/freedreno/vulkan/tu_pipeline.c index b768fd84dbc..ba4abadfd3d 100644 --- a/src/freedreno/vulkan/tu_pipeline.c +++ b/src/freedreno/vulkan/tu_pipeline.c @@ -841,11 +841,21 @@ tu6_setup_streamout(struct tu_cs *cs, /* no streamout: */ if (info->num_outputs == 0) { - tu_cs_emit_pkt7(cs, CP_CONTEXT_REG_BUNCH, 4); + unsigned sizedw = 4; + if (cs->device->physical_device->info->a6xx.tess_use_shared) + sizedw += 2; + + tu_cs_emit_pkt7(cs, CP_CONTEXT_REG_BUNCH, sizedw); tu_cs_emit(cs, REG_A6XX_VPC_SO_CNTL); tu_cs_emit(cs, 0); tu_cs_emit(cs, REG_A6XX_VPC_SO_STREAM_CNTL); tu_cs_emit(cs, 0); + + if (cs->device->physical_device->info->a6xx.tess_use_shared) { + tu_cs_emit(cs, REG_A6XX_PC_SO_STREAM_CNTL); + tu_cs_emit(cs, 0); + } + return; } @@ -894,6 +904,13 @@ tu6_setup_streamout(struct tu_cs *cs, prog_count += end - start + 1; } + const bool emit_pc_so_stream_cntl = + cs->device->physical_device->info->a6xx.tess_use_shared && + v->type == MESA_SHADER_TESS_EVAL; + + if (emit_pc_so_stream_cntl) + prog_count += 1; + tu_cs_emit_pkt7(cs, CP_CONTEXT_REG_BUNCH, 10 + 2 * prog_count); tu_cs_emit(cs, REG_A6XX_VPC_SO_STREAM_CNTL); tu_cs_emit(cs, A6XX_VPC_SO_STREAM_CNTL_STREAM_ENABLE(info->streams_written) | @@ -921,6 +938,14 @@ tu6_setup_streamout(struct tu_cs *cs, } first = false; } + + if (emit_pc_so_stream_cntl) { + /* Possibly not tess_use_shared related, but the combination of + * tess + xfb fails some tests if we don't emit this. + */ + tu_cs_emit(cs, REG_A6XX_PC_SO_STREAM_CNTL); + tu_cs_emit(cs, A6XX_PC_SO_STREAM_CNTL_STREAM_ENABLE(info->streams_written)); + } } static void