diff --git a/CMakeLists.txt b/CMakeLists.txt index 56ef592c0c..e0ceec5f06 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -153,12 +153,15 @@ if (CXX_CLANG_CL) $<$:-Wno-reserved-identifier> $<$:-Wno-deprecated-declarations> $<$:-Wno-cast-function-type-mismatch> - $<$:/EHsc>) + $<$:/EHsc> + ) + # REQUIRED CPU features IN Windows-amd64 if (ARCHITECTURE_x86_64) add_compile_options( $<$:-msse4.1> - $<$:-mcx16>) + $<$:-mcx16> + ) endif() endif() @@ -401,7 +404,8 @@ if (Boost_ADDED) target_compile_options(boost_icl INTERFACE $<$:-Wno-shadow>) target_compile_options(boost_asio INTERFACE $<$:-Wno-conversion> - $<$:-Wno-implicit-fallthrough>) + $<$:-Wno-implicit-fallthrough> + ) endif() endif() @@ -439,7 +443,9 @@ if (NOT YUZU_STATIC_ROOM) if (Opus_ADDED) if (MSVC AND CXX_CLANG) - target_compile_options(opus PRIVATE $<$:-Wno-implicit-function-declaration>) + target_compile_options(opus PRIVATE + $<$:-Wno-implicit-function-declaration> + ) endif() endif() diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 600b985609..2905fdf3fa 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -120,8 +120,9 @@ else() add_compile_options( $<$:-fwrapv> $<$:-pipe> - # Disable RTTI (C++ only) - $<$:-fno-rtti>) + ) + # Disable RTTI (C++ only) + add_compile_options($<$:-fno-rtti>) endif() add_compile_options( @@ -130,22 +131,27 @@ else() $<$:-Werror=missing-declarations> $<$:-Werror=shadow> $<$:-Werror=unused> + $<$:-Wno-attributes> $<$:-Wno-invalid-offsetof> $<$:-Wno-unused-parameter> - $<$:-Wno-missing-field-initializers>) + $<$:-Wno-missing-field-initializers> + ) if (CXX_CLANG OR CXX_ICC OR CXX_APPLE) # Clang, AppleClang, or Intel C++ if (NOT MSVC) add_compile_options( $<$:-Werror=shadow-uncaptured-local> $<$:-Werror=implicit-fallthrough> - $<$:-Werror=type-limits>) + $<$:-Werror=type-limits> + ) endif() + add_compile_options( $<$:-Wno-braced-scalar-init> $<$:-Wno-unused-private-field> - $<$:-Wno-nullability-completeness>) + $<$:-Wno-nullability-completeness> + ) endif() if (ARCHITECTURE_x86_64) @@ -163,7 +169,8 @@ else() add_compile_options( $<$:-Wno-array-bounds> $<$:-Wno-stringop-overread> - $<$:-Wno-stringop-overflow>) + $<$:-Wno-stringop-overflow> + ) endif() # Set file offset size to 64 bits. diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/DriverManagerFragment.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/DriverManagerFragment.kt index 3aa55522e6..877097dc80 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/DriverManagerFragment.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/DriverManagerFragment.kt @@ -29,6 +29,7 @@ import org.yuzu.yuzu_emu.databinding.FragmentDriverManagerBinding import org.yuzu.yuzu_emu.features.settings.model.Settings import org.yuzu.yuzu_emu.features.settings.model.StringSetting import org.yuzu.yuzu_emu.features.settings.ui.SettingsSubscreen +import org.yuzu.yuzu_emu.model.Driver.Companion.toDriver import org.yuzu.yuzu_emu.model.DriverViewModel import org.yuzu.yuzu_emu.model.HomeViewModel import org.yuzu.yuzu_emu.utils.FileUtil @@ -215,23 +216,19 @@ class DriverManagerFragment : Fragment() { val driverData = GpuDriverHelper.getMetadataFromZip(driverFile) val driverInList = - driverViewModel.driverData.firstOrNull { - it.first == driverPath || it.second == driverData - } + driverViewModel.driverData.firstOrNull { it.second == driverData } if (driverInList != null) { return@newInstance getString(R.string.driver_already_installed) } else { driverViewModel.onDriverAdded(Pair(driverPath, driverData)) withContext(Dispatchers.Main) { if (_binding != null) { - refreshDriverList() val adapter = binding.listDrivers.adapter as DriverAdapter - val selectedPosition = adapter.currentList - .indexOfFirst { it.selected } - .let { if (it == -1) 0 else it } + adapter.addItem(driverData.toDriver()) + adapter.selectItem(adapter.currentList.indices.last) driverViewModel.showClearButton(!StringSetting.DRIVER_PATH.global) binding.listDrivers - .smoothScrollToPosition(selectedPosition) + .smoothScrollToPosition(adapter.currentList.indices.last) } } } diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/DriverViewModel.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/DriverViewModel.kt index 3904f83279..fc7fbc9bfc 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/DriverViewModel.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/DriverViewModel.kt @@ -154,30 +154,15 @@ class DriverViewModel : ViewModel() { } fun onDriverRemoved(removedPosition: Int, selectedPosition: Int) { - val driverIndex = removedPosition - 1 - if (driverIndex !in driverData.indices) { - updateDriverList() - return - } - - driversToDelete.add(driverData[driverIndex].first) - driverData.removeAt(driverIndex) - val safeSelectedPosition = selectedPosition.coerceIn(0, driverData.size) - onDriverSelected(safeSelectedPosition) + driversToDelete.add(driverData[removedPosition - 1].first) + driverData.removeAt(removedPosition - 1) + onDriverSelected(selectedPosition) } fun onDriverAdded(driver: Pair) { if (driversToDelete.contains(driver.first)) { driversToDelete.remove(driver.first) } - - val existingDriverIndex = driverData.indexOfFirst { - it.first == driver.first || it.second == driver.second - } - if (existingDriverIndex != -1) { - onDriverSelected(existingDriverIndex + 1) - return - } driverData.add(driver) onDriverSelected(driverData.size) } diff --git a/src/audio_core/CMakeLists.txt b/src/audio_core/CMakeLists.txt index e31fd2c5b9..512c109f6f 100644 --- a/src/audio_core/CMakeLists.txt +++ b/src/audio_core/CMakeLists.txt @@ -223,7 +223,8 @@ if (MSVC) else() target_compile_options(audio_core PRIVATE $<$:-Werror=conversion> - $<$:-Wno-sign-conversion>) + $<$:-Wno-sign-conversion> + ) endif() target_include_directories(audio_core PRIVATE ${OPUS_INCLUDE_DIRS}) diff --git a/src/common/CMakeLists.txt b/src/common/CMakeLists.txt index 1ee4794272..0e16aa8c61 100644 --- a/src/common/CMakeLists.txt +++ b/src/common/CMakeLists.txt @@ -227,7 +227,8 @@ endif() if(CXX_CLANG) target_compile_options(common PRIVATE $<$:-fsized-deallocation> - $<$:-Werror=unreachable-code-aggressive>) + $<$:-Werror=unreachable-code-aggressive> + ) target_compile_definitions( common PRIVATE diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt index 08a2d0e2db..d3643dedf6 100644 --- a/src/core/CMakeLists.txt +++ b/src/core/CMakeLists.txt @@ -1198,7 +1198,8 @@ else() $<$:-Werror=conversion> $<$:-Wno-sign-conversion> $<$:-Wno-cast-function-type> - $<$:-fsized-deallocation>) + $<$:-fsized-deallocation> + ) # pre-clang19 will spam with "OH DID YOU MEAN THIS?" otherwise... if (CXX_CLANG AND CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 19) target_compile_options(core PRIVATE $<$:-Wno-cast-function-type-mismatch>) diff --git a/src/dynarmic/src/dynarmic/CMakeLists.txt b/src/dynarmic/src/dynarmic/CMakeLists.txt index 2f05d8a34b..7abee86522 100644 --- a/src/dynarmic/src/dynarmic/CMakeLists.txt +++ b/src/dynarmic/src/dynarmic/CMakeLists.txt @@ -53,6 +53,7 @@ add_library(dynarmic STATIC common/fp/util.h common/llvm_disassemble.cpp common/llvm_disassemble.h + common/lut_from_list.h common/math_util.cpp common/math_util.h common/safe_ops.h diff --git a/src/dynarmic/src/dynarmic/backend/arm64/emit_arm64_vector_floating_point.cpp b/src/dynarmic/src/dynarmic/backend/arm64/emit_arm64_vector_floating_point.cpp index 431d51c081..4d11c62abd 100644 --- a/src/dynarmic/src/dynarmic/backend/arm64/emit_arm64_vector_floating_point.cpp +++ b/src/dynarmic/src/dynarmic/backend/arm64/emit_arm64_vector_floating_point.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later /* This file is part of the dynarmic project. @@ -31,6 +31,7 @@ #include "dynarmic/common/fp/info.h" #include "dynarmic/common/fp/op.h" #include "dynarmic/common/fp/rounding_mode.h" +#include "dynarmic/common/lut_from_list.h" #include "dynarmic/ir/basic_block.h" #include "dynarmic/ir/microinstruction.h" #include "dynarmic/ir/opcodes.h" diff --git a/src/dynarmic/src/dynarmic/backend/x64/emit_x64_floating_point.cpp b/src/dynarmic/src/dynarmic/backend/x64/emit_x64_floating_point.cpp index abe04b53ff..76c103ec6f 100644 --- a/src/dynarmic/src/dynarmic/backend/x64/emit_x64_floating_point.cpp +++ b/src/dynarmic/src/dynarmic/backend/x64/emit_x64_floating_point.cpp @@ -31,6 +31,7 @@ #include "dynarmic/common/fp/info.h" #include "dynarmic/common/fp/op.h" #include "dynarmic/common/fp/rounding_mode.h" +#include "dynarmic/common/lut_from_list.h" #include "dynarmic/interface/optimization_flags.h" #include "dynarmic/ir/basic_block.h" #include "dynarmic/ir/microinstruction.h" diff --git a/src/dynarmic/src/dynarmic/backend/x64/emit_x64_vector_floating_point.cpp b/src/dynarmic/src/dynarmic/backend/x64/emit_x64_vector_floating_point.cpp index ee9ec39f46..2247b18fcd 100644 --- a/src/dynarmic/src/dynarmic/backend/x64/emit_x64_vector_floating_point.cpp +++ b/src/dynarmic/src/dynarmic/backend/x64/emit_x64_vector_floating_point.cpp @@ -31,6 +31,7 @@ #include "dynarmic/common/fp/info.h" #include "dynarmic/common/fp/op.h" #include "dynarmic/common/fp/util.h" +#include "dynarmic/common/lut_from_list.h" #include "dynarmic/interface/optimization_flags.h" #include "dynarmic/ir/basic_block.h" #include "dynarmic/ir/microinstruction.h" @@ -2126,42 +2127,28 @@ void EmitFPVectorToFixed(BlockOfCode& code, EmitContext& ctx, IR::Inst* inst) { } } - using FPT = mcl::unsigned_integer_of_size; // WORKAROUND: For issue 678 on MSVC - auto const func = [rounding]() -> void(*)(VectorArray& output, const VectorArray& input, FP::FPCR fpcr, FP::FPSR& fpsr) { - switch (rounding) { - case FP::RoundingMode::ToNearest_TieEven: - return [](VectorArray& output, const VectorArray& input, FP::FPCR fpcr, FP::FPSR& fpsr) { + using fbits_list = mp::lift_sequence>; + using rounding_list = mp::list< + mp::lift_value, + mp::lift_value, + mp::lift_value, + mp::lift_value, + mp::lift_value>; + + static const auto lut = Common::GenerateLookupTableFromList([](I) { + using FPT = mcl::unsigned_integer_of_size; // WORKAROUND: For issue 678 on MSVC + return std::pair{ + mp::lower_to_tuple_v, + Common::FptrCast([](VectorArray& output, const VectorArray& input, FP::FPCR fpcr, FP::FPSR& fpsr) { + constexpr size_t fbits = mp::get<0, I>::value; + constexpr FP::RoundingMode rounding_mode = mp::get<1, I>::value; for (size_t i = 0; i < output.size(); ++i) - output[i] = FPT(FP::FPToFixed(fsize, input[i], fsize, unsigned_, fpcr, FP::RoundingMode::ToNearest_TieEven, fpsr)); - }; - case FP::RoundingMode::TowardsPlusInfinity: - return [](VectorArray& output, const VectorArray& input, FP::FPCR fpcr, FP::FPSR& fpsr) { - for (size_t i = 0; i < output.size(); ++i) - output[i] = FPT(FP::FPToFixed(fsize, input[i], fsize, unsigned_, fpcr, FP::RoundingMode::TowardsPlusInfinity, fpsr)); - }; - case FP::RoundingMode::TowardsMinusInfinity: - return [](VectorArray& output, const VectorArray& input, FP::FPCR fpcr, FP::FPSR& fpsr) { - for (size_t i = 0; i < output.size(); ++i) - output[i] = FPT(FP::FPToFixed(fsize, input[i], fsize, unsigned_, fpcr, FP::RoundingMode::TowardsMinusInfinity, fpsr)); - }; - case FP::RoundingMode::TowardsZero: - return [](VectorArray& output, const VectorArray& input, FP::FPCR fpcr, FP::FPSR& fpsr) { - for (size_t i = 0; i < output.size(); ++i) - output[i] = FPT(FP::FPToFixed(fsize, input[i], fsize, unsigned_, fpcr, FP::RoundingMode::TowardsZero, fpsr)); - }; - case FP::RoundingMode::ToNearest_TieAwayFromZero: - return [](VectorArray& output, const VectorArray& input, FP::FPCR fpcr, FP::FPSR& fpsr) { - for (size_t i = 0; i < output.size(); ++i) - output[i] = FPT(FP::FPToFixed(fsize, input[i], fsize, unsigned_, fpcr, FP::RoundingMode::ToNearest_TieAwayFromZero, fpsr)); - }; - case FP::RoundingMode::ToOdd: - return [](VectorArray& output, const VectorArray& input, FP::FPCR fpcr, FP::FPSR& fpsr) { - for (size_t i = 0; i < output.size(); ++i) - output[i] = FPT(FP::FPToFixed(fsize, input[i], fsize, unsigned_, fpcr, FP::RoundingMode::ToOdd, fpsr)); - }; - } - }(); - EmitTwoOpFallback<3>(code, ctx, inst, func); + output[i] = FPT(FP::FPToFixed(fsize, input[i], fbits, unsigned_, fpcr, rounding_mode, fpsr)); + }) + }; + }, mp::cartesian_product{}); + + EmitTwoOpFallback<3>(code, ctx, inst, lut.at(std::make_tuple(fbits, rounding))); } void EmitX64::EmitFPVectorToSignedFixed16(EmitContext& ctx, IR::Inst* inst) { diff --git a/src/dynarmic/src/dynarmic/common/lut_from_list.h b/src/dynarmic/src/dynarmic/common/lut_from_list.h new file mode 100644 index 0000000000..633b62aeda --- /dev/null +++ b/src/dynarmic/src/dynarmic/common/lut_from_list.h @@ -0,0 +1,55 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +/* This file is part of the dynarmic project. + * Copyright (c) 2018 MerryMage + * SPDX-License-Identifier: 0BSD + */ + +#pragma once + +#include +#include +#include + +#include +#include +#include + +#ifdef _MSC_VER +# include +#endif + +namespace Dynarmic::Common { + +// prevents this function from printing 56,000 character warning messages +#ifdef __GNUC__ +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wno-stack-usage" +#endif +#ifdef __clang__ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wno-stack-usage" +#endif + +template +inline auto GenerateLookupTableFromList(Function f, mcl::mp::list) { +#ifdef _MSC_VER + using PairT = std::invoke_result_t>>; +#else + using PairT = std::common_type_t...>; +#endif + using MapT = mcl::mp::apply; + static_assert(mcl::is_instance_of_template_v); + const std::initializer_list pair_array{f(Values{})...}; + return MapT(pair_array.begin(), pair_array.end()); +} + +#ifdef __GNUC__ +#pragma GCC diagnostic pop +#endif +#ifdef __clang__ +#pragma clang diagnostic pop +#endif + +} // namespace Dynarmic::Common diff --git a/src/hid_core/CMakeLists.txt b/src/hid_core/CMakeLists.txt index c740cdbe7f..c8f9250721 100644 --- a/src/hid_core/CMakeLists.txt +++ b/src/hid_core/CMakeLists.txt @@ -154,7 +154,8 @@ else() $<$:-Werror=conversion> $<$:-Wno-sign-conversion> $<$:-Wno-cast-function-type> - $<$:-fsized-deallocation>) + $<$:-fsized-deallocation> + ) endif() create_target_directory_groups(hid_core) diff --git a/src/tests/CMakeLists.txt b/src/tests/CMakeLists.txt index 875c40604c..23b398af30 100644 --- a/src/tests/CMakeLists.txt +++ b/src/tests/CMakeLists.txt @@ -35,5 +35,6 @@ if (NOT MSVC) $<$:-Wno-conversion> $<$:-Wno-unused-variable> $<$:-Wno-unused-parameter> - $<$:-Wno-missing-field-initializers>) + $<$:-Wno-missing-field-initializers> + ) endif() diff --git a/src/video_core/CMakeLists.txt b/src/video_core/CMakeLists.txt index 362b068656..df642194ee 100644 --- a/src/video_core/CMakeLists.txt +++ b/src/video_core/CMakeLists.txt @@ -365,7 +365,8 @@ else() # error: implicit conversion loses integer precision: 'int' to 'boost::icl::bound_type' (aka 'unsigned char') target_compile_options(video_core PRIVATE $<$:-Wno-shadow> - $<$:-Wno-unused-local-typedef>) + $<$:-Wno-unused-local-typedef> + ) else() target_compile_options(video_core PRIVATE $<$:-Werror=conversion>) endif() diff --git a/src/yuzu/CMakeLists.txt b/src/yuzu/CMakeLists.txt index 79642711ac..e030643a36 100644 --- a/src/yuzu/CMakeLists.txt +++ b/src/yuzu/CMakeLists.txt @@ -446,7 +446,8 @@ if (NOT MSVC AND (APPLE OR NOT YUZU_STATIC_BUILD)) $<$:-Wno-conversion> $<$:-Wno-unused-variable> $<$:-Wno-unused-parameter> - $<$:-Wno-missing-field-initializers>) + $<$:-Wno-missing-field-initializers> + ) endif() # Remember that the linker is incredibly stupid. diff --git a/src/yuzu_cmd/CMakeLists.txt b/src/yuzu_cmd/CMakeLists.txt index 8f92525ad6..b3f2b4fd8b 100644 --- a/src/yuzu_cmd/CMakeLists.txt +++ b/src/yuzu_cmd/CMakeLists.txt @@ -63,5 +63,6 @@ if (NOT MSVC) $<$:-Wno-conversion> $<$:-Wno-unused-variable> $<$:-Wno-unused-parameter> - $<$:-Wno-missing-field-initializers>) + $<$:-Wno-missing-field-initializers> + ) endif()