diff --git a/src/Cafe/GameProfile/GameProfile.cpp b/src/Cafe/GameProfile/GameProfile.cpp index 49bac2ae..73a6e927 100644 --- a/src/Cafe/GameProfile/GameProfile.cpp +++ b/src/Cafe/GameProfile/GameProfile.cpp @@ -227,7 +227,7 @@ bool GameProfile::Load(uint64_t title_id) gameProfile_loadEnumOption(iniParser, "accurateShaderMul", m_accurateShaderMul); gameProfile_loadBooleanOption2(iniParser, "fastMath", m_fastMath); - gameProfile_loadEnumOption(iniParser, "bufferCacheMode", m_bufferCacheMode); + gameProfile_loadEnumOption(iniParser, "bufferCacheMode2", m_bufferCacheMode); gameProfile_loadEnumOption(iniParser, "positionInvariance2", m_positionInvariance); // legacy support @@ -295,25 +295,23 @@ void GameProfile::Save(uint64_t title_id) #define WRITE_OPTIONAL_ENTRY(__NAME) if (m_##__NAME) fs->writeLine(fmt::format("{} = {}", #__NAME, m_##__NAME.value()).c_str()); #define WRITE_ENTRY(__NAME) fs->writeLine(fmt::format("{} = {}", #__NAME, m_##__NAME).c_str()); +#define WRITE_ENTRY_NUMBERED(__NAME, __NUM) fs->writeLine(fmt::format("{} = {}", #__NAME #__NUM, m_##__NAME).c_str()); fs->writeLine("[General]"); WRITE_OPTIONAL_ENTRY(loadSharedLibraries); WRITE_ENTRY(startWithPadView); - fs->writeLine(""); - fs->writeLine("[CPU]"); WRITE_OPTIONAL_ENTRY(cpuMode); WRITE_ENTRY(threadQuantum); - fs->writeLine(""); fs->writeLine("[Graphics]"); WRITE_ENTRY(accurateShaderMul); WRITE_ENTRY(fastMath); - WRITE_ENTRY(bufferCacheMode); - WRITE_ENTRY(positionInvariance); + WRITE_ENTRY_NUMBERED(bufferCacheMode, 2); + WRITE_ENTRY_NUMBERED(positionInvariance, 2); WRITE_OPTIONAL_ENTRY(precompiledShaders); WRITE_OPTIONAL_ENTRY(graphics_api); fs->writeLine(""); @@ -344,7 +342,7 @@ void GameProfile::ResetOptional() // graphic settings m_accurateShaderMul = AccurateShaderMulOption::True; m_fastMath = true; - m_bufferCacheMode = BufferCacheMode::DevicePrivate; + m_bufferCacheMode = BufferCacheMode::Auto; m_positionInvariance = PositionInvariance::Auto; // cpu settings m_threadQuantum = kThreadQuantumDefault; @@ -367,7 +365,7 @@ void GameProfile::Reset() // graphic settings m_accurateShaderMul = AccurateShaderMulOption::True; m_fastMath = true; - m_bufferCacheMode = BufferCacheMode::DevicePrivate; + m_bufferCacheMode = BufferCacheMode::Auto; m_positionInvariance = PositionInvariance::Auto; m_precompiledShaders = PrecompiledShaderOption::Auto; // cpu settings diff --git a/src/Cafe/GameProfile/GameProfile.h b/src/Cafe/GameProfile/GameProfile.h index 9e40b378..58fd099b 100644 --- a/src/Cafe/GameProfile/GameProfile.h +++ b/src/Cafe/GameProfile/GameProfile.h @@ -58,7 +58,7 @@ private: std::optional m_graphics_api{}; AccurateShaderMulOption m_accurateShaderMul = AccurateShaderMulOption::True; bool m_fastMath = true; - BufferCacheMode m_bufferCacheMode = BufferCacheMode::DevicePrivate; + BufferCacheMode m_bufferCacheMode = BufferCacheMode::Auto; PositionInvariance m_positionInvariance = PositionInvariance::Auto; std::optional m_precompiledShaders{}; // cpu settings diff --git a/src/Cafe/HW/Latte/Renderer/Metal/MetalMemoryManager.cpp b/src/Cafe/HW/Latte/Renderer/Metal/MetalMemoryManager.cpp index 7b1dd53f..11afd892 100644 --- a/src/Cafe/HW/Latte/Renderer/Metal/MetalMemoryManager.cpp +++ b/src/Cafe/HW/Latte/Renderer/Metal/MetalMemoryManager.cpp @@ -2,9 +2,11 @@ #include "Cafe/HW/Latte/Renderer/Metal/MetalMemoryManager.h" #include "Cafe/HW/Latte/Renderer/Metal/MetalVoidVertexPipeline.h" +#include "CafeSystem.h" #include "Cemu/Logging/CemuLogging.h" #include "Common/precompiled.h" #include "HW/MMU/MMU.h" +#include "config/CemuConfig.h" MetalMemoryManager::~MetalMemoryManager() { @@ -36,6 +38,31 @@ void MetalMemoryManager::InitBufferCache(size_t size) m_bufferCacheMode = g_current_game_profile->GetBufferCacheMode(); + if (m_bufferCacheMode == BufferCacheMode::Auto) + { + // TODO: do this for all unified memory systems? + if (m_mtlr->IsAppleGPU()) + { + switch (CafeSystem::GetForegroundTitleId()) + { + // The Legend of Zelda: Wind Waker HD + case 0x0005000010143600: // EUR + case 0x0005000010143500: // USA + case 0x0005000010143400: // JPN + // TODO: use host instead? + m_bufferCacheMode = BufferCacheMode::DeviceShared; + break; + default: + m_bufferCacheMode = BufferCacheMode::DevicePrivate; + break; + } + } + else + { + m_bufferCacheMode = BufferCacheMode::DevicePrivate; + } + } + // First, try to import the host memory as a buffer if (m_bufferCacheMode == BufferCacheMode::Host) { diff --git a/src/Cafe/HW/Latte/Renderer/Metal/MetalRenderer.cpp b/src/Cafe/HW/Latte/Renderer/Metal/MetalRenderer.cpp index d91dd266..d2bd89b0 100644 --- a/src/Cafe/HW/Latte/Renderer/Metal/MetalRenderer.cpp +++ b/src/Cafe/HW/Latte/Renderer/Metal/MetalRenderer.cpp @@ -76,9 +76,9 @@ MetalRenderer::MetalRenderer() case 0x00050000101C9300: // JPN // Ninja Gaiden 3: Razor's Edge case 0x0005000010110B00: // EUR + case 0x0005000010139B00: // EUR (TODO: check) case 0x0005000010110A00: // USA case 0x0005000010110900: // JPN - case 0x0005000010139B00: // EUR (TODO: check) // Bayonetta 2 case 0x0005000010172700: // EUR case 0x0005000010172600: // USA diff --git a/src/config/CemuConfig.h b/src/config/CemuConfig.h index 6233b781..17f224ab 100644 --- a/src/config/CemuConfig.h +++ b/src/config/CemuConfig.h @@ -126,11 +126,12 @@ ENABLE_ENUM_ITERATORS(AccurateShaderMulOption, AccurateShaderMulOption::False, A enum class BufferCacheMode { + Auto, DevicePrivate, DeviceShared, Host, }; -ENABLE_ENUM_ITERATORS(BufferCacheMode, BufferCacheMode::DevicePrivate, BufferCacheMode::Host); +ENABLE_ENUM_ITERATORS(BufferCacheMode, BufferCacheMode::Auto, BufferCacheMode::Host); enum class PositionInvariance { @@ -244,6 +245,7 @@ struct fmt::formatter : formatter { string_view name; switch (c) { + case BufferCacheMode::Auto: name = "auto"; break; case BufferCacheMode::DevicePrivate: name = "device private"; break; case BufferCacheMode::DeviceShared: name = "device shared"; break; case BufferCacheMode::Host: name = "host"; break;