Skip to content

Commit 42ed8f1

Browse files
committed
Switch iOS renderer to Metal
1 parent bf92b2c commit 42ed8f1

8 files changed

Lines changed: 639 additions & 205 deletions

File tree

UnleashedRecomp/CMakeLists.txt

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -465,14 +465,12 @@ if (CMAKE_SYSTEM_NAME STREQUAL "iOS" AND TARGET SDL2::SDL2main)
465465
list(PREPEND UNLEASHED_RECOMP_SDL_LIBS SDL2::SDL2main)
466466
endif()
467467

468-
set(UNLEASHED_RECOMP_PLATFORM_LIBS)
469-
if (CMAKE_SYSTEM_NAME STREQUAL "iOS")
470-
list(APPEND UNLEASHED_RECOMP_PLATFORM_LIBS MoltenVK)
471-
target_link_options(UnleashedRecomp PRIVATE
472-
"LINKER:-u,_vkGetInstanceProcAddr"
473-
"LINKER:-ObjC"
474-
)
475-
endif()
468+
set(UNLEASHED_RECOMP_PLATFORM_LIBS)
469+
if (CMAKE_SYSTEM_NAME STREQUAL "iOS")
470+
target_link_options(UnleashedRecomp PRIVATE
471+
"LINKER:-ObjC"
472+
)
473+
endif()
476474

477475
target_link_libraries(UnleashedRecomp PRIVATE
478476
fmt::fmt

UnleashedRecomp/gpu/video.cpp

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,24 +100,38 @@ extern "C"
100100
}
101101
#endif
102102

103+
#if defined(UNLEASHED_RECOMP_IOS) && defined(__APPLE__) && !defined(SDL_VULKAN_ENABLED)
104+
#define UNLEASHED_RECOMP_USE_METAL 1
105+
#endif
106+
103107
namespace plume
104108
{
105109
#ifdef UNLEASHED_RECOMP_D3D12
106110
extern std::unique_ptr<RenderInterface> CreateD3D12Interface();
107111
#endif
112+
#ifdef UNLEASHED_RECOMP_USE_METAL
113+
extern std::unique_ptr<RenderInterface> CreateMetalInterface();
114+
#else
108115
#ifdef SDL_VULKAN_ENABLED
109116
extern std::unique_ptr<RenderInterface> CreateVulkanInterface(RenderWindow sdlWindow);
110117
#else
111118
extern std::unique_ptr<RenderInterface> CreateVulkanInterface();
112119
#endif
120+
#endif
113121

122+
#ifdef UNLEASHED_RECOMP_USE_METAL
123+
static std::unique_ptr<RenderInterface> CreateMetalInterfaceWrapper() {
124+
return CreateMetalInterface();
125+
}
126+
#else
114127
static std::unique_ptr<RenderInterface> CreateVulkanInterfaceWrapper() {
115128
#ifdef SDL_VULKAN_ENABLED
116129
return CreateVulkanInterface(GameWindow::s_renderWindow);
117130
#else
118131
return CreateVulkanInterface();
119132
#endif
120133
}
134+
#endif
121135
}
122136

123137
#pragma pack(push, 1)
@@ -291,6 +305,15 @@ static bool g_vulkan = false;
291305
static constexpr bool g_vulkan = true;
292306
#endif
293307

308+
static const char* GetGraphicsApiName()
309+
{
310+
#ifdef UNLEASHED_RECOMP_USE_METAL
311+
return "Metal";
312+
#else
313+
return g_vulkan ? "Vulkan" : "D3D12";
314+
#endif
315+
}
316+
294317
static bool g_triangleStripWorkaround = false;
295318

296319
static bool g_hardwareResolve = true;
@@ -1755,6 +1778,8 @@ bool Video::CreateHostDevice(const char *sdlVideoDriver, bool graphicsApiRetry)
17551778

17561779
interfaceFunctions.push_back(g_vulkan ? CreateVulkanInterfaceWrapper : CreateD3D12Interface);
17571780
interfaceFunctions.push_back(g_vulkan ? CreateD3D12Interface : CreateVulkanInterfaceWrapper);
1781+
#elif defined(UNLEASHED_RECOMP_USE_METAL)
1782+
interfaceFunctions.push_back(CreateMetalInterfaceWrapper);
17581783
#else
17591784
interfaceFunctions.push_back(CreateVulkanInterfaceWrapper);
17601785
#endif
@@ -2529,7 +2554,7 @@ static void DrawProfiler()
25292554
ImGui::Text("Hardware Depth Resolve: %s", g_hardwareDepthResolve ? "Enabled" : "Disabled");
25302555
ImGui::NewLine();
25312556

2532-
ImGui::Text("API: %s", g_vulkan ? "Vulkan" : "D3D12");
2557+
ImGui::Text("API: %s", GetGraphicsApiName());
25332558
ImGui::Text("Device: %s", g_device->getDescription().name.c_str());
25342559
ImGui::Text("Device Type: %s", DeviceTypeName(g_device->getDescription().type));
25352560
ImGui::Text("VRAM: %.2f MiB", (double)(g_device->getDescription().dedicatedVideoMemory) / (1024.0 * 1024.0));

UnleashedRecomp/ui/game_window.cpp

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@
66
#include <app.h>
77
#include <sdl_listener.h>
88
#include <SDL_syswm.h>
9+
#ifdef __APPLE__
10+
#include <SDL_metal.h>
11+
#endif
912

