Merge pull request #11317 from Kelebek1/macro_dumps
Mark decompiled macros on dump, dump shaders after translation
This commit is contained in:
		| @@ -27,14 +27,24 @@ MICROPROFILE_DEFINE(MacroHLE, "GPU", "Execute macro HLE", MP_RGB(128, 192, 192)) | ||||
|  | ||||
| namespace Tegra { | ||||
|  | ||||
| static void Dump(u64 hash, std::span<const u32> code) { | ||||
| static void Dump(u64 hash, std::span<const u32> code, bool decompiled = false) { | ||||
|     const auto base_dir{Common::FS::GetYuzuPath(Common::FS::YuzuPath::DumpDir)}; | ||||
|     const auto macro_dir{base_dir / "macros"}; | ||||
|     if (!Common::FS::CreateDir(base_dir) || !Common::FS::CreateDir(macro_dir)) { | ||||
|         LOG_ERROR(Common_Filesystem, "Failed to create macro dump directories"); | ||||
|         return; | ||||
|     } | ||||
|     const auto name{macro_dir / fmt::format("{:016x}.macro", hash)}; | ||||
|     auto name{macro_dir / fmt::format("{:016x}.macro", hash)}; | ||||
|  | ||||
|     if (decompiled) { | ||||
|         auto new_name{macro_dir / fmt::format("decompiled_{:016x}.macro", hash)}; | ||||
|         if (Common::FS::Exists(name)) { | ||||
|             (void)Common::FS::RenameFile(name, new_name); | ||||
|             return; | ||||
|         } | ||||
|         name = new_name; | ||||
|     } | ||||
|  | ||||
|     std::fstream macro_file(name, std::ios::out | std::ios::binary); | ||||
|     if (!macro_file) { | ||||
|         LOG_ERROR(Common_Filesystem, "Unable to open or create file at {}", | ||||
| @@ -90,9 +100,6 @@ void MacroEngine::Execute(u32 method, const std::vector<u32>& parameters) { | ||||
|         if (!mid_method.has_value()) { | ||||
|             cache_info.lle_program = Compile(macro_code->second); | ||||
|             cache_info.hash = Common::HashValue(macro_code->second); | ||||
|             if (Settings::values.dump_macros) { | ||||
|                 Dump(cache_info.hash, macro_code->second); | ||||
|             } | ||||
|         } else { | ||||
|             const auto& macro_cached = uploaded_macro_code[mid_method.value()]; | ||||
|             const auto rebased_method = method - mid_method.value(); | ||||
| @@ -102,9 +109,6 @@ void MacroEngine::Execute(u32 method, const std::vector<u32>& parameters) { | ||||
|                         code.size() * sizeof(u32)); | ||||
|             cache_info.hash = Common::HashValue(code); | ||||
|             cache_info.lle_program = Compile(code); | ||||
|             if (Settings::values.dump_macros) { | ||||
|                 Dump(cache_info.hash, code); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         auto hle_program = hle_macros->GetHLEProgram(cache_info.hash); | ||||
| @@ -117,6 +121,10 @@ void MacroEngine::Execute(u32 method, const std::vector<u32>& parameters) { | ||||
|             MICROPROFILE_SCOPE(MacroHLE); | ||||
|             cache_info.hle_program->Execute(parameters, method); | ||||
|         } | ||||
|  | ||||
|         if (Settings::values.dump_macros) { | ||||
|             Dump(cache_info.hash, macro_code->second, cache_info.has_hle_program); | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -611,9 +611,6 @@ std::unique_ptr<GraphicsPipeline> PipelineCache::CreateGraphicsPipeline( | ||||
|  | ||||
|         const u32 cfg_offset{static_cast<u32>(env.StartAddress() + sizeof(Shader::ProgramHeader))}; | ||||
|         Shader::Maxwell::Flow::CFG cfg(env, pools.flow_block, cfg_offset, index == 0); | ||||
|         if (Settings::values.dump_shaders) { | ||||
|             env.Dump(hash, key.unique_hashes[index]); | ||||
|         } | ||||
|         if (!uses_vertex_a || index != 1) { | ||||
|             // Normal path | ||||
|             programs[index] = TranslateProgram(pools.inst, pools.block, env, cfg, host_info); | ||||
| @@ -624,6 +621,10 @@ std::unique_ptr<GraphicsPipeline> PipelineCache::CreateGraphicsPipeline( | ||||
|             programs[index] = MergeDualVertexPrograms(program_va, program_vb, env); | ||||
|         } | ||||
|  | ||||
|         if (Settings::values.dump_shaders) { | ||||
|             env.Dump(hash, key.unique_hashes[index]); | ||||
|         } | ||||
|  | ||||
|         if (programs[index].info.requires_layer_emulation) { | ||||
|             layer_source_program = &programs[index]; | ||||
|         } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user