From c6264c2f374f8533bbec233c020b238a90a17cdc Mon Sep 17 00:00:00 2001 From: TellowKrinkle Date: Tue, 18 Mar 2025 22:36:55 -0500 Subject: [PATCH] GS:MTL: Avoid WC memory on Ryzen hackintoshes --- pcsx2/GS/Renderers/Metal/GSDeviceMTL.h | 1 + pcsx2/GS/Renderers/Metal/GSDeviceMTL.mm | 13 ++++++++++--- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/pcsx2/GS/Renderers/Metal/GSDeviceMTL.h b/pcsx2/GS/Renderers/Metal/GSDeviceMTL.h index 24dd039f6d..27b39357a8 100644 --- a/pcsx2/GS/Renderers/Metal/GSDeviceMTL.h +++ b/pcsx2/GS/Renderers/Metal/GSDeviceMTL.h @@ -219,6 +219,7 @@ public: MRCOwned> m_draw_sync_fence; MRCOwned m_fn_constants; MRCOwned m_hw_vertex; + MTLResourceOptions m_resource_options_shared_wc; // Previously in MetalHostDisplay. MRCOwned m_view; diff --git a/pcsx2/GS/Renderers/Metal/GSDeviceMTL.mm b/pcsx2/GS/Renderers/Metal/GSDeviceMTL.mm index ac5cb818d3..758e6889f4 100644 --- a/pcsx2/GS/Renderers/Metal/GSDeviceMTL.mm +++ b/pcsx2/GS/Renderers/Metal/GSDeviceMTL.mm @@ -10,6 +10,7 @@ #include "common/Console.h" #include "common/HostSys.h" +#include "cpuinfo.h" #include "imgui.h" #ifdef __APPLE__ @@ -90,6 +91,12 @@ GSDeviceMTL::GSDeviceMTL() , m_dev(nil) { m_backref->second = this; + m_resource_options_shared_wc = MTLResourceStorageModeShared | MTLResourceCPUCacheModeWriteCombined; +#ifdef _M_X86 + // WC memory doesn't work properly on AMD hackintoshes, and ends up being horribly slow even when only writing + if (cpuinfo_get_core(0)->vendor == cpuinfo_vendor_amd) + m_resource_options_shared_wc = MTLResourceStorageModeShared; +#endif } GSDeviceMTL::~GSDeviceMTL() @@ -107,7 +114,7 @@ GSDeviceMTL::Map GSDeviceMTL::Allocate(UploadBuffer& buffer, size_t amt) size_t newsize = std::max(buffer.usage.Size() * 2, 4096); while (newsize < amt) newsize *= 2; - MTLResourceOptions options = MTLResourceStorageModeShared | MTLResourceCPUCacheModeWriteCombined; + MTLResourceOptions options = m_resource_options_shared_wc; buffer.mtlbuffer = MRCTransfer([m_dev.dev newBufferWithLength:newsize options:options]); pxAssertRel(buffer.mtlbuffer, "Failed to allocate MTLBuffer (out of memory?)"); buffer.buffer = [buffer.mtlbuffer contents]; @@ -148,7 +155,7 @@ GSDeviceMTL::Map GSDeviceMTL::Allocate(BufferPair& buffer, size_t amt) size_t newsize = std::max(buffer.usage.Size() * 2, 4096); while (newsize < amt) newsize *= 2; - MTLResourceOptions options = MTLResourceStorageModeShared | MTLResourceCPUCacheModeWriteCombined; + MTLResourceOptions options = m_resource_options_shared_wc; buffer.cpubuffer = MRCTransfer([m_dev.dev newBufferWithLength:newsize options:options]); pxAssertRel(buffer.cpubuffer, "Failed to allocate MTLBuffer (out of memory?)"); buffer.buffer = [buffer.cpubuffer contents]; @@ -1277,7 +1284,7 @@ void GSDeviceMTL::UpdateTexture(id texture, u32 x, u32 y, u32 width, id cmdbuf = [m_queue commandBuffer]; id enc = [cmdbuf blitCommandEncoder]; size_t bytes = data_stride * height; - MRCOwned> buf = MRCTransfer([m_dev.dev newBufferWithLength:bytes options:MTLResourceStorageModeShared | MTLResourceCPUCacheModeWriteCombined]); + MRCOwned> buf = MRCTransfer([m_dev.dev newBufferWithLength:bytes options:m_resource_options_shared_wc]); memcpy([buf contents], data, bytes); [enc copyFromBuffer:buf sourceOffset:0