Mesa (main): radeonsi: compile si_state_draw.cpp for each gfx generation separately

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Wed Jun 16 21:44:44 UTC 2021


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

Author: Marek Olšák <marek.olsak at amd.com>
Date:   Sun Jun 13 21:12:22 2021 -0400

radeonsi: compile si_state_draw.cpp for each gfx generation separately

It makes compilating faster.

Reviewed-by: Pierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer at amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/11384>

---

 src/gallium/drivers/radeonsi/meson.build       | 30 +++++++++++++++++-------
 src/gallium/drivers/radeonsi/si_pipe.c         | 23 +++++++++++++++++-
 src/gallium/drivers/radeonsi/si_state.h        |  7 +++++-
 src/gallium/drivers/radeonsi/si_state_draw.cpp | 32 ++++++++++++++++----------
 4 files changed, 70 insertions(+), 22 deletions(-)

diff --git a/src/gallium/drivers/radeonsi/meson.build b/src/gallium/drivers/radeonsi/meson.build
index e8e30faa0dd..49b97f41ec5 100644
--- a/src/gallium/drivers/radeonsi/meson.build
+++ b/src/gallium/drivers/radeonsi/meson.build
@@ -63,7 +63,6 @@ files_libradeonsi = files(
   'si_state.c',
   'si_state.h',
   'si_state_binning.c',
-  'si_state_draw.cpp',
   'si_state_msaa.c',
   'si_state_shaders.c',
   'si_state_streamout.c',
@@ -96,21 +95,36 @@ files_libradeonsi = files(
   '../radeon/radeon_winsys.h',
 )
 
+radeonsi_include_dirs = [inc_src, inc_include, inc_gallium, inc_gallium_aux, inc_amd_common,
+                         inc_amd_common_llvm, inc_gallium_drivers]
+radeonsi_c_args = ['-Wstrict-overflow=0']
+radeonsi_deps = [dep_llvm, dep_clock, dep_libdrm_radeon, idep_nir_headers, idep_amdgfxregs_h, idep_mesautil]
+
+radeonsi_gfx_libs = []
+foreach ver : ['6', '7', '8', '9', '10', '103']
+  radeonsi_gfx_libs += static_library(
+    'radeonsi_gfx at 0@'.format(ver),
+    ['si_state_draw.cpp'],
+    include_directories : radeonsi_include_dirs,
+    c_args : radeonsi_c_args,
+    cpp_args : ['-DGFX_VER=@0@'.format(ver)],
+    gnu_symbol_visibility : 'hidden',
+    dependencies : radeonsi_deps,
+  )
+endforeach
+
 libradeonsi = static_library(
   'radeonsi',
   [files_libradeonsi, sid_tables_h],
-  include_directories : [
-    inc_src, inc_include, inc_gallium, inc_gallium_aux, inc_amd_common, inc_amd_common_llvm,
-    inc_gallium_drivers,
-  ],
-  c_args : ['-Wstrict-overflow=0'],
+  include_directories : radeonsi_include_dirs,
+  c_args : radeonsi_c_args,
   gnu_symbol_visibility : 'hidden',
-  dependencies : [dep_llvm, dep_clock, dep_libdrm_radeon, idep_nir_headers, idep_amdgfxregs_h, idep_mesautil],
+  dependencies : radeonsi_deps,
 )
 
 driver_radeonsi = declare_dependency(
   compile_args : '-DGALLIUM_RADEONSI',
-  link_with : [
+  link_with : radeonsi_gfx_libs + [
     libradeonsi, libradeonwinsys, libamdgpuwinsys, libamd_common, libamd_common_llvm, libgalliumvl
   ],
   dependencies : idep_nir,
diff --git a/src/gallium/drivers/radeonsi/si_pipe.c b/src/gallium/drivers/radeonsi/si_pipe.c
index 3967ffea7ec..f34e7e741a4 100644
--- a/src/gallium/drivers/radeonsi/si_pipe.c
+++ b/src/gallium/drivers/radeonsi/si_pipe.c
@@ -592,7 +592,28 @@ static struct pipe_context *si_create_context(struct pipe_screen *screen, unsign
       sctx->discard_rasterizer_state = util_blitter_get_discard_rasterizer_state(sctx->blitter);
       sctx->queued.named.rasterizer = sctx->discard_rasterizer_state;
 
-      si_init_draw_functions(sctx);
+      switch (sctx->chip_class) {
+      case GFX6:
+         si_init_draw_functions_GFX6(sctx);
+         break;
+      case GFX7:
+         si_init_draw_functions_GFX7(sctx);
+         break;
+      case GFX8:
+         si_init_draw_functions_GFX8(sctx);
+         break;
+      case GFX9:
+         si_init_draw_functions_GFX9(sctx);
+         break;
+      case GFX10:
+         si_init_draw_functions_GFX10(sctx);
+         break;
+      case GFX10_3:
+         si_init_draw_functions_GFX10_3(sctx);
+         break;
+      default:
+         unreachable("unhandled chip class");
+      }
 
       si_initialize_prim_discard_tunables(sscreen, flags & SI_CONTEXT_FLAG_AUX,
                                           &sctx->prim_discard_vertex_count_threshold,
diff --git a/src/gallium/drivers/radeonsi/si_state.h b/src/gallium/drivers/radeonsi/si_state.h
index 14bffbb02c8..f9d4e6713ea 100644
--- a/src/gallium/drivers/radeonsi/si_state.h
+++ b/src/gallium/drivers/radeonsi/si_state.h
@@ -589,7 +589,12 @@ unsigned si_get_input_prim(const struct si_shader_selector *gs);
 bool si_update_ngg(struct si_context *sctx);
 
 /* si_state_draw.c */
-void si_init_draw_functions(struct si_context *sctx);
+void si_init_draw_functions_GFX6(struct si_context *sctx);
+void si_init_draw_functions_GFX7(struct si_context *sctx);
+void si_init_draw_functions_GFX8(struct si_context *sctx);
+void si_init_draw_functions_GFX9(struct si_context *sctx);
+void si_init_draw_functions_GFX10(struct si_context *sctx);
+void si_init_draw_functions_GFX10_3(struct si_context *sctx);
 
 /* si_state_msaa.c */
 void si_init_msaa_functions(struct si_context *sctx);
diff --git a/src/gallium/drivers/radeonsi/si_state_draw.cpp b/src/gallium/drivers/radeonsi/si_state_draw.cpp
index 83489e726d0..f7a286db54c 100644
--- a/src/gallium/drivers/radeonsi/si_state_draw.cpp
+++ b/src/gallium/drivers/radeonsi/si_state_draw.cpp
@@ -28,6 +28,22 @@
 #include "util/u_prim.h"
 #include "util/u_upload_mgr.h"
 
+#if (GFX_VER == 6)
+#define GFX(name) name##GFX6
+#elif (GFX_VER == 7)
+#define GFX(name) name##GFX7
+#elif (GFX_VER == 8)
+#define GFX(name) name##GFX8
+#elif (GFX_VER == 9)
+#define GFX(name) name##GFX9
+#elif (GFX_VER == 10)
+#define GFX(name) name##GFX10
+#elif (GFX_VER == 103)
+#define GFX(name) name##GFX10_3
+#else
+#error "Unknown gfx version"
+#endif
+
 /* special primitive types */
 #define SI_PRIM_RECTANGLE_LIST PIPE_PRIM_MAX
 
@@ -2327,16 +2343,6 @@ static void si_init_draw_vbo_all_pipeline_options(struct si_context *sctx)
    si_init_draw_vbo_all_internal_options<GFX_VERSION, TESS_ON, GS_ON>(sctx);
 }
 
-static void si_init_draw_vbo_all_families(struct si_context *sctx)
-{
-   si_init_draw_vbo_all_pipeline_options<GFX6>(sctx);
-   si_init_draw_vbo_all_pipeline_options<GFX7>(sctx);
-   si_init_draw_vbo_all_pipeline_options<GFX8>(sctx);
-   si_init_draw_vbo_all_pipeline_options<GFX9>(sctx);
-   si_init_draw_vbo_all_pipeline_options<GFX10>(sctx);
-   si_init_draw_vbo_all_pipeline_options<GFX10_3>(sctx);
-}
-
 static void si_invalid_draw_vbo(struct pipe_context *pipe,
                                 const struct pipe_draw_info *info,
                                 unsigned drawid_offset,
@@ -2348,9 +2354,11 @@ static void si_invalid_draw_vbo(struct pipe_context *pipe,
 }
 
 extern "C"
-void si_init_draw_functions(struct si_context *sctx)
+void GFX(si_init_draw_functions_)(struct si_context *sctx)
 {
-   si_init_draw_vbo_all_families(sctx);
+   assert(sctx->chip_class == GFX());
+
+   si_init_draw_vbo_all_pipeline_options<GFX()>(sctx);
 
    /* Bind a fake draw_vbo, so that draw_vbo isn't NULL, which would skip
     * initialization of callbacks in upper layers (such as u_threaded_context).



More information about the mesa-commit mailing list