From 1e4d91355fa9716de2432fe1f3ff93ce1de0cfd2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Ol=C5=A1=C3=A1k?= Date: Sun, 13 Jun 2021 21:12:22 -0400 Subject: [PATCH] radeonsi: compile si_state_draw.cpp for each gfx generation separately It makes compilating faster. Reviewed-by: Pierre-Eric Pelloux-Prayer Part-of: --- src/gallium/drivers/radeonsi/meson.build | 30 ++++++++++++----- src/gallium/drivers/radeonsi/si_pipe.c | 23 ++++++++++++- src/gallium/drivers/radeonsi/si_state.h | 7 +++- .../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@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(sctx); } -static void si_init_draw_vbo_all_families(struct si_context *sctx) -{ - si_init_draw_vbo_all_pipeline_options(sctx); - si_init_draw_vbo_all_pipeline_options(sctx); - si_init_draw_vbo_all_pipeline_options(sctx); - si_init_draw_vbo_all_pipeline_options(sctx); - si_init_draw_vbo_all_pipeline_options(sctx); - si_init_draw_vbo_all_pipeline_options(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(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).