diff --git a/dep/CMakeLists.txt b/dep/CMakeLists.txt
index e3eeca98a..8a49fc272 100644
--- a/dep/CMakeLists.txt
+++ b/dep/CMakeLists.txt
@@ -1,3 +1,4 @@
+add_subdirectory(fmt)
add_subdirectory(glad)
add_subdirectory(stb)
add_subdirectory(zlib)
diff --git a/duckstation.sln b/duckstation.sln
index d3bec092b..7a1d8ceb6 100644
--- a/duckstation.sln
+++ b/duckstation.sln
@@ -103,6 +103,8 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "duckstation-regtest", "src\
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "rainterface", "dep\rainterface\rainterface.vcxproj", "{E4357877-D459-45C7-B8F6-DCBB587BB528}"
EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "fmt", "dep\fmt\fmt.vcxproj", "{8BE398E6-B882-4248-9065-FECC8728E038}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|ARM64 = Debug|ARM64
@@ -951,6 +953,42 @@ Global
{E4357877-D459-45C7-B8F6-DCBB587BB528}.ReleaseUWP|x64.Build.0 = ReleaseUWP|x64
{E4357877-D459-45C7-B8F6-DCBB587BB528}.ReleaseUWP|x86.ActiveCfg = ReleaseUWP|Win32
{E4357877-D459-45C7-B8F6-DCBB587BB528}.ReleaseUWP|x86.Build.0 = ReleaseUWP|Win32
+ {8BE398E6-B882-4248-9065-FECC8728E038}.Debug|ARM64.ActiveCfg = Debug|ARM64
+ {8BE398E6-B882-4248-9065-FECC8728E038}.Debug|ARM64.Build.0 = Debug|ARM64
+ {8BE398E6-B882-4248-9065-FECC8728E038}.Debug|x64.ActiveCfg = Debug|x64
+ {8BE398E6-B882-4248-9065-FECC8728E038}.Debug|x64.Build.0 = Debug|x64
+ {8BE398E6-B882-4248-9065-FECC8728E038}.Debug|x86.ActiveCfg = Debug|Win32
+ {8BE398E6-B882-4248-9065-FECC8728E038}.Debug|x86.Build.0 = Debug|Win32
+ {8BE398E6-B882-4248-9065-FECC8728E038}.DebugFast|ARM64.ActiveCfg = DebugFast|ARM64
+ {8BE398E6-B882-4248-9065-FECC8728E038}.DebugFast|ARM64.Build.0 = DebugFast|ARM64
+ {8BE398E6-B882-4248-9065-FECC8728E038}.DebugFast|x64.ActiveCfg = DebugFast|x64
+ {8BE398E6-B882-4248-9065-FECC8728E038}.DebugFast|x64.Build.0 = DebugFast|x64
+ {8BE398E6-B882-4248-9065-FECC8728E038}.DebugFast|x86.ActiveCfg = DebugFast|Win32
+ {8BE398E6-B882-4248-9065-FECC8728E038}.DebugFast|x86.Build.0 = DebugFast|Win32
+ {8BE398E6-B882-4248-9065-FECC8728E038}.DebugUWP|ARM64.ActiveCfg = DebugUWP|ARM64
+ {8BE398E6-B882-4248-9065-FECC8728E038}.DebugUWP|ARM64.Build.0 = DebugUWP|ARM64
+ {8BE398E6-B882-4248-9065-FECC8728E038}.DebugUWP|x64.ActiveCfg = DebugUWP|x64
+ {8BE398E6-B882-4248-9065-FECC8728E038}.DebugUWP|x64.Build.0 = DebugUWP|x64
+ {8BE398E6-B882-4248-9065-FECC8728E038}.DebugUWP|x86.ActiveCfg = DebugUWP|Win32
+ {8BE398E6-B882-4248-9065-FECC8728E038}.DebugUWP|x86.Build.0 = DebugUWP|Win32
+ {8BE398E6-B882-4248-9065-FECC8728E038}.Release|ARM64.ActiveCfg = Release|ARM64
+ {8BE398E6-B882-4248-9065-FECC8728E038}.Release|ARM64.Build.0 = Release|ARM64
+ {8BE398E6-B882-4248-9065-FECC8728E038}.Release|x64.ActiveCfg = Release|x64
+ {8BE398E6-B882-4248-9065-FECC8728E038}.Release|x64.Build.0 = Release|x64
+ {8BE398E6-B882-4248-9065-FECC8728E038}.Release|x86.ActiveCfg = Release|Win32
+ {8BE398E6-B882-4248-9065-FECC8728E038}.Release|x86.Build.0 = Release|Win32
+ {8BE398E6-B882-4248-9065-FECC8728E038}.ReleaseLTCG|ARM64.ActiveCfg = ReleaseLTCG|ARM64
+ {8BE398E6-B882-4248-9065-FECC8728E038}.ReleaseLTCG|ARM64.Build.0 = ReleaseLTCG|ARM64
+ {8BE398E6-B882-4248-9065-FECC8728E038}.ReleaseLTCG|x64.ActiveCfg = ReleaseLTCG|x64
+ {8BE398E6-B882-4248-9065-FECC8728E038}.ReleaseLTCG|x64.Build.0 = ReleaseLTCG|x64
+ {8BE398E6-B882-4248-9065-FECC8728E038}.ReleaseLTCG|x86.ActiveCfg = ReleaseLTCG|Win32
+ {8BE398E6-B882-4248-9065-FECC8728E038}.ReleaseLTCG|x86.Build.0 = ReleaseLTCG|Win32
+ {8BE398E6-B882-4248-9065-FECC8728E038}.ReleaseUWP|ARM64.ActiveCfg = ReleaseUWP|ARM64
+ {8BE398E6-B882-4248-9065-FECC8728E038}.ReleaseUWP|ARM64.Build.0 = ReleaseUWP|ARM64
+ {8BE398E6-B882-4248-9065-FECC8728E038}.ReleaseUWP|x64.ActiveCfg = ReleaseUWP|x64
+ {8BE398E6-B882-4248-9065-FECC8728E038}.ReleaseUWP|x64.Build.0 = ReleaseUWP|x64
+ {8BE398E6-B882-4248-9065-FECC8728E038}.ReleaseUWP|x86.ActiveCfg = ReleaseUWP|Win32
+ {8BE398E6-B882-4248-9065-FECC8728E038}.ReleaseUWP|x86.Build.0 = ReleaseUWP|Win32
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@@ -975,6 +1013,7 @@ Global
{39F0ADFF-3A84-470D-9CF0-CA49E164F2F3} = {BA490C0E-497D-4634-A21E-E65012006385}
{4BA0A6D4-3AE1-42B2-9347-096FD023FF64} = {BA490C0E-497D-4634-A21E-E65012006385}
{E4357877-D459-45C7-B8F6-DCBB587BB528} = {BA490C0E-497D-4634-A21E-E65012006385}
+ {8BE398E6-B882-4248-9065-FECC8728E038} = {BA490C0E-497D-4634-A21E-E65012006385}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {26E40B32-7C1D-48D0-95F4-1A500E054028}
diff --git a/src/common/common.props b/src/common/common.props
index 250fcc378..6e39e69dc 100644
--- a/src/common/common.props
+++ b/src/common/common.props
@@ -2,13 +2,13 @@
- $(SolutionDir)dep\libsamplerate\include;$(SolutionDir)dep\glad\include;$(SolutionDir)dep\libcue\include;$(SolutionDir)dep\libchdr\include;$(SolutionDir)dep\stb\include;$(SolutionDir)dep\vulkan-loader\include;$(SolutionDir)dep\glslang;$(SolutionDir)dep\zlib\include;$(SolutionDir)dep\minizip\include;$(SolutionDir)src;%(AdditionalIncludeDirectories)
+ $(SolutionDir)dep\fmt\include;$(SolutionDir)dep\libsamplerate\include;$(SolutionDir)dep\glad\include;$(SolutionDir)dep\libcue\include;$(SolutionDir)dep\libchdr\include;$(SolutionDir)dep\stb\include;$(SolutionDir)dep\vulkan-loader\include;$(SolutionDir)dep\glslang;$(SolutionDir)dep\zlib\include;$(SolutionDir)dep\minizip\include;$(SolutionDir)src;%(AdditionalIncludeDirectories)
- $(RootBuildDir)glad\glad.lib;$(RootBuildDir)glslang\glslang.lib;$(RootBuildDir)libchdr\libchdr.lib;$(RootBuildDir)zlib\zlib.lib;$(RootBuildDir)minizip\minizip.lib;$(RootBuildDir)lzma\lzma.lib;$(RootBuildDir)libsamplerate\libsamplerate.lib;d3dcompiler.lib;d3d11.lib;%(AdditionalDependencies)
+ $(RootBuildDir)fmt\fmt.lib;$(RootBuildDir)glad\glad.lib;$(RootBuildDir)glslang\glslang.lib;$(RootBuildDir)libchdr\libchdr.lib;$(RootBuildDir)zlib\zlib.lib;$(RootBuildDir)minizip\minizip.lib;$(RootBuildDir)lzma\lzma.lib;$(RootBuildDir)libsamplerate\libsamplerate.lib;d3dcompiler.lib;d3d11.lib;%(AdditionalDependencies)
diff --git a/src/updater/updater.vcxproj b/src/updater/updater.vcxproj
index e57982b54..13b6fbfe6 100644
--- a/src/updater/updater.vcxproj
+++ b/src/updater/updater.vcxproj
@@ -30,6 +30,7 @@
+