radeonsi: add threadgroups_per_cu param into si_get_compute_resource_limits
authorMarek Olšák <marek.olsak@amd.com>
Tue, 22 Jan 2019 22:18:01 +0000 (17:18 -0500)
committerMarek Olšák <marek.olsak@amd.com>
Thu, 16 May 2019 17:06:54 +0000 (13:06 -0400)
Tested-by: Dieter Nützel <Dieter@nuetzel-hh.de>
Acked-by: Nicolai Hähnle <nicolai.haehnle@amd.com>
src/gallium/drivers/radeonsi/si_compute.c
src/gallium/drivers/radeonsi/si_pipe.h

index 2d70f0759bb699f9783fc4fcc813ab5a5cafe87f..f92ab59103696b2b590b6d8ef5de0a12329b21df 100644 (file)
@@ -751,7 +751,8 @@ static void si_setup_tgsi_user_data(struct si_context *sctx,
 
 unsigned si_get_compute_resource_limits(struct si_screen *sscreen,
                                        unsigned waves_per_threadgroup,
-                                       unsigned max_waves_per_sh)
+                                       unsigned max_waves_per_sh,
+                                       unsigned threadgroups_per_cu)
 {
        unsigned compute_resource_limits =
                S_00B854_SIMD_DEST_CNTL(waves_per_threadgroup % 4 == 0);
@@ -767,7 +768,9 @@ unsigned si_get_compute_resource_limits(struct si_screen *sscreen,
                if (num_cu_per_se % 4 && waves_per_threadgroup == 1)
                        compute_resource_limits |= S_00B854_FORCE_SIMD_DIST(1);
 
-               compute_resource_limits |= S_00B854_WAVES_PER_SH(max_waves_per_sh);
+               assert(threadgroups_per_cu >= 1 && threadgroups_per_cu <= 8);
+               compute_resource_limits |= S_00B854_WAVES_PER_SH(max_waves_per_sh) |
+                                          S_00B854_CU_GROUP_COUNT(threadgroups_per_cu - 1);
        } else {
                /* GFX6 */
                if (max_waves_per_sh) {
@@ -789,7 +792,7 @@ static void si_emit_dispatch_packets(struct si_context *sctx,
 
        radeon_set_sh_reg(cs, R_00B854_COMPUTE_RESOURCE_LIMITS,
                          si_get_compute_resource_limits(sscreen, waves_per_threadgroup,
-                                                        sctx->cs_max_waves_per_sh));
+                                                        sctx->cs_max_waves_per_sh, 1));
 
        unsigned dispatch_initiator =
                S_00B800_COMPUTE_SHADER_EN(1) |
index f65f4f500434efbc64f82e46e7dbfe2041af55fc..4606140f53dea1abbf88b888f031160299933ce1 100644 (file)
@@ -1307,7 +1307,8 @@ unsigned si_end_counter(struct si_screen *sscreen, unsigned type,
 void si_emit_initial_compute_regs(struct si_context *sctx, struct radeon_cmdbuf *cs);
 unsigned si_get_compute_resource_limits(struct si_screen *sscreen,
                                        unsigned waves_per_threadgroup,
-                                       unsigned max_waves_per_sh);
+                                       unsigned max_waves_per_sh,
+                                       unsigned threadgroups_per_cu);
 void si_init_compute_functions(struct si_context *sctx);
 
 /* si_perfcounters.c */