From fe716c242829c0ac1ed1d0e68bdf62b16ad6405c Mon Sep 17 00:00:00 2001 From: =?utf8?q?Daniel=20Sch=C3=BCrmann?= Date: Thu, 16 Mar 2023 22:18:26 +0100 Subject: [PATCH] radv: separate radv_postprocess_binary_config() from radv_shader_create() The goal is to make radv_shader_create() a function that creates a shader from a binary without any additional information. Postprocessing the config is only needed after compilation. Part-of: --- src/amd/vulkan/radv_pipeline_cache.c | 2 +- src/amd/vulkan/radv_shader.c | 113 ++++++++++++++++++----------------- src/amd/vulkan/radv_shader.h | 3 +- 3 files changed, 59 insertions(+), 59 deletions(-) diff --git a/src/amd/vulkan/radv_pipeline_cache.c b/src/amd/vulkan/radv_pipeline_cache.c index e4c58d4..9727b3f 100644 --- a/src/amd/vulkan/radv_pipeline_cache.c +++ b/src/amd/vulkan/radv_pipeline_cache.c @@ -374,7 +374,7 @@ radv_create_shaders_from_pipeline_cache(struct radv_device *device, memcpy(binary, p, entry->binary_sizes[i]); p += entry->binary_sizes[i]; - entry->shaders[i] = radv_shader_create(device, binary, false, true, NULL); + entry->shaders[i] = radv_shader_create(device, binary, false); free(binary); } else if (entry->binary_sizes[i]) { diff --git a/src/amd/vulkan/radv_shader.c b/src/amd/vulkan/radv_shader.c index 4d5a575..8a08e91 100644 --- a/src/amd/vulkan/radv_shader.c +++ b/src/amd/vulkan/radv_shader.c @@ -2141,6 +2141,48 @@ radv_open_rtld_binary(struct radv_device *device, const struct radv_shader_binar #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 = {0}; + + 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 + } else { + assert(binary->type == RADV_BINARY_TYPE_LEGACY); + config = ((struct radv_shader_binary_legacy *)binary)->base.config; + } + + radv_postprocess_config(device, &config, &binary->info, binary->stage, args, &binary->config); + return true; +} + +static bool radv_shader_binary_upload(struct radv_device *device, const struct radv_shader_binary *binary, struct radv_shader *shader, void *dest_ptr) { @@ -2350,65 +2392,17 @@ radv_shader_dma_submit(struct radv_device *device, struct radv_shader_dma_submis struct radv_shader * radv_shader_create(struct radv_device *device, const struct radv_shader_binary *binary, - bool keep_shader_info, bool from_cache, const struct radv_shader_args *args) + bool keep_shader_info) { - struct ac_shader_config config = {0}; struct radv_shader *shader = calloc(1, sizeof(struct radv_shader)); if (!shader) return NULL; shader->ref_count = 1; - - if (binary->type == RADV_BINARY_TYPE_RTLD) { -#if !defined(USE_LIBELF) - free(shader); - return NULL; -#else - struct ac_rtld_binary rtld_binary = {0}; - - if (!radv_open_rtld_binary(device, binary, &rtld_binary)) { - free(shader); - return NULL; - } - - if (!ac_rtld_read_config(&device->physical_device->rad_info, &rtld_binary, &config)) { - ac_rtld_close(&rtld_binary); - free(shader); - return NULL; - } - - 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); - - shader->code_size = rtld_binary.rx_size; - shader->exec_size = rtld_binary.exec_size; - ac_rtld_close(&rtld_binary); -#endif - } else { - assert(binary->type == RADV_BINARY_TYPE_LEGACY); - config = ((struct radv_shader_binary_legacy *)binary)->base.config; - shader->code_size = - radv_get_shader_binary_size(((struct radv_shader_binary_legacy *)binary)->code_size); - shader->exec_size = ((struct radv_shader_binary_legacy *)binary)->exec_size; - } - shader->info = binary->info; - if (from_cache) { - /* Copy the shader binary configuration from the cache. */ - memcpy(&shader->config, &binary->config, sizeof(shader->config)); - } else { - assert(args); - radv_postprocess_config(device, &config, &binary->info, binary->stage, args, &shader->config); - } + /* Copy the shader binary configuration. */ + memcpy(&shader->config, &binary->config, sizeof(shader->config)); if (binary->type == RADV_BINARY_TYPE_RTLD) { #if !defined(USE_LIBELF) @@ -2423,6 +2417,9 @@ radv_shader_create(struct radv_device *device, const struct radv_shader_binary * return NULL; } + shader->code_size = rtld_binary.rx_size; + shader->exec_size = rtld_binary.exec_size; + if (keep_shader_info || (device->instance->debug_flags & RADV_DEBUG_DUMP_SHADERS)) { const char *disasm_data; size_t disasm_size; @@ -2444,6 +2441,8 @@ radv_shader_create(struct radv_device *device, const struct radv_shader_binary * } else { struct radv_shader_binary_legacy *bin = (struct radv_shader_binary_legacy *)binary; + shader->code_size = radv_get_shader_binary_size(bin->code_size); + shader->exec_size = bin->exec_size; shader->ir_string = bin->ir_size ? strdup((const char *)(bin->data + bin->stats_size + bin->code_size)) : NULL; shader->disasm_string = @@ -2707,7 +2706,11 @@ shader_compile(struct radv_device *device, struct nir_shader *const *shaders, in binary->info = *info; - struct radv_shader *shader = radv_shader_create(device, binary, keep_shader_info, false, args); + if (!radv_postprocess_binary_config(device, binary, args)) { + free(binary); + return NULL; + } + struct radv_shader *shader = radv_shader_create(device, binary, keep_shader_info); if (!shader) { free(binary); return NULL; @@ -2725,9 +2728,6 @@ shader_compile(struct radv_device *device, struct nir_shader *const *shaders, in shader->nir_string = radv_dump_nir_shaders(shaders, shader_count); } - /* Copy the shader binary configuration to store it in the cache. */ - memcpy(&binary->config, &shader->config, sizeof(binary->config)); - *binary_out = binary; return shader; } @@ -2862,7 +2862,8 @@ radv_create_rt_prolog(struct radv_device *device) &radv_aco_build_shader_binary, (void **)&binary); binary->info = info; - prolog = radv_shader_create(device, binary, device->keep_shader_info, false, &in_args); + radv_postprocess_binary_config(device, binary, &in_args); + prolog = radv_shader_create(device, binary, device->keep_shader_info); if (!prolog) goto fail; diff --git a/src/amd/vulkan/radv_shader.h b/src/amd/vulkan/radv_shader.h index fd4128f..b3b2e5a 100644 --- a/src/amd/vulkan/radv_shader.h +++ b/src/amd/vulkan/radv_shader.h @@ -582,8 +582,7 @@ struct radv_shader_args; struct radv_shader *radv_shader_create(struct radv_device *device, const struct radv_shader_binary *binary, - bool keep_shader_info, bool from_cache, - const struct radv_shader_args *args); + bool keep_shader_info); struct radv_shader *radv_shader_nir_to_asm( struct radv_device *device, struct radv_pipeline_stage *stage, struct nir_shader *const *shaders, int shader_count, const struct radv_pipeline_key *key, bool keep_shader_info, bool keep_statistic_info, -- 2.7.4