tu: Fix streamout with tess_use_shared

Mirrors 31835ac3b8 change in freedreno.

Together with "tu: Fix HS input size formula for gen3+" fixes following
tests from GL CTS running via Zink:

  dEQP-GLES31.functional.tessellation.invariance.inner_triangle_set.quads_fractional_odd_spacing
  dEQP-GLES31.functional.tessellation.invariance.inner_triangle_set.triangles_fractional_odd_spacing
  dEQP-GLES31.functional.tessellation.invariance.primitive_set.triangles_fractional_odd_spacing_ccw
  dEQP-GLES31.functional.tessellation.invariance.primitive_set.triangles_fractional_odd_spacing_cw
  dEQP-GLES31.functional.tessellation.invariance.triangle_set.triangles_fractional_odd_spacing
  dEQP-GLES31.functional.tessellation.primitive_discard.quads_fractional_odd_spacing_ccw
  dEQP-GLES31.functional.tessellation.primitive_discard.quads_fractional_odd_spacing_cw
  dEQP-GLES31.functional.tessellation.primitive_discard.triangles_fractional_odd_spacing_ccw
  dEQP-GLES31.functional.tessellation.primitive_discard.triangles_fractional_odd_spacing_cw

Signed-off-by: Danylo Piliaiev <dpiliaiev@igalia.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/17957>
This commit is contained in:
Danylo Piliaiev 2022-08-09 13:50:27 +03:00
parent 0120e7b9d9
commit a7db1da37d

View file

@ -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