Merge branch 'dev' into dev
Some checks failed
codespell / Check for spelling errors (push) Successful in 1m5s
suyu-ci / Check REUSE Specification (push) Has been skipped
suyu verify / Verify Format (push) Failing after 1m17s
suyu verify / test build (push) Has been skipped
suyu verify / android (push) Has been skipped

This commit is contained in:
Aphcity 2024-11-25 20:51:04 +01:00
commit c2cc2c2674
55 changed files with 118 additions and 83 deletions

View file

@ -7,6 +7,8 @@
export NDK_CCACHE="$(which ccache)"
ccache -s
git submodule update --init --recursive
BUILD_FLAVOR="mainline"
BUILD_TYPE="release"

View file

@ -7,7 +7,9 @@
# Exit on error, rather than continuing with the rest of the script.
set -e
ccache -sv
ccache -s
git submodule update --init --recursive
mkdir build || true && cd build
cmake .. \

View file

@ -6,7 +6,9 @@
# Exit on error, rather than continuing with the rest of the script.
set -e
ccache -sv
ccache -s
git submodule update --init --recursive
mkdir build || true && cd build
cmake .. \
@ -52,9 +54,9 @@ DESTDIR="$PWD/AppDir" ninja install
rm -vf AppDir/usr/bin/suyu-cmd AppDir/usr/bin/suyu-tester
# Download tools needed to build an AppImage
wget -nc https://gitlab.com/suyu-emu/ext-linux-bin/-/raw/main/appimage/deploy-linux.sh
wget -nc https://gitlab.com/suyu-emu/ext-linux-bin/-/raw/main/appimage/exec-x86_64.so
wget -nc https://gitlab.com/suyu-emu/AppImageKit-checkrt/-/raw/old/AppRun.sh
wget -nc https://git.suyu.dev/suyu/ext-linux-bin/raw/branch/main/appimage/deploy-linux.sh
wget -nc https://git.suyu.dev/suyu/ext-linux-bin/raw/branch/main/appimage/exec-x86_64.so
wget -nc https://git.suyu.dev/suyu/AppImageKit-checkrt/raw/branch/gh-workflow/AppRun
# Set executable bit
chmod 755 \

View file

@ -8,7 +8,9 @@ set -e
#cd /suyu
ccache -sv
ccache -s
git submodule update --init --recursive
rm -rf build
mkdir -p build && cd build

View file

@ -8,7 +8,7 @@ name: 'suyu verify'
on:
pull_request:
branches: [ "dev" ]
# branches: [ "dev" ]
paths:
- 'src/**'
- 'CMakeModules/**'
@ -19,7 +19,7 @@ on:
# paths-ignore:
# - 'src/android/**'
push:
branches: [ "dev" ]
# branches: [ "dev" ]
paths:
- 'src/**'
- 'CMakeModules/**'

View file

@ -279,8 +279,6 @@ endif()
# Configure C++ standard
# ===========================
# boost asio's concept usage doesn't play nicely with some compilers yet.
add_definitions(-DBOOST_ASIO_DISABLE_CONCEPTS)
if (MSVC)
add_compile_options($<$<COMPILE_LANGUAGE:CXX>:/std:c++20>)

View file

@ -1,3 +1,7 @@
<!--
SPDX-FileCopyrightText: 2024 suyu Emulator Project
SPDX-License-Identifier: GPL-3.0-or-later
-->
# Migrating from yuzu
When coming from yuzu, the migration is as easy as renaming some directories.

View file

