settings_enums.h 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219
  1. // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
  2. // SPDX-License-Identifier: GPL-2.0-or-later
  3. #pragma once
  4. #include <string>
  5. #include <utility>
  6. #include <vector>
  7. #include "common/common_types.h"
  8. namespace Settings {
  9. template <typename T>
  10. struct EnumMetadata {
  11. static std::vector<std::pair<std::string, T>> Canonicalizations();
  12. static u32 Index();
  13. };
  14. #define PAIR_45(N, X, ...) {#X, N::X} __VA_OPT__(, PAIR_46(N, __VA_ARGS__))
  15. #define PAIR_44(N, X, ...) {#X, N::X} __VA_OPT__(, PAIR_45(N, __VA_ARGS__))
  16. #define PAIR_43(N, X, ...) {#X, N::X} __VA_OPT__(, PAIR_44(N, __VA_ARGS__))
  17. #define PAIR_42(N, X, ...) {#X, N::X} __VA_OPT__(, PAIR_43(N, __VA_ARGS__))
  18. #define PAIR_41(N, X, ...) {#X, N::X} __VA_OPT__(, PAIR_42(N, __VA_ARGS__))
  19. #define PAIR_40(N, X, ...) {#X, N::X} __VA_OPT__(, PAIR_41(N, __VA_ARGS__))
  20. #define PAIR_39(N, X, ...) {#X, N::X} __VA_OPT__(, PAIR_40(N, __VA_ARGS__))
  21. #define PAIR_38(N, X, ...) {#X, N::X} __VA_OPT__(, PAIR_39(N, __VA_ARGS__))
  22. #define PAIR_37(N, X, ...) {#X, N::X} __VA_OPT__(, PAIR_38(N, __VA_ARGS__))
  23. #define PAIR_36(N, X, ...) {#X, N::X} __VA_OPT__(, PAIR_37(N, __VA_ARGS__))
  24. #define PAIR_35(N, X, ...) {#X, N::X} __VA_OPT__(, PAIR_36(N, __VA_ARGS__))
  25. #define PAIR_34(N, X, ...) {#X, N::X} __VA_OPT__(, PAIR_35(N, __VA_ARGS__))
  26. #define PAIR_33(N, X, ...) {#X, N::X} __VA_OPT__(, PAIR_34(N, __VA_ARGS__))
  27. #define PAIR_32(N, X, ...) {#X, N::X} __VA_OPT__(, PAIR_33(N, __VA_ARGS__))
  28. #define PAIR_31(N, X, ...) {#X, N::X} __VA_OPT__(, PAIR_32(N, __VA_ARGS__))
  29. #define PAIR_30(N, X, ...) {#X, N::X} __VA_OPT__(, PAIR_31(N, __VA_ARGS__))
  30. #define PAIR_29(N, X, ...) {#X, N::X} __VA_OPT__(, PAIR_30(N, __VA_ARGS__))
  31. #define PAIR_28(N, X, ...) {#X, N::X} __VA_OPT__(, PAIR_29(N, __VA_ARGS__))
  32. #define PAIR_27(N, X, ...) {#X, N::X} __VA_OPT__(, PAIR_28(N, __VA_ARGS__))
  33. #define PAIR_26(N, X, ...) {#X, N::X} __VA_OPT__(, PAIR_27(N, __VA_ARGS__))
  34. #define PAIR_25(N, X, ...) {#X, N::X} __VA_OPT__(, PAIR_26(N, __VA_ARGS__))
  35. #define PAIR_24(N, X, ...) {#X, N::X} __VA_OPT__(, PAIR_25(N, __VA_ARGS__))
  36. #define PAIR_23(N, X, ...) {#X, N::X} __VA_OPT__(, PAIR_24(N, __VA_ARGS__))
  37. #define PAIR_22(N, X, ...) {#X, N::X} __VA_OPT__(, PAIR_23(N, __VA_ARGS__))
  38. #define PAIR_21(N, X, ...) {#X, N::X} __VA_OPT__(, PAIR_22(N, __VA_ARGS__))
  39. #define PAIR_20(N, X, ...) {#X, N::X} __VA_OPT__(, PAIR_21(N, __VA_ARGS__))
  40. #define PAIR_19(N, X, ...) {#X, N::X} __VA_OPT__(, PAIR_20(N, __VA_ARGS__))
  41. #define PAIR_18(N, X, ...) {#X, N::X} __VA_OPT__(, PAIR_19(N, __VA_ARGS__))
  42. #define PAIR_17(N, X, ...) {#X, N::X} __VA_OPT__(, PAIR_18(N, __VA_ARGS__))
  43. #define PAIR_16(N, X, ...) {#X, N::X} __VA_OPT__(, PAIR_17(N, __VA_ARGS__))
  44. #define PAIR_15(N, X, ...) {#X, N::X} __VA_OPT__(, PAIR_16(N, __VA_ARGS__))
  45. #define PAIR_14(N, X, ...) {#X, N::X} __VA_OPT__(, PAIR_15(N, __VA_ARGS__))
  46. #define PAIR_13(N, X, ...) {#X, N::X} __VA_OPT__(, PAIR_14(N, __VA_ARGS__))
  47. #define PAIR_12(N, X, ...) {#X, N::X} __VA_OPT__(, PAIR_13(N, __VA_ARGS__))
  48. #define PAIR_11(N, X, ...) {#X, N::X} __VA_OPT__(, PAIR_12(N, __VA_ARGS__))
  49. #define PAIR_10(N, X, ...) {#X, N::X} __VA_OPT__(, PAIR_11(N, __VA_ARGS__))
  50. #define PAIR_9(N, X, ...) {#X, N::X} __VA_OPT__(, PAIR_10(N, __VA_ARGS__))
  51. #define PAIR_8(N, X, ...) {#X, N::X} __VA_OPT__(, PAIR_9(N, __VA_ARGS__))
  52. #define PAIR_7(N, X, ...) {#X, N::X} __VA_OPT__(, PAIR_8(N, __VA_ARGS__))
  53. #define PAIR_6(N, X, ...) {#X, N::X} __VA_OPT__(, PAIR_7(N, __VA_ARGS__))
  54. #define PAIR_5(N, X, ...) {#X, N::X} __VA_OPT__(, PAIR_6(N, __VA_ARGS__))
  55. #define PAIR_4(N, X, ...) {#X, N::X} __VA_OPT__(, PAIR_5(N, __VA_ARGS__))
  56. #define PAIR_3(N, X, ...) {#X, N::X} __VA_OPT__(, PAIR_4(N, __VA_ARGS__))
  57. #define PAIR_2(N, X, ...) {#X, N::X} __VA_OPT__(, PAIR_3(N, __VA_ARGS__))
  58. #define PAIR_1(N, X, ...) {#X, N::X} __VA_OPT__(, PAIR_2(N, __VA_ARGS__))
  59. #define PAIR(N, X, ...) {#X, N::X} __VA_OPT__(, PAIR_1(N, __VA_ARGS__))
  60. #define ENUM(NAME, ...) \
  61. enum class NAME : u32 { __VA_ARGS__ }; \
  62. template <> \
  63. inline std::vector<std::pair<std::string, NAME>> EnumMetadata<NAME>::Canonicalizations() { \
  64. return {PAIR(NAME, __VA_ARGS__)}; \
  65. } \
  66. template <> \
  67. inline u32 EnumMetadata<NAME>::Index() { \
  68. return __COUNTER__; \
  69. }
  70. // AudioEngine must be specified discretely due to having existing but slightly different
  71. // canonicalizations
  72. // TODO (lat9nq): Remove explicit definition of AudioEngine/sink_id
  73. enum class AudioEngine : u32 {
  74. Auto,
  75. Cubeb,
  76. Sdl2,
  77. Null,
  78. Oboe,
  79. };
  80. template <>
  81. inline std::vector<std::pair<std::string, AudioEngine>>
  82. EnumMetadata<AudioEngine>::Canonicalizations() {
  83. return {
  84. {"auto", AudioEngine::Auto}, {"cubeb", AudioEngine::Cubeb}, {"sdl2", AudioEngine::Sdl2},
  85. {"null", AudioEngine::Null}, {"oboe", AudioEngine::Oboe},
  86. };
  87. }
  88. template <>
  89. inline u32 EnumMetadata<AudioEngine>::Index() {
  90. // This is just a sufficiently large number that is more than the number of other enums declared
  91. // here
  92. return 100;
  93. }
  94. ENUM(AudioMode, Mono, Stereo, Surround);
  95. ENUM(Language, Japanese, EnglishAmerican, French, German, Italian, Spanish, Chinese, Korean, Dutch,
  96. Portuguese, Russian, Taiwanese, EnglishBritish, FrenchCanadian, SpanishLatin,
  97. ChineseSimplified, ChineseTraditional, PortugueseBrazilian);
  98. ENUM(Region, Japan, Usa, Europe, Australia, China, Korea, Taiwan);
  99. ENUM(TimeZone, Auto, Default, Cet, Cst6Cdt, Cuba, Eet, Egypt, Eire, Est, Est5Edt, Gb, GbEire, Gmt,
  100. GmtPlusZero, GmtMinusZero, GmtZero, Greenwich, Hongkong, Hst, Iceland, Iran, Israel, Jamaica,
  101. Japan, Kwajalein, Libya, Met, Mst, Mst7Mdt, Navajo, Nz, NzChat, Poland, Portugal, Prc, Pst8Pdt,
  102. Roc, Rok, Singapore, Turkey, Uct, Universal, Utc, WSu, Wet, Zulu);
  103. ENUM(AnisotropyMode, Automatic, Default, X2, X4, X8, X16);
  104. ENUM(AstcDecodeMode, Cpu, Gpu, CpuAsynchronous);
  105. ENUM(AstcRecompression, Uncompressed, Bc1, Bc3);
  106. ENUM(VSyncMode, Immediate, Mailbox, Fifo, FifoRelaxed);
  107. ENUM(RendererBackend, OpenGL, Vulkan, Null);
  108. ENUM(ShaderBackend, Glsl, Glasm, SpirV);
  109. ENUM(GpuAccuracy, Normal, High, Extreme);
  110. ENUM(CpuBackend, Dynarmic, Nce);
  111. ENUM(CpuAccuracy, Auto, Accurate, Unsafe, Paranoid);
  112. ENUM(MemoryLayout, Memory_4Gb, Memory_6Gb, Memory_8Gb);
  113. ENUM(ConfirmStop, Ask_Always, Ask_Based_On_Game, Ask_Never);
  114. ENUM(FullscreenMode, Borderless, Exclusive);
  115. ENUM(NvdecEmulation, Off, Cpu, Gpu);
  116. ENUM(ResolutionSetup, Res1_2X, Res3_4X, Res1X, Res3_2X, Res2X, Res3X, Res4X, Res5X, Res6X, Res7X,
  117. Res8X);
  118. ENUM(ScalingFilter, NearestNeighbor, Bilinear, Bicubic, Gaussian, ScaleForce, Fsr, MaxEnum);
  119. ENUM(AntiAliasing, None, Fxaa, Smaa, MaxEnum);
  120. ENUM(AspectRatio, R16_9, R4_3, R21_9, R16_10, Stretch);
  121. ENUM(ConsoleMode, Handheld, Docked);
  122. template <typename Type>
  123. inline std::string CanonicalizeEnum(Type id) {
  124. const auto group = EnumMetadata<Type>::Canonicalizations();
  125. for (auto& [name, value] : group) {
  126. if (value == id) {
  127. return name;
  128. }
  129. }
  130. return "unknown";
  131. }
  132. template <typename Type>
  133. inline Type ToEnum(const std::string& canonicalization) {
  134. const auto group = EnumMetadata<Type>::Canonicalizations();
  135. for (auto& [name, value] : group) {
  136. if (name == canonicalization) {
  137. return value;
  138. }
  139. }
  140. return {};
  141. }
  142. } // namespace Settings
  143. #undef ENUM
  144. #undef PAIR
  145. #undef PAIR_1
  146. #undef PAIR_2
  147. #undef PAIR_3
  148. #undef PAIR_4
  149. #undef PAIR_5
  150. #undef PAIR_6
  151. #undef PAIR_7
  152. #undef PAIR_8
  153. #undef PAIR_9
  154. #undef PAIR_10
  155. #undef PAIR_12
  156. #undef PAIR_13
  157. #undef PAIR_14
  158. #undef PAIR_15
  159. #undef PAIR_16
  160. #undef PAIR_17
  161. #undef PAIR_18
  162. #undef PAIR_19
  163. #undef PAIR_20
  164. #undef PAIR_22
  165. #undef PAIR_23
  166. #undef PAIR_24
  167. #undef PAIR_25
  168. #undef PAIR_26
  169. #undef PAIR_27
  170. #undef PAIR_28
  171. #undef PAIR_29
  172. #undef PAIR_30
  173. #undef PAIR_32
  174. #undef PAIR_33
  175. #undef PAIR_34
  176. #undef PAIR_35
  177. #undef PAIR_36
  178. #undef PAIR_37
  179. #undef PAIR_38
  180. #undef PAIR_39
  181. #undef PAIR_40
  182. #undef PAIR_42
  183. #undef PAIR_43
  184. #undef PAIR_44
  185. #undef PAIR_45