From 74d10525374e0699c27d1935ae9fba852701f97f Mon Sep 17 00:00:00 2001 From: Rob Clark Date: Sat, 21 Aug 2021 10:58:58 -0700 Subject: [PATCH] freedreno/a6xx: Fix a6xx gen4 compute shaders I believe the addition of these new regs is related to the changes made for LPAC ring, so let's key off of that. Signed-off-by: Rob Clark Part-of: --- src/freedreno/common/freedreno_dev_info.h | 2 ++ src/freedreno/common/freedreno_devices.py | 1 + src/gallium/drivers/freedreno/a6xx/fd6_compute.c | 16 ++++++++++++++++ 3 files changed, 19 insertions(+) diff --git a/src/freedreno/common/freedreno_dev_info.h b/src/freedreno/common/freedreno_dev_info.h index f280298a344..a5b6f7cef4e 100644 --- a/src/freedreno/common/freedreno_dev_info.h +++ b/src/freedreno/common/freedreno_dev_info.h @@ -117,6 +117,8 @@ struct fd_dev_info { */ bool has_ccu_flush_bug; + bool has_lpac; + struct { uint32_t RB_UNKNOWN_8E04_blit; uint32_t PC_POWER_CNTL; diff --git a/src/freedreno/common/freedreno_devices.py b/src/freedreno/common/freedreno_devices.py index 21a4f58c2af..d13cb54c10b 100644 --- a/src/freedreno/common/freedreno_devices.py +++ b/src/freedreno/common/freedreno_devices.py @@ -238,6 +238,7 @@ a6xx_gen4 = dict( has_sample_locations = True, has_cp_reg_write = False, has_8bpp_ubwc = False, + has_lpac = True, ) add_gpus([ diff --git a/src/gallium/drivers/freedreno/a6xx/fd6_compute.c b/src/gallium/drivers/freedreno/a6xx/fd6_compute.c index 9e8d68a6aae..1075b7528cc 100644 --- a/src/gallium/drivers/freedreno/a6xx/fd6_compute.c +++ b/src/gallium/drivers/freedreno/a6xx/fd6_compute.c @@ -75,6 +75,12 @@ cs_program_emit(struct fd_context *ctx, struct fd_ringbuffer *ring, OUT_RING(ring, A6XX_SP_CS_UNKNOWN_A9B1_SHARED_SIZE(shared_size) | A6XX_SP_CS_UNKNOWN_A9B1_UNK6); + if (ctx->screen->info->a6xx.has_lpac) { + OUT_PKT4(ring, REG_A6XX_HLSQ_CS_UNKNOWN_B9D0, 1); + OUT_RING(ring, A6XX_HLSQ_CS_UNKNOWN_B9D0_SHARED_SIZE(shared_size) | + A6XX_HLSQ_CS_UNKNOWN_B9D0_UNK6); + } + uint32_t local_invocation_id, work_group_id; local_invocation_id = ir3_find_sysval_regid(v, SYSTEM_VALUE_LOCAL_INVOCATION_ID); @@ -88,6 +94,16 @@ cs_program_emit(struct fd_context *ctx, struct fd_ringbuffer *ring, OUT_RING(ring, A6XX_HLSQ_CS_CNTL_1_LINEARLOCALIDREGID(regid(63, 0)) | A6XX_HLSQ_CS_CNTL_1_THREADSIZE(thrsz)); + if (ctx->screen->info->a6xx.has_lpac) { + OUT_PKT4(ring, REG_A6XX_SP_CS_CNTL_0, 2); + OUT_RING(ring, A6XX_SP_CS_CNTL_0_WGIDCONSTID(work_group_id) | + A6XX_SP_CS_CNTL_0_WGSIZECONSTID(regid(63, 0)) | + A6XX_SP_CS_CNTL_0_WGOFFSETCONSTID(regid(63, 0)) | + A6XX_SP_CS_CNTL_0_LOCALIDREGID(local_invocation_id)); + OUT_RING(ring, A6XX_SP_CS_CNTL_1_LINEARLOCALIDREGID(regid(63, 0)) | + A6XX_SP_CS_CNTL_1_THREADSIZE(thrsz)); + } + OUT_PKT4(ring, REG_A6XX_SP_CS_OBJ_START, 2); OUT_RELOC(ring, v->bo, 0, 0, 0); /* SP_CS_OBJ_START_LO/HI */