Module: Mesa
Branch: main
Commit: 022850ed0563f27d1a7321a2cac68866f2fd9f98
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=022850ed0563f27d1a7321a2cac68866f2fd9f98

Author: Gert Wollny <[email protected]>
Date:   Tue Jul 11 16:33:28 2023 +0200

r600: Add experimental get_compute_state_info

This callback is needed for rusticl, but the values that are returned
may be completely off.

Related: https://gitlab.freedesktop.org/mesa/mesa/-/issues/7420

v2: use r600_wavefront_size value

Signed-off-by: Gert Wollny <[email protected]>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/24229>

---

 src/gallium/drivers/r600/evergreen_compute.c | 18 +++++++++++++++++-
 src/gallium/drivers/r600/r600_pipe_common.c  |  3 ++-
 2 files changed, 19 insertions(+), 2 deletions(-)

diff --git a/src/gallium/drivers/r600/evergreen_compute.c 
b/src/gallium/drivers/r600/evergreen_compute.c
index b3c16fe067f..98962656e3a 100644
--- a/src/gallium/drivers/r600/evergreen_compute.c
+++ b/src/gallium/drivers/r600/evergreen_compute.c
@@ -1215,6 +1215,22 @@ void evergreen_init_atom_start_compute_cs(struct 
r600_context *rctx)
        eg_store_loop_const(cb, R_03A200_SQ_LOOP_CONST_0 + (160 * 4), 
0x1000FFF);
 }
 
+
+static void evergreen_get_compute_state_info(struct pipe_context *ctx, void 
*state,
+                                             struct 
pipe_compute_state_object_info *info)
+{
+       struct r600_context *rctx = (struct r600_context*)ctx;
+       struct r600_pipe_compute *shader = state;
+       
+       /* This is somehow copied from RadeonSI, but in thruth this not more
+        * than an educated guess. */
+       uint8_t wave_size = r600_wavefront_size(rctx->b.screen->family);
+       info->private_memory = shader->sel->current->scratch_space_needed;
+       info->preferred_simd_size = wave_size;
+       info->simd_sizes = wave_size;
+       info->max_threads = 128;
+}
+
 void evergreen_init_compute_state_functions(struct r600_context *rctx)
 {
        rctx->b.b.create_compute_state = evergreen_create_compute_state;
@@ -1224,7 +1240,7 @@ void evergreen_init_compute_state_functions(struct 
r600_context *rctx)
        rctx->b.b.set_compute_resources = evergreen_set_compute_resources;
        rctx->b.b.set_global_binding = evergreen_set_global_binding;
        rctx->b.b.launch_grid = evergreen_launch_grid;
-
+       rctx->b.b.get_compute_state_info = evergreen_get_compute_state_info;
 }
 
 void *r600_compute_global_transfer_map(struct pipe_context *ctx,
diff --git a/src/gallium/drivers/r600/r600_pipe_common.c 
b/src/gallium/drivers/r600/r600_pipe_common.c
index 8a5f78db95f..783d7badc3b 100644
--- a/src/gallium/drivers/r600/r600_pipe_common.c
+++ b/src/gallium/drivers/r600/r600_pipe_common.c
@@ -1034,7 +1034,6 @@ static int r600_get_compute_param(struct pipe_screen 
*screen,
                }
                return sizeof(uint32_t);
        case PIPE_COMPUTE_CAP_MAX_PRIVATE_SIZE:
-       case PIPE_COMPUTE_CAP_MAX_SUBGROUPS:
                break; /* unused */
        case PIPE_COMPUTE_CAP_SUBGROUP_SIZES:
                if (ret) {
@@ -1048,6 +1047,8 @@ static int r600_get_compute_param(struct pipe_screen 
*screen,
                        *max_variable_threads_per_block = 0;
                }
                return sizeof(uint64_t);
+        case PIPE_COMPUTE_CAP_MAX_SUBGROUPS:
+           return 0;
        }
 
         fprintf(stderr, "unknown PIPE_COMPUTE_CAP %d\n", param);

Reply via email to