@ -6,9 +6,10 @@ SPDX-License-Identifier: GPL-3.0-or-later
**Note**: We do not support or condone piracy in any form. In order to use suyu, you'll need keys from your real Switch system, and games which you have legally obtained and paid for. We do not intend to make money or profit from this project.
We're in need of developers. Please join our chat below if you want to contribute!
This repo was based on Yuzu EA 4176 but the code is being rewritten from the ground up for legal and performance reasons.
We're in need of developers. Please join our chat below or DM a dev if you want to contribute!
This repo is currently based on Yuzu EA 4176 but the code will be rewritten for legal and performance reasons.
Our only website is suyu.dev so please be cautious when using other sites offering builds/downloads.
<hr />
@ -22,12 +23,13 @@ This repo was based on Yuzu EA 4176 but the code is being rewritten from the gro
<h4 align="center"><b>suyu</b> was the continuation of the world's most popular, open-source Nintendo Switch emulator, yuzu, but is now something more.
<br>
It is written in C++ with portability in mind, and we actively provide builds for Windows, Linux, Android and iOS potentially coming soon.
It is written in C++ with portability in mind, and we actively provide builds for Windows, Linux and Android, iOS may come later.
</h4>
<p align="center">
<a href="https://chat.suyu.dev">Chat</a> |
<a href="https://www.reddit.com/r/suyu/">Reddit</a> |
<a href="#status">Status</a> |
<a href="#development">Development</a> |
<a href="#downloads">Downloads</a> |
@ -54,7 +56,7 @@ We currently have builds over at the [Releases](https://git.suyu.dev/suyu/suyu/r
This project is completely free and open source, and anyone can contribute to help improve suyu.
Most of the development happens on the Git. For development discussion, please join us in our [Chat](https://chat.suyu.dev) or contact a developer.
Most of the development happens on Git. For development discussion, please join us in our [Chat](https://chat.suyu.dev) or [Subreddit](reddit.com/r/suyu/), you can also contact a developer.
If you want to contribute, please take a look at the [Contributor's Guide](https://git.suyu.dev/suyu/suyu/wiki/Contributing) and [Developer Information](https://git.suyu.dev/suyu/suyu/wiki/Developer-Information).
You can also contact any of the developers on the Chat to learn more about the current state of suyu.
@ -65,25 +67,27 @@ You can also contact any of the developers on the Chat to learn more about the c
* __Linux__: [Releases](https://git.suyu.dev/suyu/suyu/releases)
* __macOS__: [Releases](https://git.suyu.dev/suyu/suyu/releases)
* __Android__: [Releases](https://git.suyu.dev/suyu/suyu/releases)
###### We currently do not provide builds for iOS, however if you would like, you could try the experimental [Sudachi](https://github.com/emuPlace/Sudachi/releases)/[Folium](https://github.com/jarrodnorwell/Folium/releases).
###### We currently do not provide builds for iOS, however if you would like, you could try the experimental [Sudachi Emulator](https://sudachi.emuplace.app/) and it's bigger project: [Folium](https://apps.apple.com/us/app/folium/id6498623389).
If you want daily builds then [Click here](https://git.suyu.dev/suyu/suyu/actions).
If you don't know how to download the daily builds then [Click here](https://git.suyu.dev/suyu/suyu/raw/branch/dev/img/daily-builds.png)
We have official builds [here.](https://git.suyu.dev/suyu/suyu/releases)<br>If any website or person is claiming to have a build for suyu, take that with a grain of salt.
We have official builds [here.](https://git.suyu.dev/suyu/suyu/releases)<br>If any website or person is claiming to have a build for suyu, take that with a grain of salt and let us know.
For Multiplayer, we recommend using the "Yuzu Online" patch, install instructions can be found on Reddit and their Discord.
## Building
* __Windows__: [Windows Build](https://git.suyu.dev/suyu/suyu/wiki/Building-For-Windows)
* __Linux__: [Linux Build](https://git.suyu.dev/suyu/suyu/wiki/Building-For-Linux)
* __Android__: [Android Build](https://git.suyu.dev/suyu/suyu/wiki/Building-For-Android)
* __macOS__: [macOS Build](https://git.suyu.dev/suyu/suyu/wiki/Building-for-macOS)
* __MacOS__: [MacOS Build](https://git.suyu.dev/suyu/suyu/wiki/Building-for-macOS)
## Support
If you have any questions, don't hesitate to ask us in our [chat](https://chat.suyu.dev), make an issue or contact a developer. We don't bite!
If you have any questions, don't hesitate to ask us in our [Chat](https://chat.suyu.dev) or [Subreddit](https://www.reddit.com/r/suyu/), make an issue or contact a developer. We don't bite!
## License

BIN
img/need to fix bugs.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 249 KiB

View file

@ -13,7 +13,7 @@
#include "common/polyfill_ranges.h"
namespace AudioCore {
constexpr u32 CurrentRevision = 11;
constexpr u32 CurrentRevision = 12;
enum class SupportTags {
CommandProcessingTimeEstimatorVersion4,

View file

@ -54,7 +54,8 @@ public:
const s32 to_register{std::min(std::min(appended_count, BufferAppendLimit),
BufferAppendLimit - registered_count)};
for (s32 i = 0; i < to_register; i++) {
out_buffers.reserve(to_register);
for (s32 i = 0; i < to_register; ++i) {
s32 index{appended_index - appended_count};
if (index < 0) {
index += N;
@ -180,6 +181,7 @@ public:
return 0;
}
buffers_flushed.reserve(registered_count + appended_count);
while (registered_count > 0) {
auto index{registered_index - registered_count};
if (index < 0) {

View file

@ -14,7 +14,7 @@ template <typename T>
struct fmt::formatter<T, std::enable_if_t<std::is_enum_v<T>, char>>
: formatter<std::underlying_type_t<T>> {
template <typename FormatContext>
auto format(const T& value, FormatContext& ctx) -> decltype(ctx.out()) {
auto format(const T& value, FormatContext& ctx) const -> decltype(ctx.out()) {
return fmt::formatter<std::underlying_type_t<T>>::format(
static_cast<std::underlying_type_t<T>>(value), ctx);
}

View file

@ -262,7 +262,7 @@ struct fmt::formatter<Common::PhysicalAddress> {
return ctx.begin();
}
template <typename FormatContext>
auto format(const Common::PhysicalAddress& addr, FormatContext& ctx) {
auto format(const Common::PhysicalAddress& addr, FormatContext& ctx) const {
return fmt::format_to(ctx.out(), "{:#x}", static_cast<u64>(addr.GetValue()));
}
};
@ -273,7 +273,7 @@ struct fmt::formatter<Common::ProcessAddress> {
return ctx.begin();
}
template <typename FormatContext>
auto format(const Common::ProcessAddress& addr, FormatContext& ctx) {
auto format(const Common::ProcessAddress& addr, FormatContext& ctx) const {
return fmt::format_to(ctx.out(), "{:#x}", static_cast<u64>(addr.GetValue()));
}
};
@ -284,7 +284,7 @@ struct fmt::formatter<Common::VirtualAddress> {
return ctx.begin();
}
template <typename FormatContext>
auto format(const Common::VirtualAddress& addr, FormatContext& ctx) {
auto format(const Common::VirtualAddress& addr, FormatContext& ctx) const {
return fmt::format_to(ctx.out(), "{:#x}", static_cast<u64>(addr.GetValue()));
}
};

View file

@ -22,7 +22,7 @@ struct fmt::formatter<Dynarmic::A32::CoprocReg> {
return ctx.begin();
}
template <typename FormatContext>
auto format(const Dynarmic::A32::CoprocReg& reg, FormatContext& ctx) {
auto format(const Dynarmic::A32::CoprocReg& reg, FormatContext& ctx) const {
return fmt::format_to(ctx.out(), "cp{}", static_cast<size_t>(reg));
}
};

View file

@ -80,6 +80,7 @@ FileSys::VirtualFile GetGameFileFromPath(const FileSys::VirtualFilesystem& vfs,
if (filename == "00") {
const auto dir = vfs->OpenDirectory(dir_name, FileSys::OpenMode::Read);
std::vector<FileSys::VirtualFile> concat;
concat.reserve(0x10);
for (u32 i = 0; i < 0x10; ++i) {
const auto file_name = fmt::format("{:02X}", i);

View file

@ -9,6 +9,7 @@
#include <thread>
#include <boost/algorithm/string.hpp>
#include <fmt/ranges.h>
#include "common/hex_util.h"
#include "common/logging/log.h"
@ -481,6 +482,7 @@ void GDBStub::HandleQuery(std::string_view command) {
// beginning of list
const auto& threads = GetProcess()->GetThreadList();
std::vector<std::string> thread_ids;
thread_ids.reserve(threads.size());
for (const auto& thread : threads) {
thread_ids.push_back(fmt::format("{:x}", thread.GetThreadId()));
}

View file

@ -261,7 +261,7 @@ std::vector<NcaID> PlaceholderCache::List() const {
std::vector<NcaID> out;
for (const auto& sdir : dir->GetSubdirectories()) {
for (const auto& file : sdir->GetFiles()) {
const auto name = file->GetName();
const auto& name = file->GetName();
if (name.length() == 36 && name.ends_with(".nca")) {
out.push_back(Common::HexStringToArray<0x10>(name.substr(0, 32)));
}

View file

@ -117,7 +117,9 @@ std::vector<std::shared_ptr<NCA>> NSP::GetNCAsCollapsed() const {
if (extracted)
LOG_WARNING(Service_FS, "called on an NSP that is of type extracted.");
std::vector<std::shared_ptr<NCA>> out;
out.reserve(ncas.size());
for (const auto& map : ncas) {
out.reserve(map.second.size());
for (const auto& inner_map : map.second)
out.push_back(inner_map.second);
}

View file

@ -10,7 +10,7 @@ namespace FileSys::SystemArchive {
namespace NgWord1Data {
constexpr std::size_t NUMBER_WORD_TXT_FILES = 0x10;
[[maybe_unused]] constexpr std::size_t NUMBER_WORD_TXT_FILES = 0x10;
// Should this archive replacement mysteriously not work on a future game, consider updating.
constexpr std::array<u8, 4> VERSION_DAT{0x0, 0x0, 0x0, 0x20}; // 11.0.1 System Version
@ -24,7 +24,7 @@ constexpr std::array<u8, 30> WORD_TXT{
VirtualDir NgWord1() {
std::vector<VirtualFile> files;
files.reserve(NgWord1Data::NUMBER_WORD_TXT_FILES);
files.reserve(files.size() + 2);
for (std::size_t i = 0; i < files.size(); ++i) {
files.push_back(MakeArrayFile(NgWord1Data::WORD_TXT, fmt::format("{}.txt", i)));
@ -54,7 +54,7 @@ constexpr std::array<u8, 0x2C> AC_NX_DATA{
VirtualDir NgWord2() {
std::vector<VirtualFile> files;
files.reserve(NgWord2Data::NUMBER_AC_NX_FILES * 3);
files.reserve(NgWord2Data::NUMBER_AC_NX_FILES + 4);
for (std::size_t i = 0; i < NgWord2Data::NUMBER_AC_NX_FILES; ++i) {
files.push_back(MakeArrayFile(NgWord2Data::AC_NX_DATA, fmt::format("ac_{}_b1_nx", i)));

View file

@ -37,6 +37,7 @@ const static std::map<std::string, const std::map<const char*, const std::vector
static void GenerateFiles(std::vector<VirtualFile>& directory,
const std::map<const char*, const std::vector<u8>>& files) {
directory.reserve(files.size());
for (const auto& [filename, data] : files) {
const auto data_copy{data};
const std::string filename_copy{filename};
@ -54,6 +55,7 @@ static std::vector<VirtualFile> GenerateZoneinfoFiles() {
VirtualDir TimeZoneBinary() {
std::vector<VirtualDir> america_sub_dirs;
america_sub_dirs.reserve(tzdb_america_dirs.size());
for (const auto& [dir_name, files] : tzdb_america_dirs) {
std::vector<VirtualFile> vfs_files;
GenerateFiles(vfs_files, files);
@ -62,6 +64,7 @@ VirtualDir TimeZoneBinary() {
}
std::vector<VirtualDir> zoneinfo_sub_dirs;
zoneinfo_sub_dirs.reserve(tzdb_zoneinfo_dirs.size());
for (const auto& [dir_name, files] : tzdb_zoneinfo_dirs) {
std::vector<VirtualFile> vfs_files;
GenerateFiles(vfs_files, files);

View file

@ -38,7 +38,8 @@ VirtualDir CachedVfsDirectory::GetSubdirectory(std::string_view dir_name) const
std::vector<VirtualFile> CachedVfsDirectory::GetFiles() const {
std::vector<VirtualFile> out;
for (auto& [file_name, file] : files) {
out.reserve(files.size());
for (const auto& [_, file] : files) {
out.push_back(file);
}
return out;
@ -46,7 +47,8 @@ std::vector<VirtualFile> CachedVfsDirectory::GetFiles() const {
std::vector<VirtualDir> CachedVfsDirectory::GetSubdirectories() const {
std::vector<VirtualDir> out;
for (auto& [dir_name, dir] : dirs) {
out.reserve(dirs.size());
for (auto& [_, dir] : dirs) {
out.push_back(dir);
}
return out;

View file

@ -121,7 +121,7 @@ void WindowSystem::RequestAppletVisibilityState(Applet& applet, bool visible) {
void WindowSystem::OnOperationModeChanged() {
std::scoped_lock lk{m_lock};
for (const auto& [aruid, applet] : m_applets) {
for (const auto& [_, applet] : m_applets) {
std::scoped_lock lk2{applet->lock};
applet->lifecycle_manager.OnOperationAndPerformanceModeChanged();
}
@ -130,7 +130,7 @@ void WindowSystem::OnOperationModeChanged() {
void WindowSystem::OnExitRequested() {
std::scoped_lock lk{m_lock};
for (const auto& [aruid, applet] : m_applets) {
for (const auto& [_, applet] : m_applets) {
std::scoped_lock lk2{applet->lock};
applet->lifecycle_manager.RequestExit();
}
@ -156,7 +156,7 @@ void WindowSystem::OnHomeButtonPressed(ButtonPressDuration type) {
void WindowSystem::PruneTerminatedAppletsLocked() {
for (auto it = m_applets.begin(); it != m_applets.end(); /* ... */) {
const auto& [aruid, applet] = *it;
const auto& [_, applet] = *it;
std::scoped_lock lk{applet->lock};

View file

@ -119,7 +119,7 @@ Result LANDiscovery::Scan(std::span<NetworkInfo> out_networks, s16& out_count,
std::this_thread::sleep_for(std::chrono::seconds(1));
std::scoped_lock lock{packet_mutex};
for (const auto& [key, info] : scan_results) {
for (const auto& [_, info] : scan_results) {
if (out_count >= static_cast<s16>(out_networks.size())) {
break;
}

View file

@ -15,6 +15,7 @@
#endif
#include <fmt/format.h>
#include <fmt/ranges.h>
#include "common/fs/file.h"
#include "common/fs/fs.h"

View file

@ -348,7 +348,7 @@ Result IApplicationManagerInterface::ListApplicationRecord(
size_t i = 0;
u8 ii = 24;
for (const auto& [slot, game] : installed_games) {
for (const auto& [_, game] : installed_games) {
if (i >= limit) {
break;
}

View file

@ -167,7 +167,7 @@ constexpr inline Result GetSpanBetweenTimePoints(s64* out_seconds, const SteadyC
template <>
struct fmt::formatter<Service::PSC::Time::TimeType> : fmt::formatter<fmt::string_view> {
template <typename FormatContext>
auto format(Service::PSC::Time::TimeType type, FormatContext& ctx) {
auto format(Service::PSC::Time::TimeType type, FormatContext& ctx) const {
const string_view name = [type] {
using Service::PSC::Time::TimeType;
switch (type) {
@ -270,4 +270,4 @@ struct fmt::formatter<Service::PSC::Time::ContinuousAdjustmentTimePoint>
time_point.rtc_offset, time_point.diff_scale, time_point.shift_amount,
time_point.lower, time_point.upper);
}
};
};

View file

@ -28,7 +28,7 @@ ServiceManager::ServiceManager(Kernel::KernelCore& kernel_) : kernel{kernel_} {
}
ServiceManager::~ServiceManager() {
for (auto& [name, port] : service_ports) {
for (auto& [_, port] : service_ports) {
port->Close();
}

View file

@ -571,7 +571,7 @@ SDLDriver::~SDLDriver() {
std::vector<Common::ParamPackage> SDLDriver::GetInputDevices() const {
std::vector<Common::ParamPackage> devices;
std::unordered_map<int, std::shared_ptr<SDLJoystick>> joycon_pairs;
for (const auto& [key, value] : joystick_map) {
for (const auto& [_, value] : joystick_map) {
for (const auto& joystick : value) {
if (!joystick->GetSDLJoystick()) {
continue;
@ -591,7 +591,7 @@ std::vector<Common::ParamPackage> SDLDriver::GetInputDevices() const {
}
// Add dual controllers
for (const auto& [key, value] : joystick_map) {
for (const auto& [_, value] : joystick_map) {
for (const auto& joystick : value) {
if (joystick->IsJoyconRight()) {
if (!joycon_pairs.contains(joystick->GetPort())) {

View file

@ -184,7 +184,7 @@ struct fmt::formatter<Shader::Backend::GLASM::Id> {
return ctx.begin();
}
template <typename FormatContext>
auto format(Shader::Backend::GLASM::Id id, FormatContext& ctx) {
auto format(Shader::Backend::GLASM::Id id, FormatContext& ctx) const {
return Shader::Backend::GLASM::FormatTo<true>(ctx, id);
}
};
@ -195,7 +195,7 @@ struct fmt::formatter<Shader::Backend::GLASM::Register> {
return ctx.begin();
}
template <typename FormatContext>
auto format(const Shader::Backend::GLASM::Register& value, FormatContext& ctx) {
auto format(const Shader::Backend::GLASM::Register& value, FormatContext& ctx) const {
if (value.type != Shader::Backend::GLASM::Type::Register) {
throw Shader::InvalidArgument("Register value type is not register");
}
@ -209,7 +209,7 @@ struct fmt::formatter<Shader::Backend::GLASM::ScalarRegister> {
return ctx.begin();
}
template <typename FormatContext>
auto format(const Shader::Backend::GLASM::ScalarRegister& value, FormatContext& ctx) {
auto format(const Shader::Backend::GLASM::ScalarRegister& value, FormatContext& ctx) const {
if (value.type != Shader::Backend::GLASM::Type::Register) {
throw Shader::InvalidArgument("Register value type is not register");
}
@ -223,7 +223,7 @@ struct fmt::formatter<Shader::Backend::GLASM::ScalarU32> {
return ctx.begin();
}
template <typename FormatContext>
auto format(const Shader::Backend::GLASM::ScalarU32& value, FormatContext& ctx) {
auto format(const Shader::Backend::GLASM::ScalarU32& value, FormatContext& ctx) const {
switch (value.type) {
case Shader::Backend::GLASM::Type::Void:
break;
@ -244,7 +244,7 @@ struct fmt::formatter<Shader::Backend::GLASM::ScalarS32> {
return ctx.begin();
}
template <typename FormatContext>
auto format(const Shader::Backend::GLASM::ScalarS32& value, FormatContext& ctx) {
auto format(const Shader::Backend::GLASM::ScalarS32& value, FormatContext& ctx) const {
switch (value.type) {
case Shader::Backend::GLASM::Type::Void:
break;
@ -265,7 +265,7 @@ struct fmt::formatter<Shader::Backend::GLASM::ScalarF32> {
return ctx.begin();
}
template <typename FormatContext>
auto format(const Shader::Backend::GLASM::ScalarF32& value, FormatContext& ctx) {
auto format(const Shader::Backend::GLASM::ScalarF32& value, FormatContext& ctx) const {
switch (value.type) {
case Shader::Backend::GLASM::Type::Void:
break;
@ -286,7 +286,7 @@ struct fmt::formatter<Shader::Backend::GLASM::ScalarF64> {
return ctx.begin();
}
template <typename FormatContext>
auto format(const Shader::Backend::GLASM::ScalarF64& value, FormatContext& ctx) {
auto format(const Shader::Backend::GLASM::ScalarF64& value, FormatContext& ctx) const {
switch (value.type) {
case Shader::Backend::GLASM::Type::Void:
break;

View file

@ -196,8 +196,11 @@ Id Texture(EmitContext& ctx, IR::TextureInstInfo info, [[maybe_unused]] const IR
}
Id TextureImage(EmitContext& ctx, IR::TextureInstInfo info, const IR::Value& index) {
if (!index.IsImmediate() || index.U32() != 0) {
throw NotImplementedException("Indirect image indexing");
// if (!index.IsImmediate() || index.Type() != Shader::IR::Type::U32 || index.U32() != 0) {
// throw NotImplementedException("Indirect image indexing");
// }
if (index.Type() != Shader::IR::Type::U32) {
LOG_WARNING(Shader_SPIRV, "Non-U32 type provided as index: {}", index.Type());
}
if (info.type == TextureType::Buffer) {
const TextureBufferDefinition& def{ctx.texture_buffers.at(info.descriptor_index)};
@ -215,8 +218,11 @@ Id TextureImage(EmitContext& ctx, IR::TextureInstInfo info, const IR::Value& ind
}
std::pair<Id, bool> Image(EmitContext& ctx, const IR::Value& index, IR::TextureInstInfo info) {
if (!index.IsImmediate() || index.U32() != 0) {
throw NotImplementedException("Indirect image indexing");
// if (!index.IsImmediate() || index.Type() != Shader::IR::Type::U32 || index.U32() != 0) {
// throw NotImplementedException("Indirect image indexing");
// }
if (index.Type() != Shader::IR::Type::U32) {
LOG_WARNING(Shader_SPIRV, "Non-U32 type provided as index: {}", index.Type());
}
if (info.type == TextureType::Buffer) {
const ImageBufferDefinition def{ctx.image_buffers.at(info.descriptor_index)};

View file

@ -250,7 +250,7 @@ struct fmt::formatter<Shader::IR::Attribute> {
return ctx.begin();
}
template <typename FormatContext>
auto format(const Shader::IR::Attribute& attribute, FormatContext& ctx) {
auto format(const Shader::IR::Attribute& attribute, FormatContext& ctx) const {
return fmt::format_to(ctx.out(), "{}", Shader::IR::NameOf(attribute));
}
};

View file

@ -52,7 +52,7 @@ struct fmt::formatter<Shader::IR::Condition> {
return ctx.begin();
}
template <typename FormatContext>
auto format(const Shader::IR::Condition& cond, FormatContext& ctx) {
auto format(const Shader::IR::Condition& cond, FormatContext& ctx) const {
return fmt::format_to(ctx.out(), "{}", Shader::IR::NameOf(cond));
}
};

View file

@ -55,7 +55,7 @@ struct fmt::formatter<Shader::IR::FlowTest> {
return ctx.begin();
}
template <typename FormatContext>
auto format(const Shader::IR::FlowTest& flow_test, FormatContext& ctx) {
auto format(const Shader::IR::FlowTest& flow_test, FormatContext& ctx) const {
return fmt::format_to(ctx.out(), "{}", Shader::IR::NameOf(flow_test));
}
};

View file

@ -54,7 +54,7 @@ constexpr Type F64x2{Type::F64x2};
constexpr Type F64x3{Type::F64x3};
constexpr Type F64x4{Type::F64x4};
constexpr OpcodeMeta META_TABLE[]{
constexpr OpcodeMeta META_TABLE[] {
#define OPCODE(name_token, type_token, ...) \
{ \
.name{#name_token}, \
@ -103,7 +103,7 @@ struct fmt::formatter<Shader::IR::Opcode> {
return ctx.begin();
}
template <typename FormatContext>
auto format(const Shader::IR::Opcode& op, FormatContext& ctx) {
auto format(const Shader::IR::Opcode& op, FormatContext& ctx) const {
return fmt::format_to(ctx.out(), "{}", Shader::IR::NameOf(op));
}
};

View file

@ -33,7 +33,7 @@ struct fmt::formatter<Shader::IR::Pred> {
return ctx.begin();
}
template <typename FormatContext>
auto format(const Shader::IR::Pred& pred, FormatContext& ctx) {
auto format(const Shader::IR::Pred& pred, FormatContext& ctx) const {
if (pred == Shader::IR::Pred::PT) {
return fmt::format_to(ctx.out(), "PT");
} else {

View file

@ -319,7 +319,7 @@ struct fmt::formatter<Shader::IR::Reg> {
return ctx.begin();
}
template <typename FormatContext>
auto format(const Shader::IR::Reg& reg, FormatContext& ctx) {
auto format(const Shader::IR::Reg& reg, FormatContext& ctx) const {
if (reg == Shader::IR::Reg::RZ) {
return fmt::format_to(ctx.out(), "RZ");
} else if (static_cast<int>(reg) >= 0 && static_cast<int>(reg) < 255) {

View file

@ -54,7 +54,7 @@ struct fmt::formatter<Shader::IR::Type> {
return ctx.begin();
}
template <typename FormatContext>
auto format(const Shader::IR::Type& type, FormatContext& ctx) {
auto format(const Shader::IR::Type& type, FormatContext& ctx) const {
return fmt::format_to(ctx.out(), "{}", NameOf(type));
}
};

View file

@ -102,7 +102,7 @@ struct fmt::formatter<Shader::Maxwell::Location> {
return ctx.begin();
}
template <typename FormatContext>
auto format(const Shader::Maxwell::Location& location, FormatContext& ctx) {
auto format(const Shader::Maxwell::Location& location, FormatContext& ctx) const {
return fmt::format_to(ctx.out(), "{:04x}", location.Offset());
}
};

View file

@ -23,7 +23,7 @@ struct fmt::formatter<Shader::Maxwell::Opcode> {
return ctx.begin();
}
template <typename FormatContext>
auto format(const Shader::Maxwell::Opcode& opcode, FormatContext& ctx) {
auto format(const Shader::Maxwell::Opcode& opcode, FormatContext& ctx) const {
return fmt::format_to(ctx.out(), "{}", NameOf(opcode));
}
};

View file

@ -69,7 +69,7 @@ void ConfigureApplets::Setup(const ConfigurationShared::Builder& builder) {
applets_hold.emplace(setting->Id(), widget);
}
for (const auto& [label, widget] : applets_hold) {
for (const auto& [_, widget] : applets_hold) {
library_applets_layout.addWidget(widget);
}
}

View file

@ -164,7 +164,7 @@ void ConfigureAudio::Setup(const ConfigurationShared::Builder& builder) {
}
}
for (const auto& [id, widget] : hold) {
for (const auto& [_, widget] : hold) {
layout.addWidget(widget);
}
}

View file

@ -79,7 +79,7 @@ void ConfigureCpu::Setup(const ConfigurationShared::Builder& builder) {
}
}
for (const auto& [label, widget] : unsafe_hold) {
for (const auto& [_, widget] : unsafe_hold) {
unsafe_layout->addWidget(widget);
}

View file

@ -81,10 +81,10 @@ void ConfigureGeneral::Setup(const ConfigurationShared::Builder& builder) {
}
}
for (const auto& [id, widget] : general_hold) {
for (const auto& [_, widget] : general_hold) {
general_layout.addWidget(widget);
}
for (const auto& [id, widget] : linux_hold) {
for (const auto& [_, widget] : linux_hold) {
linux_layout.addWidget(widget);
}
}

View file

@ -358,7 +358,7 @@ void ConfigureGraphics::Setup(const ConfigurationShared::Builder& builder) {
}
}
for (const auto& [id, widget] : hold_graphics) {
for (const auto& [_, widget] : hold_graphics) {
graphics_layout.addWidget(widget);
}

View file

@ -53,7 +53,7 @@ void ConfigureGraphicsAdvanced::Setup(const ConfigurationShared::Builder& builde
checkbox_enable_compute_pipelines = widget;
}
}
for (const auto& [id, widget] : hold) {
for (const auto& [_, widget] : hold) {
layout.addWidget(widget);
}
}

View file

@ -50,7 +50,7 @@ void ConfigureLinuxTab::Setup(const ConfigurationShared::Builder& builder) {
linux_hold.insert({setting->Id(), widget});
}
for (const auto& [id, widget] : linux_hold) {
for (const auto& [_, widget] : linux_hold) {
linux_layout.addWidget(widget);
}
}

View file

@ -174,10 +174,10 @@ void ConfigureSystem::Setup(const ConfigurationShared::Builder& builder) {
widget->deleteLater();
}
}
for (const auto& [label, widget] : core_hold) {
for (const auto& [_, widget] : core_hold) {
core_layout.addWidget(widget);
}
for (const auto& [id, widget] : system_hold) {
for (const auto& [_, widget] : system_hold) {
system_layout.addWidget(widget);
}
}

View file

@ -83,7 +83,7 @@ static void PopulateResolutionComboBox(QComboBox* screenshot_height, QWidget* pa
const auto& enumeration =
Settings::EnumMetadata<Settings::ResolutionSetup>::Canonicalizations();
std::set<u32> resolutions{};
for (const auto& [name, value] : enumeration) {
for (const auto& [_, value] : enumeration) {
const float up_factor = GetUpFactor(value);
u32 height_undocked = Layout::ScreenUndocked::Height * up_factor;
u32 height_docked = Layout::ScreenDocked::Height * up_factor;

View file

@ -61,7 +61,7 @@ std::vector<std::string> InputProfiles::GetInputProfileNames() {
auto it = map_profiles.cbegin();
while (it != map_profiles.cend()) {
const auto& [profile_name, config] = *it;
const auto& [profile_name, _] = *it;
if (!ProfileExistsInFilesystem(profile_name)) {
it = map_profiles.erase(it);
continue;

View file

@ -135,7 +135,7 @@ QWidget* Widget::CreateCombobox(std::function<std::string()>& serializer,
const ComboboxTranslations* enumeration{nullptr};
if (combobox_enumerations.contains(type)) {
enumeration = &combobox_enumerations.at(type);
for (const auto& [id, name] : *enumeration) {
for (const auto& [_, name] : *enumeration) {
combobox->addItem(name);
}
} else {
@ -223,7 +223,7 @@ QWidget* Widget::CreateRadioGroup(std::function<std::string()>& serializer,
};
if (!Settings::IsConfiguringGlobal()) {
for (const auto& [id, button] : radio_buttons) {
for (const auto& [_, button] : radio_buttons) {
QObject::connect(button, &QAbstractButton::clicked, [touch]() { touch(); });
}
}

View file

@ -9,6 +9,8 @@
#include <memory>
#include <thread>
#include <fmt/ranges.h>
#include "core/hle/service/am/applet_manager.h"
#include "core/loader/nca.h"
#include "core/loader/nro.h"

View file

@ -87,7 +87,7 @@ std::optional<std::filesystem::path> GetCurrentUserPlayTimePath(
std::vector<PlayTimeElement> elements;
elements.reserve(play_time_db.size());
for (auto& [program_id, play_time] : play_time_db) {
for (const auto& [program_id, play_time] : play_time_db) {
if (program_id != 0) {
elements.push_back(PlayTimeElement{program_id, play_time});
}

View file

@ -45,7 +45,7 @@ public:
[[nodiscard]] unsigned Count() const noexcept {
unsigned count = 0;
for (const auto& [index, value] : page_table) {
for (const auto& [_, value] : page_table) {
count += value;
}
return count;

View file

@ -45,7 +45,7 @@ public:
// Vic does not know which nvdec is producing frames for it, so search all the fds here for
// the given offset.
for (auto& map : m_presentation_order) {
for (auto& [offset, frame] : map.second) {
for (auto& [offset, _] : map.second) {
if (offset == search_offset) {
return map.first;
}
@ -53,7 +53,7 @@ public:
}
for (auto& map : m_decode_order) {
for (auto& [offset, frame] : map.second) {
for (auto& [offset, _] : map.second) {
if (offset == search_offset) {
return map.first;
}

View file

@ -13,7 +13,7 @@
template <>
struct fmt::formatter<VideoCore::Surface::PixelFormat> : fmt::formatter<fmt::string_view> {
template <typename FormatContext>
auto format(VideoCore::Surface::PixelFormat format, FormatContext& ctx) {
auto format(VideoCore::Surface::PixelFormat format, FormatContext& ctx) const {
using VideoCore::Surface::PixelFormat;
const string_view name = [format] {
switch (format) {
@ -234,7 +234,7 @@ struct fmt::formatter<VideoCore::Surface::PixelFormat> : fmt::formatter<fmt::str
template <>
struct fmt::formatter<VideoCommon::ImageType> : fmt::formatter<fmt::string_view> {
template <typename FormatContext>
auto format(VideoCommon::ImageType type, FormatContext& ctx) {
auto format(VideoCommon::ImageType type, FormatContext& ctx) const {
const string_view name = [type] {
using VideoCommon::ImageType;
switch (type) {
@ -262,7 +262,7 @@ struct fmt::formatter<VideoCommon::Extent3D> {
}
template <typename FormatContext>
auto format(const VideoCommon::Extent3D& extent, FormatContext& ctx) {
auto format(const VideoCommon::Extent3D& extent, FormatContext& ctx) const {
return fmt::format_to(ctx.out(), "{{{}, {}, {}}}", extent.width, extent.height,
extent.depth);
}