diff --git a/src/common/settings.h b/src/common/settings.h
index 82ec18e275..dd2d8d4d8c 100644
--- a/src/common/settings.h
+++ b/src/common/settings.h
@@ -37,8 +37,9 @@ enum class CPUAccuracy : u32 {
 template <typename Type>
 class Setting final {
 public:
-    Setting() = default;
-    explicit Setting(Type val) : global{val} {}
+    explicit Setting(Type val) : global{val} {
+        default_value = val;
+    }
     ~Setting() = default;
     void SetGlobal(bool to_global) {
         use_global = to_global;
@@ -59,11 +60,15 @@ public:
             local = value;
         }
     }
+    Type GetDefault() const {
+        return default_value;
+    }
 
 private:
     bool use_global = true;
     Type global{};
     Type local{};
+    Type default_value{};
 };
 
 /**
@@ -108,14 +113,14 @@ struct Values {
     std::string audio_device_id;
     std::string sink_id;
     bool audio_muted;
-    Setting<bool> enable_audio_stretching;
-    Setting<float> volume;
+    Setting<bool> enable_audio_stretching{true};
+    Setting<float> volume{1.0f};
 
     // Core
-    Setting<bool> use_multi_core;
+    Setting<bool> use_multi_core{true};
 
     // Cpu
-    Setting<CPUAccuracy> cpu_accuracy;
+    Setting<CPUAccuracy> cpu_accuracy{CPUAccuracy::Accurate};
 
     bool cpuopt_page_tables;
     bool cpuopt_block_linking;
@@ -127,61 +132,69 @@ struct Values {
     bool cpuopt_reduce_misalign_checks;
     bool cpuopt_fastmem;
 
-    Setting<bool> cpuopt_unsafe_unfuse_fma;
-    Setting<bool> cpuopt_unsafe_reduce_fp_error;
-    Setting<bool> cpuopt_unsafe_ignore_standard_fpcr;
-    Setting<bool> cpuopt_unsafe_inaccurate_nan;
-    Setting<bool> cpuopt_unsafe_fastmem_check;
+    Setting<bool> cpuopt_unsafe_unfuse_fma{true};
+    Setting<bool> cpuopt_unsafe_reduce_fp_error{true};
+    Setting<bool> cpuopt_unsafe_ignore_standard_fpcr{true};
+    Setting<bool> cpuopt_unsafe_inaccurate_nan{true};
+    Setting<bool> cpuopt_unsafe_fastmem_check{true};
 
     // Renderer
-    Setting<RendererBackend> renderer_backend;
+    Setting<RendererBackend> renderer_backend{RendererBackend::OpenGL};
     bool renderer_debug;
-    Setting<int> vulkan_device;
+    Setting<int> vulkan_device{0};
 
-    Setting<u16> resolution_factor{1};
-    Setting<int> fullscreen_mode;
-    Setting<int> aspect_ratio;
-    Setting<int> max_anisotropy;
-    Setting<bool> use_frame_limit;
-    Setting<u16> frame_limit;
-    Setting<bool> use_disk_shader_cache;
-    Setting<GPUAccuracy> gpu_accuracy;
-    Setting<bool> use_asynchronous_gpu_emulation;
-    Setting<bool> use_nvdec_emulation;
-    Setting<bool> accelerate_astc;
-    Setting<bool> use_vsync;
-    Setting<bool> disable_fps_limit;
-    Setting<bool> use_assembly_shaders;
-    Setting<bool> use_asynchronous_shaders;
-    Setting<bool> use_fast_gpu_time;
-    Setting<bool> use_caches_gc;
+    Setting<u16> resolution_factor{0};
+    // *nix platforms may have issues with the borderless windowed fullscreen mode.
+    // Default to exclusive fullscreen on these platforms for now.
+    Setting<int> fullscreen_mode{
+#ifdef _WIN32
+        0
+#else
+        1
+#endif
+    };
+    Setting<int> aspect_ratio{0};
+    Setting<int> max_anisotropy{0};
+    Setting<bool> use_frame_limit{true};
+    Setting<u16> frame_limit{100};
+    Setting<bool> use_disk_shader_cache{true};
+    Setting<GPUAccuracy> gpu_accuracy{GPUAccuracy::High};
+    Setting<bool> use_asynchronous_gpu_emulation{true};
+    Setting<bool> use_nvdec_emulation{true};
+    Setting<bool> accelerate_astc{true};
+    Setting<bool> use_vsync{true};
+    Setting<bool> disable_fps_limit{false};
+    Setting<bool> use_assembly_shaders{false};
+    Setting<bool> use_asynchronous_shaders{false};
+    Setting<bool> use_fast_gpu_time{true};
+    Setting<bool> use_caches_gc{false};
 
-    Setting<float> bg_red;
-    Setting<float> bg_green;
-    Setting<float> bg_blue;
+    Setting<float> bg_red{0.0f};
+    Setting<float> bg_green{0.0f};
+    Setting<float> bg_blue{0.0f};
 
     // System
-    Setting<std::optional<u32>> rng_seed;
+    Setting<std::optional<u32>> rng_seed{std::optional<u32>()};
     // Measured in seconds since epoch
     std::optional<std::chrono::seconds> custom_rtc;
     // Set on game boot, reset on stop. Seconds difference between current time and `custom_rtc`
     std::chrono::seconds custom_rtc_differential;
 
     s32 current_user;
-    Setting<s32> language_index;
-    Setting<s32> region_index;
-    Setting<s32> time_zone_index;
-    Setting<s32> sound_index;
+    Setting<s32> language_index{1};
+    Setting<s32> region_index{1};
+    Setting<s32> time_zone_index{0};
+    Setting<s32> sound_index{1};
 
     // Controls
     InputSetting<std::array<PlayerInput, 10>> players;
 
-    Setting<bool> use_docked_mode;
+    Setting<bool> use_docked_mode{true};
 
-    Setting<bool> vibration_enabled;
-    Setting<bool> enable_accurate_vibrations;
+    Setting<bool> vibration_enabled{true};
+    Setting<bool> enable_accurate_vibrations{false};
 
-    Setting<bool> motion_enabled;
+    Setting<bool> motion_enabled{true};
     std::string motion_device;
     std::string udp_input_servers;