diff --git a/src/freedreno/.gitlab-ci/reference/crash.log b/src/freedreno/.gitlab-ci/reference/crash.log index 76ee876e107..db42f99d591 100644 --- a/src/freedreno/.gitlab-ci/reference/crash.log +++ b/src/freedreno/.gitlab-ci/reference/crash.log @@ -7973,7 +7973,7 @@ clusters: 00000100 SP_VS_CONFIG: { ENABLED | NTEX = 0 | NSAMP = 0 | NIBO = 0 } 00000000 SP_VS_INSTRLEN: 0 00000000 SP_HS_CTRL_REG0: { HALFREGFOOTPRINT = 0 | FULLREGFOOTPRINT = 0 | BRANCHSTACK = 0 | THREADSIZE = TWO_QUADS } - 00000000 SP_HS_UNKNOWN_A831: 0 + 00000000 SP_HS_WAVE_INPUT_SIZE: 0 00000000 0xa832: 00000000 00000000 SP_HS_OBJ_FIRST_EXEC_OFFSET: 0 780a8ca5 SP_HS_OBJ_START_LO: 0x780a8ca5 @@ -8119,7 +8119,7 @@ clusters: 00000100 SP_VS_CONFIG: { ENABLED | NTEX = 0 | NSAMP = 0 | NIBO = 0 } 00000000 SP_VS_INSTRLEN: 0 00000000 SP_HS_CTRL_REG0: { HALFREGFOOTPRINT = 0 | FULLREGFOOTPRINT = 0 | BRANCHSTACK = 0 | THREADSIZE = TWO_QUADS } - 00000000 SP_HS_UNKNOWN_A831: 0 + 00000000 SP_HS_WAVE_INPUT_SIZE: 0 00000000 0xa832: 00000000 00000000 SP_HS_OBJ_FIRST_EXEC_OFFSET: 0 780a8ca5 SP_HS_OBJ_START_LO: 0x780a8ca5 diff --git a/src/freedreno/.gitlab-ci/reference/dEQP-VK.draw.indirect_draw.indexed.indirect_draw_count.triangle_list.log b/src/freedreno/.gitlab-ci/reference/dEQP-VK.draw.indirect_draw.indexed.indirect_draw_count.triangle_list.log index 3f56d8a65de..8900e61ebe4 100644 --- a/src/freedreno/.gitlab-ci/reference/dEQP-VK.draw.indirect_draw.indexed.indirect_draw_count.triangle_list.log +++ b/src/freedreno/.gitlab-ci/reference/dEQP-VK.draw.indirect_draw.indexed.indirect_draw_count.triangle_list.log @@ -948,8 +948,8 @@ t4 write SP_CS_CONFIG (a9bb) t4 write HLSQ_CS_CNTL (b987) HLSQ_CS_CNTL: { CONSTLEN = 0 } 0000000001054250: 0000: 40b98701 00000000 -t4 write SP_HS_UNKNOWN_A831 (a831) - SP_HS_UNKNOWN_A831: 0 +t4 write SP_HS_WAVE_INPUT_SIZE (a831) + SP_HS_WAVE_INPUT_SIZE: 0 0000000001054258: 0000: 48a83101 00000000 t4 write VFD_CONTROL_1 (a001) VFD_CONTROL_1: { REGID4VTX = r2.y | REGID4INST = r63.x | REGID4PRIMID = r63.x | REGID4VIEWID = r63.x } @@ -1511,7 +1511,7 @@ t7 opcode: CP_DRAW_INDIRECT_MULTI (2a) (12 dwords) - shaderdb: 0 (ss), 0 (sy) !+ 00000100 SP_VS_CONFIG: { ENABLED | NTEX = 0 | NSAMP = 0 | NIBO = 0 } !+ 00000001 SP_VS_INSTRLEN: 1 - + 00000000 SP_HS_UNKNOWN_A831: 0 + + 00000000 SP_HS_WAVE_INPUT_SIZE: 0 + 00000000 SP_HS_CONFIG: { NTEX = 0 | NSAMP = 0 | NIBO = 0 } + 00000000 SP_DS_CONFIG: { NTEX = 0 | NSAMP = 0 | NIBO = 0 } + 00000000 SP_GS_CONFIG: { NTEX = 0 | NSAMP = 0 | NIBO = 0 } diff --git a/src/freedreno/.gitlab-ci/reference/fd-clouds.log b/src/freedreno/.gitlab-ci/reference/fd-clouds.log index 24fdc6603bf..77bf190c8d2 100644 --- a/src/freedreno/.gitlab-ci/reference/fd-clouds.log +++ b/src/freedreno/.gitlab-ci/reference/fd-clouds.log @@ -681,8 +681,8 @@ t4 write SP_VS_OUT[0].REG (a803) t4 write SP_VS_VPC_DST[0].REG (a813) SP_VS_VPC_DST[0].REG: { OUTLOC0 = 0 | OUTLOC1 = 0 | OUTLOC2 = 0 | OUTLOC3 = 0 } 0000000001121070: 0000: 48a81301 00000000 -t4 write SP_HS_UNKNOWN_A831 (a831) - SP_HS_UNKNOWN_A831: 0 +t4 write SP_HS_WAVE_INPUT_SIZE (a831) + SP_HS_WAVE_INPUT_SIZE: 0 0000000001121078: 0000: 48a83101 00000000 t4 write SP_VS_PRIMITIVE_CNTL (a802) SP_VS_PRIMITIVE_CNTL: { OUT = 1 } @@ -1118,7 +1118,7 @@ t7 opcode: CP_DRAW_INDX_OFFSET (38) (4 dwords) - shaderdb: 0 (ss), 0 (sy) !+ 00000100 SP_VS_CONFIG: { ENABLED | NTEX = 0 | NSAMP = 0 | NIBO = 0 } !+ 00000001 SP_VS_INSTRLEN: 1 - + 00000000 SP_HS_UNKNOWN_A831: 0 + + 00000000 SP_HS_WAVE_INPUT_SIZE: 0 + 00000000 SP_HS_OBJ_FIRST_EXEC_OFFSET: 0 + 00000000 SP_HS_CONFIG: { NTEX = 0 | NSAMP = 0 | NIBO = 0 } + 00000000 SP_DS_CONFIG: { NTEX = 0 | NSAMP = 0 | NIBO = 0 } @@ -1996,8 +1996,8 @@ t4 write SP_VS_OUT[0].REG (a803) t4 write SP_VS_VPC_DST[0].REG (a813) SP_VS_VPC_DST[0].REG: { OUTLOC0 = 0 | OUTLOC1 = 0 | OUTLOC2 = 0 | OUTLOC3 = 0 } 0000000001120070: 0000: 48a81301 00000000 -t4 write SP_HS_UNKNOWN_A831 (a831) - SP_HS_UNKNOWN_A831: 0 +t4 write SP_HS_WAVE_INPUT_SIZE (a831) + SP_HS_WAVE_INPUT_SIZE: 0 0000000001120078: 0000: 48a83101 00000000 t4 write SP_VS_PRIMITIVE_CNTL (a802) SP_VS_PRIMITIVE_CNTL: { OUT = 1 } @@ -5343,7 +5343,7 @@ t7 opcode: CP_DRAW_INDX_OFFSET (38) (4 dwords) - shaderdb: 0 (ss), 0 (sy) + 00000100 SP_VS_CONFIG: { ENABLED | NTEX = 0 | NSAMP = 0 | NIBO = 0 } + 00000001 SP_VS_INSTRLEN: 1 - + 00000000 SP_HS_UNKNOWN_A831: 0 + + 00000000 SP_HS_WAVE_INPUT_SIZE: 0 + 00000000 SP_HS_OBJ_FIRST_EXEC_OFFSET: 0 + 00000000 SP_HS_CONFIG: { NTEX = 0 | NSAMP = 0 | NIBO = 0 } + 00000000 SP_DS_CONFIG: { NTEX = 0 | NSAMP = 0 | NIBO = 0 } diff --git a/src/freedreno/registers/adreno/a6xx.xml b/src/freedreno/registers/adreno/a6xx.xml index 082fd720398..61a73cb9f70 100644 --- a/src/freedreno/registers/adreno/a6xx.xml +++ b/src/freedreno/registers/adreno/a6xx.xml @@ -3220,7 +3220,13 @@ to upconvert to 32b float internally? - + + diff --git a/src/freedreno/vulkan/tu_pipeline.c b/src/freedreno/vulkan/tu_pipeline.c index 883d5499035..bd7072d5371 100644 --- a/src/freedreno/vulkan/tu_pipeline.c +++ b/src/freedreno/vulkan/tu_pipeline.c @@ -1058,7 +1058,7 @@ tu6_emit_vpc(struct tu_cs *cs, unknown_a831 = DIV_ROUND_UP(total_size, wavesize); } - tu_cs_emit_pkt4(cs, REG_A6XX_SP_HS_UNKNOWN_A831, 1); + tu_cs_emit_pkt4(cs, REG_A6XX_SP_HS_WAVE_INPUT_SIZE, 1); tu_cs_emit(cs, unknown_a831); /* In SPIR-V generated from GLSL, the tessellation primitive params are @@ -1563,7 +1563,7 @@ tu6_emit_program(struct tu_cs *cs, tu_cs_emit(cs, builder->multiview_mask); } - tu_cs_emit_pkt4(cs, REG_A6XX_SP_HS_UNKNOWN_A831, 1); + tu_cs_emit_pkt4(cs, REG_A6XX_SP_HS_WAVE_INPUT_SIZE, 1); tu_cs_emit(cs, 0); tu6_emit_vpc(cs, vs, hs, ds, gs, fs, cps_per_patch, diff --git a/src/gallium/drivers/freedreno/a6xx/fd6_program.c b/src/gallium/drivers/freedreno/a6xx/fd6_program.c index c872c94839b..251479ac14f 100644 --- a/src/gallium/drivers/freedreno/a6xx/fd6_program.c +++ b/src/gallium/drivers/freedreno/a6xx/fd6_program.c @@ -654,8 +654,24 @@ setup_stateobj(struct fd_ringbuffer *ring, struct fd_context *ctx, OUT_PKT4(ring, REG_A6XX_PC_HS_INPUT_SIZE, 1); OUT_RING(ring, hs_info->tess.tcs_vertices_out * vs->output_size / 4); - OUT_PKT4(ring, REG_A6XX_SP_HS_UNKNOWN_A831, 1); - OUT_RING(ring, vs->output_size); + const uint32_t wavesize = 64; + const uint32_t max_wave_input_size = 64; + const uint32_t patch_control_points = hs_info->tess.tcs_vertices_out; + + /* note: if HS is really just the VS extended, then this + * should be by MAX2(patch_control_points, hs_info->tess.tcs_vertices_out) + * however that doesn't match the blob, and fails some dEQP tests. + */ + uint32_t prims_per_wave = wavesize / hs_info->tess.tcs_vertices_out; + uint32_t max_prims_per_wave = + max_wave_input_size * wavesize / (vs->output_size * patch_control_points); + prims_per_wave = MIN2(prims_per_wave, max_prims_per_wave); + + uint32_t total_size = vs->output_size * patch_control_points * prims_per_wave; + uint32_t wave_input_size = DIV_ROUND_UP(total_size, wavesize); + + OUT_PKT4(ring, REG_A6XX_SP_HS_WAVE_INPUT_SIZE, 1); + OUT_RING(ring, wave_input_size); shader_info *ds_info = &ds->shader->nir->info; OUT_PKT4(ring, REG_A6XX_PC_TESS_CNTL, 1); @@ -706,7 +722,7 @@ setup_stateobj(struct fd_ringbuffer *ring, struct fd_context *ctx, A6XX_PC_DS_OUT_CNTL_CLIP_MASK(clip_cull_mask)); } else { - OUT_PKT4(ring, REG_A6XX_SP_HS_UNKNOWN_A831, 1); + OUT_PKT4(ring, REG_A6XX_SP_HS_WAVE_INPUT_SIZE, 1); OUT_RING(ring, 0); }