From 43ad3d39175943813fbcb01a4e5e385fd7051fbb Mon Sep 17 00:00:00 2001 From: =?utf8?q?Daniel=20Sch=C3=BCrmann?= Date: Thu, 16 Mar 2023 22:28:56 +0100 Subject: [PATCH] radv: inline radv_postprocess_config() Part-of: --- src/amd/vulkan/radv_shader.c | 167 +++++++++++++++++++++---------------------- 1 file changed, 81 insertions(+), 86 deletions(-) diff --git a/src/amd/vulkan/radv_shader.c b/src/amd/vulkan/radv_shader.c index c904674..7e833fc 100644 --- a/src/amd/vulkan/radv_shader.c +++ b/src/amd/vulkan/radv_shader.c @@ -1820,11 +1820,88 @@ radv_should_use_wgp_mode(const struct radv_device *device, gl_shader_stage stage } } -static void -radv_postprocess_config(const struct radv_device *device, struct ac_shader_config *config, - const struct radv_shader_info *info, gl_shader_stage stage, - const struct radv_shader_args *args) +#if defined(USE_LIBELF) +static bool +radv_open_rtld_binary(struct radv_device *device, const struct radv_shader_binary *binary, + struct ac_rtld_binary *rtld_binary) { + const char *elf_data = (const char *)((struct radv_shader_binary_rtld *)binary)->data; + size_t elf_size = ((struct radv_shader_binary_rtld *)binary)->elf_size; + struct ac_rtld_symbol lds_symbols[3]; + unsigned num_lds_symbols = 0; + + if (device->physical_device->rad_info.gfx_level >= GFX9 && + (binary->stage == MESA_SHADER_GEOMETRY || binary->info.is_ngg)) { + struct ac_rtld_symbol *sym = &lds_symbols[num_lds_symbols++]; + sym->name = "esgs_ring"; + sym->size = binary->info.ngg_info.esgs_ring_size; + sym->align = 64 * 1024; + } + + if (binary->info.is_ngg && binary->stage == MESA_SHADER_GEOMETRY) { + struct ac_rtld_symbol *sym = &lds_symbols[num_lds_symbols++]; + sym->name = "ngg_emit"; + sym->size = binary->info.ngg_info.ngg_emit_size * 4; + sym->align = 4; + + sym = &lds_symbols[num_lds_symbols++]; + sym->name = "ngg_scratch"; + sym->size = 8; + sym->align = 4; + } + + struct ac_rtld_open_info open_info = { + .info = &device->physical_device->rad_info, + .shader_type = binary->stage, + .wave_size = binary->info.wave_size, + .num_parts = 1, + .elf_ptrs = &elf_data, + .elf_sizes = &elf_size, + .num_shared_lds_symbols = num_lds_symbols, + .shared_lds_symbols = lds_symbols, + }; + + return ac_rtld_open(rtld_binary, open_info); +} +#endif + +static bool +radv_postprocess_binary_config(struct radv_device *device, struct radv_shader_binary *binary, + const struct radv_shader_args *args) +{ + struct ac_shader_config *config = &binary->config; + + if (binary->type == RADV_BINARY_TYPE_RTLD) { +#if !defined(USE_LIBELF) + return false; +#else + struct ac_rtld_binary rtld_binary = {0}; + + if (!radv_open_rtld_binary(device, binary, &rtld_binary)) { + return false; + } + + if (!ac_rtld_read_config(&device->physical_device->rad_info, &rtld_binary, config)) { + ac_rtld_close(&rtld_binary); + return false; + } + + if (rtld_binary.lds_size > 0) { + unsigned encode_granularity = device->physical_device->rad_info.lds_encode_granularity; + config->lds_size = DIV_ROUND_UP(rtld_binary.lds_size, encode_granularity); + } + if (!config->lds_size && binary->stage == MESA_SHADER_TESS_CTRL) { + /* This is used for reporting LDS statistics */ + config->lds_size = binary->info.tcs.num_lds_blocks; + } + + assert(!binary->info.has_ngg_culling || config->lds_size); + ac_rtld_close(&rtld_binary); +#endif + } + + const struct radv_shader_info *info = &binary->info; + gl_shader_stage stage = binary->stage; const struct radv_physical_device *pdevice = device->physical_device; bool scratch_enabled = config->scratch_bytes_per_wave > 0 || info->cs.is_rt_shader; bool trap_enabled = !!device->trap_handler_shader; @@ -2085,89 +2162,7 @@ radv_postprocess_config(const struct radv_device *device, struct ac_shader_confi } else { config->rsrc1 |= S_00B128_VGPR_COMP_CNT(vgpr_comp_cnt); } -} - -#if defined(USE_LIBELF) -static bool -radv_open_rtld_binary(struct radv_device *device, const struct radv_shader_binary *binary, - struct ac_rtld_binary *rtld_binary) -{ - const char *elf_data = (const char *)((struct radv_shader_binary_rtld *)binary)->data; - size_t elf_size = ((struct radv_shader_binary_rtld *)binary)->elf_size; - struct ac_rtld_symbol lds_symbols[3]; - unsigned num_lds_symbols = 0; - - if (device->physical_device->rad_info.gfx_level >= GFX9 && - (binary->stage == MESA_SHADER_GEOMETRY || binary->info.is_ngg)) { - struct ac_rtld_symbol *sym = &lds_symbols[num_lds_symbols++]; - sym->name = "esgs_ring"; - sym->size = binary->info.ngg_info.esgs_ring_size; - sym->align = 64 * 1024; - } - - if (binary->info.is_ngg && binary->stage == MESA_SHADER_GEOMETRY) { - struct ac_rtld_symbol *sym = &lds_symbols[num_lds_symbols++]; - sym->name = "ngg_emit"; - sym->size = binary->info.ngg_info.ngg_emit_size * 4; - sym->align = 4; - - sym = &lds_symbols[num_lds_symbols++]; - sym->name = "ngg_scratch"; - sym->size = 8; - sym->align = 4; - } - - struct ac_rtld_open_info open_info = { - .info = &device->physical_device->rad_info, - .shader_type = binary->stage, - .wave_size = binary->info.wave_size, - .num_parts = 1, - .elf_ptrs = &elf_data, - .elf_sizes = &elf_size, - .num_shared_lds_symbols = num_lds_symbols, - .shared_lds_symbols = lds_symbols, - }; - - return ac_rtld_open(rtld_binary, open_info); -} -#endif - -static bool -radv_postprocess_binary_config(struct radv_device *device, struct radv_shader_binary *binary, - const struct radv_shader_args *args) -{ - struct ac_shader_config *config = &binary->config; - - if (binary->type == RADV_BINARY_TYPE_RTLD) { -#if !defined(USE_LIBELF) - return false; -#else - struct ac_rtld_binary rtld_binary = {0}; - - if (!radv_open_rtld_binary(device, binary, &rtld_binary)) { - return false; - } - - if (!ac_rtld_read_config(&device->physical_device->rad_info, &rtld_binary, config)) { - ac_rtld_close(&rtld_binary); - return false; - } - - if (rtld_binary.lds_size > 0) { - unsigned encode_granularity = device->physical_device->rad_info.lds_encode_granularity; - config->lds_size = DIV_ROUND_UP(rtld_binary.lds_size, encode_granularity); - } - if (!config->lds_size && binary->stage == MESA_SHADER_TESS_CTRL) { - /* This is used for reporting LDS statistics */ - config->lds_size = binary->info.tcs.num_lds_blocks; - } - - assert(!binary->info.has_ngg_culling || config->lds_size); - ac_rtld_close(&rtld_binary); -#endif - } - radv_postprocess_config(device, config, &binary->info, binary->stage, args); return true; } -- 2.7.4