mirror of
				https://git.tardis.systems/mirrors/yuzu
				synced 2025-10-31 10:44:49 +01:00 
			
		
		
		
	Merge pull request #8320 from liamwhite/macro-dump
video_core/macro: Add option to dump macros
This commit is contained in:
		
						commit
						2123594ce2
					
				| @ -606,6 +606,7 @@ struct Values { | ||||
|     BasicSetting<bool> dump_exefs{false, "dump_exefs"}; | ||||
|     BasicSetting<bool> dump_nso{false, "dump_nso"}; | ||||
|     BasicSetting<bool> dump_shaders{false, "dump_shaders"}; | ||||
|     BasicSetting<bool> dump_macros{false, "dump_macros"}; | ||||
|     BasicSetting<bool> enable_fs_access_log{false, "enable_fs_access_log"}; | ||||
|     BasicSetting<bool> reporting_services{false, "reporting_services"}; | ||||
|     BasicSetting<bool> quest_flag{false, "quest_flag"}; | ||||
|  | ||||
| @ -2,11 +2,15 @@ | ||||
| // SPDX-License-Identifier: GPL-2.0-or-later
 | ||||
| 
 | ||||
| #include <cstring> | ||||
| #include <fstream> | ||||
| #include <optional> | ||||
| #include <span> | ||||
| 
 | ||||
| #include <boost/container_hash/hash.hpp> | ||||
| 
 | ||||
| #include "common/assert.h" | ||||
| #include "common/fs/fs.h" | ||||
| #include "common/fs/path_util.h" | ||||
| #include "common/settings.h" | ||||
| #include "video_core/macro/macro.h" | ||||
| #include "video_core/macro/macro_hle.h" | ||||
| @ -15,6 +19,23 @@ | ||||
| 
 | ||||
| namespace Tegra { | ||||
| 
 | ||||
| static void Dump(u64 hash, std::span<const u32> code) { | ||||
|     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)}; | ||||
|     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 {}", | ||||
|                   Common::FS::PathToUTF8String(name)); | ||||
|         return; | ||||
|     } | ||||
|     macro_file.write(reinterpret_cast<const char*>(code.data()), code.size_bytes()); | ||||
| } | ||||
| 
 | ||||
| MacroEngine::MacroEngine(Engines::Maxwell3D& maxwell3d) | ||||
|     : hle_macros{std::make_unique<Tegra::HLEMacro>(maxwell3d)} {} | ||||
| 
 | ||||
| @ -54,6 +75,9 @@ 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 = boost::hash_value(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(); | ||||
| @ -63,6 +87,9 @@ void MacroEngine::Execute(u32 method, const std::vector<u32>& parameters) { | ||||
|                         code.size() * sizeof(u32)); | ||||
|             cache_info.hash = boost::hash_value(code); | ||||
|             cache_info.lle_program = Compile(code); | ||||
|             if (Settings::values.dump_macros) { | ||||
|                 Dump(cache_info.hash, code); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         if (auto hle_program = hle_macros->GetHLEProgram(cache_info.hash)) { | ||||
|  | ||||
| @ -53,6 +53,8 @@ void ConfigureDebug::SetConfiguration() { | ||||
|     ui->enable_nsight_aftermath->setChecked(Settings::values.enable_nsight_aftermath.GetValue()); | ||||
|     ui->dump_shaders->setEnabled(runtime_lock); | ||||
|     ui->dump_shaders->setChecked(Settings::values.dump_shaders.GetValue()); | ||||
|     ui->dump_macros->setEnabled(runtime_lock); | ||||
|     ui->dump_macros->setChecked(Settings::values.dump_macros.GetValue()); | ||||
|     ui->disable_macro_jit->setEnabled(runtime_lock); | ||||
|     ui->disable_macro_jit->setChecked(Settings::values.disable_macro_jit.GetValue()); | ||||
|     ui->disable_loop_safety_checks->setEnabled(runtime_lock); | ||||
| @ -83,6 +85,7 @@ void ConfigureDebug::ApplyConfiguration() { | ||||
|     Settings::values.cpu_debug_mode = ui->enable_cpu_debugging->isChecked(); | ||||
|     Settings::values.enable_nsight_aftermath = ui->enable_nsight_aftermath->isChecked(); | ||||
|     Settings::values.dump_shaders = ui->dump_shaders->isChecked(); | ||||
|     Settings::values.dump_macros = ui->dump_macros->isChecked(); | ||||
|     Settings::values.disable_shader_loop_safety_checks = | ||||
|         ui->disable_loop_safety_checks->isChecked(); | ||||
|     Settings::values.disable_macro_jit = ui->disable_macro_jit->isChecked(); | ||||
|  | ||||
| @ -118,6 +118,19 @@ | ||||
|         </property> | ||||
|        </widget> | ||||
|       </item> | ||||
|       <item row="0" column="2"> | ||||
|        <widget class="QCheckBox" name="dump_macros"> | ||||
|         <property name="enabled"> | ||||
|          <bool>true</bool> | ||||
|         </property> | ||||
|         <property name="toolTip"> | ||||
|          <string>When checked, it will dump all the macro programs of the GPU</string> | ||||
|         </property> | ||||
|         <property name="text"> | ||||
|          <string>Dump Maxwell Macros</string> | ||||
|         </property> | ||||
|        </widget> | ||||
|       </item> | ||||
|       <item row="0" column="1"> | ||||
|        <widget class="QCheckBox" name="disable_macro_jit"> | ||||
|         <property name="enabled"> | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user