diff options
Diffstat (limited to 'src/common')
| -rw-r--r-- | src/common/common_funcs.h | 23 | ||||
| -rw-r--r-- | src/common/intrusive_red_black_tree.h | 1 | ||||
| -rw-r--r-- | src/common/parent_of_member.h | 11 | ||||
| -rw-r--r-- | src/common/settings.cpp | 9 | ||||
| -rw-r--r-- | src/common/settings.h | 10 | ||||
| -rw-r--r-- | src/common/tree.h | 2 |
6 files changed, 42 insertions, 14 deletions
diff --git a/src/common/common_funcs.h b/src/common/common_funcs.h index 4ace2cd33..17d1ee86b 100644 --- a/src/common/common_funcs.h +++ b/src/common/common_funcs.h | |||
| @@ -108,6 +108,14 @@ __declspec(dllimport) void __stdcall DebugBreak(void); | |||
| 108 | } \ | 108 | } \ |
| 109 | } | 109 | } |
| 110 | 110 | ||
| 111 | #define YUZU_NON_COPYABLE(cls) \ | ||
| 112 | cls(const cls&) = delete; \ | ||
| 113 | cls& operator=(const cls&) = delete | ||
| 114 | |||
| 115 | #define YUZU_NON_MOVEABLE(cls) \ | ||
| 116 | cls(cls&&) = delete; \ | ||
| 117 | cls& operator=(cls&&) = delete | ||
| 118 | |||
| 111 | #define R_SUCCEEDED(res) (res.IsSuccess()) | 119 | #define R_SUCCEEDED(res) (res.IsSuccess()) |
| 112 | 120 | ||
| 113 | /// Evaluates an expression that returns a result, and returns the result if it would fail. | 121 | /// Evaluates an expression that returns a result, and returns the result if it would fail. |
| @@ -128,4 +136,19 @@ namespace Common { | |||
| 128 | return u32(a) | u32(b) << 8 | u32(c) << 16 | u32(d) << 24; | 136 | return u32(a) | u32(b) << 8 | u32(c) << 16 | u32(d) << 24; |
| 129 | } | 137 | } |
| 130 | 138 | ||
| 139 | // std::size() does not support zero-size C arrays. We're fixing that. | ||
| 140 | template <class C> | ||
| 141 | constexpr auto Size(const C& c) -> decltype(c.size()) { | ||
| 142 | return std::size(c); | ||
| 143 | } | ||
| 144 | |||
| 145 | template <class C> | ||
| 146 | constexpr std::size_t Size(const C& c) { | ||
| 147 | if constexpr (sizeof(C) == 0) { | ||
| 148 | return 0; | ||
| 149 | } else { | ||
| 150 | return std::size(c); | ||
| 151 | } | ||
| 152 | } | ||
| 153 | |||
| 131 | } // namespace Common | 154 | } // namespace Common |
diff --git a/src/common/intrusive_red_black_tree.h b/src/common/intrusive_red_black_tree.h index c0bbcd457..1f696fe80 100644 --- a/src/common/intrusive_red_black_tree.h +++ b/src/common/intrusive_red_black_tree.h | |||
| @@ -509,7 +509,6 @@ private: | |||
| 509 | 509 | ||
| 510 | private: | 510 | private: |
| 511 | static constexpr TypedStorage<Derived> DerivedStorage = {}; | 511 | static constexpr TypedStorage<Derived> DerivedStorage = {}; |
| 512 | static_assert(GetParent(GetNode(GetPointer(DerivedStorage))) == GetPointer(DerivedStorage)); | ||
| 513 | }; | 512 | }; |
| 514 | 513 | ||
| 515 | template <auto T, class Derived = impl::GetParentType<T>> | 514 | template <auto T, class Derived = impl::GetParentType<T>> |
diff --git a/src/common/parent_of_member.h b/src/common/parent_of_member.h index d9a14529d..58c70b0e7 100644 --- a/src/common/parent_of_member.h +++ b/src/common/parent_of_member.h | |||
| @@ -109,7 +109,8 @@ struct OffsetOfCalculator { | |||
| 109 | } | 109 | } |
| 110 | } | 110 | } |
| 111 | 111 | ||
| 112 | return (next - start) * sizeof(MemberType) + Offset; | 112 | return static_cast<ptrdiff_t>(static_cast<size_t>(next - start) * sizeof(MemberType) + |
| 113 | Offset); | ||
| 113 | } | 114 | } |
| 114 | 115 | ||
| 115 | static constexpr std::ptrdiff_t OffsetOf(MemberType ParentType::*member) { | 116 | static constexpr std::ptrdiff_t OffsetOf(MemberType ParentType::*member) { |
| @@ -133,27 +134,27 @@ template <auto MemberPtr> | |||
| 133 | using GetMemberType = typename GetMemberPointerTraits<decltype(MemberPtr)>::Member; | 134 | using GetMemberType = typename GetMemberPointerTraits<decltype(MemberPtr)>::Member; |
| 134 | 135 | ||
| 135 | template <auto MemberPtr, typename RealParentType = GetParentType<MemberPtr>> | 136 | template <auto MemberPtr, typename RealParentType = GetParentType<MemberPtr>> |
| 136 | static inline std::ptrdiff_t OffsetOf = [] { | 137 | constexpr std::ptrdiff_t OffsetOf() { |
| 137 | using DeducedParentType = GetParentType<MemberPtr>; | 138 | using DeducedParentType = GetParentType<MemberPtr>; |
| 138 | using MemberType = GetMemberType<MemberPtr>; | 139 | using MemberType = GetMemberType<MemberPtr>; |
| 139 | static_assert(std::is_base_of<DeducedParentType, RealParentType>::value || | 140 | static_assert(std::is_base_of<DeducedParentType, RealParentType>::value || |
| 140 | std::is_same<RealParentType, DeducedParentType>::value); | 141 | std::is_same<RealParentType, DeducedParentType>::value); |
| 141 | 142 | ||
| 142 | return OffsetOfCalculator<RealParentType, MemberType>::OffsetOf(MemberPtr); | 143 | return OffsetOfCalculator<RealParentType, MemberType>::OffsetOf(MemberPtr); |
| 143 | }(); | 144 | }; |
| 144 | 145 | ||
| 145 | } // namespace impl | 146 | } // namespace impl |
| 146 | 147 | ||
| 147 | template <auto MemberPtr, typename RealParentType = impl::GetParentType<MemberPtr>> | 148 | template <auto MemberPtr, typename RealParentType = impl::GetParentType<MemberPtr>> |
| 148 | constexpr RealParentType& GetParentReference(impl::GetMemberType<MemberPtr>* member) { | 149 | constexpr RealParentType& GetParentReference(impl::GetMemberType<MemberPtr>* member) { |
| 149 | std::ptrdiff_t Offset = impl::OffsetOf<MemberPtr, RealParentType>; | 150 | std::ptrdiff_t Offset = impl::OffsetOf<MemberPtr, RealParentType>(); |
| 150 | return *static_cast<RealParentType*>( | 151 | return *static_cast<RealParentType*>( |
| 151 | static_cast<void*>(static_cast<uint8_t*>(static_cast<void*>(member)) - Offset)); | 152 | static_cast<void*>(static_cast<uint8_t*>(static_cast<void*>(member)) - Offset)); |
| 152 | } | 153 | } |
| 153 | 154 | ||
| 154 | template <auto MemberPtr, typename RealParentType = impl::GetParentType<MemberPtr>> | 155 | template <auto MemberPtr, typename RealParentType = impl::GetParentType<MemberPtr>> |
| 155 | constexpr RealParentType const& GetParentReference(impl::GetMemberType<MemberPtr> const* member) { | 156 | constexpr RealParentType const& GetParentReference(impl::GetMemberType<MemberPtr> const* member) { |
| 156 | std::ptrdiff_t Offset = impl::OffsetOf<MemberPtr, RealParentType>; | 157 | std::ptrdiff_t Offset = impl::OffsetOf<MemberPtr, RealParentType>(); |
| 157 | return *static_cast<const RealParentType*>(static_cast<const void*>( | 158 | return *static_cast<const RealParentType*>(static_cast<const void*>( |
| 158 | static_cast<const uint8_t*>(static_cast<const void*>(member)) - Offset)); | 159 | static_cast<const uint8_t*>(static_cast<const void*>(member)) - Offset)); |
| 159 | } | 160 | } |
diff --git a/src/common/settings.cpp b/src/common/settings.cpp index 702b6598d..e29cbf506 100644 --- a/src/common/settings.cpp +++ b/src/common/settings.cpp | |||
| @@ -42,7 +42,7 @@ void LogSettings() { | |||
| 42 | log_setting("System_RegionIndex", values.region_index.GetValue()); | 42 | log_setting("System_RegionIndex", values.region_index.GetValue()); |
| 43 | log_setting("System_TimeZoneIndex", values.time_zone_index.GetValue()); | 43 | log_setting("System_TimeZoneIndex", values.time_zone_index.GetValue()); |
| 44 | log_setting("Core_UseMultiCore", values.use_multi_core.GetValue()); | 44 | log_setting("Core_UseMultiCore", values.use_multi_core.GetValue()); |
| 45 | log_setting("CPU_Accuracy", values.cpu_accuracy); | 45 | log_setting("CPU_Accuracy", values.cpu_accuracy.GetValue()); |
| 46 | log_setting("Renderer_UseResolutionFactor", values.resolution_factor.GetValue()); | 46 | log_setting("Renderer_UseResolutionFactor", values.resolution_factor.GetValue()); |
| 47 | log_setting("Renderer_UseFrameLimit", values.use_frame_limit.GetValue()); | 47 | log_setting("Renderer_UseFrameLimit", values.use_frame_limit.GetValue()); |
| 48 | log_setting("Renderer_FrameLimit", values.frame_limit.GetValue()); | 48 | log_setting("Renderer_FrameLimit", values.frame_limit.GetValue()); |
| @@ -106,6 +106,12 @@ void RestoreGlobalState(bool is_powered_on) { | |||
| 106 | // Core | 106 | // Core |
| 107 | values.use_multi_core.SetGlobal(true); | 107 | values.use_multi_core.SetGlobal(true); |
| 108 | 108 | ||
| 109 | // CPU | ||
| 110 | values.cpu_accuracy.SetGlobal(true); | ||
| 111 | values.cpuopt_unsafe_unfuse_fma.SetGlobal(true); | ||
| 112 | values.cpuopt_unsafe_reduce_fp_error.SetGlobal(true); | ||
| 113 | values.cpuopt_unsafe_inaccurate_nan.SetGlobal(true); | ||
| 114 | |||
| 109 | // Renderer | 115 | // Renderer |
| 110 | values.renderer_backend.SetGlobal(true); | 116 | values.renderer_backend.SetGlobal(true); |
| 111 | values.vulkan_device.SetGlobal(true); | 117 | values.vulkan_device.SetGlobal(true); |
| @@ -130,7 +136,6 @@ void RestoreGlobalState(bool is_powered_on) { | |||
| 130 | values.region_index.SetGlobal(true); | 136 | values.region_index.SetGlobal(true); |
| 131 | values.time_zone_index.SetGlobal(true); | 137 | values.time_zone_index.SetGlobal(true); |
| 132 | values.rng_seed.SetGlobal(true); | 138 | values.rng_seed.SetGlobal(true); |
| 133 | values.custom_rtc.SetGlobal(true); | ||
| 134 | values.sound_index.SetGlobal(true); | 139 | values.sound_index.SetGlobal(true); |
| 135 | 140 | ||
| 136 | // Controls | 141 | // Controls |
diff --git a/src/common/settings.h b/src/common/settings.h index d39b4aa45..48085b9a9 100644 --- a/src/common/settings.h +++ b/src/common/settings.h | |||
| @@ -115,7 +115,7 @@ struct Values { | |||
| 115 | Setting<bool> use_multi_core; | 115 | Setting<bool> use_multi_core; |
| 116 | 116 | ||
| 117 | // Cpu | 117 | // Cpu |
| 118 | CPUAccuracy cpu_accuracy; | 118 | Setting<CPUAccuracy> cpu_accuracy; |
| 119 | 119 | ||
| 120 | bool cpuopt_page_tables; | 120 | bool cpuopt_page_tables; |
| 121 | bool cpuopt_block_linking; | 121 | bool cpuopt_block_linking; |
| @@ -126,9 +126,9 @@ struct Values { | |||
| 126 | bool cpuopt_misc_ir; | 126 | bool cpuopt_misc_ir; |
| 127 | bool cpuopt_reduce_misalign_checks; | 127 | bool cpuopt_reduce_misalign_checks; |
| 128 | 128 | ||
| 129 | bool cpuopt_unsafe_unfuse_fma; | 129 | Setting<bool> cpuopt_unsafe_unfuse_fma; |
| 130 | bool cpuopt_unsafe_reduce_fp_error; | 130 | Setting<bool> cpuopt_unsafe_reduce_fp_error; |
| 131 | bool cpuopt_unsafe_inaccurate_nan; | 131 | Setting<bool> cpuopt_unsafe_inaccurate_nan; |
| 132 | 132 | ||
| 133 | // Renderer | 133 | // Renderer |
| 134 | Setting<RendererBackend> renderer_backend; | 134 | Setting<RendererBackend> renderer_backend; |
| @@ -157,7 +157,7 @@ struct Values { | |||
| 157 | // System | 157 | // System |
| 158 | Setting<std::optional<u32>> rng_seed; | 158 | Setting<std::optional<u32>> rng_seed; |
| 159 | // Measured in seconds since epoch | 159 | // Measured in seconds since epoch |
| 160 | Setting<std::optional<std::chrono::seconds>> custom_rtc; | 160 | std::optional<std::chrono::seconds> custom_rtc; |
| 161 | // Set on game boot, reset on stop. Seconds difference between current time and `custom_rtc` | 161 | // Set on game boot, reset on stop. Seconds difference between current time and `custom_rtc` |
| 162 | std::chrono::seconds custom_rtc_differential; | 162 | std::chrono::seconds custom_rtc_differential; |
| 163 | 163 | ||
diff --git a/src/common/tree.h b/src/common/tree.h index 3da49e422..9d2d0df4e 100644 --- a/src/common/tree.h +++ b/src/common/tree.h | |||
| @@ -322,7 +322,7 @@ void RB_INSERT_COLOR(RBHead<Node>* head, Node* elm) { | |||
| 322 | template <typename Node> | 322 | template <typename Node> |
| 323 | void RB_REMOVE_COLOR(RBHead<Node>* head, Node* parent, Node* elm) { | 323 | void RB_REMOVE_COLOR(RBHead<Node>* head, Node* parent, Node* elm) { |
| 324 | Node* tmp; | 324 | Node* tmp; |
| 325 | while ((elm == nullptr || RB_IS_BLACK(elm)) && elm != head->Root()) { | 325 | while ((elm == nullptr || RB_IS_BLACK(elm)) && elm != head->Root() && parent != nullptr) { |
| 326 | if (RB_LEFT(parent) == elm) { | 326 | if (RB_LEFT(parent) == elm) { |
| 327 | tmp = RB_RIGHT(parent); | 327 | tmp = RB_RIGHT(parent); |
| 328 | if (RB_IS_RED(tmp)) { | 328 | if (RB_IS_RED(tmp)) { |