1013
#if _WIN32
1114
#include <dwmapi.h>
@@ -227,8 +230,13 @@ void GameWindow::Init(const char* sdlVideoDriver)
227230
#elif defined(__linux__)
228231
s_renderWindow = { info.info.x11.display, info.info.x11.window };
229232
#elif defined(__APPLE__)
233+
s_metalView = SDL_Metal_CreateView(s_pWindow);
234+
#ifdef UNLEASHED_RECOMP_IOS
235+
s_renderWindow.window = s_metalView;
236+
#else
230237
s_renderWindow.window = info.info.cocoa.window;
231-
s_renderWindow.view = SDL_Metal_GetLayer(SDL_Metal_CreateView(s_pWindow));
238+
#endif
239+
s_renderWindow.view = s_metalView != nullptr ? SDL_Metal_GetLayer(s_metalView) : nullptr;
232240
#else
233241
static_assert(false, "Unknown platform.");
234242
#endif
@@ -449,6 +457,8 @@ uint32_t GameWindow::GetWindowFlags()
449457

450458
#ifdef SDL_VULKAN_ENABLED
451459
flags |= SDL_WINDOW_VULKAN;
460+
#elif defined(__APPLE__)
461+
flags |= SDL_WINDOW_METAL;
452462
#endif
453463

454464
return flags;

UnleashedRecomp/ui/game_window.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,9 @@
33
#include <plume_render_interface_types.h>
44
#include <user/config.h>
55
#include <sdl_events.h>
6+
#ifdef __APPLE__
7+
#include <SDL_metal.h>
8+
#endif
69

710
#define DEFAULT_WIDTH 1280
811
#define DEFAULT_HEIGHT 720
@@ -14,6 +17,9 @@ class GameWindow
1417
public:
1518
static inline SDL_Window* s_pWindow = nullptr;
1619
static inline plume::RenderWindow s_renderWindow;
20+
#ifdef __APPLE__
21+
static inline SDL_MetalView s_metalView = nullptr;
22+
#endif
1723

1824
static inline int s_x;
1925
static inline int s_y;

thirdparty/CMakeLists.txt

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,10 @@ set(SDL2MIXER_OPUS OFF)
1515
set(SDL2MIXER_VORBIS "VORBISFILE")
1616
set(SDL2MIXER_WAVPACK OFF)
1717

18-
if (CMAKE_SYSTEM_NAME MATCHES "Linux" OR CMAKE_SYSTEM_NAME STREQUAL "iOS")
18+
if (CMAKE_SYSTEM_NAME STREQUAL "iOS")
19+
set(SDL_VULKAN_ENABLED OFF CACHE BOOL "" FORCE)
20+
set(SDL_VULKAN OFF CACHE BOOL "" FORCE)
21+
elseif (CMAKE_SYSTEM_NAME MATCHES "Linux")
1922
set(SDL_VULKAN_ENABLED ON CACHE BOOL "")
2023
endif()
2124

@@ -38,8 +41,9 @@ endif()
3841
add_subdirectory("${UNLEASHED_RECOMP_THIRDPARTY_ROOT}/o1heap")
3942
add_subdirectory("${UNLEASHED_RECOMP_THIRDPARTY_ROOT}/SDL")
4043
add_subdirectory("${UNLEASHED_RECOMP_THIRDPARTY_ROOT}/SDL_mixer")
41-
add_subdirectory("${UNLEASHED_RECOMP_THIRDPARTY_ROOT}/plume")
4244

4345
if (APPLE)
4446
add_subdirectory("${UNLEASHED_RECOMP_THIRDPARTY_ROOT}/MoltenVK")
4547
endif()
48+
49+
add_subdirectory("${UNLEASHED_RECOMP_THIRDPARTY_ROOT}/plume")

tools/apply_ios_submodule_patches.sh

Lines changed: 1 addition & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,9 @@ set -euo pipefail
33

44
ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
55
PLUME_DIR="$ROOT/thirdparty/plume"
6-
PLUME_PATCH_FILE="$ROOT/tools/patches/plume-ios-sdl-vulkan.patch"
6+
PLUME_PATCH_FILE="$ROOT/tools/patches/plume-ios-metal.patch"
77
XENON_RECOMP_DIR="$ROOT/tools/XenonRecomp"
88
XENON_RECOMP_PATCH_FILE="$ROOT/tools/patches/xenonrecomp-ios-streaming-memory-map.patch"
9-
PLUME_VOLK_HEADER="$PLUME_DIR/contrib/volk/volk.h"
10-
PLUME_VOLK_RENAME_HEADER="$PLUME_DIR/plume_volk_rename_ios.h"
119

1210
if [[ ! -d "$PLUME_DIR/.git" && ! -f "$PLUME_DIR/.git" ]]; then
1311
printf 'Missing Plume submodule. Run: git submodule update --init --recursive\n' >&2
@@ -31,18 +29,6 @@ else
3129
fi
3230
fi
3331

34-
if [[ ! -f "$PLUME_VOLK_HEADER" ]]; then
35-
printf 'Missing Plume volk header: %s\n' "$PLUME_VOLK_HEADER" >&2
36-
exit 1
37-
fi
38-
39-
{
40-
printf '#pragma once\n\n'
41-
printf '// Keep Plume'\''s embedded volk function-pointer globals from colliding with statically linked MoltenVK on iOS.\n'
42-
awk '/^extern PFN_vk/ { name = $3; sub(/;$/, "", name); print "#define " name " plumeVolk_" name }' "$PLUME_VOLK_HEADER"
43-
} > "$PLUME_VOLK_RENAME_HEADER"
44-
printf 'Generated Plume iOS volk rename header.\n'
45-
4632
if git -C "$XENON_RECOMP_DIR" apply --check "$XENON_RECOMP_PATCH_FILE" >/dev/null 2>&1; then
4733
git -C "$XENON_RECOMP_DIR" apply "$XENON_RECOMP_PATCH_FILE"
4834
printf 'Applied XenonRecomp iOS patch.\n'

0 commit comments

Comments
 (0)