Mesa (main): aco: refactor the radv binary builder out of the core aco fn.

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Fri Jul 1 02:04:38 UTC 2022


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

Author: Dave Airlie <airlied at redhat.com>
Date:   Wed May 11 14:10:55 2022 +1000

aco: refactor the radv binary builder out of the core aco fn.

Reviewed-by: Daniel Schürmann <daniel at schuermann.dev>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/16445>

---

 src/amd/compiler/aco_interface.cpp | 113 +++++++++++++++++++++++--------------
 1 file changed, 71 insertions(+), 42 deletions(-)

diff --git a/src/amd/compiler/aco_interface.cpp b/src/amd/compiler/aco_interface.cpp
index 5c77131d4dd..efb97664cdc 100644
--- a/src/amd/compiler/aco_interface.cpp
+++ b/src/amd/compiler/aco_interface.cpp
@@ -113,6 +113,63 @@ get_disasm_string(aco::Program* program, std::vector<uint32_t>& code,
    return disasm;
 }
 
+static void
+aco_build_radv_shader_binary(struct radv_shader_binary **binary,
+                             gl_shader_stage stage,
+                             bool is_gs_copy_shader,
+                             const ac_shader_config *config,
+                             const char *llvm_ir_str,
+                             unsigned llvm_ir_size,
+                             const char *disasm_str,
+                             unsigned disasm_size,
+                             uint32_t *statistics,
+                             uint32_t stats_size,
+                             uint32_t exec_size,
+                             const uint32_t *code,
+                             uint32_t code_dw)
+{
+   size_t size = llvm_ir_size;
+
+   size += disasm_size;
+   size += stats_size;
+
+   size += code_dw * sizeof(uint32_t) + sizeof(radv_shader_binary_legacy);
+
+   /* We need to calloc to prevent unintialized data because this will be used
+    * directly for the disk cache. Uninitialized data can appear because of
+    * padding in the struct or because legacy_binary->data can be at an offset
+    * from the start less than sizeof(radv_shader_binary_legacy). */
+   radv_shader_binary_legacy *legacy_binary = (radv_shader_binary_legacy *)calloc(size, 1);
+   legacy_binary->base.type = RADV_BINARY_TYPE_LEGACY;
+   legacy_binary->base.stage = stage;
+   legacy_binary->base.is_gs_copy_shader = is_gs_copy_shader;
+   legacy_binary->base.total_size = size;
+   legacy_binary->base.config = *config;
+
+   if (stats_size)
+      memcpy(legacy_binary->data, statistics, stats_size);
+   legacy_binary->stats_size = stats_size;
+
+   memcpy(legacy_binary->data + legacy_binary->stats_size, code,
+          code_dw * sizeof(uint32_t));
+   legacy_binary->exec_size = exec_size;
+   legacy_binary->code_size = code_dw * sizeof(uint32_t);
+
+   legacy_binary->disasm_size = 0;
+   legacy_binary->ir_size = llvm_ir_size;
+
+   memcpy((char*)legacy_binary->data + legacy_binary->stats_size + legacy_binary->code_size,
+          llvm_ir_str, llvm_ir_size);
+
+   legacy_binary->disasm_size = disasm_size;
+   if (disasm_size) {
+      memcpy((char*)legacy_binary->data + legacy_binary->stats_size +
+             legacy_binary->code_size + llvm_ir_size, disasm_str,
+             disasm_size);
+   }
+   *binary = (radv_shader_binary*)legacy_binary;
+}
+
 void
 aco_compile_shader(const struct aco_compiler_options* options,
                    const struct aco_shader_info* info,
@@ -237,55 +294,27 @@ aco_compile_shader(const struct aco_compiler_options* options,
 
    bool get_disasm = options->dump_shader || options->record_ir;
 
-   size_t size = llvm_ir.size();
-
    std::string disasm;
-   if (get_disasm) {
+   if (get_disasm)
       disasm = get_disasm_string(program.get(), code, exec_size);
-      size += disasm.size();
-   }
 
    size_t stats_size = 0;
    if (program->collect_statistics)
       stats_size = aco::num_statistics * sizeof(uint32_t);
-   size += stats_size;
-
-   size += code.size() * sizeof(uint32_t) + sizeof(radv_shader_binary_legacy);
-   /* We need to calloc to prevent unintialized data because this will be used
-    * directly for the disk cache. Uninitialized data can appear because of
-    * padding in the struct or because legacy_binary->data can be at an offset
-    * from the start less than sizeof(radv_shader_binary_legacy). */
-   radv_shader_binary_legacy* legacy_binary = (radv_shader_binary_legacy*)calloc(size, 1);
-
-   legacy_binary->base.type = RADV_BINARY_TYPE_LEGACY;
-   legacy_binary->base.stage = shaders[shader_count - 1]->info.stage;
-   legacy_binary->base.is_gs_copy_shader = args->is_gs_copy_shader;
-   legacy_binary->base.total_size = size;
 
-   if (program->collect_statistics)
-      memcpy(legacy_binary->data, program->statistics, aco::num_statistics * sizeof(uint32_t));
-   legacy_binary->stats_size = stats_size;
-
-   memcpy(legacy_binary->data + legacy_binary->stats_size, code.data(),
-          code.size() * sizeof(uint32_t));
-   legacy_binary->exec_size = exec_size;
-   legacy_binary->code_size = code.size() * sizeof(uint32_t);
-
-   legacy_binary->base.config = config;
-   legacy_binary->disasm_size = 0;
-   legacy_binary->ir_size = llvm_ir.size();
-
-   llvm_ir.copy((char*)legacy_binary->data + legacy_binary->stats_size + legacy_binary->code_size,
-                llvm_ir.size());
-
-   if (get_disasm) {
-      disasm.copy((char*)legacy_binary->data + legacy_binary->stats_size +
-                     legacy_binary->code_size + llvm_ir.size(),
-                  disasm.size());
-      legacy_binary->disasm_size = disasm.size();
-   }
-
-   *binary = (radv_shader_binary*)legacy_binary;
+   aco_build_radv_shader_binary(binary,
+                                shaders[shader_count - 1]->info.stage,
+                                args->is_gs_copy_shader,
+                                &config,
+                                llvm_ir.c_str(),
+                                llvm_ir.size(),
+                                disasm.c_str(),
+                                disasm.size(),
+                                program->statistics,
+                                stats_size,
+                                exec_size,
+                                code.data(),
+                                code.size());
 }
 
 void



More information about the mesa-commit mailing list