From c0628a64a6094e197ecfc354895593abb91b3823 Mon Sep 17 00:00:00 2001 From: TellowKrinkle Date: Fri, 19 Nov 2021 00:25:51 -0600 Subject: [PATCH] GS: Add Metal renderer to settings --- pcsx2/Config.h | 1 + pcsx2/GS/GS.cpp | 14 +++++++++++++- pcsx2/GS/GSUtil.cpp | 3 +++ pcsx2/GS/Window/GSwxDialog.cpp | 8 +++++++- pcsx2/HostDisplay.cpp | 4 ++++ pcsx2/Pcsx2Config.cpp | 3 ++- pcsx2/gui/Dialogs/GSDumpDialog.cpp | 15 ++++++++++----- 7 files changed, 40 insertions(+), 8 deletions(-) diff --git a/pcsx2/Config.h b/pcsx2/Config.h index a37d02ec7d..87eb330976 100644 --- a/pcsx2/Config.h +++ b/pcsx2/Config.h @@ -121,6 +121,7 @@ enum class GSRendererType : s8 OGL = 12, SW = 13, VK = 14, + Metal = 17, }; enum class GSInterlaceMode : u8 diff --git a/pcsx2/GS/GS.cpp b/pcsx2/GS/GS.cpp index ef3491effd..6b4de7c171 100644 --- a/pcsx2/GS/GS.cpp +++ b/pcsx2/GS/GS.cpp @@ -26,6 +26,7 @@ #include "Renderers/Null/GSRendererNull.h" #include "Renderers/Null/GSDeviceNull.h" #include "Renderers/OpenGL/GSDeviceOGL.h" +#include "Renderers/Metal/GSMetalCPPAccessible.h" #include "Renderers/HW/GSRendererNew.h" #include "Renderers/HW/GSTextureReplacements.h" #include "GSLzma.h" @@ -166,6 +167,10 @@ static HostDisplay::RenderAPI GetAPIForRenderer(GSRendererType renderer) case GSRendererType::VK: return HostDisplay::RenderAPI::Vulkan; +#ifdef __APPLE__ + case GSRendererType::Metal: + return HostDisplay::RenderAPI::Metal; +#endif #ifdef _WIN32 case GSRendererType::DX11: case GSRendererType::SW: @@ -189,7 +194,11 @@ static bool DoGSOpen(GSRendererType renderer, u8* basemem) g_gs_device = std::make_unique(); break; #endif - +#ifdef __APPLE__ + case HostDisplay::RenderAPI::Metal: + g_gs_device = std::unique_ptr(MakeGSDeviceMTL()); + break; +#endif case HostDisplay::RenderAPI::OpenGL: case HostDisplay::RenderAPI::OpenGLES: g_gs_device = std::make_unique(); @@ -1180,6 +1189,9 @@ void GSApp::Init() m_gs_renderers.push_back(GSSetting(static_cast(GSRendererType::Auto), "Automatic", "")); #ifdef _WIN32 m_gs_renderers.push_back(GSSetting(static_cast(GSRendererType::DX11), "Direct3D 11", "")); +#endif +#ifdef __APPLE__ + m_gs_renderers.push_back(GSSetting(static_cast(GSRendererType::Metal), "Metal", "")); #endif m_gs_renderers.push_back(GSSetting(static_cast(GSRendererType::OGL), "OpenGL", "")); #ifdef ENABLE_VULKAN diff --git a/pcsx2/GS/GSUtil.cpp b/pcsx2/GS/GSUtil.cpp index 502b820130..e12ed986d6 100644 --- a/pcsx2/GS/GSUtil.cpp +++ b/pcsx2/GS/GSUtil.cpp @@ -190,6 +190,9 @@ CRCHackLevel GSUtil::GetRecommendedCRCHackLevel(GSRendererType type) GSRendererType GSUtil::GetPreferredRenderer() { +#ifdef __APPLE__ + return GSRendererType::Metal; +#endif #ifdef _WIN32 if (D3D::ShouldPreferD3D()) return GSRendererType::DX11; diff --git a/pcsx2/GS/Window/GSwxDialog.cpp b/pcsx2/GS/Window/GSwxDialog.cpp index 18b6ec7e67..0d27224cf4 100644 --- a/pcsx2/GS/Window/GSwxDialog.cpp +++ b/pcsx2/GS/Window/GSwxDialog.cpp @@ -22,6 +22,7 @@ #ifdef _WIN32 #include "Frontend/D3D11HostDisplay.h" #endif +#include "GS/Renderers/Metal/GSMetalCPPAccessible.h" #ifdef ENABLE_VULKAN #include "Frontend/VulkanHostDisplay.h" @@ -694,6 +695,11 @@ void Dialog::RendererChange() case GSRendererType::VK: list = VulkanHostDisplay::StaticGetAdapterAndModeList(nullptr); break; +#endif +#ifdef __APPLE__ + case GSRendererType::Metal: + list = GetMetalAdapterAndModeList(); + break; #endif default: break; @@ -774,7 +780,7 @@ void Dialog::Update() else { // cross-tab dependencies yay - const bool is_hw = renderer == GSRendererType::OGL || renderer == GSRendererType::DX11 || renderer == GSRendererType::VK; + const bool is_hw = renderer == GSRendererType::OGL || renderer == GSRendererType::DX11 || renderer == GSRendererType::VK || renderer == GSRendererType::Metal; const bool is_upscale = m_renderer_panel->m_internal_resolution->GetSelection() != 0; m_hacks_panel->m_is_native_res = !is_hw || !is_upscale; m_hacks_panel->m_is_hardware = is_hw; diff --git a/pcsx2/HostDisplay.cpp b/pcsx2/HostDisplay.cpp index 56af502f8b..a8c3ce6e58 100644 --- a/pcsx2/HostDisplay.cpp +++ b/pcsx2/HostDisplay.cpp @@ -143,6 +143,10 @@ std::unique_ptr HostDisplay::CreateDisplayForAPI(RenderAPI api) case RenderAPI::D3D11: return std::make_unique(); #endif +#ifdef __APPLE__ + case HostDisplay::RenderAPI::Metal: + return std::unique_ptr(MakeMetalHostDisplay()); +#endif case RenderAPI::OpenGL: case RenderAPI::OpenGLES: diff --git a/pcsx2/Pcsx2Config.cpp b/pcsx2/Pcsx2Config.cpp index 6e69eb74c2..dae3e9a82f 100644 --- a/pcsx2/Pcsx2Config.cpp +++ b/pcsx2/Pcsx2Config.cpp @@ -271,6 +271,7 @@ const char* Pcsx2Config::GSOptions::GetRendererName(GSRendererType type) { case GSRendererType::Auto: return "Auto"; case GSRendererType::DX11: return "Direct3D 11"; + case GSRendererType::Metal: return "Metal"; case GSRendererType::OGL: return "OpenGL"; case GSRendererType::VK: return "Vulkan"; case GSRendererType::SW: return "Software"; @@ -637,7 +638,7 @@ void Pcsx2Config::GSOptions::MaskUpscalingHacks() bool Pcsx2Config::GSOptions::UseHardwareRenderer() const { - return (Renderer == GSRendererType::DX11 || Renderer == GSRendererType::OGL || Renderer == GSRendererType::VK); + return (Renderer == GSRendererType::DX11 || Renderer == GSRendererType::OGL || Renderer == GSRendererType::VK || Renderer == GSRendererType::Metal); } VsyncMode Pcsx2Config::GetEffectiveVsyncMode() const diff --git a/pcsx2/gui/Dialogs/GSDumpDialog.cpp b/pcsx2/gui/Dialogs/GSDumpDialog.cpp index a894823b92..eab5e6c836 100644 --- a/pcsx2/gui/Dialogs/GSDumpDialog.cpp +++ b/pcsx2/gui/Dialogs/GSDumpDialog.cpp @@ -129,6 +129,8 @@ Dialogs::GSDumpDialog::GSDumpDialog(wxWindow* parent) #endif #if defined(_WIN32) rdoverrides.Add(Pcsx2Config::GSOptions::GetRendererName(GSRendererType::DX11)); +#elif defined(__APPLE__) + rdoverrides.Add(Pcsx2Config::GSOptions::GetRendererName(GSRendererType::Metal)); #endif m_renderer_overrides->Create(this, wxID_ANY, "Renderer overrides", wxDefaultPosition, wxDefaultSize, rdoverrides, 1); @@ -829,18 +831,21 @@ void Dialogs::GSDumpDialog::GSThread::ExecuteTaskInThread() case 2: renderer = GSRendererType::OGL; break; -#ifdef ENABLE_VULKAN - // Vulkan case 3: +#ifdef ENABLE_VULKAN + // Vulkan renderer = GSRendererType::VK; break; + case 4: #endif #ifdef _WIN32 - // D3D11 - case 4: // WIN32 implies WITH_VULKAN so this is okay + // D3D11 renderer = GSRendererType::DX11; - break; +#elif defined(__APPLE__) + // Metal + renderer = GSRendererType::Metal; #endif + break; default: break; }