From ac75edb8c4ea4dbbe220ed00b9673fe230b084b7 Mon Sep 17 00:00:00 2001 From: Danylo Piliaiev Date: Thu, 14 Dec 2023 13:56:05 +0100 Subject: [PATCH] tu/a7xx: Correctly set A7XX_HLSQ_UNKNOWN_A9AE.SYSVAL_REGS_COUNT Signed-off-by: Danylo Piliaiev Part-of: --- src/freedreno/registers/adreno/a6xx.xml | 7 ++++-- src/freedreno/vulkan/tu_clear_blit.cc | 1 - src/freedreno/vulkan/tu_shader.cc | 29 ++++++++++++++++++++++++- 3 files changed, 33 insertions(+), 4 deletions(-) diff --git a/src/freedreno/registers/adreno/a6xx.xml b/src/freedreno/registers/adreno/a6xx.xml index 3980ee31f2b..7db232819a3 100644 --- a/src/freedreno/registers/adreno/a6xx.xml +++ b/src/freedreno/registers/adreno/a6xx.xml @@ -4298,9 +4298,12 @@ to upconvert to 32b float internally? - - + + + + + diff --git a/src/freedreno/vulkan/tu_clear_blit.cc b/src/freedreno/vulkan/tu_clear_blit.cc index 26ca84654c9..f201b0e6214 100644 --- a/src/freedreno/vulkan/tu_clear_blit.cc +++ b/src/freedreno/vulkan/tu_clear_blit.cc @@ -862,7 +862,6 @@ r3d_common(struct tu_cmd_buffer *cmd, struct tu_cs *cs, enum r3d_type type, tu6_emit_vpc(cs, vs, NULL, NULL, NULL, fs); if (CHIP >= A7XX) { - tu_cs_emit_regs(cs, A7XX_HLSQ_UNKNOWN_A9AE(.unk0 = 0x2, .unk8 = 1)); tu_cs_emit_regs(cs, A6XX_GRAS_UNKNOWN_8110(0x2)); tu_cs_emit_regs(cs, A7XX_HLSQ_FS_UNKNOWN_A9AA(.consts_load_disable = false)); diff --git a/src/freedreno/vulkan/tu_shader.cc b/src/freedreno/vulkan/tu_shader.cc index 1acecd7146e..7756f46f184 100644 --- a/src/freedreno/vulkan/tu_shader.cc +++ b/src/freedreno/vulkan/tu_shader.cc @@ -21,6 +21,8 @@ #include "tu_pipeline.h" #include "tu_lrz.h" +#include + nir_shader * tu_spirv_to_nir(struct tu_device *dev, void *mem_ctx, @@ -1525,6 +1527,32 @@ tu6_emit_fs_inputs(struct tu_cs *cs, const struct ir3_shader_variant *fs) .zwcoordregid = zwcoord_regid), HLSQ_CONTROL_5_REG(CHIP, .dword = 0xfcfc), ); + if (CHIP >= A7XX) { + uint32_t sysval_regs = 0; + for (unsigned i = 0; i < ARRAY_SIZE(ij_regid); i++) { + if (VALIDREG(ij_regid[i])) { + if (i == IJ_PERSP_CENTER_RHW) + sysval_regs += 1; + else + sysval_regs += 2; + } + } + + for (uint32_t sysval : { face_regid, samp_id_regid, smask_in_regid }) { + if (VALIDREG(sysval)) + sysval_regs += 1; + } + + for (uint32_t sysval : { coord_regid, zwcoord_regid }) { + if (VALIDREG(sysval)) + sysval_regs += 2; + } + + tu_cs_emit_regs(cs, A7XX_HLSQ_UNKNOWN_A9AE(.sysval_regs_count = sysval_regs, + .unk8 = 1, + .unk9 = 1)); + } + enum a6xx_threadsize thrsz = fs->info.double_threadsize ? THREAD128 : THREAD64; tu_cs_emit_regs(cs, HLSQ_FS_CNTL_0(CHIP, .threadsize = thrsz, .varyings = enable_varyings)); @@ -1846,7 +1874,6 @@ tu6_emit_fs(struct tu_cs *cs, tu_cs_emit_regs(cs, A6XX_PC_PS_CNTL(.primitiveiden = fs && fs->reads_primid)); if (CHIP >= A7XX) { - tu_cs_emit_regs(cs, A7XX_HLSQ_UNKNOWN_A9AE(.unk0 = 0x2, .unk8 = 1)); tu_cs_emit_regs(cs, A6XX_GRAS_UNKNOWN_8110(0x2)); tu_cs_emit_regs(cs, A7XX_HLSQ_FS_UNKNOWN_A9AA(.consts_load_disable = false)); }