diff options
38 files changed, 155 insertions, 193 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index 957df54f5..b625743ea 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt | |||
| @@ -541,9 +541,9 @@ add_definitions(-DBOOST_ERROR_CODE_HEADER_ONLY | |||
| 541 | # Adjustments for MSVC + Ninja | 541 | # Adjustments for MSVC + Ninja |
| 542 | if (MSVC AND CMAKE_GENERATOR STREQUAL "Ninja") | 542 | if (MSVC AND CMAKE_GENERATOR STREQUAL "Ninja") |
| 543 | add_compile_options( | 543 | add_compile_options( |
| 544 | /wd4711 # function 'function' selected for automatic inline expansion | ||
| 545 | /wd4464 # relative include path contains '..' | 544 | /wd4464 # relative include path contains '..' |
| 546 | /wd4820 # 'identifier1': '4' bytes padding added after data member 'identifier2' | 545 | /wd4711 # function 'function' selected for automatic inline expansion |
| 546 | /wd4820 # 'bytes' bytes padding added after construct 'member_name' | ||
| 547 | ) | 547 | ) |
| 548 | endif() | 548 | endif() |
| 549 | 549 | ||
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 3575a3cb3..0ac3d254e 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt | |||
| @@ -58,13 +58,11 @@ if (MSVC) | |||
| 58 | 58 | ||
| 59 | # Warnings | 59 | # Warnings |
| 60 | /W3 | 60 | /W3 |
| 61 | /we4018 # 'expression': signed/unsigned mismatch | 61 | /WX |
| 62 | |||
| 62 | /we4062 # Enumerator 'identifier' in a switch of enum 'enumeration' is not handled | 63 | /we4062 # Enumerator 'identifier' in a switch of enum 'enumeration' is not handled |
| 63 | /we4101 # 'identifier': unreferenced local variable | ||
| 64 | /we4189 # 'identifier': local variable is initialized but not referenced | 64 | /we4189 # 'identifier': local variable is initialized but not referenced |
| 65 | /we4265 # 'class': class has virtual functions, but destructor is not virtual | 65 | /we4265 # 'class': class has virtual functions, but destructor is not virtual |
| 66 | /we4267 # 'var': conversion from 'size_t' to 'type', possible loss of data | ||
| 67 | /we4305 # 'context': truncation from 'type1' to 'type2' | ||
| 68 | /we4388 # 'expression': signed/unsigned mismatch | 66 | /we4388 # 'expression': signed/unsigned mismatch |
| 69 | /we4389 # 'operator': signed/unsigned mismatch | 67 | /we4389 # 'operator': signed/unsigned mismatch |
| 70 | /we4456 # Declaration of 'identifier' hides previous local declaration | 68 | /we4456 # Declaration of 'identifier' hides previous local declaration |
| @@ -75,10 +73,13 @@ if (MSVC) | |||
| 75 | /we4547 # 'operator': operator before comma has no effect; expected operator with side-effect | 73 | /we4547 # 'operator': operator before comma has no effect; expected operator with side-effect |
| 76 | /we4549 # 'operator1': operator before comma has no effect; did you intend 'operator2'? | 74 | /we4549 # 'operator1': operator before comma has no effect; did you intend 'operator2'? |
| 77 | /we4555 # Expression has no effect; expected expression with side-effect | 75 | /we4555 # Expression has no effect; expected expression with side-effect |
| 78 | /we4715 # 'function': not all control paths return a value | 76 | /we4826 # Conversion from 'type1' to 'type2' is sign-extended. This may cause unexpected runtime behavior. |
| 79 | /we4834 # Discarding return value of function with 'nodiscard' attribute | ||
| 80 | /we5038 # data member 'member1' will be initialized after data member 'member2' | 77 | /we5038 # data member 'member1' will be initialized after data member 'member2' |
| 78 | /we5233 # explicit lambda capture 'identifier' is not used | ||
| 81 | /we5245 # 'function': unreferenced function with internal linkage has been removed | 79 | /we5245 # 'function': unreferenced function with internal linkage has been removed |
| 80 | |||
| 81 | /wd4100 # 'identifier': unreferenced formal parameter | ||
| 82 | /wd4324 # 'struct_name': structure was padded due to __declspec(align()) | ||
| 82 | ) | 83 | ) |
| 83 | 84 | ||
| 84 | if (USE_CCACHE) | 85 | if (USE_CCACHE) |
| @@ -99,24 +100,18 @@ if (MSVC) | |||
| 99 | set(CMAKE_EXE_LINKER_FLAGS_RELEASE "/DEBUG /MANIFEST:NO /INCREMENTAL:NO /OPT:REF,ICF" CACHE STRING "" FORCE) | 100 | set(CMAKE_EXE_LINKER_FLAGS_RELEASE "/DEBUG /MANIFEST:NO /INCREMENTAL:NO /OPT:REF,ICF" CACHE STRING "" FORCE) |
| 100 | else() | 101 | else() |
| 101 | add_compile_options( | 102 | add_compile_options( |
| 102 | -Wall | 103 | -Werror=all |
| 103 | -Werror=array-bounds | 104 | -Werror=extra |
| 104 | -Werror=implicit-fallthrough | ||
| 105 | -Werror=missing-declarations | 105 | -Werror=missing-declarations |
| 106 | -Werror=missing-field-initializers | ||
| 107 | -Werror=reorder | ||
| 108 | -Werror=shadow | 106 | -Werror=shadow |
| 109 | -Werror=sign-compare | 107 | -Werror=unused |
| 110 | -Werror=switch | 108 | |
| 111 | -Werror=uninitialized | ||
| 112 | -Werror=unused-function | ||
| 113 | -Werror=unused-result | ||
| 114 | -Werror=unused-variable | ||
| 115 | -Wextra | ||
| 116 | -Wmissing-declarations | ||
| 117 | -Wno-attributes | 109 | -Wno-attributes |
| 118 | -Wno-invalid-offsetof | 110 | -Wno-invalid-offsetof |
| 119 | -Wno-unused-parameter | 111 | -Wno-unused-parameter |
| 112 | |||
| 113 | $<$<CXX_COMPILER_ID:Clang>:-Wno-braced-scalar-init> | ||
| 114 | $<$<CXX_COMPILER_ID:Clang>:-Wno-unused-private-field> | ||
| 120 | ) | 115 | ) |
| 121 | 116 | ||
| 122 | if (ARCHITECTURE_x86_64) | 117 | if (ARCHITECTURE_x86_64) |
diff --git a/src/audio_core/CMakeLists.txt b/src/audio_core/CMakeLists.txt index 144f1bab2..0a1f3bf18 100644 --- a/src/audio_core/CMakeLists.txt +++ b/src/audio_core/CMakeLists.txt | |||
| @@ -206,20 +206,11 @@ if (MSVC) | |||
| 206 | /we4244 # 'conversion': conversion from 'type1' to 'type2', possible loss of data | 206 | /we4244 # 'conversion': conversion from 'type1' to 'type2', possible loss of data |
| 207 | /we4245 # 'conversion': conversion from 'type1' to 'type2', signed/unsigned mismatch | 207 | /we4245 # 'conversion': conversion from 'type1' to 'type2', signed/unsigned mismatch |
| 208 | /we4254 # 'operator': conversion from 'type1:field_bits' to 'type2:field_bits', possible loss of data | 208 | /we4254 # 'operator': conversion from 'type1:field_bits' to 'type2:field_bits', possible loss of data |
| 209 | /we4456 # Declaration of 'identifier' hides previous local declaration | 209 | /we4800 # Implicit conversion from 'type' to bool. Possible information loss |
| 210 | /we4457 # Declaration of 'identifier' hides function parameter | ||
| 211 | /we4458 # Declaration of 'identifier' hides class member | ||
| 212 | /we4459 # Declaration of 'identifier' hides global declaration | ||
| 213 | ) | 210 | ) |
| 214 | else() | 211 | else() |
| 215 | target_compile_options(audio_core PRIVATE | 212 | target_compile_options(audio_core PRIVATE |
| 216 | -Werror=conversion | 213 | -Werror=conversion |
| 217 | -Werror=ignored-qualifiers | ||
| 218 | -Werror=shadow | ||
| 219 | -Werror=unused-variable | ||
| 220 | |||
| 221 | $<$<CXX_COMPILER_ID:GNU>:-Werror=unused-but-set-parameter> | ||
| 222 | $<$<CXX_COMPILER_ID:GNU>:-Werror=unused-but-set-variable> | ||
| 223 | 214 | ||
| 224 | -Wno-sign-conversion | 215 | -Wno-sign-conversion |
| 225 | ) | 216 | ) |
diff --git a/src/audio_core/renderer/behavior/info_updater.cpp b/src/audio_core/renderer/behavior/info_updater.cpp index c0a307b89..574cf0982 100644 --- a/src/audio_core/renderer/behavior/info_updater.cpp +++ b/src/audio_core/renderer/behavior/info_updater.cpp | |||
| @@ -91,7 +91,7 @@ Result InfoUpdater::UpdateVoices(VoiceContext& voice_context, | |||
| 91 | voice_info.Initialize(); | 91 | voice_info.Initialize(); |
| 92 | 92 | ||
| 93 | for (u32 channel = 0; channel < in_param.channel_count; channel++) { | 93 | for (u32 channel = 0; channel < in_param.channel_count; channel++) { |
| 94 | std::memset(voice_states[channel], 0, sizeof(VoiceState)); | 94 | *voice_states[channel] = {}; |
| 95 | } | 95 | } |
| 96 | } | 96 | } |
| 97 | 97 | ||
diff --git a/src/audio_core/renderer/command/effect/biquad_filter.cpp b/src/audio_core/renderer/command/effect/biquad_filter.cpp index 1baae74fd..edb30ce72 100644 --- a/src/audio_core/renderer/command/effect/biquad_filter.cpp +++ b/src/audio_core/renderer/command/effect/biquad_filter.cpp | |||
| @@ -94,7 +94,7 @@ void BiquadFilterCommand::Dump([[maybe_unused]] const ADSP::CommandListProcessor | |||
| 94 | void BiquadFilterCommand::Process(const ADSP::CommandListProcessor& processor) { | 94 | void BiquadFilterCommand::Process(const ADSP::CommandListProcessor& processor) { |
| 95 | auto state_{reinterpret_cast<VoiceState::BiquadFilterState*>(state)}; | 95 | auto state_{reinterpret_cast<VoiceState::BiquadFilterState*>(state)}; |
| 96 | if (needs_init) { | 96 | if (needs_init) { |
| 97 | std::memset(state_, 0, sizeof(VoiceState::BiquadFilterState)); | 97 | *state_ = {}; |
| 98 | } | 98 | } |
| 99 | 99 | ||
| 100 | auto input_buffer{ | 100 | auto input_buffer{ |
diff --git a/src/audio_core/renderer/command/effect/multi_tap_biquad_filter.cpp b/src/audio_core/renderer/command/effect/multi_tap_biquad_filter.cpp index b3c3ba4ba..48a7cba8a 100644 --- a/src/audio_core/renderer/command/effect/multi_tap_biquad_filter.cpp +++ b/src/audio_core/renderer/command/effect/multi_tap_biquad_filter.cpp | |||
| @@ -30,7 +30,7 @@ void MultiTapBiquadFilterCommand::Process(const ADSP::CommandListProcessor& proc | |||
| 30 | for (u32 i = 0; i < filter_tap_count; i++) { | 30 | for (u32 i = 0; i < filter_tap_count; i++) { |
| 31 | auto state{reinterpret_cast<VoiceState::BiquadFilterState*>(states[i])}; | 31 | auto state{reinterpret_cast<VoiceState::BiquadFilterState*>(states[i])}; |
| 32 | if (needs_init[i]) { | 32 | if (needs_init[i]) { |
| 33 | std::memset(state, 0, sizeof(VoiceState::BiquadFilterState)); | 33 | *state = {}; |
| 34 | } | 34 | } |
| 35 | 35 | ||
| 36 | ApplyBiquadFilterFloat(output_buffer, input_buffer, biquads[i].b, biquads[i].a, *state, | 36 | ApplyBiquadFilterFloat(output_buffer, input_buffer, biquads[i].b, biquads[i].a, *state, |
diff --git a/src/common/CMakeLists.txt b/src/common/CMakeLists.txt index 46cf75fde..c0555f840 100644 --- a/src/common/CMakeLists.txt +++ b/src/common/CMakeLists.txt | |||
| @@ -156,12 +156,13 @@ if (MSVC) | |||
| 156 | ) | 156 | ) |
| 157 | target_compile_options(common PRIVATE | 157 | target_compile_options(common PRIVATE |
| 158 | /W4 | 158 | /W4 |
| 159 | /WX | 159 | |
| 160 | /we4242 # 'identifier': conversion from 'type1' to 'type2', possible loss of data | ||
| 161 | /we4254 # 'operator': conversion from 'type1:field_bits' to 'type2:field_bits', possible loss of data | ||
| 162 | /we4800 # Implicit conversion from 'type' to bool. Possible information loss | ||
| 160 | ) | 163 | ) |
| 161 | else() | 164 | else() |
| 162 | target_compile_options(common PRIVATE | 165 | target_compile_options(common PRIVATE |
| 163 | -Werror | ||
| 164 | |||
| 165 | $<$<CXX_COMPILER_ID:Clang>:-fsized-deallocation> | 166 | $<$<CXX_COMPILER_ID:Clang>:-fsized-deallocation> |
| 166 | ) | 167 | ) |
| 167 | endif() | 168 | endif() |
diff --git a/src/common/bit_field.h b/src/common/bit_field.h index 7e1df62b1..e4e58ea45 100644 --- a/src/common/bit_field.h +++ b/src/common/bit_field.h | |||
| @@ -141,10 +141,6 @@ public: | |||
| 141 | constexpr BitField(BitField&&) noexcept = default; | 141 | constexpr BitField(BitField&&) noexcept = default; |
| 142 | constexpr BitField& operator=(BitField&&) noexcept = default; | 142 | constexpr BitField& operator=(BitField&&) noexcept = default; |
| 143 | 143 | ||
| 144 | [[nodiscard]] constexpr operator T() const { | ||
| 145 | return Value(); | ||
| 146 | } | ||
| 147 | |||
| 148 | constexpr void Assign(const T& value) { | 144 | constexpr void Assign(const T& value) { |
| 149 | #ifdef _MSC_VER | 145 | #ifdef _MSC_VER |
| 150 | storage = static_cast<StorageType>((storage & ~mask) | FormatValue(value)); | 146 | storage = static_cast<StorageType>((storage & ~mask) | FormatValue(value)); |
| @@ -162,6 +158,17 @@ public: | |||
| 162 | return ExtractValue(storage); | 158 | return ExtractValue(storage); |
| 163 | } | 159 | } |
| 164 | 160 | ||
| 161 | template <typename ConvertedToType> | ||
| 162 | [[nodiscard]] constexpr ConvertedToType As() const { | ||
| 163 | static_assert(!std::is_same_v<T, ConvertedToType>, | ||
| 164 | "Unnecessary cast. Use Value() instead."); | ||
| 165 | return static_cast<ConvertedToType>(Value()); | ||
| 166 | } | ||
| 167 | |||
| 168 | [[nodiscard]] constexpr operator T() const { | ||
| 169 | return Value(); | ||
| 170 | } | ||
| 171 | |||
| 165 | [[nodiscard]] constexpr explicit operator bool() const { | 172 | [[nodiscard]] constexpr explicit operator bool() const { |
| 166 | return Value() != 0; | 173 | return Value() != 0; |
| 167 | } | 174 | } |
diff --git a/src/common/bounded_threadsafe_queue.h b/src/common/bounded_threadsafe_queue.h index 7e465549b..21217801e 100644 --- a/src/common/bounded_threadsafe_queue.h +++ b/src/common/bounded_threadsafe_queue.h | |||
| @@ -21,11 +21,6 @@ constexpr size_t hardware_interference_size = std::hardware_destructive_interfer | |||
| 21 | constexpr size_t hardware_interference_size = 64; | 21 | constexpr size_t hardware_interference_size = 64; |
| 22 | #endif | 22 | #endif |
| 23 | 23 | ||
| 24 | #ifdef _MSC_VER | ||
| 25 | #pragma warning(push) | ||
| 26 | #pragma warning(disable : 4324) | ||
| 27 | #endif | ||
| 28 | |||
| 29 | template <typename T, size_t capacity = 0x400> | 24 | template <typename T, size_t capacity = 0x400> |
| 30 | class MPSCQueue { | 25 | class MPSCQueue { |
| 31 | public: | 26 | public: |
| @@ -160,8 +155,4 @@ private: | |||
| 160 | static_assert(std::is_nothrow_destructible_v<T>, "T must be nothrow destructible"); | 155 | static_assert(std::is_nothrow_destructible_v<T>, "T must be nothrow destructible"); |
| 161 | }; | 156 | }; |
| 162 | 157 | ||
| 163 | #ifdef _MSC_VER | ||
| 164 | #pragma warning(pop) | ||
| 165 | #endif | ||
| 166 | |||
| 167 | } // namespace Common | 158 | } // namespace Common |
diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt index 055bea641..113e663b5 100644 --- a/src/core/CMakeLists.txt +++ b/src/core/CMakeLists.txt | |||
| @@ -774,19 +774,15 @@ if (MSVC) | |||
| 774 | /we4244 # 'conversion': conversion from 'type1' to 'type2', possible loss of data | 774 | /we4244 # 'conversion': conversion from 'type1' to 'type2', possible loss of data |
| 775 | /we4245 # 'conversion': conversion from 'type1' to 'type2', signed/unsigned mismatch | 775 | /we4245 # 'conversion': conversion from 'type1' to 'type2', signed/unsigned mismatch |
| 776 | /we4254 # 'operator': conversion from 'type1:field_bits' to 'type2:field_bits', possible loss of data | 776 | /we4254 # 'operator': conversion from 'type1:field_bits' to 'type2:field_bits', possible loss of data |
| 777 | /we4800 # Implicit conversion from 'type' to bool. Possible information loss | ||
| 777 | ) | 778 | ) |
| 778 | else() | 779 | else() |
| 779 | target_compile_options(core PRIVATE | 780 | target_compile_options(core PRIVATE |
| 780 | -Werror=conversion | 781 | -Werror=conversion |
| 781 | -Werror=ignored-qualifiers | ||
| 782 | 782 | ||
| 783 | $<$<CXX_COMPILER_ID:GNU>:-Werror=class-memaccess> | 783 | -Wno-sign-conversion |
| 784 | $<$<CXX_COMPILER_ID:GNU>:-Werror=unused-but-set-parameter> | ||
| 785 | $<$<CXX_COMPILER_ID:GNU>:-Werror=unused-but-set-variable> | ||
| 786 | 784 | ||
| 787 | $<$<CXX_COMPILER_ID:Clang>:-fsized-deallocation> | 785 | $<$<CXX_COMPILER_ID:Clang>:-fsized-deallocation> |
| 788 | |||
| 789 | -Wno-sign-conversion | ||
| 790 | ) | 786 | ) |
| 791 | endif() | 787 | endif() |
| 792 | 788 | ||
diff --git a/src/core/file_sys/card_image.cpp b/src/core/file_sys/card_image.cpp index f23d9373b..5d02865f4 100644 --- a/src/core/file_sys/card_image.cpp +++ b/src/core/file_sys/card_image.cpp | |||
| @@ -232,8 +232,8 @@ const std::vector<std::shared_ptr<NCA>>& XCI::GetNCAs() const { | |||
| 232 | 232 | ||
| 233 | std::shared_ptr<NCA> XCI::GetNCAByType(NCAContentType type) const { | 233 | std::shared_ptr<NCA> XCI::GetNCAByType(NCAContentType type) const { |
| 234 | const auto program_id = secure_partition->GetProgramTitleID(); | 234 | const auto program_id = secure_partition->GetProgramTitleID(); |
| 235 | const auto iter = std::find_if( | 235 | const auto iter = |
| 236 | ncas.begin(), ncas.end(), [this, type, program_id](const std::shared_ptr<NCA>& nca) { | 236 | std::find_if(ncas.begin(), ncas.end(), [type, program_id](const std::shared_ptr<NCA>& nca) { |
| 237 | return nca->GetType() == type && nca->GetTitleId() == program_id; | 237 | return nca->GetType() == type && nca->GetTitleId() == program_id; |
| 238 | }); | 238 | }); |
| 239 | return iter == ncas.end() ? nullptr : *iter; | 239 | return iter == ncas.end() ? nullptr : *iter; |
diff --git a/src/core/file_sys/program_metadata.cpp b/src/core/file_sys/program_metadata.cpp index 08d489eab..f00479bd3 100644 --- a/src/core/file_sys/program_metadata.cpp +++ b/src/core/file_sys/program_metadata.cpp | |||
| @@ -127,7 +127,7 @@ void ProgramMetadata::LoadManual(bool is_64_bit, ProgramAddressSpaceType address | |||
| 127 | } | 127 | } |
| 128 | 128 | ||
| 129 | bool ProgramMetadata::Is64BitProgram() const { | 129 | bool ProgramMetadata::Is64BitProgram() const { |
| 130 | return npdm_header.has_64_bit_instructions; | 130 | return npdm_header.has_64_bit_instructions.As<bool>(); |
| 131 | } | 131 | } |
| 132 | 132 | ||
| 133 | ProgramAddressSpaceType ProgramMetadata::GetAddressSpaceType() const { | 133 | ProgramAddressSpaceType ProgramMetadata::GetAddressSpaceType() const { |
diff --git a/src/core/hid/emulated_controller.cpp b/src/core/hid/emulated_controller.cpp index 025f1c78e..57eff72fe 100644 --- a/src/core/hid/emulated_controller.cpp +++ b/src/core/hid/emulated_controller.cpp | |||
| @@ -1158,27 +1158,27 @@ bool EmulatedController::IsControllerSupported(bool use_temporary_value) const { | |||
| 1158 | const auto type = is_configuring && use_temporary_value ? tmp_npad_type : npad_type; | 1158 | const auto type = is_configuring && use_temporary_value ? tmp_npad_type : npad_type; |
| 1159 | switch (type) { | 1159 | switch (type) { |
| 1160 | case NpadStyleIndex::ProController: | 1160 | case NpadStyleIndex::ProController: |
| 1161 | return supported_style_tag.fullkey; | 1161 | return supported_style_tag.fullkey.As<bool>(); |
| 1162 | case NpadStyleIndex::Handheld: | 1162 | case NpadStyleIndex::Handheld: |
| 1163 | return supported_style_tag.handheld; | 1163 | return supported_style_tag.handheld.As<bool>(); |
| 1164 | case NpadStyleIndex::JoyconDual: | 1164 | case NpadStyleIndex::JoyconDual: |
| 1165 | return supported_style_tag.joycon_dual; | 1165 | return supported_style_tag.joycon_dual.As<bool>(); |
| 1166 | case NpadStyleIndex::JoyconLeft: | 1166 | case NpadStyleIndex::JoyconLeft: |
| 1167 | return supported_style_tag.joycon_left; | 1167 | return supported_style_tag.joycon_left.As<bool>(); |
| 1168 | case NpadStyleIndex::JoyconRight: | 1168 | case NpadStyleIndex::JoyconRight: |
| 1169 | return supported_style_tag.joycon_right; | 1169 | return supported_style_tag.joycon_right.As<bool>(); |
| 1170 | case NpadStyleIndex::GameCube: | 1170 | case NpadStyleIndex::GameCube: |
| 1171 | return supported_style_tag.gamecube; | 1171 | return supported_style_tag.gamecube.As<bool>(); |
| 1172 | case NpadStyleIndex::Pokeball: | 1172 | case NpadStyleIndex::Pokeball: |
| 1173 | return supported_style_tag.palma; | 1173 | return supported_style_tag.palma.As<bool>(); |
| 1174 | case NpadStyleIndex::NES: | 1174 | case NpadStyleIndex::NES: |
| 1175 | return supported_style_tag.lark; | 1175 | return supported_style_tag.lark.As<bool>(); |
| 1176 | case NpadStyleIndex::SNES: | 1176 | case NpadStyleIndex::SNES: |
| 1177 | return supported_style_tag.lucia; | 1177 | return supported_style_tag.lucia.As<bool>(); |
| 1178 | case NpadStyleIndex::N64: | 1178 | case NpadStyleIndex::N64: |
| 1179 | return supported_style_tag.lagoon; | 1179 | return supported_style_tag.lagoon.As<bool>(); |
| 1180 | case NpadStyleIndex::SegaGenesis: | 1180 | case NpadStyleIndex::SegaGenesis: |
| 1181 | return supported_style_tag.lager; | 1181 | return supported_style_tag.lager.As<bool>(); |
| 1182 | default: | 1182 | default: |
| 1183 | return false; | 1183 | return false; |
| 1184 | } | 1184 | } |
diff --git a/src/core/hle/ipc_helpers.h b/src/core/hle/ipc_helpers.h index aa27be767..18fde8bd6 100644 --- a/src/core/hle/ipc_helpers.h +++ b/src/core/hle/ipc_helpers.h | |||
| @@ -406,7 +406,7 @@ inline s32 RequestParser::Pop() { | |||
| 406 | } | 406 | } |
| 407 | 407 | ||
| 408 | // Ignore the -Wclass-memaccess warning on memcpy for non-trivially default constructible objects. | 408 | // Ignore the -Wclass-memaccess warning on memcpy for non-trivially default constructible objects. |
| 409 | #if defined(__GNUC__) | 409 | #if defined(__GNUC__) && !defined(__clang__) && !defined(__INTEL_COMPILER) |
| 410 | #pragma GCC diagnostic push | 410 | #pragma GCC diagnostic push |
| 411 | #pragma GCC diagnostic ignored "-Wclass-memaccess" | 411 | #pragma GCC diagnostic ignored "-Wclass-memaccess" |
| 412 | #endif | 412 | #endif |
| @@ -417,7 +417,7 @@ void RequestParser::PopRaw(T& value) { | |||
| 417 | std::memcpy(&value, cmdbuf + index, sizeof(T)); | 417 | std::memcpy(&value, cmdbuf + index, sizeof(T)); |
| 418 | index += (sizeof(T) + 3) / 4; // round up to word length | 418 | index += (sizeof(T) + 3) / 4; // round up to word length |
| 419 | } | 419 | } |
| 420 | #if defined(__GNUC__) | 420 | #if defined(__GNUC__) && !defined(__clang__) && !defined(__INTEL_COMPILER) |
| 421 | #pragma GCC diagnostic pop | 421 | #pragma GCC diagnostic pop |
| 422 | #endif | 422 | #endif |
| 423 | 423 | ||
diff --git a/src/core/hle/kernel/svc.cpp b/src/core/hle/kernel/svc.cpp index b07ae3f02..4aca5b27d 100644 --- a/src/core/hle/kernel/svc.cpp +++ b/src/core/hle/kernel/svc.cpp | |||
| @@ -751,8 +751,8 @@ static void Break(Core::System& system, u32 reason, u64 info1, u64 info2) { | |||
| 751 | } | 751 | } |
| 752 | 752 | ||
| 753 | system.GetReporter().SaveSvcBreakReport( | 753 | system.GetReporter().SaveSvcBreakReport( |
| 754 | static_cast<u32>(break_reason.break_type.Value()), break_reason.signal_debugger, info1, | 754 | static_cast<u32>(break_reason.break_type.Value()), break_reason.signal_debugger.As<bool>(), |
| 755 | info2, has_dumped_buffer ? std::make_optional(debug_buffer) : std::nullopt); | 755 | info1, info2, has_dumped_buffer ? std::make_optional(debug_buffer) : std::nullopt); |
| 756 | 756 | ||
| 757 | if (!break_reason.signal_debugger) { | 757 | if (!break_reason.signal_debugger) { |
| 758 | LOG_CRITICAL( | 758 | LOG_CRITICAL( |
diff --git a/src/core/hle/service/am/applets/applets.h b/src/core/hle/service/am/applets/applets.h index e78a57657..12c6a5b1a 100644 --- a/src/core/hle/service/am/applets/applets.h +++ b/src/core/hle/service/am/applets/applets.h | |||
| @@ -164,7 +164,7 @@ protected: | |||
| 164 | u32_le size; | 164 | u32_le size; |
| 165 | u32_le library_version; | 165 | u32_le library_version; |
| 166 | u32_le theme_color; | 166 | u32_le theme_color; |
| 167 | u8 play_startup_sound; | 167 | bool play_startup_sound; |
| 168 | u64_le system_tick; | 168 | u64_le system_tick; |
| 169 | }; | 169 | }; |
| 170 | static_assert(sizeof(CommonArguments) == 0x20, "CommonArguments has incorrect size."); | 170 | static_assert(sizeof(CommonArguments) == 0x20, "CommonArguments has incorrect size."); |
diff --git a/src/core/hle/service/hid/controllers/npad.cpp b/src/core/hle/service/hid/controllers/npad.cpp index ba8a1f786..3b26e96de 100644 --- a/src/core/hle/service/hid/controllers/npad.cpp +++ b/src/core/hle/service/hid/controllers/npad.cpp | |||
| @@ -1502,25 +1502,25 @@ bool Controller_NPad::IsControllerSupported(Core::HID::NpadStyleIndex controller | |||
| 1502 | Core::HID::NpadStyleTag style = GetSupportedStyleSet(); | 1502 | Core::HID::NpadStyleTag style = GetSupportedStyleSet(); |
| 1503 | switch (controller) { | 1503 | switch (controller) { |
| 1504 | case Core::HID::NpadStyleIndex::ProController: | 1504 | case Core::HID::NpadStyleIndex::ProController: |
| 1505 | return style.fullkey; | 1505 | return style.fullkey.As<bool>(); |
| 1506 | case Core::HID::NpadStyleIndex::JoyconDual: | 1506 | case Core::HID::NpadStyleIndex::JoyconDual: |
| 1507 | return style.joycon_dual; | 1507 | return style.joycon_dual.As<bool>(); |
| 1508 | case Core::HID::NpadStyleIndex::JoyconLeft: | 1508 | case Core::HID::NpadStyleIndex::JoyconLeft: |
| 1509 | return style.joycon_left; | 1509 | return style.joycon_left.As<bool>(); |
| 1510 | case Core::HID::NpadStyleIndex::JoyconRight: | 1510 | case Core::HID::NpadStyleIndex::JoyconRight: |
| 1511 | return style.joycon_right; | 1511 | return style.joycon_right.As<bool>(); |
| 1512 | case Core::HID::NpadStyleIndex::GameCube: | 1512 | case Core::HID::NpadStyleIndex::GameCube: |
| 1513 | return style.gamecube; | 1513 | return style.gamecube.As<bool>(); |
| 1514 | case Core::HID::NpadStyleIndex::Pokeball: | 1514 | case Core::HID::NpadStyleIndex::Pokeball: |
| 1515 | return style.palma; | 1515 | return style.palma.As<bool>(); |
| 1516 | case Core::HID::NpadStyleIndex::NES: | 1516 | case Core::HID::NpadStyleIndex::NES: |
| 1517 | return style.lark; | 1517 | return style.lark.As<bool>(); |
| 1518 | case Core::HID::NpadStyleIndex::SNES: | 1518 | case Core::HID::NpadStyleIndex::SNES: |
| 1519 | return style.lucia; | 1519 | return style.lucia.As<bool>(); |
| 1520 | case Core::HID::NpadStyleIndex::N64: | 1520 | case Core::HID::NpadStyleIndex::N64: |
| 1521 | return style.lagoon; | 1521 | return style.lagoon.As<bool>(); |
| 1522 | case Core::HID::NpadStyleIndex::SegaGenesis: | 1522 | case Core::HID::NpadStyleIndex::SegaGenesis: |
| 1523 | return style.lager; | 1523 | return style.lager.As<bool>(); |
| 1524 | default: | 1524 | default: |
| 1525 | return false; | 1525 | return false; |
| 1526 | } | 1526 | } |
diff --git a/src/core/hle/service/nvdrv/nvdrv.cpp b/src/core/hle/service/nvdrv/nvdrv.cpp index 9d9924395..9f4c7c99a 100644 --- a/src/core/hle/service/nvdrv/nvdrv.cpp +++ b/src/core/hle/service/nvdrv/nvdrv.cpp | |||
| @@ -53,7 +53,7 @@ void InstallInterfaces(SM::ServiceManager& service_manager, NVFlinger::NVFlinger | |||
| 53 | } | 53 | } |
| 54 | 54 | ||
| 55 | Module::Module(Core::System& system) | 55 | Module::Module(Core::System& system) |
| 56 | : service_context{system, "nvdrv"}, events_interface{*this}, container{system.Host1x()} { | 56 | : container{system.Host1x()}, service_context{system, "nvdrv"}, events_interface{*this} { |
| 57 | builders["/dev/nvhost-as-gpu"] = [this, &system](DeviceFD fd) { | 57 | builders["/dev/nvhost-as-gpu"] = [this, &system](DeviceFD fd) { |
| 58 | std::shared_ptr<Devices::nvdevice> device = | 58 | std::shared_ptr<Devices::nvdevice> device = |
| 59 | std::make_shared<Devices::nvhost_as_gpu>(system, *this, container); | 59 | std::make_shared<Devices::nvhost_as_gpu>(system, *this, container); |
diff --git a/src/core/hle/service/nvdrv/nvdrv.h b/src/core/hle/service/nvdrv/nvdrv.h index 146d046a9..f3c81bd88 100644 --- a/src/core/hle/service/nvdrv/nvdrv.h +++ b/src/core/hle/service/nvdrv/nvdrv.h | |||
| @@ -97,6 +97,9 @@ private: | |||
| 97 | friend class EventInterface; | 97 | friend class EventInterface; |
| 98 | friend class Service::NVFlinger::NVFlinger; | 98 | friend class Service::NVFlinger::NVFlinger; |
| 99 | 99 | ||
| 100 | /// Manages syncpoints on the host | ||
| 101 | NvCore::Container container; | ||
| 102 | |||
| 100 | /// Id to use for the next open file descriptor. | 103 | /// Id to use for the next open file descriptor. |
| 101 | DeviceFD next_fd = 1; | 104 | DeviceFD next_fd = 1; |
| 102 | 105 | ||
| @@ -108,9 +111,6 @@ private: | |||
| 108 | 111 | ||
| 109 | EventInterface events_interface; | 112 | EventInterface events_interface; |
| 110 | 113 | ||
| 111 | /// Manages syncpoints on the host | ||
| 112 | NvCore::Container container; | ||
| 113 | |||
| 114 | std::unordered_map<std::string, std::function<FilesContainerType::iterator(DeviceFD)>> builders; | 114 | std::unordered_map<std::string, std::function<FilesContainerType::iterator(DeviceFD)>> builders; |
| 115 | }; | 115 | }; |
| 116 | 116 | ||
diff --git a/src/core/memory.cpp b/src/core/memory.cpp index 9637cb5b1..3ca80c8ff 100644 --- a/src/core/memory.cpp +++ b/src/core/memory.cpp | |||
| @@ -233,18 +233,17 @@ struct Memory::Impl { | |||
| 233 | current_vaddr, src_addr, size); | 233 | current_vaddr, src_addr, size); |
| 234 | std::memset(dest_buffer, 0, copy_amount); | 234 | std::memset(dest_buffer, 0, copy_amount); |
| 235 | }, | 235 | }, |
| 236 | [&dest_buffer](const std::size_t copy_amount, const u8* const src_ptr) { | 236 | [&](const std::size_t copy_amount, const u8* const src_ptr) { |
| 237 | std::memcpy(dest_buffer, src_ptr, copy_amount); | 237 | std::memcpy(dest_buffer, src_ptr, copy_amount); |
| 238 | }, | 238 | }, |
| 239 | [&system = system, &dest_buffer](const VAddr current_vaddr, | 239 | [&](const VAddr current_vaddr, const std::size_t copy_amount, |
| 240 | const std::size_t copy_amount, | 240 | const u8* const host_ptr) { |
| 241 | const u8* const host_ptr) { | ||
| 242 | if constexpr (!UNSAFE) { | 241 | if constexpr (!UNSAFE) { |
| 243 | system.GPU().FlushRegion(current_vaddr, copy_amount); | 242 | system.GPU().FlushRegion(current_vaddr, copy_amount); |
| 244 | } | 243 | } |
| 245 | std::memcpy(dest_buffer, host_ptr, copy_amount); | 244 | std::memcpy(dest_buffer, host_ptr, copy_amount); |
| 246 | }, | 245 | }, |
| 247 | [&dest_buffer](const std::size_t copy_amount) { | 246 | [&](const std::size_t copy_amount) { |
| 248 | dest_buffer = static_cast<u8*>(dest_buffer) + copy_amount; | 247 | dest_buffer = static_cast<u8*>(dest_buffer) + copy_amount; |
| 249 | }); | 248 | }); |
| 250 | } | 249 | } |
| @@ -267,17 +266,16 @@ struct Memory::Impl { | |||
| 267 | "Unmapped WriteBlock @ 0x{:016X} (start address = 0x{:016X}, size = {})", | 266 | "Unmapped WriteBlock @ 0x{:016X} (start address = 0x{:016X}, size = {})", |
| 268 | current_vaddr, dest_addr, size); | 267 | current_vaddr, dest_addr, size); |
| 269 | }, | 268 | }, |
| 270 | [&src_buffer](const std::size_t copy_amount, u8* const dest_ptr) { | 269 | [&](const std::size_t copy_amount, u8* const dest_ptr) { |
| 271 | std::memcpy(dest_ptr, src_buffer, copy_amount); | 270 | std::memcpy(dest_ptr, src_buffer, copy_amount); |
| 272 | }, | 271 | }, |
| 273 | [&system = system, &src_buffer](const VAddr current_vaddr, | 272 | [&](const VAddr current_vaddr, const std::size_t copy_amount, u8* const host_ptr) { |
| 274 | const std::size_t copy_amount, u8* const host_ptr) { | ||
| 275 | if constexpr (!UNSAFE) { | 273 | if constexpr (!UNSAFE) { |
| 276 | system.GPU().InvalidateRegion(current_vaddr, copy_amount); | 274 | system.GPU().InvalidateRegion(current_vaddr, copy_amount); |
| 277 | } | 275 | } |
| 278 | std::memcpy(host_ptr, src_buffer, copy_amount); | 276 | std::memcpy(host_ptr, src_buffer, copy_amount); |
| 279 | }, | 277 | }, |
| 280 | [&src_buffer](const std::size_t copy_amount) { | 278 | [&](const std::size_t copy_amount) { |
| 281 | src_buffer = static_cast<const u8*>(src_buffer) + copy_amount; | 279 | src_buffer = static_cast<const u8*>(src_buffer) + copy_amount; |
| 282 | }); | 280 | }); |
| 283 | } | 281 | } |
| @@ -301,8 +299,7 @@ struct Memory::Impl { | |||
| 301 | [](const std::size_t copy_amount, u8* const dest_ptr) { | 299 | [](const std::size_t copy_amount, u8* const dest_ptr) { |
| 302 | std::memset(dest_ptr, 0, copy_amount); | 300 | std::memset(dest_ptr, 0, copy_amount); |
| 303 | }, | 301 | }, |
| 304 | [&system = system](const VAddr current_vaddr, const std::size_t copy_amount, | 302 | [&](const VAddr current_vaddr, const std::size_t copy_amount, u8* const host_ptr) { |
| 305 | u8* const host_ptr) { | ||
| 306 | system.GPU().InvalidateRegion(current_vaddr, copy_amount); | 303 | system.GPU().InvalidateRegion(current_vaddr, copy_amount); |
| 307 | std::memset(host_ptr, 0, copy_amount); | 304 | std::memset(host_ptr, 0, copy_amount); |
| 308 | }, | 305 | }, |
| @@ -313,22 +310,20 @@ struct Memory::Impl { | |||
| 313 | const std::size_t size) { | 310 | const std::size_t size) { |
| 314 | WalkBlock( | 311 | WalkBlock( |
| 315 | process, dest_addr, size, | 312 | process, dest_addr, size, |
| 316 | [this, &process, &dest_addr, &src_addr, size](const std::size_t copy_amount, | 313 | [&](const std::size_t copy_amount, const VAddr current_vaddr) { |
| 317 | const VAddr current_vaddr) { | ||
| 318 | LOG_ERROR(HW_Memory, | 314 | LOG_ERROR(HW_Memory, |
| 319 | "Unmapped CopyBlock @ 0x{:016X} (start address = 0x{:016X}, size = {})", | 315 | "Unmapped CopyBlock @ 0x{:016X} (start address = 0x{:016X}, size = {})", |
| 320 | current_vaddr, src_addr, size); | 316 | current_vaddr, src_addr, size); |
| 321 | ZeroBlock(process, dest_addr, copy_amount); | 317 | ZeroBlock(process, dest_addr, copy_amount); |
| 322 | }, | 318 | }, |
| 323 | [this, &process, &dest_addr](const std::size_t copy_amount, const u8* const src_ptr) { | 319 | [&](const std::size_t copy_amount, const u8* const src_ptr) { |
| 324 | WriteBlockImpl<false>(process, dest_addr, src_ptr, copy_amount); | 320 | WriteBlockImpl<false>(process, dest_addr, src_ptr, copy_amount); |
| 325 | }, | 321 | }, |
| 326 | [this, &system = system, &process, &dest_addr]( | 322 | [&](const VAddr current_vaddr, const std::size_t copy_amount, u8* const host_ptr) { |
| 327 | const VAddr current_vaddr, const std::size_t copy_amount, u8* const host_ptr) { | ||
| 328 | system.GPU().FlushRegion(current_vaddr, copy_amount); | 323 | system.GPU().FlushRegion(current_vaddr, copy_amount); |
| 329 | WriteBlockImpl<false>(process, dest_addr, host_ptr, copy_amount); | 324 | WriteBlockImpl<false>(process, dest_addr, host_ptr, copy_amount); |
| 330 | }, | 325 | }, |
| 331 | [&dest_addr, &src_addr](const std::size_t copy_amount) { | 326 | [&](const std::size_t copy_amount) { |
| 332 | dest_addr += static_cast<VAddr>(copy_amount); | 327 | dest_addr += static_cast<VAddr>(copy_amount); |
| 333 | src_addr += static_cast<VAddr>(copy_amount); | 328 | src_addr += static_cast<VAddr>(copy_amount); |
| 334 | }); | 329 | }); |
| @@ -575,7 +570,7 @@ struct Memory::Impl { | |||
| 575 | [vaddr]() { | 570 | [vaddr]() { |
| 576 | LOG_ERROR(HW_Memory, "Unmapped Read{} @ 0x{:016X}", sizeof(T) * 8, vaddr); | 571 | LOG_ERROR(HW_Memory, "Unmapped Read{} @ 0x{:016X}", sizeof(T) * 8, vaddr); |
| 577 | }, | 572 | }, |
| 578 | [&system = system, vaddr]() { system.GPU().FlushRegion(vaddr, sizeof(T)); }); | 573 | [&]() { system.GPU().FlushRegion(vaddr, sizeof(T)); }); |
| 579 | if (ptr) { | 574 | if (ptr) { |
| 580 | std::memcpy(&result, ptr, sizeof(T)); | 575 | std::memcpy(&result, ptr, sizeof(T)); |
| 581 | } | 576 | } |
| @@ -599,7 +594,7 @@ struct Memory::Impl { | |||
| 599 | LOG_ERROR(HW_Memory, "Unmapped Write{} @ 0x{:016X} = 0x{:016X}", sizeof(T) * 8, | 594 | LOG_ERROR(HW_Memory, "Unmapped Write{} @ 0x{:016X} = 0x{:016X}", sizeof(T) * 8, |
| 600 | vaddr, static_cast<u64>(data)); | 595 | vaddr, static_cast<u64>(data)); |
| 601 | }, | 596 | }, |
| 602 | [&system = system, vaddr]() { system.GPU().InvalidateRegion(vaddr, sizeof(T)); }); | 597 | [&]() { system.GPU().InvalidateRegion(vaddr, sizeof(T)); }); |
| 603 | if (ptr) { | 598 | if (ptr) { |
| 604 | std::memcpy(ptr, &data, sizeof(T)); | 599 | std::memcpy(ptr, &data, sizeof(T)); |
| 605 | } | 600 | } |
| @@ -613,7 +608,7 @@ struct Memory::Impl { | |||
| 613 | LOG_ERROR(HW_Memory, "Unmapped WriteExclusive{} @ 0x{:016X} = 0x{:016X}", | 608 | LOG_ERROR(HW_Memory, "Unmapped WriteExclusive{} @ 0x{:016X} = 0x{:016X}", |
| 614 | sizeof(T) * 8, vaddr, static_cast<u64>(data)); | 609 | sizeof(T) * 8, vaddr, static_cast<u64>(data)); |
| 615 | }, | 610 | }, |
| 616 | [&system = system, vaddr]() { system.GPU().InvalidateRegion(vaddr, sizeof(T)); }); | 611 | [&]() { system.GPU().InvalidateRegion(vaddr, sizeof(T)); }); |
| 617 | if (ptr) { | 612 | if (ptr) { |
| 618 | const auto volatile_pointer = reinterpret_cast<volatile T*>(ptr); | 613 | const auto volatile_pointer = reinterpret_cast<volatile T*>(ptr); |
| 619 | return Common::AtomicCompareAndSwap(volatile_pointer, data, expected); | 614 | return Common::AtomicCompareAndSwap(volatile_pointer, data, expected); |
| @@ -628,7 +623,7 @@ struct Memory::Impl { | |||
| 628 | LOG_ERROR(HW_Memory, "Unmapped WriteExclusive128 @ 0x{:016X} = 0x{:016X}{:016X}", | 623 | LOG_ERROR(HW_Memory, "Unmapped WriteExclusive128 @ 0x{:016X} = 0x{:016X}{:016X}", |
| 629 | vaddr, static_cast<u64>(data[1]), static_cast<u64>(data[0])); | 624 | vaddr, static_cast<u64>(data[1]), static_cast<u64>(data[0])); |
| 630 | }, | 625 | }, |
| 631 | [&system = system, vaddr]() { system.GPU().InvalidateRegion(vaddr, sizeof(u128)); }); | 626 | [&]() { system.GPU().InvalidateRegion(vaddr, sizeof(u128)); }); |
| 632 | if (ptr) { | 627 | if (ptr) { |
| 633 | const auto volatile_pointer = reinterpret_cast<volatile u64*>(ptr); | 628 | const auto volatile_pointer = reinterpret_cast<volatile u64*>(ptr); |
| 634 | return Common::AtomicCompareAndSwap(volatile_pointer, data, expected); | 629 | return Common::AtomicCompareAndSwap(volatile_pointer, data, expected); |
diff --git a/src/input_common/CMakeLists.txt b/src/input_common/CMakeLists.txt index 2cf9eb97f..cc6f0ffc0 100644 --- a/src/input_common/CMakeLists.txt +++ b/src/input_common/CMakeLists.txt | |||
| @@ -39,21 +39,14 @@ add_library(input_common STATIC | |||
| 39 | if (MSVC) | 39 | if (MSVC) |
| 40 | target_compile_options(input_common PRIVATE | 40 | target_compile_options(input_common PRIVATE |
| 41 | /W4 | 41 | /W4 |
| 42 | /WX | ||
| 43 | 42 | ||
| 44 | /we4242 # 'identifier': conversion from 'type1' to 'type2', possible loss of data | 43 | /we4242 # 'identifier': conversion from 'type1' to 'type2', possible loss of data |
| 45 | /we4244 # 'conversion': conversion from 'type1' to 'type2', possible loss of data | ||
| 46 | /we4245 # 'conversion': conversion from 'type1' to 'type2', signed/unsigned mismatch | ||
| 47 | /we4254 # 'operator': conversion from 'type1:field_bits' to 'type2:field_bits', possible loss of data | 44 | /we4254 # 'operator': conversion from 'type1:field_bits' to 'type2:field_bits', possible loss of data |
| 45 | /we4800 # Implicit conversion from 'type' to bool. Possible information loss | ||
| 48 | ) | 46 | ) |
| 49 | else() | 47 | else() |
| 50 | target_compile_options(input_common PRIVATE | 48 | target_compile_options(input_common PRIVATE |
| 51 | -Werror | ||
| 52 | -Werror=conversion | 49 | -Werror=conversion |
| 53 | -Werror=ignored-qualifiers | ||
| 54 | $<$<CXX_COMPILER_ID:GNU>:-Werror=unused-but-set-parameter> | ||
| 55 | $<$<CXX_COMPILER_ID:GNU>:-Werror=unused-but-set-variable> | ||
| 56 | -Werror=unused-variable | ||
| 57 | ) | 50 | ) |
| 58 | endif() | 51 | endif() |
| 59 | 52 | ||
diff --git a/src/input_common/drivers/sdl_driver.cpp b/src/input_common/drivers/sdl_driver.cpp index b72e4b397..c175a8853 100644 --- a/src/input_common/drivers/sdl_driver.cpp +++ b/src/input_common/drivers/sdl_driver.cpp | |||
| @@ -40,8 +40,8 @@ public: | |||
| 40 | void EnableMotion() { | 40 | void EnableMotion() { |
| 41 | if (sdl_controller) { | 41 | if (sdl_controller) { |
| 42 | SDL_GameController* controller = sdl_controller.get(); | 42 | SDL_GameController* controller = sdl_controller.get(); |
| 43 | has_accel = SDL_GameControllerHasSensor(controller, SDL_SENSOR_ACCEL); | 43 | has_accel = SDL_GameControllerHasSensor(controller, SDL_SENSOR_ACCEL) == SDL_TRUE; |
| 44 | has_gyro = SDL_GameControllerHasSensor(controller, SDL_SENSOR_GYRO); | 44 | has_gyro = SDL_GameControllerHasSensor(controller, SDL_SENSOR_GYRO) == SDL_TRUE; |
| 45 | if (has_accel) { | 45 | if (has_accel) { |
| 46 | SDL_GameControllerSetSensorEnabled(controller, SDL_SENSOR_ACCEL, SDL_TRUE); | 46 | SDL_GameControllerSetSensorEnabled(controller, SDL_SENSOR_ACCEL, SDL_TRUE); |
| 47 | } | 47 | } |
diff --git a/src/input_common/input_poller.cpp b/src/input_common/input_poller.cpp index ca33fb4eb..ccc3076ca 100644 --- a/src/input_common/input_poller.cpp +++ b/src/input_common/input_poller.cpp | |||
| @@ -797,8 +797,8 @@ std::unique_ptr<Common::Input::InputDevice> InputFactory::CreateButtonDevice( | |||
| 797 | 797 | ||
| 798 | const auto button_id = params.Get("button", 0); | 798 | const auto button_id = params.Get("button", 0); |
| 799 | const auto keyboard_key = params.Get("code", 0); | 799 | const auto keyboard_key = params.Get("code", 0); |
| 800 | const auto toggle = params.Get("toggle", false); | 800 | const auto toggle = params.Get("toggle", false) != 0; |
| 801 | const auto inverted = params.Get("inverted", false); | 801 | const auto inverted = params.Get("inverted", false) != 0; |
| 802 | input_engine->PreSetController(identifier); | 802 | input_engine->PreSetController(identifier); |
| 803 | input_engine->PreSetButton(identifier, button_id); | 803 | input_engine->PreSetButton(identifier, button_id); |
| 804 | input_engine->PreSetButton(identifier, keyboard_key); | 804 | input_engine->PreSetButton(identifier, keyboard_key); |
| @@ -820,8 +820,8 @@ std::unique_ptr<Common::Input::InputDevice> InputFactory::CreateHatButtonDevice( | |||
| 820 | 820 | ||
| 821 | const auto button_id = params.Get("hat", 0); | 821 | const auto button_id = params.Get("hat", 0); |
| 822 | const auto direction = input_engine->GetHatButtonId(params.Get("direction", "")); | 822 | const auto direction = input_engine->GetHatButtonId(params.Get("direction", "")); |
| 823 | const auto toggle = params.Get("toggle", false); | 823 | const auto toggle = params.Get("toggle", false) != 0; |
| 824 | const auto inverted = params.Get("inverted", false); | 824 | const auto inverted = params.Get("inverted", false) != 0; |
| 825 | 825 | ||
| 826 | input_engine->PreSetController(identifier); | 826 | input_engine->PreSetController(identifier); |
| 827 | input_engine->PreSetHatButton(identifier, button_id); | 827 | input_engine->PreSetHatButton(identifier, button_id); |
| @@ -879,7 +879,7 @@ std::unique_ptr<Common::Input::InputDevice> InputFactory::CreateAnalogDevice( | |||
| 879 | .threshold = std::clamp(params.Get("threshold", 0.5f), 0.0f, 1.0f), | 879 | .threshold = std::clamp(params.Get("threshold", 0.5f), 0.0f, 1.0f), |
| 880 | .offset = std::clamp(params.Get("offset", 0.0f), -1.0f, 1.0f), | 880 | .offset = std::clamp(params.Get("offset", 0.0f), -1.0f, 1.0f), |
| 881 | .inverted = params.Get("invert", "+") == "-", | 881 | .inverted = params.Get("invert", "+") == "-", |
| 882 | .toggle = static_cast<bool>(params.Get("toggle", false)), | 882 | .toggle = params.Get("toggle", false) != 0, |
| 883 | }; | 883 | }; |
| 884 | input_engine->PreSetController(identifier); | 884 | input_engine->PreSetController(identifier); |
| 885 | input_engine->PreSetAxis(identifier, axis); | 885 | input_engine->PreSetAxis(identifier, axis); |
| @@ -895,8 +895,8 @@ std::unique_ptr<Common::Input::InputDevice> InputFactory::CreateTriggerDevice( | |||
| 895 | }; | 895 | }; |
| 896 | 896 | ||
| 897 | const auto button = params.Get("button", 0); | 897 | const auto button = params.Get("button", 0); |
| 898 | const auto toggle = params.Get("toggle", false); | 898 | const auto toggle = params.Get("toggle", false) != 0; |
| 899 | const auto inverted = params.Get("inverted", false); | 899 | const auto inverted = params.Get("inverted", false) != 0; |
| 900 | 900 | ||
| 901 | const auto axis = params.Get("axis", 0); | 901 | const auto axis = params.Get("axis", 0); |
| 902 | const Common::Input::AnalogProperties properties = { | 902 | const Common::Input::AnalogProperties properties = { |
| @@ -926,8 +926,8 @@ std::unique_ptr<Common::Input::InputDevice> InputFactory::CreateTouchDevice( | |||
| 926 | }; | 926 | }; |
| 927 | 927 | ||
| 928 | const auto button = params.Get("button", 0); | 928 | const auto button = params.Get("button", 0); |
| 929 | const auto toggle = params.Get("toggle", false); | 929 | const auto toggle = params.Get("toggle", false) != 0; |
| 930 | const auto inverted = params.Get("inverted", false); | 930 | const auto inverted = params.Get("inverted", false) != 0; |
| 931 | 931 | ||
| 932 | const auto axis_x = params.Get("axis_x", 0); | 932 | const auto axis_x = params.Get("axis_x", 0); |
| 933 | const Common::Input::AnalogProperties properties_x = { | 933 | const Common::Input::AnalogProperties properties_x = { |
diff --git a/src/shader_recompiler/CMakeLists.txt b/src/shader_recompiler/CMakeLists.txt index af8e51fe8..bcdd60db9 100644 --- a/src/shader_recompiler/CMakeLists.txt +++ b/src/shader_recompiler/CMakeLists.txt | |||
| @@ -241,24 +241,14 @@ target_link_libraries(shader_recompiler PUBLIC common fmt::fmt sirit) | |||
| 241 | if (MSVC) | 241 | if (MSVC) |
| 242 | target_compile_options(shader_recompiler PRIVATE | 242 | target_compile_options(shader_recompiler PRIVATE |
| 243 | /W4 | 243 | /W4 |
| 244 | /WX | 244 | |
| 245 | /we4018 # 'expression' : signed/unsigned mismatch | 245 | /we4242 # 'identifier': conversion from 'type1' to 'type2', possible loss of data |
| 246 | /we4244 # 'argument' : conversion from 'type1' to 'type2', possible loss of data (floating-point) | ||
| 247 | /we4245 # 'conversion' : conversion from 'type1' to 'type2', signed/unsigned mismatch | ||
| 248 | /we4254 # 'operator': conversion from 'type1:field_bits' to 'type2:field_bits', possible loss of data | 246 | /we4254 # 'operator': conversion from 'type1:field_bits' to 'type2:field_bits', possible loss of data |
| 249 | /we4267 # 'var' : conversion from 'size_t' to 'type', possible loss of data | ||
| 250 | /we4305 # 'context' : truncation from 'type1' to 'type2' | ||
| 251 | /we4800 # Implicit conversion from 'type' to bool. Possible information loss | 247 | /we4800 # Implicit conversion from 'type' to bool. Possible information loss |
| 252 | /we4826 # Conversion from 'type1' to 'type2' is sign-extended. This may cause unexpected runtime behavior. | ||
| 253 | ) | 248 | ) |
| 254 | else() | 249 | else() |
| 255 | target_compile_options(shader_recompiler PRIVATE | 250 | target_compile_options(shader_recompiler PRIVATE |
| 256 | -Werror | ||
| 257 | -Werror=conversion | 251 | -Werror=conversion |
| 258 | -Werror=ignored-qualifiers | ||
| 259 | $<$<CXX_COMPILER_ID:GNU>:-Werror=unused-but-set-parameter> | ||
| 260 | $<$<CXX_COMPILER_ID:GNU>:-Werror=unused-but-set-variable> | ||
| 261 | -Werror=unused-variable | ||
| 262 | 252 | ||
| 263 | # Bracket depth determines maximum size of a fold expression in Clang since 9c9974c3ccb6. | 253 | # Bracket depth determines maximum size of a fold expression in Clang since 9c9974c3ccb6. |
| 264 | # And this in turns limits the size of a std::array. | 254 | # And this in turns limits the size of a std::array. |
diff --git a/src/shader_recompiler/backend/glasm/emit_glasm_not_implemented.cpp b/src/shader_recompiler/backend/glasm/emit_glasm_not_implemented.cpp index 7094d8e42..1f4ffdd62 100644 --- a/src/shader_recompiler/backend/glasm/emit_glasm_not_implemented.cpp +++ b/src/shader_recompiler/backend/glasm/emit_glasm_not_implemented.cpp | |||
| @@ -5,10 +5,6 @@ | |||
| 5 | #include "shader_recompiler/backend/glasm/glasm_emit_context.h" | 5 | #include "shader_recompiler/backend/glasm/glasm_emit_context.h" |
| 6 | #include "shader_recompiler/frontend/ir/value.h" | 6 | #include "shader_recompiler/frontend/ir/value.h" |
| 7 | 7 | ||
| 8 | #ifdef _MSC_VER | ||
| 9 | #pragma warning(disable : 4100) | ||
| 10 | #endif | ||
| 11 | |||
| 12 | namespace Shader::Backend::GLASM { | 8 | namespace Shader::Backend::GLASM { |
| 13 | 9 | ||
| 14 | #define NotImplemented() throw NotImplementedException("GLASM instruction {}", __LINE__) | 10 | #define NotImplemented() throw NotImplementedException("GLASM instruction {}", __LINE__) |
diff --git a/src/shader_recompiler/backend/glsl/emit_glsl_not_implemented.cpp b/src/shader_recompiler/backend/glsl/emit_glsl_not_implemented.cpp index b03a8ba1e..9f1ed95a4 100644 --- a/src/shader_recompiler/backend/glsl/emit_glsl_not_implemented.cpp +++ b/src/shader_recompiler/backend/glsl/emit_glsl_not_implemented.cpp | |||
| @@ -7,10 +7,6 @@ | |||
| 7 | #include "shader_recompiler/backend/glsl/glsl_emit_context.h" | 7 | #include "shader_recompiler/backend/glsl/glsl_emit_context.h" |
| 8 | #include "shader_recompiler/frontend/ir/value.h" | 8 | #include "shader_recompiler/frontend/ir/value.h" |
| 9 | 9 | ||
| 10 | #ifdef _MSC_VER | ||
| 11 | #pragma warning(disable : 4100) | ||
| 12 | #endif | ||
| 13 | |||
| 14 | namespace Shader::Backend::GLSL { | 10 | namespace Shader::Backend::GLSL { |
| 15 | 11 | ||
| 16 | void EmitGetRegister(EmitContext& ctx) { | 12 | void EmitGetRegister(EmitContext& ctx) { |
diff --git a/src/shader_recompiler/frontend/maxwell/translate_program.cpp b/src/shader_recompiler/frontend/maxwell/translate_program.cpp index 77efb4f57..b58741d4d 100644 --- a/src/shader_recompiler/frontend/maxwell/translate_program.cpp +++ b/src/shader_recompiler/frontend/maxwell/translate_program.cpp | |||
| @@ -137,28 +137,35 @@ bool IsLegacyAttribute(IR::Attribute attribute) { | |||
| 137 | } | 137 | } |
| 138 | 138 | ||
| 139 | std::map<IR::Attribute, IR::Attribute> GenerateLegacyToGenericMappings( | 139 | std::map<IR::Attribute, IR::Attribute> GenerateLegacyToGenericMappings( |
| 140 | const VaryingState& state, std::queue<IR::Attribute> ununsed_generics) { | 140 | const VaryingState& state, std::queue<IR::Attribute> unused_generics, |
| 141 | const std::map<IR::Attribute, IR::Attribute>& previous_stage_mapping) { | ||
| 141 | std::map<IR::Attribute, IR::Attribute> mapping; | 142 | std::map<IR::Attribute, IR::Attribute> mapping; |
| 143 | auto update_mapping = [&mapping, &unused_generics, previous_stage_mapping](IR::Attribute attr, | ||
| 144 | size_t count) { | ||
| 145 | if (previous_stage_mapping.find(attr) != previous_stage_mapping.end()) { | ||
| 146 | for (size_t i = 0; i < count; ++i) { | ||
| 147 | mapping.insert({attr + i, previous_stage_mapping.at(attr + i)}); | ||
| 148 | } | ||
| 149 | } else { | ||
| 150 | for (size_t i = 0; i < count; ++i) { | ||
| 151 | mapping.insert({attr + i, unused_generics.front() + i}); | ||
| 152 | } | ||
| 153 | unused_generics.pop(); | ||
| 154 | } | ||
| 155 | }; | ||
| 142 | for (size_t index = 0; index < 4; ++index) { | 156 | for (size_t index = 0; index < 4; ++index) { |
| 143 | auto attr = IR::Attribute::ColorFrontDiffuseR + index * 4; | 157 | auto attr = IR::Attribute::ColorFrontDiffuseR + index * 4; |
| 144 | if (state.AnyComponent(attr)) { | 158 | if (state.AnyComponent(attr)) { |
| 145 | for (size_t i = 0; i < 4; ++i) { | 159 | update_mapping(attr, 4); |
| 146 | mapping.insert({attr + i, ununsed_generics.front() + i}); | ||
| 147 | } | ||
| 148 | ununsed_generics.pop(); | ||
| 149 | } | 160 | } |
| 150 | } | 161 | } |
| 151 | if (state[IR::Attribute::FogCoordinate]) { | 162 | if (state[IR::Attribute::FogCoordinate]) { |
| 152 | mapping.insert({IR::Attribute::FogCoordinate, ununsed_generics.front()}); | 163 | update_mapping(IR::Attribute::FogCoordinate, 1); |
| 153 | ununsed_generics.pop(); | ||
| 154 | } | 164 | } |
| 155 | for (size_t index = 0; index < IR::NUM_FIXEDFNCTEXTURE; ++index) { | 165 | for (size_t index = 0; index < IR::NUM_FIXEDFNCTEXTURE; ++index) { |
| 156 | auto attr = IR::Attribute::FixedFncTexture0S + index * 4; | 166 | auto attr = IR::Attribute::FixedFncTexture0S + index * 4; |
| 157 | if (state.AnyComponent(attr)) { | 167 | if (state.AnyComponent(attr)) { |
| 158 | for (size_t i = 0; i < 4; ++i) { | 168 | update_mapping(attr, 4); |
| 159 | mapping.insert({attr + i, ununsed_generics.front() + i}); | ||
| 160 | } | ||
| 161 | ununsed_generics.pop(); | ||
| 162 | } | 169 | } |
| 163 | } | 170 | } |
| 164 | return mapping; | 171 | return mapping; |
| @@ -265,21 +272,22 @@ IR::Program MergeDualVertexPrograms(IR::Program& vertex_a, IR::Program& vertex_b | |||
| 265 | void ConvertLegacyToGeneric(IR::Program& program, const Shader::RuntimeInfo& runtime_info) { | 272 | void ConvertLegacyToGeneric(IR::Program& program, const Shader::RuntimeInfo& runtime_info) { |
| 266 | auto& stores = program.info.stores; | 273 | auto& stores = program.info.stores; |
| 267 | if (stores.Legacy()) { | 274 | if (stores.Legacy()) { |
| 268 | std::queue<IR::Attribute> ununsed_output_generics{}; | 275 | std::queue<IR::Attribute> unused_output_generics{}; |
| 269 | for (size_t index = 0; index < IR::NUM_GENERICS; ++index) { | 276 | for (size_t index = 0; index < IR::NUM_GENERICS; ++index) { |
| 270 | if (!stores.Generic(index)) { | 277 | if (!stores.Generic(index)) { |
| 271 | ununsed_output_generics.push(IR::Attribute::Generic0X + index * 4); | 278 | unused_output_generics.push(IR::Attribute::Generic0X + index * 4); |
| 272 | } | 279 | } |
| 273 | } | 280 | } |
| 274 | auto mappings = GenerateLegacyToGenericMappings(stores, ununsed_output_generics); | 281 | program.info.legacy_stores_mapping = |
| 282 | GenerateLegacyToGenericMappings(stores, unused_output_generics, {}); | ||
| 275 | for (IR::Block* const block : program.post_order_blocks) { | 283 | for (IR::Block* const block : program.post_order_blocks) { |
| 276 | for (IR::Inst& inst : block->Instructions()) { | 284 | for (IR::Inst& inst : block->Instructions()) { |
| 277 | switch (inst.GetOpcode()) { | 285 | switch (inst.GetOpcode()) { |
| 278 | case IR::Opcode::SetAttribute: { | 286 | case IR::Opcode::SetAttribute: { |
| 279 | const auto attr = inst.Arg(0).Attribute(); | 287 | const auto attr = inst.Arg(0).Attribute(); |
| 280 | if (IsLegacyAttribute(attr)) { | 288 | if (IsLegacyAttribute(attr)) { |
| 281 | stores.Set(mappings[attr], true); | 289 | stores.Set(program.info.legacy_stores_mapping[attr], true); |
| 282 | inst.SetArg(0, Shader::IR::Value(mappings[attr])); | 290 | inst.SetArg(0, Shader::IR::Value(program.info.legacy_stores_mapping[attr])); |
| 283 | } | 291 | } |
| 284 | break; | 292 | break; |
| 285 | } | 293 | } |
| @@ -292,15 +300,16 @@ void ConvertLegacyToGeneric(IR::Program& program, const Shader::RuntimeInfo& run | |||
| 292 | 300 | ||
| 293 | auto& loads = program.info.loads; | 301 | auto& loads = program.info.loads; |
| 294 | if (loads.Legacy()) { | 302 | if (loads.Legacy()) { |
| 295 | std::queue<IR::Attribute> ununsed_input_generics{}; | 303 | std::queue<IR::Attribute> unused_input_generics{}; |
| 296 | for (size_t index = 0; index < IR::NUM_GENERICS; ++index) { | 304 | for (size_t index = 0; index < IR::NUM_GENERICS; ++index) { |
| 297 | const AttributeType input_type{runtime_info.generic_input_types[index]}; | 305 | const AttributeType input_type{runtime_info.generic_input_types[index]}; |
| 298 | if (!runtime_info.previous_stage_stores.Generic(index) || !loads.Generic(index) || | 306 | if (!runtime_info.previous_stage_stores.Generic(index) || !loads.Generic(index) || |
| 299 | input_type == AttributeType::Disabled) { | 307 | input_type == AttributeType::Disabled) { |
| 300 | ununsed_input_generics.push(IR::Attribute::Generic0X + index * 4); | 308 | unused_input_generics.push(IR::Attribute::Generic0X + index * 4); |
| 301 | } | 309 | } |
| 302 | } | 310 | } |
| 303 | auto mappings = GenerateLegacyToGenericMappings(loads, ununsed_input_generics); | 311 | auto mappings = GenerateLegacyToGenericMappings( |
| 312 | loads, unused_input_generics, runtime_info.previous_stage_legacy_stores_mapping); | ||
| 304 | for (IR::Block* const block : program.post_order_blocks) { | 313 | for (IR::Block* const block : program.post_order_blocks) { |
| 305 | for (IR::Inst& inst : block->Instructions()) { | 314 | for (IR::Inst& inst : block->Instructions()) { |
| 306 | switch (inst.GetOpcode()) { | 315 | switch (inst.GetOpcode()) { |
diff --git a/src/shader_recompiler/runtime_info.h b/src/shader_recompiler/runtime_info.h index dcb5ab158..549b81ef7 100644 --- a/src/shader_recompiler/runtime_info.h +++ b/src/shader_recompiler/runtime_info.h | |||
| @@ -4,6 +4,7 @@ | |||
| 4 | #pragma once | 4 | #pragma once |
| 5 | 5 | ||
| 6 | #include <array> | 6 | #include <array> |
| 7 | #include <map> | ||
| 7 | #include <optional> | 8 | #include <optional> |
| 8 | #include <vector> | 9 | #include <vector> |
| 9 | 10 | ||
| @@ -60,6 +61,7 @@ struct TransformFeedbackVarying { | |||
| 60 | struct RuntimeInfo { | 61 | struct RuntimeInfo { |
| 61 | std::array<AttributeType, 32> generic_input_types{}; | 62 | std::array<AttributeType, 32> generic_input_types{}; |
| 62 | VaryingState previous_stage_stores; | 63 | VaryingState previous_stage_stores; |
| 64 | std::map<IR::Attribute, IR::Attribute> previous_stage_legacy_stores_mapping; | ||
| 63 | 65 | ||
| 64 | bool convert_depth_mode{}; | 66 | bool convert_depth_mode{}; |
| 65 | bool force_early_z{}; | 67 | bool force_early_z{}; |
diff --git a/src/shader_recompiler/shader_info.h b/src/shader_recompiler/shader_info.h index cc596da4f..81097bf1a 100644 --- a/src/shader_recompiler/shader_info.h +++ b/src/shader_recompiler/shader_info.h | |||
| @@ -5,6 +5,7 @@ | |||
| 5 | 5 | ||
| 6 | #include <array> | 6 | #include <array> |
| 7 | #include <bitset> | 7 | #include <bitset> |
| 8 | #include <map> | ||
| 8 | 9 | ||
| 9 | #include "common/common_types.h" | 10 | #include "common/common_types.h" |
| 10 | #include "shader_recompiler/frontend/ir/type.h" | 11 | #include "shader_recompiler/frontend/ir/type.h" |
| @@ -127,6 +128,8 @@ struct Info { | |||
| 127 | VaryingState stores; | 128 | VaryingState stores; |
| 128 | VaryingState passthrough; | 129 | VaryingState passthrough; |
| 129 | 130 | ||
| 131 | std::map<IR::Attribute, IR::Attribute> legacy_stores_mapping; | ||
| 132 | |||
| 130 | bool loads_indexed_attributes{}; | 133 | bool loads_indexed_attributes{}; |
| 131 | 134 | ||
| 132 | std::array<bool, 8> stores_frag_color{}; | 135 | std::array<bool, 8> stores_frag_color{}; |
diff --git a/src/video_core/CMakeLists.txt b/src/video_core/CMakeLists.txt index cb8b46edf..106991969 100644 --- a/src/video_core/CMakeLists.txt +++ b/src/video_core/CMakeLists.txt | |||
| @@ -279,14 +279,8 @@ if (MSVC) | |||
| 279 | else() | 279 | else() |
| 280 | target_compile_options(video_core PRIVATE | 280 | target_compile_options(video_core PRIVATE |
| 281 | -Werror=conversion | 281 | -Werror=conversion |
| 282 | -Wno-error=sign-conversion | ||
| 283 | -Werror=pessimizing-move | ||
| 284 | -Werror=redundant-move | ||
| 285 | -Werror=type-limits | ||
| 286 | 282 | ||
| 287 | $<$<CXX_COMPILER_ID:GNU>:-Werror=class-memaccess> | 283 | -Wno-sign-conversion |
| 288 | $<$<CXX_COMPILER_ID:GNU>:-Werror=unused-but-set-parameter> | ||
| 289 | $<$<CXX_COMPILER_ID:GNU>:-Werror=unused-but-set-variable> | ||
| 290 | ) | 284 | ) |
| 291 | endif() | 285 | endif() |
| 292 | 286 | ||
diff --git a/src/video_core/memory_manager.cpp b/src/video_core/memory_manager.cpp index d07b21bd6..384350dbd 100644 --- a/src/video_core/memory_manager.cpp +++ b/src/video_core/memory_manager.cpp | |||
| @@ -133,7 +133,7 @@ inline void MemoryManager::SetBigPageContinous(size_t big_page_index, bool value | |||
| 133 | template <MemoryManager::EntryType entry_type> | 133 | template <MemoryManager::EntryType entry_type> |
| 134 | GPUVAddr MemoryManager::PageTableOp(GPUVAddr gpu_addr, [[maybe_unused]] VAddr cpu_addr, size_t size, | 134 | GPUVAddr MemoryManager::PageTableOp(GPUVAddr gpu_addr, [[maybe_unused]] VAddr cpu_addr, size_t size, |
| 135 | PTEKind kind) { | 135 | PTEKind kind) { |
| 136 | u64 remaining_size{size}; | 136 | [[maybe_unused]] u64 remaining_size{size}; |
| 137 | if constexpr (entry_type == EntryType::Mapped) { | 137 | if constexpr (entry_type == EntryType::Mapped) { |
| 138 | page_table.ReserveRange(gpu_addr, size); | 138 | page_table.ReserveRange(gpu_addr, size); |
| 139 | } | 139 | } |
| @@ -159,7 +159,7 @@ GPUVAddr MemoryManager::PageTableOp(GPUVAddr gpu_addr, [[maybe_unused]] VAddr cp | |||
| 159 | template <MemoryManager::EntryType entry_type> | 159 | template <MemoryManager::EntryType entry_type> |
| 160 | GPUVAddr MemoryManager::BigPageTableOp(GPUVAddr gpu_addr, [[maybe_unused]] VAddr cpu_addr, | 160 | GPUVAddr MemoryManager::BigPageTableOp(GPUVAddr gpu_addr, [[maybe_unused]] VAddr cpu_addr, |
| 161 | size_t size, PTEKind kind) { | 161 | size_t size, PTEKind kind) { |
| 162 | u64 remaining_size{size}; | 162 | [[maybe_unused]] u64 remaining_size{size}; |
| 163 | for (u64 offset{}; offset < size; offset += big_page_size) { | 163 | for (u64 offset{}; offset < size; offset += big_page_size) { |
| 164 | const GPUVAddr current_gpu_addr = gpu_addr + offset; | 164 | const GPUVAddr current_gpu_addr = gpu_addr + offset; |
| 165 | [[maybe_unused]] const auto current_entry_type = GetEntry<true>(current_gpu_addr); | 165 | [[maybe_unused]] const auto current_entry_type = GetEntry<true>(current_gpu_addr); |
diff --git a/src/video_core/renderer_opengl/gl_shader_cache.cpp b/src/video_core/renderer_opengl/gl_shader_cache.cpp index 609f0a772..e94cfdb1a 100644 --- a/src/video_core/renderer_opengl/gl_shader_cache.cpp +++ b/src/video_core/renderer_opengl/gl_shader_cache.cpp | |||
| @@ -63,6 +63,7 @@ Shader::RuntimeInfo MakeRuntimeInfo(const GraphicsPipelineKey& key, | |||
| 63 | Shader::RuntimeInfo info; | 63 | Shader::RuntimeInfo info; |
| 64 | if (previous_program) { | 64 | if (previous_program) { |
| 65 | info.previous_stage_stores = previous_program->info.stores; | 65 | info.previous_stage_stores = previous_program->info.stores; |
| 66 | info.previous_stage_legacy_stores_mapping = previous_program->info.legacy_stores_mapping; | ||
| 66 | } else { | 67 | } else { |
| 67 | // Mark all stores as available for vertex shaders | 68 | // Mark all stores as available for vertex shaders |
| 68 | info.previous_stage_stores.mask.set(); | 69 | info.previous_stage_stores.mask.set(); |
diff --git a/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp b/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp index 20f1d6584..13d5a1f67 100644 --- a/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp | |||
| @@ -134,6 +134,7 @@ Shader::RuntimeInfo MakeRuntimeInfo(std::span<const Shader::IR::Program> program | |||
| 134 | Shader::RuntimeInfo info; | 134 | Shader::RuntimeInfo info; |
| 135 | if (previous_program) { | 135 | if (previous_program) { |
| 136 | info.previous_stage_stores = previous_program->info.stores; | 136 | info.previous_stage_stores = previous_program->info.stores; |
| 137 | info.previous_stage_legacy_stores_mapping = previous_program->info.legacy_stores_mapping; | ||
| 137 | if (previous_program->is_geometry_passthrough) { | 138 | if (previous_program->is_geometry_passthrough) { |
| 138 | info.previous_stage_stores.mask |= previous_program->info.passthrough.mask; | 139 | info.previous_stage_stores.mask |= previous_program->info.passthrough.mask; |
| 139 | } | 140 | } |
diff --git a/src/video_core/texture_cache/texture_cache.h b/src/video_core/texture_cache/texture_cache.h index 0e0fd410f..8ef75fe73 100644 --- a/src/video_core/texture_cache/texture_cache.h +++ b/src/video_core/texture_cache/texture_cache.h | |||
| @@ -442,7 +442,7 @@ void TextureCache<P>::WriteMemory(VAddr cpu_addr, size_t size) { | |||
| 442 | template <class P> | 442 | template <class P> |
| 443 | void TextureCache<P>::DownloadMemory(VAddr cpu_addr, size_t size) { | 443 | void TextureCache<P>::DownloadMemory(VAddr cpu_addr, size_t size) { |
| 444 | std::vector<ImageId> images; | 444 | std::vector<ImageId> images; |
| 445 | ForEachImageInRegion(cpu_addr, size, [this, &images](ImageId image_id, ImageBase& image) { | 445 | ForEachImageInRegion(cpu_addr, size, [&images](ImageId image_id, ImageBase& image) { |
| 446 | if (!image.IsSafeDownload()) { | 446 | if (!image.IsSafeDownload()) { |
| 447 | return; | 447 | return; |
| 448 | } | 448 | } |
| @@ -1502,9 +1502,9 @@ void TextureCache<P>::UnregisterImage(ImageId image_id) { | |||
| 1502 | image.flags &= ~ImageFlagBits::BadOverlap; | 1502 | image.flags &= ~ImageFlagBits::BadOverlap; |
| 1503 | lru_cache.Free(image.lru_index); | 1503 | lru_cache.Free(image.lru_index); |
| 1504 | const auto& clear_page_table = | 1504 | const auto& clear_page_table = |
| 1505 | [this, image_id](u64 page, | 1505 | [image_id](u64 page, |
| 1506 | std::unordered_map<u64, std::vector<ImageId>, Common::IdentityHash<u64>>& | 1506 | std::unordered_map<u64, std::vector<ImageId>, Common::IdentityHash<u64>>& |
| 1507 | selected_page_table) { | 1507 | selected_page_table) { |
| 1508 | const auto page_it = selected_page_table.find(page); | 1508 | const auto page_it = selected_page_table.find(page); |
| 1509 | if (page_it == selected_page_table.end()) { | 1509 | if (page_it == selected_page_table.end()) { |
| 1510 | ASSERT_MSG(false, "Unregistering unregistered page=0x{:x}", page << YUZU_PAGEBITS); | 1510 | ASSERT_MSG(false, "Unregistering unregistered page=0x{:x}", page << YUZU_PAGEBITS); |
diff --git a/src/video_core/textures/astc.cpp b/src/video_core/textures/astc.cpp index 15b9d4182..69a32819a 100644 --- a/src/video_core/textures/astc.cpp +++ b/src/video_core/textures/astc.cpp | |||
| @@ -1661,8 +1661,8 @@ void Decompress(std::span<const uint8_t> data, uint32_t width, uint32_t height, | |||
| 1661 | for (u32 z = 0; z < depth; ++z) { | 1661 | for (u32 z = 0; z < depth; ++z) { |
| 1662 | const u32 depth_offset = z * height * width * 4; | 1662 | const u32 depth_offset = z * height * width * 4; |
| 1663 | for (u32 y_index = 0; y_index < rows; ++y_index) { | 1663 | for (u32 y_index = 0; y_index < rows; ++y_index) { |
| 1664 | auto decompress_stride = [data, width, height, depth, block_width, block_height, output, | 1664 | auto decompress_stride = [data, width, height, block_width, block_height, output, rows, |
| 1665 | rows, cols, z, depth_offset, y_index] { | 1665 | cols, z, depth_offset, y_index] { |
| 1666 | const u32 y = y_index * block_height; | 1666 | const u32 y = y_index * block_height; |
| 1667 | for (u32 x_index = 0; x_index < cols; ++x_index) { | 1667 | for (u32 x_index = 0; x_index < cols; ++x_index) { |
| 1668 | const u32 block_index = (z * rows * cols) + (y_index * cols) + x_index; | 1668 | const u32 block_index = (z * rows * cols) + (y_index * cols) + x_index; |
diff --git a/src/video_core/textures/decoders.cpp b/src/video_core/textures/decoders.cpp index 52d067a2d..fd1a4b987 100644 --- a/src/video_core/textures/decoders.cpp +++ b/src/video_core/textures/decoders.cpp | |||
| @@ -21,7 +21,7 @@ constexpr u32 pdep(u32 value) { | |||
| 21 | u32 m = mask; | 21 | u32 m = mask; |
| 22 | for (u32 bit = 1; m; bit += bit) { | 22 | for (u32 bit = 1; m; bit += bit) { |
| 23 | if (value & bit) | 23 | if (value & bit) |
| 24 | result |= m & -m; | 24 | result |= m & (~m + 1); |
| 25 | m &= m - 1; | 25 | m &= m - 1; |
| 26 | } | 26 | } |
| 27 | return result; | 27 | return result; |
diff --git a/src/yuzu/multiplayer/state.cpp b/src/yuzu/multiplayer/state.cpp index ae2738ad4..285bb150d 100644 --- a/src/yuzu/multiplayer/state.cpp +++ b/src/yuzu/multiplayer/state.cpp | |||
| @@ -268,7 +268,7 @@ bool MultiplayerState::OnCloseRoom() { | |||
| 268 | return true; | 268 | return true; |
| 269 | } | 269 | } |
| 270 | // Save ban list | 270 | // Save ban list |
| 271 | UISettings::values.multiplayer_ban_list = std::move(room->GetBanList()); | 271 | UISettings::values.multiplayer_ban_list = room->GetBanList(); |
| 272 | 272 | ||
| 273 | room->Destroy(); | 273 | room->Destroy(); |
| 274 | announce_multiplayer_session->Stop(); | 274 | announce_multiplayer_session->Stop(); |
diff --git a/src/yuzu/startup_checks.cpp b/src/yuzu/startup_checks.cpp index fc2693f9d..6a91212e2 100644 --- a/src/yuzu/startup_checks.cpp +++ b/src/yuzu/startup_checks.cpp | |||
| @@ -49,7 +49,7 @@ bool CheckEnvVars(bool* is_child) { | |||
| 49 | *is_child = true; | 49 | *is_child = true; |
| 50 | return false; | 50 | return false; |
| 51 | } else if (!SetEnvironmentVariableA(IS_CHILD_ENV_VAR, ENV_VAR_ENABLED_TEXT)) { | 51 | } else if (!SetEnvironmentVariableA(IS_CHILD_ENV_VAR, ENV_VAR_ENABLED_TEXT)) { |
| 52 | std::fprintf(stderr, "SetEnvironmentVariableA failed to set %s with error %d\n", | 52 | std::fprintf(stderr, "SetEnvironmentVariableA failed to set %s with error %lu\n", |
| 53 | IS_CHILD_ENV_VAR, GetLastError()); | 53 | IS_CHILD_ENV_VAR, GetLastError()); |
| 54 | return true; | 54 | return true; |
| 55 | } | 55 | } |
| @@ -62,7 +62,7 @@ bool StartupChecks(const char* arg0, bool* has_broken_vulkan, bool perform_vulka | |||
| 62 | // Set the startup variable for child processes | 62 | // Set the startup variable for child processes |
| 63 | const bool env_var_set = SetEnvironmentVariableA(STARTUP_CHECK_ENV_VAR, ENV_VAR_ENABLED_TEXT); | 63 | const bool env_var_set = SetEnvironmentVariableA(STARTUP_CHECK_ENV_VAR, ENV_VAR_ENABLED_TEXT); |
| 64 | if (!env_var_set) { | 64 | if (!env_var_set) { |
| 65 | std::fprintf(stderr, "SetEnvironmentVariableA failed to set %s with error %d\n", | 65 | std::fprintf(stderr, "SetEnvironmentVariableA failed to set %s with error %lu\n", |
| 66 | STARTUP_CHECK_ENV_VAR, GetLastError()); | 66 | STARTUP_CHECK_ENV_VAR, GetLastError()); |
| 67 | return false; | 67 | return false; |
| 68 | } | 68 | } |
| @@ -81,22 +81,22 @@ bool StartupChecks(const char* arg0, bool* has_broken_vulkan, bool perform_vulka | |||
| 81 | DWORD exit_code = STILL_ACTIVE; | 81 | DWORD exit_code = STILL_ACTIVE; |
| 82 | const int err = GetExitCodeProcess(process_info.hProcess, &exit_code); | 82 | const int err = GetExitCodeProcess(process_info.hProcess, &exit_code); |
| 83 | if (err == 0) { | 83 | if (err == 0) { |
| 84 | std::fprintf(stderr, "GetExitCodeProcess failed with error %d\n", GetLastError()); | 84 | std::fprintf(stderr, "GetExitCodeProcess failed with error %lu\n", GetLastError()); |
| 85 | } | 85 | } |
| 86 | 86 | ||
| 87 | // Vulkan is broken if the child crashed (return value is not zero) | 87 | // Vulkan is broken if the child crashed (return value is not zero) |
| 88 | *has_broken_vulkan = (exit_code != 0); | 88 | *has_broken_vulkan = (exit_code != 0); |
| 89 | 89 | ||
| 90 | if (CloseHandle(process_info.hProcess) == 0) { | 90 | if (CloseHandle(process_info.hProcess) == 0) { |
| 91 | std::fprintf(stderr, "CloseHandle failed with error %d\n", GetLastError()); | 91 | std::fprintf(stderr, "CloseHandle failed with error %lu\n", GetLastError()); |
| 92 | } | 92 | } |
| 93 | if (CloseHandle(process_info.hThread) == 0) { | 93 | if (CloseHandle(process_info.hThread) == 0) { |
| 94 | std::fprintf(stderr, "CloseHandle failed with error %d\n", GetLastError()); | 94 | std::fprintf(stderr, "CloseHandle failed with error %lu\n", GetLastError()); |
| 95 | } | 95 | } |
| 96 | } | 96 | } |
| 97 | 97 | ||
| 98 | if (!SetEnvironmentVariableA(STARTUP_CHECK_ENV_VAR, nullptr)) { | 98 | if (!SetEnvironmentVariableA(STARTUP_CHECK_ENV_VAR, nullptr)) { |
| 99 | std::fprintf(stderr, "SetEnvironmentVariableA failed to clear %s with error %d\n", | 99 | std::fprintf(stderr, "SetEnvironmentVariableA failed to clear %s with error %lu\n", |
| 100 | STARTUP_CHECK_ENV_VAR, GetLastError()); | 100 | STARTUP_CHECK_ENV_VAR, GetLastError()); |
| 101 | } | 101 | } |
| 102 | 102 | ||
| @@ -135,7 +135,8 @@ bool SpawnChild(const char* arg0, PROCESS_INFORMATION* pi, int flags) { | |||
| 135 | startup_info.cb = sizeof(startup_info); | 135 | startup_info.cb = sizeof(startup_info); |
| 136 | 136 | ||
| 137 | char p_name[255]; | 137 | char p_name[255]; |
| 138 | std::strncpy(p_name, arg0, 255); | 138 | std::strncpy(p_name, arg0, 254); |
| 139 | p_name[254] = '\0'; | ||
| 139 | 140 | ||
| 140 | const bool process_created = CreateProcessA(nullptr, // lpApplicationName | 141 | const bool process_created = CreateProcessA(nullptr, // lpApplicationName |
| 141 | p_name, // lpCommandLine | 142 | p_name, // lpCommandLine |
| @@ -149,7 +150,7 @@ bool SpawnChild(const char* arg0, PROCESS_INFORMATION* pi, int flags) { | |||
| 149 | pi // lpProcessInformation | 150 | pi // lpProcessInformation |
| 150 | ); | 151 | ); |
| 151 | if (!process_created) { | 152 | if (!process_created) { |
| 152 | std::fprintf(stderr, "CreateProcessA failed with error %d\n", GetLastError()); | 153 | std::fprintf(stderr, "CreateProcessA failed with error %lu\n", GetLastError()); |
| 153 | return false; | 154 | return false; |
| 154 | } | 155 | } |
| 155 | 156 | ||