radv: align the LDS size in calculate_tess_lds_size()
[mesa.git] / src / amd / vulkan / radv_llvm_helper.cpp
index d1e1e376f909150b4fc695f57984dfd0b3dcb863..612548e4219427151dcf736bcf1ff41d9df8c136 100644 (file)
 class radv_llvm_per_thread_info {
 public:
        radv_llvm_per_thread_info(enum radeon_family arg_family,
-                               enum ac_target_machine_options arg_tm_options)
-               : family(arg_family), tm_options(arg_tm_options), passes(NULL) {}
+                               enum ac_target_machine_options arg_tm_options,
+                               unsigned arg_wave_size)
+               : family(arg_family), tm_options(arg_tm_options),
+                 wave_size(arg_wave_size), passes(NULL), passes_wave32(NULL) {}
 
        ~radv_llvm_per_thread_info()
        {
-               ac_destroy_llvm_passes(passes);
                ac_destroy_llvm_compiler(&llvm_info);
        }
 
@@ -48,19 +49,28 @@ public:
                if (!passes)
                        return false;
 
+               if (llvm_info.tm_wave32) {
+                       passes_wave32 = ac_create_llvm_passes(llvm_info.tm_wave32);
+                       if (!passes_wave32)
+                               return false;
+               }
+
                return true;
        }
 
        bool compile_to_memory_buffer(LLVMModuleRef module,
-                                     struct ac_shader_binary *binary)
+                                     char **pelf_buffer, size_t *pelf_size)
        {
-               return ac_compile_module_to_binary(passes, module, binary);
+               struct ac_compiler_passes *p = wave_size == 32 ? passes_wave32 : passes;
+               return ac_compile_module_to_elf(p, module, pelf_buffer, pelf_size);
        }
 
        bool is_same(enum radeon_family arg_family,
-                    enum ac_target_machine_options arg_tm_options) {
+                    enum ac_target_machine_options arg_tm_options,
+                    unsigned arg_wave_size) {
                if (arg_family == family &&
-                   arg_tm_options == tm_options)
+                   arg_tm_options == tm_options &&
+                   arg_wave_size == wave_size)
                        return true;
                return false;
        }
@@ -68,15 +78,17 @@ public:
 private:
        enum radeon_family family;
        enum ac_target_machine_options tm_options;
+       unsigned wave_size;
        struct ac_compiler_passes *passes;
+       struct ac_compiler_passes *passes_wave32;
 };
 
 /* we have to store a linked list per thread due to the possiblity of multiple gpus being required */
 static thread_local std::list<radv_llvm_per_thread_info> radv_llvm_per_thread_list;
 
-bool radv_compile_to_binary(struct ac_llvm_compiler *info,
-                           LLVMModuleRef module,
-                           struct ac_shader_binary *binary)
+bool radv_compile_to_elf(struct ac_llvm_compiler *info,
+                       LLVMModuleRef module,
+                       char **pelf_buffer, size_t *pelf_size)
 {
        radv_llvm_per_thread_info *thread_info = nullptr;
 
@@ -89,28 +101,29 @@ bool radv_compile_to_binary(struct ac_llvm_compiler *info,
 
        if (!thread_info) {
                struct ac_compiler_passes *passes = ac_create_llvm_passes(info->tm);
-               bool ret = ac_compile_module_to_binary(passes, module, binary);
+               bool ret = ac_compile_module_to_elf(passes, module, pelf_buffer, pelf_size);
                ac_destroy_llvm_passes(passes);
                return ret;
        }
 
-       return thread_info->compile_to_memory_buffer(module, binary);
+       return thread_info->compile_to_memory_buffer(module, pelf_buffer, pelf_size);
 }
 
 bool radv_init_llvm_compiler(struct ac_llvm_compiler *info,
                             bool thread_compiler,
                             enum radeon_family family,
-                            enum ac_target_machine_options tm_options)
+                            enum ac_target_machine_options tm_options,
+                            unsigned wave_size)
 {
        if (thread_compiler) {
                for (auto &I : radv_llvm_per_thread_list) {
-                       if (I.is_same(family, tm_options)) {
+                       if (I.is_same(family, tm_options, wave_size)) {
                                *info = I.llvm_info;
                                return true;
                        }
                }
 
-               radv_llvm_per_thread_list.emplace_back(family, tm_options);
+               radv_llvm_per_thread_list.emplace_back(family, tm_options, wave_size);
                radv_llvm_per_thread_info &tinfo = radv_llvm_per_thread_list.back();
 
                if (!tinfo.init()) {