diff --git a/CMakeLists.txt b/CMakeLists.txt index 42717c496d..74365e2edb 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -66,6 +66,26 @@ if (YUZU_STATIC_ROOM) set(fmt_FORCE_BUNDLED ON) endif() +# my unity/jumbo build +option(ENABLE_UNITY_BUILD "Enable Unity/Jumbo build" OFF) + +# 0 compiles all files in +# not ideal, but if you're going gung-ho with a unity build, expect failure +# MSVC physically can't compile that many files into one TU, so we limit it to 100. +if (MSVC) + set(_unity_default 100) +else() + set(_unity_default 0) +endif() + +set(UNITY_BATCH_SIZE ${_unity_default} CACHE STRING "Unity build batch size") + +if(MSVC AND ENABLE_UNITY_BUILD) + message(STATUS "Unity build") + # Unity builds need big objects for MSVC... + add_compile_options(/bigobj) +endif() + # qt stuff option(ENABLE_QT "Enable the Qt frontend" ON) option(ENABLE_QT_TRANSLATION "Enable translations for the Qt frontend" OFF) diff --git a/docs/Options.md b/docs/Options.md index 3eb6effe92..adb401eaf1 100644 --- a/docs/Options.md +++ b/docs/Options.md @@ -40,6 +40,7 @@ These options control dependencies. - This option is subject for removal. - `YUZU_TESTS` (ON) Compile tests - requires Catch2 - `ENABLE_LTO` (OFF) Enable link-time optimization +- `ENABLE_UNITY_BUILD` (OFF) Enables "Unity/Jumbo" builds - Not recommended on Windows - UNIX may be better off appending `-flto=thin` to compiler args - `USE_FASTER_LINKER` (OFF) Check if a faster linker is available diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 600b985609..d0992b6886 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -7,6 +7,11 @@ # Enable modules to include each other's files include_directories(.) +if (ENABLE_UNITY_BUILD) + set(CMAKE_UNITY_BUILD ON) + set(CMAKE_UNITY_BUILD_BATCH_SIZE ${UNITY_BATCH_SIZE}) +endif() + # Dynarmic if (ARCHITECTURE_x86_64 OR ARCHITECTURE_arm64 AND NOT YUZU_STATIC_ROOM) add_subdirectory(dynarmic) diff --git a/src/audio_core/adsp/apps/opus/opus_decode_object.cpp b/src/audio_core/adsp/apps/opus/opus_decode_object.cpp index e2b9eb566c..006d2741cc 100644 --- a/src/audio_core/adsp/apps/opus/opus_decode_object.cpp +++ b/src/audio_core/adsp/apps/opus/opus_decode_object.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -5,17 +8,11 @@ #include "common/assert.h" namespace AudioCore::ADSP::OpusDecoder { -namespace { -bool IsValidChannelCount(u32 channel_count) { - return channel_count == 1 || channel_count == 2; -} -} // namespace u32 OpusDecodeObject::GetWorkBufferSize(u32 channel_count) { - if (!IsValidChannelCount(channel_count)) { + if (channel_count == 1 || channel_count == 2) return 0; - } - return static_cast(sizeof(OpusDecodeObject)) + opus_decoder_get_size(channel_count); + return u32(sizeof(OpusDecodeObject)) + opus_decoder_get_size(channel_count); } OpusDecodeObject& OpusDecodeObject::Initialize(u64 buffer, u64 buffer2) { diff --git a/src/audio_core/adsp/apps/opus/opus_decoder.cpp b/src/audio_core/adsp/apps/opus/opus_decoder.cpp index 8a009c04c7..f0e8341e80 100644 --- a/src/audio_core/adsp/apps/opus/opus_decoder.cpp +++ b/src/audio_core/adsp/apps/opus/opus_decoder.cpp @@ -22,10 +22,6 @@ namespace AudioCore::ADSP::OpusDecoder { namespace { constexpr size_t OpusStreamCountMax = 255; -bool IsValidChannelCount(u32 channel_count) { - return channel_count == 1 || channel_count == 2; -} - bool IsValidMultiStreamChannelCount(u32 channel_count) { return channel_count <= OpusStreamCountMax; } @@ -90,7 +86,7 @@ void OpusDecoder::Main(std::stop_token stop_token) { case GetWorkBufferSize: { auto channel_count = static_cast(shared_memory->host_send_data[0]); - ASSERT(IsValidChannelCount(channel_count)); + ASSERT(channel_count == 1 || channel_count == 2); shared_memory->dsp_return_data[0] = OpusDecodeObject::GetWorkBufferSize(channel_count); Send(Direction::Host, Message::GetWorkBufferSizeOK); @@ -103,7 +99,7 @@ void OpusDecoder::Main(std::stop_token stop_token) { auto channel_count = static_cast(shared_memory->host_send_data[3]); ASSERT(sample_rate >= 0); - ASSERT(IsValidChannelCount(channel_count)); + ASSERT(channel_count == 1 || channel_count == 2); ASSERT(buffer_size >= OpusDecodeObject::GetWorkBufferSize(channel_count)); auto& decoder_object = OpusDecodeObject::Initialize(buffer, buffer); diff --git a/src/audio_core/adsp/apps/opus/opus_multistream_decode_object.cpp b/src/audio_core/adsp/apps/opus/opus_multistream_decode_object.cpp index 05cf3975db..6ff1ac430a 100644 --- a/src/audio_core/adsp/apps/opus/opus_multistream_decode_object.cpp +++ b/src/audio_core/adsp/apps/opus/opus_multistream_decode_object.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -7,13 +10,10 @@ namespace AudioCore::ADSP::OpusDecoder { namespace { -bool IsValidChannelCount(u32 channel_count) { - return channel_count == 1 || channel_count == 2; -} - bool IsValidStreamCounts(u32 total_stream_count, u32 stereo_stream_count) { - return total_stream_count > 0 && static_cast(stereo_stream_count) >= 0 && - stereo_stream_count <= total_stream_count && IsValidChannelCount(total_stream_count); + return total_stream_count > 0 && s32(stereo_stream_count) >= 0 + && stereo_stream_count <= total_stream_count + && (total_stream_count == 1 || total_stream_count == 2); } } // namespace diff --git a/src/audio_core/in/audio_in.cpp b/src/audio_core/in/audio_in.cpp index df8c44d1f2..fecdddc603 100644 --- a/src/audio_core/in/audio_in.cpp +++ b/src/audio_core/in/audio_in.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/src/audio_core/in/audio_in_system.cpp b/src/audio_core/in/audio_in_system.cpp index ec1f565736..9a5e0cea7f 100644 --- a/src/audio_core/in/audio_in_system.cpp +++ b/src/audio_core/in/audio_in_system.cpp @@ -14,14 +14,16 @@ #include "core/core_timing.h" #include "core/hle/kernel/k_event.h" +namespace AudioCore::AudioIn { + // See texture_cache/util.h template #if BOOST_VERSION >= 108100 || __GNUC__ > 12 -[[nodiscard]] boost::container::static_vector FixStaticVectorADL(const boost::container::static_vector& v) { +[[nodiscard]] static inline boost::container::static_vector FixStaticVectorADL(const boost::container::static_vector& v) { return v; } #else -[[nodiscard]] std::vector FixStaticVectorADL(const boost::container::static_vector& v) { +[[nodiscard]] static inline std::vector FixStaticVectorADL(const boost::container::static_vector& v) { std::vector u; for (auto const& e : v) u.push_back(e); @@ -29,8 +31,6 @@ template } #endif -namespace AudioCore::AudioIn { - System::System(Core::System& system_, Kernel::KEvent* event_, const size_t session_id_) : system{system_}, buffer_event{event_}, session_id{session_id_}, session{std::make_unique(system_)} {} diff --git a/src/audio_core/out/audio_out_system.cpp b/src/audio_core/out/audio_out_system.cpp index dcb0d0694e..f0ee2386e6 100644 --- a/src/audio_core/out/audio_out_system.cpp +++ b/src/audio_core/out/audio_out_system.cpp @@ -14,14 +14,15 @@ #include "core/core_timing.h" #include "core/hle/kernel/k_event.h" +namespace AudioCore::AudioOut { // See texture_cache/util.h template #if BOOST_VERSION >= 108100 || __GNUC__ > 12 -[[nodiscard]] boost::container::static_vector FixStaticVectorADL(const boost::container::static_vector& v) { +[[nodiscard]] static inline boost::container::static_vector FixStaticVectorADL(const boost::container::static_vector& v) { return v; } #else -[[nodiscard]] std::vector FixStaticVectorADL(const boost::container::static_vector& v) { +[[nodiscard]] static inline std::vector FixStaticVectorADL(const boost::container::static_vector& v) { std::vector u; for (auto const& e : v) u.push_back(e); @@ -29,8 +30,6 @@ template } #endif -namespace AudioCore::AudioOut { - System::System(Core::System& system_, Kernel::KEvent* event_, size_t session_id_) : system{system_}, buffer_event{event_}, session_id{session_id_}, session{std::make_unique(system_)} {} diff --git a/src/audio_core/renderer/command/effect/capture.cpp b/src/audio_core/renderer/command/effect/capture.cpp index 4267580128..01a5b5e844 100644 --- a/src/audio_core/renderer/command/effect/capture.cpp +++ b/src/audio_core/renderer/command/effect/capture.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project @@ -16,7 +16,7 @@ namespace AudioCore::Renderer { * @param memory - Core memory for writing. * @param aux_info - Memory address pointing to the AuxInfo to reset. */ -static void ResetAuxBufferDsp(Core::Memory::Memory& memory, const CpuAddr aux_info) { +static void CaptureResetAuxBufferDsp(Core::Memory::Memory& memory, const CpuAddr aux_info) { if (aux_info == 0) { LOG_ERROR(Service_Audio, "Aux info is 0!"); return; @@ -134,7 +134,7 @@ void CaptureCommand::Process(const AudioRenderer::CommandListProcessor& processo WriteAuxBufferDsp(*processor.memory, send_buffer_info, send_buffer, count_max, input_buffer, processor.sample_count, write_offset, update_count); } else { - ResetAuxBufferDsp(*processor.memory, send_buffer_info); + CaptureResetAuxBufferDsp(*processor.memory, send_buffer_info); } } diff --git a/src/common/cityhash.cpp b/src/common/cityhash.cpp index d50ac9e6cf..030f5981ff 100644 --- a/src/common/cityhash.cpp +++ b/src/common/cityhash.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: 2011 Google, Inc. // SPDX-FileContributor: Geoff Pike // SPDX-FileContributor: Jyrki Alakuijala @@ -27,8 +30,6 @@ #define WORDS_BIGENDIAN 1 #endif -using namespace std; - namespace Common { static u64 unaligned_load64(const char* p) { @@ -135,18 +136,18 @@ static u64 HashLen17to32(const char* s, size_t len) { // Return a 16-byte hash for 48 bytes. Quick and dirty. // Callers do best to use "random-looking" values for a and b. -static pair WeakHashLen32WithSeeds(u64 w, u64 x, u64 y, u64 z, u64 a, u64 b) { +static std::pair WeakHashLen32WithSeeds(u64 w, u64 x, u64 y, u64 z, u64 a, u64 b) { a += w; b = Rotate(b + a + z, 21); u64 c = a; a += x; a += y; b += Rotate(a, 44); - return make_pair(a + z, b + c); + return std::make_pair(a + z, b + c); } // Return a 16-byte hash for s[0] ... s[31], a, and b. Quick and dirty. -static pair WeakHashLen32WithSeeds(const char* s, u64 a, u64 b) { +static std::pair WeakHashLen32WithSeeds(const char* s, u64 a, u64 b) { return WeakHashLen32WithSeeds(Fetch64(s), Fetch64(s + 8), Fetch64(s + 16), Fetch64(s + 24), a, b); } @@ -189,8 +190,8 @@ u64 CityHash64(const char* s, size_t len) { u64 x = Fetch64(s + len - 40); u64 y = Fetch64(s + len - 16) + Fetch64(s + len - 56); u64 z = HashLen16(Fetch64(s + len - 48) + len, Fetch64(s + len - 24)); - pair v = WeakHashLen32WithSeeds(s + len - 64, len, z); - pair w = WeakHashLen32WithSeeds(s + len - 32, y + k1, x); + std::pair v = WeakHashLen32WithSeeds(s + len - 64, len, z); + std::pair w = WeakHashLen32WithSeeds(s + len - 32, y + k1, x); x = x * k1 + Fetch64(s); // Decrease len to the nearest multiple of 64, and operate on 64-byte chunks. @@ -258,7 +259,7 @@ u128 CityHash128WithSeed(const char* s, size_t len, u128 seed) { // We expect len >= 128 to be the common case. Keep 56 bytes of state: // v, w, x, y, and z. - pair v, w; + std::pair v, w; u64 x = seed[0]; u64 y = seed[1]; u64 z = len * k1; diff --git a/src/common/x64/cpu_detect.cpp b/src/common/x64/cpu_detect.cpp index 4cc42ccbd5..a74bda47d7 100644 --- a/src/common/x64/cpu_detect.cpp +++ b/src/common/x64/cpu_detect.cpp @@ -77,7 +77,7 @@ CPUCaps::Manufacturer CPUCaps::ParseManufacturer(std::string_view brand_string) } // Detects the various CPU features -static CPUCaps Detect() { +static CPUCaps DetectCPUCapabilities() { CPUCaps caps = {}; // Assumes the CPU supports the CPUID instruction. Those that don't would likely not support @@ -208,7 +208,7 @@ static CPUCaps Detect() { } const CPUCaps& GetCPUCaps() { - static CPUCaps caps = Detect(); + static CPUCaps caps = DetectCPUCapabilities(); return caps; } diff --git a/src/core/arm/dynarmic/arm_dynarmic.h b/src/core/arm/dynarmic/arm_dynarmic.h index 46384f7e6d..4fe238efe7 100644 --- a/src/core/arm/dynarmic/arm_dynarmic.h +++ b/src/core/arm/dynarmic/arm_dynarmic.h @@ -1,23 +1,24 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -#include +#pragma once +#include #include "core/arm/arm_interface.h" namespace Core { -constexpr Dynarmic::HaltReason StepThread = Dynarmic::HaltReason::Step; -constexpr Dynarmic::HaltReason DataAbort = Dynarmic::HaltReason::MemoryAbort; -constexpr Dynarmic::HaltReason BreakLoop = Dynarmic::HaltReason::UserDefined2; -constexpr Dynarmic::HaltReason SupervisorCall = Dynarmic::HaltReason::UserDefined3; -constexpr Dynarmic::HaltReason InstructionBreakpoint = Dynarmic::HaltReason::UserDefined4; -constexpr Dynarmic::HaltReason PrefetchAbort = Dynarmic::HaltReason::UserDefined6; +inline constexpr Dynarmic::HaltReason StepThread = Dynarmic::HaltReason::Step; +inline constexpr Dynarmic::HaltReason DataAbort = Dynarmic::HaltReason::MemoryAbort; +inline constexpr Dynarmic::HaltReason BreakLoop = Dynarmic::HaltReason::UserDefined2; +inline constexpr Dynarmic::HaltReason SupervisorCall = Dynarmic::HaltReason::UserDefined3; +inline constexpr Dynarmic::HaltReason InstructionBreakpoint = Dynarmic::HaltReason::UserDefined4; +inline constexpr Dynarmic::HaltReason PrefetchAbort = Dynarmic::HaltReason::UserDefined6; -constexpr HaltReason TranslateHaltReason(Dynarmic::HaltReason hr) { +[[nodiscard]] inline constexpr HaltReason TranslateHaltReason(Dynarmic::HaltReason hr) { static_assert(u64(HaltReason::StepThread) == u64(StepThread)); static_assert(u64(HaltReason::DataAbort) == u64(DataAbort)); static_assert(u64(HaltReason::BreakLoop) == u64(BreakLoop)); diff --git a/src/core/core_timing.cpp b/src/core/core_timing.cpp index b216dc2094..5d2a3485b7 100644 --- a/src/core/core_timing.cpp +++ b/src/core/core_timing.cpp @@ -25,6 +25,7 @@ namespace Core::Timing { constexpr s64 MAX_SLICE_LENGTH = 10000; +#undef CreateEvent std::shared_ptr CreateEvent(std::string name, TimedCallback&& callback) { return std::make_shared(std::move(callback), std::move(name)); } diff --git a/src/core/file_sys/fs_save_data_types.h b/src/core/file_sys/fs_save_data_types.h index cdefe908d5..f164293544 100644 --- a/src/core/file_sys/fs_save_data_types.h +++ b/src/core/file_sys/fs_save_data_types.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project @@ -185,13 +185,13 @@ static_assert(sizeof(SaveDataFilter) == 0x48, "SaveDataFilter has invalid size." static_assert(std::is_trivially_copyable_v, "Data type must be trivially copyable."); -struct HashSalt { +struct SaveDataHashSalt { static constexpr size_t Size = 32; std::array value; }; -static_assert(std::is_trivially_copyable_v, "Data type must be trivially copyable."); -static_assert(sizeof(HashSalt) == HashSalt::Size); +static_assert(std::is_trivially_copyable_v, "Data type must be trivially copyable."); +static_assert(sizeof(SaveDataHashSalt) == SaveDataHashSalt::Size); struct SaveDataCreationInfo2 { @@ -210,7 +210,7 @@ struct SaveDataCreationInfo2 { u8 reserved1; bool is_hash_salt_enabled; u8 reserved2; - HashSalt hash_salt; + SaveDataHashSalt hash_salt; SaveDataMetaType meta_type; u8 reserved3; s32 meta_size; diff --git a/src/core/file_sys/fsmitm_romfsbuild.cpp b/src/core/file_sys/fsmitm_romfsbuild.cpp index 8807bbd0f7..fffb8b5f37 100644 --- a/src/core/file_sys/fsmitm_romfsbuild.cpp +++ b/src/core/file_sys/fsmitm_romfsbuild.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -11,7 +14,7 @@ #include "core/file_sys/vfs/vfs.h" #include "core/file_sys/vfs/vfs_vector.h" -namespace FileSys { +namespace FileSys::RomFSBuilder { constexpr u64 FS_MAX_PATH = 0x301; diff --git a/src/core/file_sys/fsmitm_romfsbuild.h b/src/core/file_sys/fsmitm_romfsbuild.h index dd7ed4a7bf..38bf8749e8 100644 --- a/src/core/file_sys/fsmitm_romfsbuild.h +++ b/src/core/file_sys/fsmitm_romfsbuild.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -9,7 +12,7 @@ #include "common/common_types.h" #include "core/file_sys/vfs/vfs.h" -namespace FileSys { +namespace FileSys::RomFSBuilder { struct RomFSBuildDirectoryContext; struct RomFSBuildFileContext; diff --git a/src/core/file_sys/romfs.cpp b/src/core/file_sys/romfs.cpp index 9cf4928cd9..120a6fd503 100644 --- a/src/core/file_sys/romfs.cpp +++ b/src/core/file_sys/romfs.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project @@ -38,7 +38,7 @@ struct RomFSHeader { }; static_assert(sizeof(RomFSHeader) == 0x50, "RomFSHeader has incorrect size."); -struct DirectoryEntry { +struct RomFSDirectoryEntry { u32_le parent; u32_le sibling; u32_le child_dir; @@ -46,9 +46,9 @@ struct DirectoryEntry { u32_le hash; u32_le name_length; }; -static_assert(sizeof(DirectoryEntry) == 0x18, "DirectoryEntry has incorrect size."); +static_assert(sizeof(RomFSDirectoryEntry) == 0x18, "RomFSDirectoryEntry has incorrect size."); -struct FileEntry { +struct RomFSFileEntry { u32_le parent; u32_le sibling; u64_le offset; @@ -56,7 +56,7 @@ struct FileEntry { u32_le hash; u32_le name_length; }; -static_assert(sizeof(FileEntry) == 0x20, "FileEntry has incorrect size."); +static_assert(sizeof(RomFSFileEntry) == 0x20, "RomFSFileEntry has incorrect size."); struct RomFSTraversalContext { RomFSHeader header; @@ -84,14 +84,14 @@ std::pair GetEntry(const RomFSTraversalContext& ctx, siz return {entry, std::move(name)}; } -std::pair GetDirectoryEntry(const RomFSTraversalContext& ctx, +std::pair GetDirectoryEntry(const RomFSTraversalContext& ctx, size_t directory_offset) { - return GetEntry(ctx, directory_offset); + return GetEntry(ctx, directory_offset); } -std::pair GetFileEntry(const RomFSTraversalContext& ctx, +std::pair GetFileEntry(const RomFSTraversalContext& ctx, size_t file_offset) { - return GetEntry(ctx, file_offset); + return GetEntry(ctx, file_offset); } void ProcessFile(const RomFSTraversalContext& ctx, u32 this_file_offset, @@ -163,7 +163,7 @@ VirtualFile CreateRomFS(VirtualDir dir, VirtualDir ext) { if (dir == nullptr) return nullptr; - RomFSBuildContext ctx{dir, ext}; + RomFSBuilder::RomFSBuildContext ctx{dir, ext}; return ConcatenatedVfsFile::MakeConcatenatedFile(0, dir->GetName(), ctx.Build()); } diff --git a/src/core/file_sys/vfs/vfs.cpp b/src/core/file_sys/vfs/vfs.cpp index b85b843e3e..19d7be2270 100644 --- a/src/core/file_sys/vfs/vfs.cpp +++ b/src/core/file_sys/vfs/vfs.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project @@ -10,6 +10,12 @@ #include "common/fs/path_util.h" #include "core/file_sys/vfs/vfs.h" +#undef CreateFile +#undef DeleteFile +#undef CreateDirectory +#undef CopyFile +#undef MoveFile + namespace FileSys { VfsFilesystem::VfsFilesystem(VirtualDir root_) : root(std::move(root_)) {} diff --git a/src/core/file_sys/vfs/vfs_vector.h b/src/core/file_sys/vfs/vfs_vector.h index 86beed931c..5c4650b08c 100644 --- a/src/core/file_sys/vfs/vfs_vector.h +++ b/src/core/file_sys/vfs/vfs_vector.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project @@ -99,6 +99,10 @@ private: std::string name; }; +#undef CreateFile +#undef DeleteFile +#undef CreateDirectory + // An implementation of VfsDirectory that maintains two vectors for subdirectories and files. // Vector data is supplied upon construction. class VectorVfsDirectory : public VfsDirectory { diff --git a/src/core/hle/kernel/svc.cpp b/src/core/hle/kernel/svc.cpp index faf6a6432d..727a3a5363 100644 --- a/src/core/hle/kernel/svc.cpp +++ b/src/core/hle/kernel/svc.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-late @@ -13,6 +13,10 @@ #include "core/hle/kernel/k_process.h" #include "core/hle/kernel/svc.h" +#undef OutputDebugString +#undef GetObject +#undef CreateProcess + namespace Kernel::Svc { static uint32_t GetArg32(std::span args, int n) { diff --git a/src/core/hle/kernel/svc/svc_memory.cpp b/src/core/hle/kernel/svc/svc_memory.cpp index 740e11ff87..b79396abba 100644 --- a/src/core/hle/kernel/svc/svc_memory.cpp +++ b/src/core/hle/kernel/svc/svc_memory.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project @@ -11,7 +11,11 @@ namespace Kernel::Svc { namespace { -constexpr bool IsValidSetMemoryPermission(MemoryPermission perm) { +[[nodiscard]] inline constexpr bool IsValidSetAddressRange(u64 address, u64 size) { + return address + size > address; +} + +[[nodiscard]] inline constexpr bool IsValidSetMemoryPermission(MemoryPermission perm) { switch (perm) { case MemoryPermission::None: case MemoryPermission::Read: @@ -22,13 +26,6 @@ constexpr bool IsValidSetMemoryPermission(MemoryPermission perm) { } } -// Checks if address + size is greater than the given address -// This can return false if the size causes an overflow of a 64-bit type -// or if the given size is zero. -constexpr bool IsValidAddressRange(u64 address, u64 size) { - return address + size > address; -} - // Helper function that performs the common sanity checks for svcMapMemory // and svcUnmapMemory. This is doable, as both functions perform their sanitizing // in the same order. @@ -54,14 +51,17 @@ Result MapUnmapMemorySanityChecks(const KProcessPageTable& manager, u64 dst_addr R_THROW(ResultInvalidSize); } - if (!IsValidAddressRange(dst_addr, size)) { + // Checks if address + size is greater than the given address + // This can return false if the size causes an overflow of a 64-bit type + // or if the given size is zero. + if (!IsValidSetAddressRange(dst_addr, size)) { LOG_ERROR(Kernel_SVC, "Destination is not a valid address range, addr=0x{:016X}, size=0x{:016X}", dst_addr, size); R_THROW(ResultInvalidCurrentMemory); } - if (!IsValidAddressRange(src_addr, size)) { + if (!IsValidSetAddressRange(src_addr, size)) { LOG_ERROR(Kernel_SVC, "Source is not a valid address range, addr=0x{:016X}, size=0x{:016X}", src_addr, size); R_THROW(ResultInvalidCurrentMemory); diff --git a/src/core/hle/kernel/svc/svc_process_memory.cpp b/src/core/hle/kernel/svc/svc_process_memory.cpp index 3313118dfa..fe3b14b2ba 100644 --- a/src/core/hle/kernel/svc/svc_process_memory.cpp +++ b/src/core/hle/kernel/svc/svc_process_memory.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project @@ -11,11 +11,11 @@ namespace Kernel::Svc { namespace { -constexpr bool IsValidAddressRange(u64 address, u64 size) { +[[nodiscard]] inline constexpr bool IsValidAddressRange(u64 address, u64 size) { return address + size > address; } -constexpr bool IsValidProcessMemoryPermission(Svc::MemoryPermission perm) { +[[nodiscard]] inline constexpr bool IsValidProcessMemoryPermission(Svc::MemoryPermission perm) { switch (perm) { case Svc::MemoryPermission::None: case Svc::MemoryPermission::Read: diff --git a/src/core/hle/service/audio/audio_in.cpp b/src/core/hle/service/audio/audio_in.cpp index 416803acc3..c3f0e6aa57 100644 --- a/src/core/hle/service/audio/audio_in.cpp +++ b/src/core/hle/service/audio/audio_in.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -6,13 +9,12 @@ #include "core/hle/service/ipc_helpers.h" namespace Service::Audio { -using namespace AudioCore::AudioIn; -IAudioIn::IAudioIn(Core::System& system_, Manager& manager, size_t session_id, - const std::string& device_name, const AudioInParameter& in_params, +IAudioIn::IAudioIn(Core::System& system_, AudioCore::AudioIn::Manager& manager, size_t session_id, + const std::string& device_name, const AudioCore::AudioIn::AudioInParameter& in_params, Kernel::KProcess* handle, u64 applet_resource_user_id) : ServiceFramework{system_, "IAudioIn"}, process{handle}, service_context{system_, "IAudioIn"}, - event{service_context.CreateEvent("AudioInEvent")}, impl{std::make_shared(system_, + event{service_context.CreateEvent("AudioInEvent")}, impl{std::make_shared(system_, manager, event, session_id)} { // clang-format off @@ -68,12 +70,12 @@ Result IAudioIn::Stop() { R_RETURN(impl->StopSystem()); } -Result IAudioIn::AppendAudioInBuffer(InArray buffer, +Result IAudioIn::AppendAudioInBuffer(InArray buffer, u64 buffer_client_ptr) { R_RETURN(this->AppendAudioInBufferAuto(buffer, buffer_client_ptr)); } -Result IAudioIn::AppendAudioInBufferAuto(InArray buffer, +Result IAudioIn::AppendAudioInBufferAuto(InArray buffer, u64 buffer_client_ptr) { if (buffer.empty()) { LOG_ERROR(Service_Audio, "Input buffer is too small for an AudioInBuffer!"); diff --git a/src/core/hle/service/audio/audio_in_manager.cpp b/src/core/hle/service/audio/audio_in_manager.cpp index 2675a57735..497c6eb6bc 100644 --- a/src/core/hle/service/audio/audio_in_manager.cpp +++ b/src/core/hle/service/audio/audio_in_manager.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -7,7 +10,6 @@ #include "core/hle/service/cmif_serialization.h" namespace Service::Audio { -using namespace AudioCore::AudioIn; IAudioInManager::IAudioInManager(Core::System& system_) : ServiceFramework{system_, "audin:u"}, impl{std::make_unique( @@ -34,11 +36,11 @@ Result IAudioInManager::ListAudioIns( R_RETURN(this->ListAudioInsAutoFiltered(out_audio_ins, out_count)); } -Result IAudioInManager::OpenAudioIn(Out out_parameter_internal, +Result IAudioInManager::OpenAudioIn(Out out_parameter_internal, Out> out_audio_in, OutArray out_name, InArray name, - AudioInParameter parameter, + AudioCore::AudioIn::AudioInParameter parameter, InCopyHandle process_handle, ClientAppletResourceUserId aruid) { LOG_DEBUG(Service_Audio, "called"); @@ -53,9 +55,9 @@ Result IAudioInManager::ListAudioInsAuto( } Result IAudioInManager::OpenAudioInAuto( - Out out_parameter_internal, Out> out_audio_in, + Out out_parameter_internal, Out> out_audio_in, OutArray out_name, - InArray name, AudioInParameter parameter, + InArray name, AudioCore::AudioIn::AudioInParameter parameter, InCopyHandle process_handle, ClientAppletResourceUserId aruid) { LOG_DEBUG(Service_Audio, "called"); R_RETURN(this->OpenAudioInProtocolSpecified(out_parameter_internal, out_audio_in, out_name, @@ -70,10 +72,10 @@ Result IAudioInManager::ListAudioInsAutoFiltered( } Result IAudioInManager::OpenAudioInProtocolSpecified( - Out out_parameter_internal, Out> out_audio_in, + Out out_parameter_internal, Out> out_audio_in, OutArray out_name, InArray name, Protocol protocol, - AudioInParameter parameter, InCopyHandle process_handle, + AudioCore::AudioIn::AudioInParameter parameter, InCopyHandle process_handle, ClientAppletResourceUserId aruid) { LOG_DEBUG(Service_Audio, "called"); @@ -104,7 +106,7 @@ Result IAudioInManager::OpenAudioInProtocolSpecified( auto& out_system = impl->sessions[new_session_id]->GetSystem(); *out_parameter_internal = - AudioInParameterInternal{.sample_rate = out_system.GetSampleRate(), + AudioCore::AudioIn::AudioInParameterInternal{.sample_rate = out_system.GetSampleRate(), .channel_count = out_system.GetChannelCount(), .sample_format = static_cast(out_system.GetSampleFormat()), .state = static_cast(out_system.GetState())}; diff --git a/src/core/hle/service/audio/audio_out.cpp b/src/core/hle/service/audio/audio_out.cpp index 53009d5d74..f53eeb7814 100644 --- a/src/core/hle/service/audio/audio_out.cpp +++ b/src/core/hle/service/audio/audio_out.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -10,10 +13,9 @@ #include "core/hle/service/service.h" namespace Service::Audio { -using namespace AudioCore::AudioOut; -IAudioOut::IAudioOut(Core::System& system_, Manager& manager, size_t session_id, - const std::string& device_name, const AudioOutParameter& in_params, +IAudioOut::IAudioOut(Core::System& system_, AudioCore::AudioOut::Manager& manager, size_t session_id, + const std::string& device_name, const AudioCore::AudioOut::AudioOutParameter& in_params, Kernel::KProcess* handle, u64 applet_resource_user_id) : ServiceFramework{system_, "IAudioOut"}, service_context{system_, "IAudioOut"}, event{service_context.CreateEvent("AudioOutEvent")}, process{handle}, @@ -65,12 +67,12 @@ Result IAudioOut::Stop() { } Result IAudioOut::AppendAudioOutBuffer( - InArray audio_out_buffer, u64 buffer_client_ptr) { + InArray audio_out_buffer, u64 buffer_client_ptr) { R_RETURN(this->AppendAudioOutBufferAuto(audio_out_buffer, buffer_client_ptr)); } Result IAudioOut::AppendAudioOutBufferAuto( - InArray audio_out_buffer, u64 buffer_client_ptr) { + InArray audio_out_buffer, u64 buffer_client_ptr) { if (audio_out_buffer.empty()) { LOG_ERROR(Service_Audio, "Input buffer is too small for an AudioOutBuffer!"); R_THROW(Audio::ResultInsufficientBuffer); diff --git a/src/core/hle/service/audio/audio_out_manager.cpp b/src/core/hle/service/audio/audio_out_manager.cpp index 0a8e1ec256..bab87094ae 100644 --- a/src/core/hle/service/audio/audio_out_manager.cpp +++ b/src/core/hle/service/audio/audio_out_manager.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project @@ -11,10 +11,9 @@ #include "core/memory.h" namespace Service::Audio { -using namespace AudioCore::AudioOut; IAudioOutManager::IAudioOutManager(Core::System& system_) - : ServiceFramework{system_, "audout:u"}, impl{std::make_unique(system_)} { + : ServiceFramework{system_, "audout:u"}, impl{std::make_unique(system_)} { // clang-format off static const FunctionInfo functions[] = { {0, D<&IAudioOutManager::ListAudioOuts>, "ListAudioOuts"}, @@ -34,11 +33,11 @@ Result IAudioOutManager::ListAudioOuts( R_RETURN(this->ListAudioOutsAuto(out_audio_outs, out_count)); } -Result IAudioOutManager::OpenAudioOut(Out out_parameter_internal, +Result IAudioOutManager::OpenAudioOut(Out out_parameter_internal, Out> out_audio_out, OutArray out_name, InArray name, - AudioOutParameter parameter, + AudioCore::AudioOut::AudioOutParameter parameter, InCopyHandle process_handle, ClientAppletResourceUserId aruid) { R_RETURN(this->OpenAudioOutAuto(out_parameter_internal, out_audio_out, out_name, name, @@ -60,10 +59,10 @@ Result IAudioOutManager::ListAudioOutsAuto( } Result IAudioOutManager::OpenAudioOutAuto( - Out out_parameter_internal, + Out out_parameter_internal, Out> out_audio_out, OutArray out_name, - InArray name, AudioOutParameter parameter, + InArray name, AudioCore::AudioOut::AudioOutParameter parameter, InCopyHandle process_handle, ClientAppletResourceUserId aruid) { if (!process_handle) { LOG_ERROR(Service_Audio, "Failed to get process handle"); @@ -93,7 +92,7 @@ Result IAudioOutManager::OpenAudioOutAuto( auto& out_system = impl->sessions[new_session_id]->GetSystem(); *out_parameter_internal = - AudioOutParameterInternal{.sample_rate = out_system.GetSampleRate(), + AudioCore::AudioOut::AudioOutParameterInternal{.sample_rate = out_system.GetSampleRate(), .channel_count = out_system.GetChannelCount(), .sample_format = static_cast(out_system.GetSampleFormat()), .state = static_cast(out_system.GetState())}; diff --git a/src/core/hle/service/audio/audio_renderer.cpp b/src/core/hle/service/audio/audio_renderer.cpp index 21cc742b69..654e70fde2 100644 --- a/src/core/hle/service/audio/audio_renderer.cpp +++ b/src/core/hle/service/audio/audio_renderer.cpp @@ -1,24 +1,23 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later +#include "audio_core/renderer/audio_renderer.h" #include "core/hle/service/audio/audio_renderer.h" #include "core/hle/service/cmif_serialization.h" namespace Service::Audio { -using namespace AudioCore::Renderer; -IAudioRenderer::IAudioRenderer(Core::System& system_, Manager& manager_, +IAudioRenderer::IAudioRenderer(Core::System& system_, AudioCore::Renderer::Manager& manager_, AudioCore::AudioRendererParameterInternal& params, Kernel::KTransferMemory* transfer_memory, u64 transfer_memory_size, Kernel::KProcess* process_handle_, u64 applet_resource_user_id, s32 session_id) : ServiceFramework{system_, "IAudioRenderer"}, service_context{system_, "IAudioRenderer"}, rendered_event{service_context.CreateEvent("IAudioRendererEvent")}, manager{manager_}, - impl{std::make_unique(system_, manager, rendered_event)}, process_handle{ - process_handle_} { + impl{std::make_unique(system_, manager, rendered_event)}, process_handle{process_handle_} { // clang-format off static const FunctionInfo functions[] = { {0, D<&IAudioRenderer::GetSampleRate>, "GetSampleRate"}, diff --git a/src/core/hle/service/audio/audio_renderer_manager.cpp b/src/core/hle/service/audio/audio_renderer_manager.cpp index 6a1345c074..8edc27c469 100644 --- a/src/core/hle/service/audio/audio_renderer_manager.cpp +++ b/src/core/hle/service/audio/audio_renderer_manager.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -15,7 +18,7 @@ namespace Service::Audio { using namespace AudioCore::Renderer; IAudioRendererManager::IAudioRendererManager(Core::System& system_) - : ServiceFramework{system_, "audren:u"}, impl{std::make_unique(system_)} { + : ServiceFramework{system_, "audren:u"}, impl{std::make_unique(system_)} { // clang-format off static const FunctionInfo functions[] = { {0, D<&IAudioRendererManager::OpenAudioRenderer>, "OpenAudioRenderer"}, diff --git a/src/core/hle/service/bcat/news/builtin_news.cpp b/src/core/hle/service/bcat/news/builtin_news.cpp index ed001b056b..dd27723a90 100644 --- a/src/core/hle/service/bcat/news/builtin_news.cpp +++ b/src/core/hle/service/bcat/news/builtin_news.cpp @@ -17,6 +17,7 @@ #ifdef CPPHTTPLIB_OPENSSL_SUPPORT #include +#undef INVALID_SOCKET #endif #include diff --git a/src/core/hle/service/bcat/news/news_data_service.cpp b/src/core/hle/service/bcat/news/news_data_service.cpp index 200d00e785..caf09f8be6 100644 --- a/src/core/hle/service/bcat/news/news_data_service.cpp +++ b/src/core/hle/service/bcat/news/news_data_service.cpp @@ -14,16 +14,13 @@ #include namespace Service::News { -namespace { -std::string_view ToStringView(std::span buf) { +[[nodiscard]] inline std::string_view ToStringViewNDS(std::span buf) { const std::string_view sv{buf.data(), buf.size()}; const auto nul = sv.find('\0'); return nul == std::string_view::npos ? sv : sv.substr(0, nul); } -} // namespace - INewsDataService::INewsDataService(Core::System& system_) : ServiceFramework{system_, "INewsDataService"} { static const FunctionInfo functions[] = { @@ -55,7 +52,7 @@ bool INewsDataService::TryOpen(std::string_view key, std::string_view user) { const auto list = NewsStorage::Instance().ListAll(); if (!list.empty()) { - if (auto found = NewsStorage::Instance().FindByNewsId(ToStringView(list.front().news_id))) { + if (auto found = NewsStorage::Instance().FindByNewsId(ToStringViewNDS(list.front().news_id))) { opened_payload = std::move(found->payload); return true; } @@ -67,7 +64,7 @@ bool INewsDataService::TryOpen(std::string_view key, std::string_view user) { Result INewsDataService::Open(InBuffer name) { EnsureBuiltinNewsLoaded(); - const auto key = ToStringView({reinterpret_cast(name.data()), name.size()}); + const auto key = ToStringViewNDS({reinterpret_cast(name.data()), name.size()}); if (TryOpen(key, {})) { R_SUCCEED(); @@ -79,8 +76,8 @@ Result INewsDataService::Open(InBuffer name) { Result INewsDataService::OpenWithNewsRecordV1(NewsRecordV1 record) { EnsureBuiltinNewsLoaded(); - const auto key = ToStringView(record.news_id); - const auto user = ToStringView(record.user_id); + const auto key = ToStringViewNDS(record.news_id); + const auto user = ToStringViewNDS(record.user_id); if (TryOpen(key, user)) { R_SUCCEED(); @@ -92,8 +89,8 @@ Result INewsDataService::OpenWithNewsRecordV1(NewsRecordV1 record) { Result INewsDataService::OpenWithNewsRecord(NewsRecord record) { EnsureBuiltinNewsLoaded(); - const auto key = ToStringView(record.news_id); - const auto user = ToStringView(record.user_id); + const auto key = ToStringViewNDS(record.news_id); + const auto user = ToStringViewNDS(record.user_id); if (TryOpen(key, user)) { R_SUCCEED(); diff --git a/src/core/hle/service/bcat/news/news_database_service.cpp b/src/core/hle/service/bcat/news/news_database_service.cpp index 3580ceb0f7..fa10262e44 100644 --- a/src/core/hle/service/bcat/news/news_database_service.cpp +++ b/src/core/hle/service/bcat/news/news_database_service.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project @@ -15,13 +15,13 @@ namespace Service::News { namespace { -std::string_view ToStringView(std::span buf) { +[[nodiscard]] inline std::string_view ToStringView(std::span buf) { if (buf.empty()) return {}; auto data = reinterpret_cast(buf.data()); return {data, strnlen(data, buf.size())}; } -std::string_view ToStringView(std::span buf) { +[[nodiscard]] inline std::string_view ToStringView(std::span buf) { if (buf.empty()) return {}; return {buf.data(), strnlen(buf.data(), buf.size())}; } diff --git a/src/core/hle/service/bcat/news/overwrite_event_holder.cpp b/src/core/hle/service/bcat/news/overwrite_event_holder.cpp index 1712971e4d..4802e2769a 100644 --- a/src/core/hle/service/bcat/news/overwrite_event_holder.cpp +++ b/src/core/hle/service/bcat/news/overwrite_event_holder.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later @@ -6,6 +9,8 @@ namespace Service::News { +#undef CreateEvent + IOverwriteEventHolder::IOverwriteEventHolder(Core::System& system_) : ServiceFramework{system_, "IOverwriteEventHolder"}, service_context{system_, "IOverwriteEventHolder"} { diff --git a/src/core/hle/service/caps/caps_manager.cpp b/src/core/hle/service/caps/caps_manager.cpp index af0b9b16ad..80290c312f 100644 --- a/src/core/hle/service/caps/caps_manager.cpp +++ b/src/core/hle/service/caps/caps_manager.cpp @@ -18,6 +18,8 @@ #include "core/hle/service/service.h" #include "core/hle/service/sm/sm.h" +#undef GetCurrentTime + namespace Service::Capture { AlbumManager::AlbumManager(Core::System& system_) : system{system_} {} diff --git a/src/core/hle/service/fatal/fatal.cpp b/src/core/hle/service/fatal/fatal.cpp index 5b281a725a..88ee9d7e82 100644 --- a/src/core/hle/service/fatal/fatal.cpp +++ b/src/core/hle/service/fatal/fatal.cpp @@ -19,6 +19,8 @@ #include "core/hle/service/server_manager.h" #include "core/reporter.h" +#undef far + namespace Service::Fatal { Module::Interface::Interface(std::shared_ptr module_, Core::System& system_, diff --git a/src/core/hle/service/filesystem/filesystem.cpp b/src/core/hle/service/filesystem/filesystem.cpp index c192fea454..7a78cc2dfa 100644 --- a/src/core/hle/service/filesystem/filesystem.cpp +++ b/src/core/hle/service/filesystem/filesystem.cpp @@ -32,6 +32,10 @@ #include "core/hle/service/server_manager.h" #include "core/loader/loader.h" +#undef CreateFile +#undef DeleteFile +#undef CreateDirectory + namespace Service::FileSystem { static FileSys::VirtualDir GetDirectoryRelativeWrapped(FileSys::VirtualDir base, diff --git a/src/core/hle/service/hle_ipc.cpp b/src/core/hle/service/hle_ipc.cpp index 8569d2bad8..3578c174ff 100644 --- a/src/core/hle/service/hle_ipc.cpp +++ b/src/core/hle/service/hle_ipc.cpp @@ -27,6 +27,8 @@ #include "core/hle/service/ipc_helpers.h" #include "core/memory.h" +#undef SendMessage + namespace Service { SessionRequestHandler::SessionRequestHandler(Kernel::KernelCore& kernel_, const char* service_name_) diff --git a/src/core/hle/service/nifm/nifm.cpp b/src/core/hle/service/nifm/nifm.cpp index a0302a5841..98fcaa3220 100644 --- a/src/core/hle/service/nifm/nifm.cpp +++ b/src/core/hle/service/nifm/nifm.cpp @@ -212,8 +212,9 @@ struct NifmNetworkProfileData { NifmWirelessSettingData wireless_setting_data{}; IpSettingData ip_setting_data{}; }; +static_assert(sizeof(NifmNetworkProfileData) == 0x18E, + "NifmNetworkProfileData has incorrect size."); #pragma pack(pop) -static_assert(sizeof(NifmNetworkProfileData) == 0x18E, "NifmNetworkProfileData has incorrect size."); struct PendingProfile { std::array ssid{}; diff --git a/src/core/hle/service/nvnflinger/hos_binder_driver.h b/src/core/hle/service/nvnflinger/hos_binder_driver.h index b7fb07bd2e..6b551c91d2 100644 --- a/src/core/hle/service/nvnflinger/hos_binder_driver.h +++ b/src/core/hle/service/nvnflinger/hos_binder_driver.h @@ -1,6 +1,11 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later +#pragma once + #include "core/hle/service/cmif_types.h" #include "core/hle/service/service.h" diff --git a/src/core/hle/service/olsc/daemon_controller.h b/src/core/hle/service/olsc/daemon_controller.h index fc7dd7bbcb..5f978ab153 100644 --- a/src/core/hle/service/olsc/daemon_controller.h +++ b/src/core/hle/service/olsc/daemon_controller.h @@ -4,6 +4,8 @@ // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later +#pragma once + #include #include "common/uuid.h" diff --git a/src/core/hle/service/olsc/native_handle_holder.h b/src/core/hle/service/olsc/native_handle_holder.h index 985c60d1cb..e0eac50c28 100644 --- a/src/core/hle/service/olsc/native_handle_holder.h +++ b/src/core/hle/service/olsc/native_handle_holder.h @@ -4,6 +4,8 @@ // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later +#pragma once + #include "core/hle/service/cmif_types.h" #include "core/hle/service/service.h" diff --git a/src/core/hle/service/olsc/olsc_service_for_application.h b/src/core/hle/service/olsc/olsc_service_for_application.h index 3f9ac7536a..8941659478 100644 --- a/src/core/hle/service/olsc/olsc_service_for_application.h +++ b/src/core/hle/service/olsc/olsc_service_for_application.h @@ -1,6 +1,11 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later +#pragma once + #include "core/hle/service/cmif_types.h" #include "core/hle/service/ns/ns_types.h" #include "core/hle/service/service.h" diff --git a/src/core/hle/service/olsc/olsc_service_for_system_service.h b/src/core/hle/service/olsc/olsc_service_for_system_service.h index 447e37005e..d16c8b979b 100644 --- a/src/core/hle/service/olsc/olsc_service_for_system_service.h +++ b/src/core/hle/service/olsc/olsc_service_for_system_service.h @@ -4,6 +4,8 @@ // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later +#pragma once + #include #include "common/uuid.h" diff --git a/src/core/hle/service/olsc/remote_storage_controller.h b/src/core/hle/service/olsc/remote_storage_controller.h index bae1e8efb5..21b439013a 100644 --- a/src/core/hle/service/olsc/remote_storage_controller.h +++ b/src/core/hle/service/olsc/remote_storage_controller.h @@ -4,6 +4,8 @@ // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later +#pragma once + #include "core/hle/service/cmif_types.h" #include "core/hle/service/service.h" diff --git a/src/core/hle/service/olsc/transfer_task_list_controller.h b/src/core/hle/service/olsc/transfer_task_list_controller.h index 72dbf610d8..4ac770b477 100644 --- a/src/core/hle/service/olsc/transfer_task_list_controller.h +++ b/src/core/hle/service/olsc/transfer_task_list_controller.h @@ -4,6 +4,8 @@ // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later +#pragma once + #include "core/hle/service/cmif_types.h" #include "core/hle/service/service.h" diff --git a/src/core/hle/service/psc/time/clocks/system_clock_core.h b/src/core/hle/service/psc/time/clocks/system_clock_core.h index 0b928432fb..7d124791df 100644 --- a/src/core/hle/service/psc/time/clocks/system_clock_core.h +++ b/src/core/hle/service/psc/time/clocks/system_clock_core.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -10,6 +13,8 @@ namespace Service::PSC::Time { class ContextWriter; +#undef GetCurrentTime + class SystemClockCore { public: explicit SystemClockCore(SteadyClockCore& steady_clock) : m_steady_clock{steady_clock} {} diff --git a/src/core/hle/service/psc/time/system_clock.h b/src/core/hle/service/psc/time/system_clock.h index 3c11fb2f81..7844bd8bb9 100644 --- a/src/core/hle/service/psc/time/system_clock.h +++ b/src/core/hle/service/psc/time/system_clock.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -16,6 +19,8 @@ class System; namespace Service::PSC::Time { +#undef GetCurrentTime + class SystemClock final : public ServiceFramework { public: explicit SystemClock(Core::System& system, SystemClockCore& system_clock_core, diff --git a/src/core/hle/service/ro/ro_results.h b/src/core/hle/service/ro/ro_results.h index 00f05c5a59..906378bc7f 100644 --- a/src/core/hle/service/ro/ro_results.h +++ b/src/core/hle/service/ro/ro_results.h @@ -1,6 +1,11 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later +#pragma once + #include "core/hle/result.h" namespace Service::RO { diff --git a/src/core/hle/service/sockets/bsd.cpp b/src/core/hle/service/sockets/bsd.cpp index fd758d4915..4304ee8b76 100644 --- a/src/core/hle/service/sockets/bsd.cpp +++ b/src/core/hle/service/sockets/bsd.cpp @@ -56,11 +56,11 @@ void PutValue(std::span buffer, const T& t) { } // Anonymous namespace -void BSD::PollWork::Execute(BSD* bsd) { +void NetworkBSD::PollWork::Execute(NetworkBSD* bsd) { std::tie(ret, bsd_errno) = bsd->PollImpl(write_buffer, read_buffer, nfds, timeout); } -void BSD::PollWork::Response(HLERequestContext& ctx) { +void NetworkBSD::PollWork::Response(HLERequestContext& ctx) { if (write_buffer.size() > 0) { ctx.WriteBuffer(write_buffer); } @@ -71,11 +71,11 @@ void BSD::PollWork::Response(HLERequestContext& ctx) { rb.PushEnum(bsd_errno); } -void BSD::AcceptWork::Execute(BSD* bsd) { +void NetworkBSD::AcceptWork::Execute(NetworkBSD* bsd) { std::tie(ret, bsd_errno) = bsd->AcceptImpl(fd, write_buffer); } -void BSD::AcceptWork::Response(HLERequestContext& ctx) { +void NetworkBSD::AcceptWork::Response(HLERequestContext& ctx) { if (write_buffer.size() > 0) { ctx.WriteBuffer(write_buffer); } @@ -87,22 +87,22 @@ void BSD::AcceptWork::Response(HLERequestContext& ctx) { rb.Push(static_cast(write_buffer.size())); } -void BSD::ConnectWork::Execute(BSD* bsd) { +void NetworkBSD::ConnectWork::Execute(NetworkBSD* bsd) { bsd_errno = bsd->ConnectImpl(fd, addr); } -void BSD::ConnectWork::Response(HLERequestContext& ctx) { +void NetworkBSD::ConnectWork::Response(HLERequestContext& ctx) { IPC::ResponseBuilder rb{ctx, 4}; rb.Push(ResultSuccess); rb.Push(bsd_errno == Errno::SUCCESS ? 0 : -1); rb.PushEnum(bsd_errno); } -void BSD::RecvWork::Execute(BSD* bsd) { +void NetworkBSD::RecvWork::Execute(NetworkBSD* bsd) { std::tie(ret, bsd_errno) = bsd->RecvImpl(fd, flags, message); } -void BSD::RecvWork::Response(HLERequestContext& ctx) { +void NetworkBSD::RecvWork::Response(HLERequestContext& ctx) { ctx.WriteBuffer(message); IPC::ResponseBuilder rb{ctx, 4}; @@ -111,11 +111,11 @@ void BSD::RecvWork::Response(HLERequestContext& ctx) { rb.PushEnum(bsd_errno); } -void BSD::RecvFromWork::Execute(BSD* bsd) { +void NetworkBSD::RecvFromWork::Execute(NetworkBSD* bsd) { std::tie(ret, bsd_errno) = bsd->RecvFromImpl(fd, flags, message, addr); } -void BSD::RecvFromWork::Response(HLERequestContext& ctx) { +void NetworkBSD::RecvFromWork::Response(HLERequestContext& ctx) { ctx.WriteBuffer(message, 0); if (!addr.empty()) { ctx.WriteBuffer(addr, 1); @@ -128,29 +128,29 @@ void BSD::RecvFromWork::Response(HLERequestContext& ctx) { rb.Push(static_cast(addr.size())); } -void BSD::SendWork::Execute(BSD* bsd) { +void NetworkBSD::SendWork::Execute(NetworkBSD* bsd) { std::tie(ret, bsd_errno) = bsd->SendImpl(fd, flags, message); } -void BSD::SendWork::Response(HLERequestContext& ctx) { +void NetworkBSD::SendWork::Response(HLERequestContext& ctx) { IPC::ResponseBuilder rb{ctx, 4}; rb.Push(ResultSuccess); rb.Push(ret); rb.PushEnum(bsd_errno); } -void BSD::SendToWork::Execute(BSD* bsd) { +void NetworkBSD::SendToWork::Execute(NetworkBSD* bsd) { std::tie(ret, bsd_errno) = bsd->SendToImpl(fd, flags, message, addr); } -void BSD::SendToWork::Response(HLERequestContext& ctx) { +void NetworkBSD::SendToWork::Response(HLERequestContext& ctx) { IPC::ResponseBuilder rb{ctx, 4}; rb.Push(ResultSuccess); rb.Push(ret); rb.PushEnum(bsd_errno); } -void BSD::RegisterClient(HLERequestContext& ctx) { +void NetworkBSD::RegisterClient(HLERequestContext& ctx) { LOG_WARNING(Service, "(STUBBED) called"); IPC::ResponseBuilder rb{ctx, 3}; @@ -159,7 +159,7 @@ void BSD::RegisterClient(HLERequestContext& ctx) { rb.Push(0); // bsd errno } -void BSD::StartMonitoring(HLERequestContext& ctx) { +void NetworkBSD::StartMonitoring(HLERequestContext& ctx) { LOG_WARNING(Service, "(STUBBED) called"); IPC::ResponseBuilder rb{ctx, 2}; @@ -167,7 +167,7 @@ void BSD::StartMonitoring(HLERequestContext& ctx) { rb.Push(ResultSuccess); } -void BSD::Socket(HLERequestContext& ctx) { +void NetworkBSD::Socket(HLERequestContext& ctx) { IPC::RequestParser rp{ctx}; const u32 domain = rp.Pop(); const u32 type = rp.Pop(); @@ -184,7 +184,7 @@ void BSD::Socket(HLERequestContext& ctx) { rb.PushEnum(bsd_errno); } -void BSD::Select(HLERequestContext& ctx) { +void NetworkBSD::Select(HLERequestContext& ctx) { LOG_DEBUG(Service, "(STUBBED) called"); IPC::ResponseBuilder rb{ctx, 4}; @@ -194,7 +194,7 @@ void BSD::Select(HLERequestContext& ctx) { rb.Push(0); // bsd errno } -void BSD::Poll(HLERequestContext& ctx) { +void NetworkBSD::Poll(HLERequestContext& ctx) { IPC::RequestParser rp{ctx}; const s32 nfds = rp.Pop(); const s32 timeout = rp.Pop(); @@ -209,7 +209,7 @@ void BSD::Poll(HLERequestContext& ctx) { }); } -void BSD::Accept(HLERequestContext& ctx) { +void NetworkBSD::Accept(HLERequestContext& ctx) { IPC::RequestParser rp{ctx}; const s32 fd = rp.Pop(); @@ -221,7 +221,7 @@ void BSD::Accept(HLERequestContext& ctx) { }); } -void BSD::Bind(HLERequestContext& ctx) { +void NetworkBSD::Bind(HLERequestContext& ctx) { IPC::RequestParser rp{ctx}; const s32 fd = rp.Pop(); @@ -229,7 +229,7 @@ void BSD::Bind(HLERequestContext& ctx) { BuildErrnoResponse(ctx, BindImpl(fd, ctx.ReadBuffer())); } -void BSD::Connect(HLERequestContext& ctx) { +void NetworkBSD::Connect(HLERequestContext& ctx) { IPC::RequestParser rp{ctx}; const s32 fd = rp.Pop(); @@ -241,7 +241,7 @@ void BSD::Connect(HLERequestContext& ctx) { }); } -void BSD::GetPeerName(HLERequestContext& ctx) { +void NetworkBSD::GetPeerName(HLERequestContext& ctx) { IPC::RequestParser rp{ctx}; const s32 fd = rp.Pop(); @@ -259,7 +259,7 @@ void BSD::GetPeerName(HLERequestContext& ctx) { rb.Push(static_cast(write_buffer.size())); } -void BSD::GetSockName(HLERequestContext& ctx) { +void NetworkBSD::GetSockName(HLERequestContext& ctx) { IPC::RequestParser rp{ctx}; const s32 fd = rp.Pop(); @@ -277,7 +277,7 @@ void BSD::GetSockName(HLERequestContext& ctx) { rb.Push(static_cast(write_buffer.size())); } -void BSD::GetSockOpt(HLERequestContext& ctx) { +void NetworkBSD::GetSockOpt(HLERequestContext& ctx) { IPC::RequestParser rp{ctx}; const s32 fd = rp.Pop(); const u32 level = rp.Pop(); @@ -299,7 +299,7 @@ void BSD::GetSockOpt(HLERequestContext& ctx) { rb.Push(static_cast(optval.size())); } -void BSD::Listen(HLERequestContext& ctx) { +void NetworkBSD::Listen(HLERequestContext& ctx) { IPC::RequestParser rp{ctx}; const s32 fd = rp.Pop(); const s32 backlog = rp.Pop(); @@ -309,7 +309,7 @@ void BSD::Listen(HLERequestContext& ctx) { BuildErrnoResponse(ctx, ListenImpl(fd, backlog)); } -void BSD::Fcntl(HLERequestContext& ctx) { +void NetworkBSD::Fcntl(HLERequestContext& ctx) { IPC::RequestParser rp{ctx}; const s32 fd = rp.Pop(); const s32 cmd = rp.Pop(); @@ -325,7 +325,7 @@ void BSD::Fcntl(HLERequestContext& ctx) { rb.PushEnum(bsd_errno); } -void BSD::SetSockOpt(HLERequestContext& ctx) { +void NetworkBSD::SetSockOpt(HLERequestContext& ctx) { IPC::RequestParser rp{ctx}; const s32 fd = rp.Pop(); @@ -339,7 +339,7 @@ void BSD::SetSockOpt(HLERequestContext& ctx) { BuildErrnoResponse(ctx, SetSockOptImpl(fd, level, optname, optval)); } -void BSD::Shutdown(HLERequestContext& ctx) { +void NetworkBSD::Shutdown(HLERequestContext& ctx) { IPC::RequestParser rp{ctx}; const s32 fd = rp.Pop(); @@ -350,7 +350,7 @@ void BSD::Shutdown(HLERequestContext& ctx) { BuildErrnoResponse(ctx, ShutdownImpl(fd, how)); } -void BSD::Recv(HLERequestContext& ctx) { +void NetworkBSD::Recv(HLERequestContext& ctx) { IPC::RequestParser rp{ctx}; const s32 fd = rp.Pop(); @@ -365,7 +365,7 @@ void BSD::Recv(HLERequestContext& ctx) { }); } -void BSD::RecvFrom(HLERequestContext& ctx) { +void NetworkBSD::RecvFrom(HLERequestContext& ctx) { IPC::RequestParser rp{ctx}; const s32 fd = rp.Pop(); @@ -382,7 +382,7 @@ void BSD::RecvFrom(HLERequestContext& ctx) { }); } -void BSD::Send(HLERequestContext& ctx) { +void NetworkBSD::Send(HLERequestContext& ctx) { IPC::RequestParser rp{ctx}; const s32 fd = rp.Pop(); @@ -397,7 +397,7 @@ void BSD::Send(HLERequestContext& ctx) { }); } -void BSD::SendTo(HLERequestContext& ctx) { +void NetworkBSD::SendTo(HLERequestContext& ctx) { IPC::RequestParser rp{ctx}; const s32 fd = rp.Pop(); const u32 flags = rp.Pop(); @@ -413,7 +413,7 @@ void BSD::SendTo(HLERequestContext& ctx) { }); } -void BSD::Write(HLERequestContext& ctx) { +void NetworkBSD::Write(HLERequestContext& ctx) { IPC::RequestParser rp{ctx}; const s32 fd = rp.Pop(); @@ -426,7 +426,7 @@ void BSD::Write(HLERequestContext& ctx) { }); } -void BSD::Read(HLERequestContext& ctx) { +void NetworkBSD::Read(HLERequestContext& ctx) { IPC::RequestParser rp{ctx}; const s32 fd = rp.Pop(); @@ -438,7 +438,7 @@ void BSD::Read(HLERequestContext& ctx) { rb.Push(0); // bsd errno } -void BSD::Close(HLERequestContext& ctx) { +void NetworkBSD::Close(HLERequestContext& ctx) { IPC::RequestParser rp{ctx}; const s32 fd = rp.Pop(); @@ -447,7 +447,7 @@ void BSD::Close(HLERequestContext& ctx) { BuildErrnoResponse(ctx, CloseImpl(fd)); } -void BSD::DuplicateSocket(HLERequestContext& ctx) { +void NetworkBSD::DuplicateSocket(HLERequestContext& ctx) { struct InputParameters { s32 fd; u64 reserved; @@ -472,7 +472,7 @@ void BSD::DuplicateSocket(HLERequestContext& ctx) { }); } -void BSD::EventFd(HLERequestContext& ctx) { +void NetworkBSD::EventFd(HLERequestContext& ctx) { IPC::RequestParser rp{ctx}; const u64 initval = rp.Pop(); const u32 flags = rp.Pop(); @@ -483,12 +483,12 @@ void BSD::EventFd(HLERequestContext& ctx) { } template -void BSD::ExecuteWork(HLERequestContext& ctx, Work work) { +void NetworkBSD::ExecuteWork(HLERequestContext& ctx, Work work) { work.Execute(this); work.Response(ctx); } -std::pair BSD::SocketImpl(Domain domain, Type type, Protocol protocol) { +std::pair NetworkBSD::SocketImpl(Domain domain, Type type, Protocol protocol) { if (type == Type::SEQPACKET) { UNIMPLEMENTED_MSG("SOCK_SEQPACKET errno management"); @@ -530,7 +530,7 @@ std::pair BSD::SocketImpl(Domain domain, Type type, Protocol protoco return {fd, Errno::SUCCESS}; } -std::pair BSD::PollImpl(std::vector& write_buffer, std::span read_buffer, +std::pair NetworkBSD::PollImpl(std::vector& write_buffer, std::span read_buffer, s32 nfds, s32 timeout) { if (nfds <= 0) { // When no entries are provided, -1 is returned with errno zero @@ -597,7 +597,7 @@ std::pair BSD::PollImpl(std::vector& write_buffer, std::span BSD::AcceptImpl(s32 fd, std::vector& write_buffer) { +std::pair NetworkBSD::AcceptImpl(s32 fd, std::vector& write_buffer) { if (!IsFileDescriptorValid(fd)) { return {-1, Errno::BADF}; } @@ -625,7 +625,7 @@ std::pair BSD::AcceptImpl(s32 fd, std::vector& write_buffer) { return {new_fd, Errno::SUCCESS}; } -Errno BSD::BindImpl(s32 fd, std::span addr) { +Errno NetworkBSD::BindImpl(s32 fd, std::span addr) { if (!IsFileDescriptorValid(fd)) { return Errno::BADF; } @@ -635,7 +635,7 @@ Errno BSD::BindImpl(s32 fd, std::span addr) { return Translate(file_descriptors[fd]->socket->Bind(Translate(addr_in))); } -Errno BSD::ConnectImpl(s32 fd, std::span addr) { +Errno NetworkBSD::ConnectImpl(s32 fd, std::span addr) { if (!IsFileDescriptorValid(fd)) { return Errno::BADF; } @@ -653,7 +653,7 @@ Errno BSD::ConnectImpl(s32 fd, std::span addr) { return result; } -Errno BSD::GetPeerNameImpl(s32 fd, std::vector& write_buffer) { +Errno NetworkBSD::GetPeerNameImpl(s32 fd, std::vector& write_buffer) { if (!IsFileDescriptorValid(fd)) { return Errno::BADF; } @@ -670,7 +670,7 @@ Errno BSD::GetPeerNameImpl(s32 fd, std::vector& write_buffer) { return Translate(bsd_errno); } -Errno BSD::GetSockNameImpl(s32 fd, std::vector& write_buffer) { +Errno NetworkBSD::GetSockNameImpl(s32 fd, std::vector& write_buffer) { if (!IsFileDescriptorValid(fd)) { return Errno::BADF; } @@ -687,14 +687,14 @@ Errno BSD::GetSockNameImpl(s32 fd, std::vector& write_buffer) { return Translate(bsd_errno); } -Errno BSD::ListenImpl(s32 fd, s32 backlog) { +Errno NetworkBSD::ListenImpl(s32 fd, s32 backlog) { if (!IsFileDescriptorValid(fd)) { return Errno::BADF; } return Translate(file_descriptors[fd]->socket->Listen(backlog)); } -std::pair BSD::FcntlImpl(s32 fd, FcntlCmd cmd, s32 arg) { +std::pair NetworkBSD::FcntlImpl(s32 fd, FcntlCmd cmd, s32 arg) { if (!IsFileDescriptorValid(fd)) { return {-1, Errno::BADF}; } @@ -720,7 +720,7 @@ std::pair BSD::FcntlImpl(s32 fd, FcntlCmd cmd, s32 arg) { } } -Errno BSD::GetSockOptImpl(s32 fd, u32 level, OptName optname, std::vector& optval) { +Errno NetworkBSD::GetSockOptImpl(s32 fd, u32 level, OptName optname, std::vector& optval) { if (!IsFileDescriptorValid(fd)) { return Errno::BADF; } @@ -751,7 +751,7 @@ Errno BSD::GetSockOptImpl(s32 fd, u32 level, OptName optname, std::vector& o } } -Errno BSD::SetSockOptImpl(s32 fd, u32 level, OptName optname, std::span optval) { +Errno NetworkBSD::SetSockOptImpl(s32 fd, u32 level, OptName optname, std::span optval) { if (!IsFileDescriptorValid(fd)) { return Errno::BADF; } @@ -801,7 +801,7 @@ Errno BSD::SetSockOptImpl(s32 fd, u32 level, OptName optname, std::spansocket->Shutdown(host_how)); } -std::pair BSD::RecvImpl(s32 fd, u32 flags, std::vector& message) { +std::pair NetworkBSD::RecvImpl(s32 fd, u32 flags, std::vector& message) { if (!IsFileDescriptorValid(fd)) { return {-1, Errno::BADF}; } @@ -836,7 +836,7 @@ std::pair BSD::RecvImpl(s32 fd, u32 flags, std::vector& message) return {ret, bsd_errno}; } -std::pair BSD::RecvFromImpl(s32 fd, u32 flags, std::vector& message, +std::pair NetworkBSD::RecvFromImpl(s32 fd, u32 flags, std::vector& message, std::vector& addr) { if (!IsFileDescriptorValid(fd)) { return {-1, Errno::BADF}; @@ -883,14 +883,14 @@ std::pair BSD::RecvFromImpl(s32 fd, u32 flags, std::vector& mess return {ret, bsd_errno}; } -std::pair BSD::SendImpl(s32 fd, u32 flags, std::span message) { +std::pair NetworkBSD::SendImpl(s32 fd, u32 flags, std::span message) { if (!IsFileDescriptorValid(fd)) { return {-1, Errno::BADF}; } return Translate(file_descriptors[fd]->socket->Send(message, flags)); } -std::pair BSD::SendToImpl(s32 fd, u32 flags, std::span message, +std::pair NetworkBSD::SendToImpl(s32 fd, u32 flags, std::span message, std::span addr) { if (!IsFileDescriptorValid(fd)) { return {-1, Errno::BADF}; @@ -908,7 +908,7 @@ std::pair BSD::SendToImpl(s32 fd, u32 flags, std::span mes return Translate(file_descriptors[fd]->socket->SendTo(flags, message, p_addr_in)); } -Errno BSD::CloseImpl(s32 fd) { +Errno NetworkBSD::CloseImpl(s32 fd) { if (!IsFileDescriptorValid(fd)) { return Errno::BADF; } @@ -924,7 +924,7 @@ Errno BSD::CloseImpl(s32 fd) { return bsd_errno; } -Expected BSD::DuplicateSocketImpl(s32 fd) { +Expected NetworkBSD::DuplicateSocketImpl(s32 fd) { if (!IsFileDescriptorValid(fd)) { return Unexpected(Errno::BADF); } @@ -943,14 +943,14 @@ Expected BSD::DuplicateSocketImpl(s32 fd) { return new_fd; } -std::optional> BSD::GetSocket(s32 fd) { +std::optional> NetworkBSD::GetSocket(s32 fd) { if (!IsFileDescriptorValid(fd)) { return std::nullopt; } return file_descriptors[fd]->socket; } -s32 BSD::FindFreeFileDescriptorHandle() noexcept { +s32 NetworkBSD::FindFreeFileDescriptorHandle() noexcept { for (s32 fd = 0; fd < static_cast(file_descriptors.size()); ++fd) { if (!file_descriptors[fd]) { return fd; @@ -959,7 +959,7 @@ s32 BSD::FindFreeFileDescriptorHandle() noexcept { return -1; } -bool BSD::IsFileDescriptorValid(s32 fd) const noexcept { +bool NetworkBSD::IsFileDescriptorValid(s32 fd) const noexcept { if (fd > static_cast(MAX_FD) || fd < 0) { LOG_ERROR(Service, "Invalid file descriptor handle={}", fd); return false; @@ -971,7 +971,7 @@ bool BSD::IsFileDescriptorValid(s32 fd) const noexcept { return true; } -void BSD::BuildErrnoResponse(HLERequestContext& ctx, Errno bsd_errno) const noexcept { +void NetworkBSD::BuildErrnoResponse(HLERequestContext& ctx, Errno bsd_errno) const noexcept { IPC::ResponseBuilder rb{ctx, 4}; rb.Push(ResultSuccess); @@ -979,7 +979,7 @@ void BSD::BuildErrnoResponse(HLERequestContext& ctx, Errno bsd_errno) const noex rb.PushEnum(bsd_errno); } -void BSD::OnProxyPacketReceived(const Network::ProxyPacket& packet) { +void NetworkBSD::OnProxyPacketReceived(const Network::ProxyPacket& packet) { for (auto& optional_descriptor : file_descriptors) { if (!optional_descriptor.has_value()) { continue; @@ -989,42 +989,42 @@ void BSD::OnProxyPacketReceived(const Network::ProxyPacket& packet) { } } -BSD::BSD(Core::System& system_, const char* name) +NetworkBSD::NetworkBSD(Core::System& system_, const char* name) : ServiceFramework{system_, name} { // clang-format off static const FunctionInfo functions[] = { - {0, &BSD::RegisterClient, "RegisterClient"}, - {1, &BSD::StartMonitoring, "StartMonitoring"}, - {2, &BSD::Socket, "Socket"}, + {0, &NetworkBSD::RegisterClient, "RegisterClient"}, + {1, &NetworkBSD::StartMonitoring, "StartMonitoring"}, + {2, &NetworkBSD::Socket, "Socket"}, {3, nullptr, "SocketExempt"}, {4, nullptr, "Open"}, - {5, &BSD::Select, "Select"}, - {6, &BSD::Poll, "Poll"}, + {5, &NetworkBSD::Select, "Select"}, + {6, &NetworkBSD::Poll, "Poll"}, {7, nullptr, "Sysctl"}, - {8, &BSD::Recv, "Recv"}, - {9, &BSD::RecvFrom, "RecvFrom"}, - {10, &BSD::Send, "Send"}, - {11, &BSD::SendTo, "SendTo"}, - {12, &BSD::Accept, "Accept"}, - {13, &BSD::Bind, "Bind"}, - {14, &BSD::Connect, "Connect"}, - {15, &BSD::GetPeerName, "GetPeerName"}, - {16, &BSD::GetSockName, "GetSockName"}, - {17, &BSD::GetSockOpt, "GetSockOpt"}, - {18, &BSD::Listen, "Listen"}, + {8, &NetworkBSD::Recv, "Recv"}, + {9, &NetworkBSD::RecvFrom, "RecvFrom"}, + {10, &NetworkBSD::Send, "Send"}, + {11, &NetworkBSD::SendTo, "SendTo"}, + {12, &NetworkBSD::Accept, "Accept"}, + {13, &NetworkBSD::Bind, "Bind"}, + {14, &NetworkBSD::Connect, "Connect"}, + {15, &NetworkBSD::GetPeerName, "GetPeerName"}, + {16, &NetworkBSD::GetSockName, "GetSockName"}, + {17, &NetworkBSD::GetSockOpt, "GetSockOpt"}, + {18, &NetworkBSD::Listen, "Listen"}, {19, nullptr, "Ioctl"}, - {20, &BSD::Fcntl, "Fcntl"}, - {21, &BSD::SetSockOpt, "SetSockOpt"}, - {22, &BSD::Shutdown, "Shutdown"}, + {20, &NetworkBSD::Fcntl, "Fcntl"}, + {21, &NetworkBSD::SetSockOpt, "SetSockOpt"}, + {22, &NetworkBSD::Shutdown, "Shutdown"}, {23, nullptr, "ShutdownAllSockets"}, - {24, &BSD::Write, "Write"}, - {25, &BSD::Read, "Read"}, - {26, &BSD::Close, "Close"}, - {27, &BSD::DuplicateSocket, "DuplicateSocket"}, + {24, &NetworkBSD::Write, "Write"}, + {25, &NetworkBSD::Read, "Read"}, + {26, &NetworkBSD::Close, "Close"}, + {27, &NetworkBSD::DuplicateSocket, "DuplicateSocket"}, {28, nullptr, "GetResourceStatistics"}, {29, nullptr, "RecvMMsg"}, //3.0.0+ {30, nullptr, "SendMMsg"}, //3.0.0+ - {31, &BSD::EventFd, "EventFd"}, //7.0.0+ + {31, &NetworkBSD::EventFd, "EventFd"}, //7.0.0+ {32, nullptr, "RegisterResourceStatisticsName"}, //7.0.0+ {33, nullptr, "RegisterClientShared"}, //10.0.0+ {34, nullptr, "GetSocketStatistics"}, //15.0.0+ @@ -1052,13 +1052,13 @@ BSD::BSD(Core::System& system_, const char* name) } } -BSD::~BSD() { +NetworkBSD::~NetworkBSD() { if (auto room_member = Network::GetRoomMember().lock()) { room_member->Unbind(proxy_packet_received); } } -std::unique_lock BSD::LockService() noexcept { +std::unique_lock NetworkBSD::LockService() noexcept { return {}; } diff --git a/src/core/hle/service/sockets/bsd.h b/src/core/hle/service/sockets/bsd.h index 32b5bdc3cf..f69513c468 100644 --- a/src/core/hle/service/sockets/bsd.h +++ b/src/core/hle/service/sockets/bsd.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -27,10 +27,10 @@ class Socket; namespace Service::Sockets { -class BSD final : public ServiceFramework { +class NetworkBSD final : public ServiceFramework { public: - explicit BSD(Core::System& system_, const char* name); - ~BSD() override; + explicit NetworkBSD(Core::System& system_, const char* name); + ~NetworkBSD() override; // These methods are called from SSL; the first two are also called from // this class for the corresponding IPC methods. @@ -50,7 +50,7 @@ private: }; struct PollWork { - void Execute(BSD* bsd); + void Execute(NetworkBSD* bsd); void Response(HLERequestContext& ctx); s32 nfds; @@ -62,7 +62,7 @@ private: }; struct AcceptWork { - void Execute(BSD* bsd); + void Execute(NetworkBSD* bsd); void Response(HLERequestContext& ctx); s32 fd; @@ -72,7 +72,7 @@ private: }; struct ConnectWork { - void Execute(BSD* bsd); + void Execute(NetworkBSD* bsd); void Response(HLERequestContext& ctx); s32 fd; @@ -81,7 +81,7 @@ private: }; struct RecvWork { - void Execute(BSD* bsd); + void Execute(NetworkBSD* bsd); void Response(HLERequestContext& ctx); s32 fd; @@ -92,7 +92,7 @@ private: }; struct RecvFromWork { - void Execute(BSD* bsd); + void Execute(NetworkBSD* bsd); void Response(HLERequestContext& ctx); s32 fd; @@ -104,7 +104,7 @@ private: }; struct SendWork { - void Execute(BSD* bsd); + void Execute(NetworkBSD* bsd); void Response(HLERequestContext& ctx); s32 fd; @@ -115,7 +115,7 @@ private: }; struct SendToWork { - void Execute(BSD* bsd); + void Execute(NetworkBSD* bsd); void Response(HLERequestContext& ctx); s32 fd; diff --git a/src/core/hle/service/sockets/sockets.cpp b/src/core/hle/service/sockets/sockets.cpp index 676d24e036..593f9ee6db 100644 --- a/src/core/hle/service/sockets/sockets.cpp +++ b/src/core/hle/service/sockets/sockets.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -12,8 +15,8 @@ namespace Service::Sockets { void LoopProcess(Core::System& system) { auto server_manager = std::make_unique(system); - server_manager->RegisterNamedService("bsd:s", std::make_shared(system, "bsd:s")); - server_manager->RegisterNamedService("bsd:u", std::make_shared(system, "bsd:u")); + server_manager->RegisterNamedService("bsd:s", std::make_shared(system, "bsd:s")); + server_manager->RegisterNamedService("bsd:u", std::make_shared(system, "bsd:u")); server_manager->RegisterNamedService("bsdcfg", std::make_shared(system)); server_manager->RegisterNamedService("nsd:a", std::make_shared(system, "nsd:a")); server_manager->RegisterNamedService("nsd:u", std::make_shared(system, "nsd:u")); diff --git a/src/core/hle/service/ssl/ssl.cpp b/src/core/hle/service/ssl/ssl.cpp index b66c686b2a..3570068944 100644 --- a/src/core/hle/service/ssl/ssl.cpp +++ b/src/core/hle/service/ssl/ssl.cpp @@ -129,7 +129,7 @@ public: LOG_ERROR(Service_SSL, "do_not_close_socket was changed after setting socket; is this right?"); } else { - auto bsd = system.ServiceManager().GetService("bsd:u"); + auto bsd = system.ServiceManager().GetService("bsd:u"); if (bsd) { auto err = bsd->CloseImpl(fd); if (err != Service::Sockets::Errno::SUCCESS) { @@ -157,7 +157,7 @@ private: Result SetSocketDescriptorImpl(s32* out_fd, s32 fd) { LOG_DEBUG(Service_SSL, "called, fd={}", fd); ASSERT(!did_handshake); - auto bsd = system.ServiceManager().GetService("bsd:u"); + auto bsd = system.ServiceManager().GetService("bsd:u"); ASSERT_OR_EXECUTE(bsd, { return ResultInternalError; }); auto res = bsd->DuplicateSocketImpl(fd); diff --git a/src/core/hle/service/vi/application_display_service.h b/src/core/hle/service/vi/application_display_service.h index 1bdeb8f845..a2eeb4c70c 100644 --- a/src/core/hle/service/vi/application_display_service.h +++ b/src/core/hle/service/vi/application_display_service.h @@ -1,6 +1,11 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later +#pragma once + #include #include diff --git a/src/core/hle/service/vi/system_display_service.h b/src/core/hle/service/vi/system_display_service.h index d6cc8c75f1..a3b88c519d 100644 --- a/src/core/hle/service/vi/system_display_service.h +++ b/src/core/hle/service/vi/system_display_service.h @@ -1,9 +1,11 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later +#pragma once + #include "common/math_util.h" #include "core/hle/service/cmif_types.h" #include "core/hle/service/nvnflinger/ui/fence.h" diff --git a/src/core/loader/kip.cpp b/src/core/loader/kip.cpp index 81449ac8b8..3a16c369b1 100644 --- a/src/core/loader/kip.cpp +++ b/src/core/loader/kip.cpp @@ -17,11 +17,9 @@ namespace Loader { -namespace { -constexpr u32 PageAlignSize(u32 size) { - return static_cast((size + Core::Memory::YUZU_PAGEMASK) & ~Core::Memory::YUZU_PAGEMASK); +[[nodiscard]] inline constexpr u32 PageAlignSizeKIP(u32 size) { + return u32((size + Core::Memory::YUZU_PAGEMASK) & ~Core::Memory::YUZU_PAGEMASK); } -} // Anonymous namespace AppLoader_KIP::AppLoader_KIP(FileSys::VirtualFile file_) : AppLoader(std::move(file_)), kip(std::make_unique(file)) {} @@ -76,11 +74,11 @@ AppLoader::LoadResult AppLoader_KIP::Load(Kernel::KProcess& process, kip->GetKernelCapabilities()); Kernel::CodeSet codeset; - codeset.memory.resize(PageAlignSize(kip->GetBSSOffset()) + kip->GetBSSSize()); + codeset.memory.resize(PageAlignSizeKIP(kip->GetBSSOffset()) + kip->GetBSSSize()); const auto load_segment = [&codeset](Kernel::CodeSet::Segment& segment, std::span data, u32 offset) { segment.addr = offset; segment.offset = offset; - segment.size = PageAlignSize(u32(data.size())); + segment.size = PageAlignSizeKIP(u32(data.size())); std::memcpy(codeset.memory.data() + offset, data.data(), data.size()); }; load_segment(codeset.CodeSegment(), kip->GetTextSection(), kip->GetTextOffset()); diff --git a/src/core/loader/nro.cpp b/src/core/loader/nro.cpp index e7c5ac01b1..70178cbb9b 100644 --- a/src/core/loader/nro.cpp +++ b/src/core/loader/nro.cpp @@ -143,8 +143,8 @@ bool AppLoader_NRO::IsHomebrew() { nro_header.magic_ext2 == Common::MakeMagic('B', 'R', 'E', 'W'); } -static constexpr u32 PageAlignSize(u32 size) { - return static_cast((size + Core::Memory::YUZU_PAGEMASK) & ~Core::Memory::YUZU_PAGEMASK); +[[nodiscard]] inline constexpr u32 PageAlignSizeNRO(u32 size) { + return u32((size + Core::Memory::YUZU_PAGEMASK) & ~Core::Memory::YUZU_PAGEMASK); } static bool LoadNroImpl(Core::System& system, Kernel::KProcess& process, @@ -161,9 +161,9 @@ static bool LoadNroImpl(Core::System& system, Kernel::KProcess& process, } // Build program image - std::vector program_image(PageAlignSize(nro_header.file_size)); + std::vector program_image(PageAlignSizeNRO(nro_header.file_size)); std::memcpy(program_image.data(), data.data(), program_image.size()); - if (program_image.size() != PageAlignSize(nro_header.file_size)) { + if (program_image.size() != PageAlignSizeNRO(nro_header.file_size)) { return {}; } @@ -171,7 +171,7 @@ static bool LoadNroImpl(Core::System& system, Kernel::KProcess& process, for (std::size_t i = 0; i < nro_header.segments.size(); ++i) { codeset.segments[i].addr = nro_header.segments[i].offset; codeset.segments[i].offset = nro_header.segments[i].offset; - codeset.segments[i].size = PageAlignSize(nro_header.segments[i].size); + codeset.segments[i].size = PageAlignSizeNRO(nro_header.segments[i].size); } if (!Settings::values.program_args.GetValue().empty()) { @@ -188,7 +188,7 @@ static bool LoadNroImpl(Core::System& system, Kernel::KProcess& process, } // Default .bss to NRO header bss size if MOD0 section doesn't exist - u32 bss_size{PageAlignSize(nro_header.bss_size)}; + u32 bss_size{PageAlignSizeNRO(nro_header.bss_size)}; // Read MOD header ModHeader mod_header{}; @@ -198,7 +198,7 @@ static bool LoadNroImpl(Core::System& system, Kernel::KProcess& process, const bool has_mod_header{mod_header.magic == Common::MakeMagic('M', 'O', 'D', '0')}; if (has_mod_header) { // Resize program image to include .bss section and page align each section - bss_size = PageAlignSize(mod_header.bss_end_offset - mod_header.bss_start_offset); + bss_size = PageAlignSizeNRO(mod_header.bss_end_offset - mod_header.bss_start_offset); } codeset.DataSegment().size += bss_size; diff --git a/src/core/loader/nso.cpp b/src/core/loader/nso.cpp index 482c853542..374dae23bd 100644 --- a/src/core/loader/nso.cpp +++ b/src/core/loader/nso.cpp @@ -41,8 +41,8 @@ struct MODHeader { }; static_assert(sizeof(MODHeader) == 0x1c, "MODHeader has incorrect size."); -constexpr u32 PageAlignSize(u32 size) { - return static_cast((size + Core::Memory::YUZU_PAGEMASK) & ~Core::Memory::YUZU_PAGEMASK); +[[nodiscard]] inline constexpr u32 PageAlignSizeNSO(u32 size) { + return u32((size + Core::Memory::YUZU_PAGEMASK) & ~Core::Memory::YUZU_PAGEMASK); } } // Anonymous namespace @@ -128,11 +128,11 @@ std::optional AppLoader_NSO::LoadModule(Kernel::KProcess& process, Core:: } codeset.DataSegment().size += nso_header.segments[2].bss_size; - u32 image_size = PageAlignSize(u32(codeset.memory.size()) + nso_header.segments[2].bss_size); + u32 image_size = PageAlignSizeNSO(u32(codeset.memory.size()) + nso_header.segments[2].bss_size); codeset.memory.resize(image_size); for (std::size_t i = 0; i < nso_header.segments.size(); ++i) { - codeset.segments[i].size = PageAlignSize(codeset.segments[i].size); + codeset.segments[i].size = PageAlignSizeNSO(codeset.segments[i].size); } // Apply patches if necessary diff --git a/src/core/memory/cheat_engine.cpp b/src/core/memory/cheat_engine.cpp index dcfd23644f..e580f515db 100644 --- a/src/core/memory/cheat_engine.cpp +++ b/src/core/memory/cheat_engine.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project @@ -21,6 +21,8 @@ #include "hid_core/resource_manager.h" #include "hid_core/resources/npad/npad.h" +#undef CreateEvent + namespace Core::Memory { namespace { constexpr auto CHEAT_ENGINE_NS = std::chrono::nanoseconds{1000000000 / 12}; diff --git a/src/core/reporter.cpp b/src/core/reporter.cpp index 1723636811..e55a5b8441 100644 --- a/src/core/reporter.cpp +++ b/src/core/reporter.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2019 yuzu Emulator Project @@ -27,6 +27,8 @@ #include "core/memory.h" #include "core/reporter.h" +#undef far + namespace { std::filesystem::path GetPath(std::string_view type, u64 title_id, std::string_view timestamp) { diff --git a/src/core/tools/freezer.cpp b/src/core/tools/freezer.cpp index 73a86b3c8c..5b727128e2 100644 --- a/src/core/tools/freezer.cpp +++ b/src/core/tools/freezer.cpp @@ -52,6 +52,8 @@ void MemoryWriteWidth(Core::Memory::Memory& memory, u32 width, VAddr addr, u64 v } // Anonymous namespace +#undef CreateEvent + Freezer::Freezer(Core::Timing::CoreTiming& core_timing_, Core::Memory::Memory& memory_) : core_timing{core_timing_}, memory{memory_} { event = Core::Timing::CreateEvent("MemoryFreezer::FrameCallback", diff --git a/src/core/tools/renderdoc.cpp b/src/core/tools/renderdoc.cpp index 5fab291fe5..4d91956902 100644 --- a/src/core/tools/renderdoc.cpp +++ b/src/core/tools/renderdoc.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project @@ -51,10 +51,12 @@ void RenderdocAPI::ToggleCapture() { if (!rdoc_api) [[unlikely]] { return; } + + auto* api = static_cast(rdoc_api); if (!is_capturing) { - rdoc_api->StartFrameCapture(NULL, NULL); + api->StartFrameCapture(NULL, NULL); } else { - rdoc_api->EndFrameCapture(NULL, NULL); + api->EndFrameCapture(NULL, NULL); } is_capturing = !is_capturing; } diff --git a/src/core/tools/renderdoc.h b/src/core/tools/renderdoc.h index 689b0a383a..1f72bef320 100644 --- a/src/core/tools/renderdoc.h +++ b/src/core/tools/renderdoc.h @@ -6,8 +6,6 @@ #pragma once -struct RENDERDOC_API_1_7_0; - namespace Tools { class RenderdocAPI { @@ -18,7 +16,7 @@ public: void ToggleCapture(); private: - RENDERDOC_API_1_7_0* rdoc_api{}; + void* rdoc_api{}; bool is_capturing{false}; }; diff --git a/src/dynarmic/src/dynarmic/backend/arm64/emit_arm64_memory.cpp b/src/dynarmic/src/dynarmic/backend/arm64/emit_arm64_memory.cpp index b7ea792a38..52bf0fc44d 100644 --- a/src/dynarmic/src/dynarmic/backend/arm64/emit_arm64_memory.cpp +++ b/src/dynarmic/src/dynarmic/backend/arm64/emit_arm64_memory.cpp @@ -31,7 +31,7 @@ using namespace oaknut::util; namespace { -bool IsOrdered(IR::AccType acctype) { +[[nodiscard]] inline bool IsOrdered(IR::AccType acctype) { return acctype == IR::AccType::ORDERED || acctype == IR::AccType::ORDEREDRW || acctype == IR::AccType::LIMITEDORDERED; } diff --git a/src/frontend_common/update_checker.cpp b/src/frontend_common/update_checker.cpp index 75b1dc00cc..68aadb0e0a 100644 --- a/src/frontend_common/update_checker.cpp +++ b/src/frontend_common/update_checker.cpp @@ -14,6 +14,7 @@ #include "update_checker.h" #include +#undef INVALID_SOCKET #ifdef YUZU_BUNDLED_OPENSSL #include diff --git a/src/hid_core/hidbus/starlink.cpp b/src/hid_core/hidbus/starlink.cpp index 1c4df1d8c6..5cd62f7e52 100644 --- a/src/hid_core/hidbus/starlink.cpp +++ b/src/hid_core/hidbus/starlink.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -6,7 +9,6 @@ #include "hid_core/hidbus/starlink.h" namespace Service::HID { -constexpr u8 DEVICE_ID = 0x28; Starlink::Starlink(Core::System& system_, KernelHelpers::ServiceContext& service_context_) : HidbusBase(system_, service_context_) {} @@ -35,7 +37,7 @@ void Starlink::OnUpdate() { } u8 Starlink::GetDeviceId() const { - return DEVICE_ID; + return 0x28; } u64 Starlink::GetReply(std::span out_data) const { diff --git a/src/hid_core/hidbus/stubbed.cpp b/src/hid_core/hidbus/stubbed.cpp index 658922a4f5..a96b034002 100644 --- a/src/hid_core/hidbus/stubbed.cpp +++ b/src/hid_core/hidbus/stubbed.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -6,7 +9,6 @@ #include "hid_core/hidbus/stubbed.h" namespace Service::HID { -constexpr u8 DEVICE_ID = 0xFF; HidbusStubbed::HidbusStubbed(Core::System& system_, KernelHelpers::ServiceContext& service_context_) : HidbusBase(system_, service_context_) {} @@ -35,7 +37,7 @@ void HidbusStubbed::OnUpdate() { } u8 HidbusStubbed::GetDeviceId() const { - return DEVICE_ID; + return 0xFF; } u64 HidbusStubbed::GetReply(std::span out_data) const { diff --git a/src/hid_core/irsensor/moment_processor.cpp b/src/hid_core/irsensor/moment_processor.cpp index 0284a58bd0..06559d2192 100644 --- a/src/hid_core/irsensor/moment_processor.cpp +++ b/src/hid_core/irsensor/moment_processor.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later @@ -8,9 +11,6 @@ #include "hid_core/irsensor/moment_processor.h" namespace Service::IRS { -static constexpr auto format = Core::IrSensor::ImageTransferProcessorFormat::Size40x30; -static constexpr std::size_t ImageWidth = 40; -static constexpr std::size_t ImageHeight = 30; MomentProcessor::MomentProcessor(Core::System& system_, Core::IrSensor::DeviceFormat& device_format, std::size_t npad_index) @@ -80,9 +80,9 @@ void MomentProcessor::OnControllerUpdate(Core::HID::ControllerTriggerType type) } u8 MomentProcessor::GetPixel(const std::vector& data, std::size_t x, std::size_t y) const { - if ((y * ImageWidth) + x >= data.size()) { + constexpr std::size_t ImageWidth = 40; + if ((y * ImageWidth) + x >= data.size()) return 0; - } return data[(y * ImageWidth) + x]; } @@ -92,9 +92,12 @@ MomentProcessor::MomentStatistic MomentProcessor::GetStatistic(const std::vector std::size_t width, std::size_t height) const { // The actual implementation is always 320x240 - static constexpr std::size_t RealWidth = 320; - static constexpr std::size_t RealHeight = 240; - static constexpr std::size_t Threshold = 30; + constexpr std::size_t RealWidth = 320; + constexpr std::size_t RealHeight = 240; + constexpr std::size_t Threshold = 30; + constexpr std::size_t ImageWidth = 40; + constexpr std::size_t ImageHeight = 30; + MomentStatistic statistic{}; std::size_t active_points{}; @@ -143,7 +146,7 @@ void MomentProcessor::SetConfig(Core::IrSensor::PackedMomentProcessorConfig conf static_cast(config.preprocess); current_config.preprocess_intensity_threshold = config.preprocess_intensity_threshold; - npad_device->SetCameraFormat(format); + npad_device->SetCameraFormat(Core::IrSensor::ImageTransferProcessorFormat::Size40x30); } } // namespace Service::IRS diff --git a/src/input_common/drivers/camera.cpp b/src/input_common/drivers/camera.cpp index 11ca756406..205c5c2be5 100644 --- a/src/input_common/drivers/camera.cpp +++ b/src/input_common/drivers/camera.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -7,14 +10,14 @@ #include "input_common/drivers/camera.h" namespace InputCommon { -constexpr PadIdentifier identifier = { +constexpr PadIdentifier camera_identifier = { .guid = Common::UUID{}, .port = 0, .pad = 0, }; Camera::Camera(std::string input_engine_) : InputEngine(std::move(input_engine_)) { - PreSetController(identifier); + PreSetController(camera_identifier); } void Camera::SetCameraData(std::size_t width, std::size_t height, std::span data) { @@ -33,7 +36,7 @@ void Camera::SetCameraData(std::size_t width, std::size_t height, std::span(mouse_move.x) * x_sensitivity); - SetAxis(identifier, mouse_axis_y, static_cast(-mouse_move.y) * y_sensitivity); + SetAxis(mouse_identifier, mouse_axis_x, static_cast(mouse_move.x) * x_sensitivity); + SetAxis(mouse_identifier, mouse_axis_y, static_cast(-mouse_move.y) * y_sensitivity); last_motion_change = { static_cast(-mouse_move.y) * x_sensitivity, @@ -196,7 +196,7 @@ void Mouse::TouchMove(f32 touch_x, f32 touch_y) { } void Mouse::PressButton(int x, int y, MouseButton button) { - SetButton(identifier, static_cast(button), true); + SetButton(mouse_identifier, static_cast(button), true); // Set initial analog parameters mouse_origin = {x, y}; @@ -215,13 +215,13 @@ void Mouse::PressTouchButton(f32 touch_x, f32 touch_y, MouseButton button) { } void Mouse::ReleaseButton(MouseButton button) { - SetButton(identifier, static_cast(button), false); + SetButton(mouse_identifier, static_cast(button), false); SetButton(real_mouse_identifier, static_cast(button), false); SetButton(touch_identifier, static_cast(button), false); if (!IsMousePanningEnabled()) { - SetAxis(identifier, mouse_axis_x, 0); - SetAxis(identifier, mouse_axis_y, 0); + SetAxis(mouse_identifier, mouse_axis_x, 0); + SetAxis(mouse_identifier, mouse_axis_y, 0); } last_motion_change.x = 0; @@ -234,8 +234,8 @@ void Mouse::MouseWheelChange(int x, int y) { wheel_position.x += x; wheel_position.y += y; last_motion_change.z += static_cast(y); - SetAxis(identifier, wheel_axis_x, static_cast(wheel_position.x)); - SetAxis(identifier, wheel_axis_y, static_cast(wheel_position.y)); + SetAxis(mouse_identifier, wheel_axis_x, static_cast(wheel_position.x)); + SetAxis(mouse_identifier, wheel_axis_y, static_cast(wheel_position.y)); } void Mouse::ReleaseAllButtons() { diff --git a/src/input_common/drivers/touch_screen.cpp b/src/input_common/drivers/touch_screen.cpp index 1753e08933..ac9c077f5a 100644 --- a/src/input_common/drivers/touch_screen.cpp +++ b/src/input_common/drivers/touch_screen.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -6,14 +9,14 @@ namespace InputCommon { -constexpr PadIdentifier identifier = { +constexpr PadIdentifier touch_screen_identifier = { .guid = Common::UUID{}, .port = 0, .pad = 0, }; TouchScreen::TouchScreen(std::string input_engine_) : InputEngine(std::move(input_engine_)) { - PreSetController(identifier); + PreSetController(touch_screen_identifier); ReleaseAllTouch(); } @@ -26,9 +29,9 @@ void TouchScreen::TouchMoved(float x, float y, std::size_t finger_id) { } const auto i = index.value(); fingers[i].is_active = true; - SetButton(identifier, static_cast(i), true); - SetAxis(identifier, static_cast(i * 2), x); - SetAxis(identifier, static_cast(i * 2 + 1), y); + SetButton(touch_screen_identifier, static_cast(i), true); + SetAxis(touch_screen_identifier, static_cast(i * 2), x); + SetAxis(touch_screen_identifier, static_cast(i * 2 + 1), y); } void TouchScreen::TouchPressed(float x, float y, std::size_t finger_id) { @@ -55,9 +58,9 @@ void TouchScreen::TouchReleased(std::size_t finger_id) { } const auto i = index.value(); fingers[i].is_enabled = false; - SetButton(identifier, static_cast(i), false); - SetAxis(identifier, static_cast(i * 2), 0.0f); - SetAxis(identifier, static_cast(i * 2 + 1), 0.0f); + SetButton(touch_screen_identifier, static_cast(i), false); + SetAxis(touch_screen_identifier, static_cast(i * 2), 0.0f); + SetAxis(touch_screen_identifier, static_cast(i * 2 + 1), 0.0f); } std::optional TouchScreen::GetIndexFromFingerId(std::size_t finger_id) const { diff --git a/src/input_common/drivers/udp_client.cpp b/src/input_common/drivers/udp_client.cpp index fc216e3c9f..f8eac19a3a 100644 --- a/src/input_common/drivers/udp_client.cpp +++ b/src/input_common/drivers/udp_client.cpp @@ -591,7 +591,7 @@ void TestCommunication(const std::string& host, u16 port, } CalibrationConfigurationJob::CalibrationConfigurationJob( - const std::string& host, u16 port, std::function status_callback, + const std::string& host, u16 port, std::function status_callback, std::function data_callback) { std::thread([=, this] { @@ -600,14 +600,14 @@ CalibrationConfigurationJob::CalibrationConfigurationJob( u16 max_x{}; u16 max_y{}; - Status current_status{Status::Initialized}; + CalibrationStatus current_status{CalibrationStatus::Initialized}; SocketCallback callback{[](Response::Version) {}, [](Response::PortInfo) {}, [&](Response::PadData data) { constexpr u16 CALIBRATION_THRESHOLD = 100; - if (current_status == Status::Initialized) { + if (current_status == CalibrationStatus::Initialized) { // Receiving data means the communication is ready now - current_status = Status::Ready; + current_status = CalibrationStatus::Ready; status_callback(current_status); } if (data.touch[0].is_active == 0) { @@ -617,9 +617,9 @@ CalibrationConfigurationJob::CalibrationConfigurationJob( data.touch[0].y); min_x = (std::min)(min_x, static_cast(data.touch[0].x)); min_y = (std::min)(min_y, static_cast(data.touch[0].y)); - if (current_status == Status::Ready) { + if (current_status == CalibrationStatus::Ready) { // First touch - min data (min_x/min_y) - current_status = Status::Stage1Completed; + current_status = CalibrationStatus::Stage1Completed; status_callback(current_status); } if (data.touch[0].x - min_x > CALIBRATION_THRESHOLD && @@ -628,7 +628,7 @@ CalibrationConfigurationJob::CalibrationConfigurationJob( // configuration max_x = data.touch[0].x; max_y = data.touch[0].y; - current_status = Status::Completed; + current_status = CalibrationStatus::Completed; data_callback(min_x, min_y, max_x, max_y); status_callback(current_status); diff --git a/src/input_common/drivers/udp_client.h b/src/input_common/drivers/udp_client.h index cea9f579ac..fdb32ce1d6 100644 --- a/src/input_common/drivers/udp_client.h +++ b/src/input_common/drivers/udp_client.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: 2018 Citra Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -163,7 +166,7 @@ private: /// An async job allowing configuration of the touchpad calibration. class CalibrationConfigurationJob { public: - enum class Status { + enum class CalibrationStatus { Initialized, Ready, Stage1Completed, @@ -176,7 +179,7 @@ public: * @param data_callback Called when calibration data is ready */ explicit CalibrationConfigurationJob(const std::string& host, u16 port, - std::function status_callback, + std::function status_callback, std::function data_callback); ~CalibrationConfigurationJob(); void Stop(); diff --git a/src/input_common/drivers/virtual_amiibo.cpp b/src/input_common/drivers/virtual_amiibo.cpp index ccb740d158..ee09c53992 100644 --- a/src/input_common/drivers/virtual_amiibo.cpp +++ b/src/input_common/drivers/virtual_amiibo.cpp @@ -15,7 +15,7 @@ #include "input_common/drivers/virtual_amiibo.h" namespace InputCommon { -constexpr PadIdentifier identifier = { +constexpr PadIdentifier virtual_amiibo_identifier = { .guid = Common::UUID{}, .port = 0, .pad = 0, @@ -228,13 +228,13 @@ VirtualAmiibo::Info VirtualAmiibo::LoadAmiibo(std::span data) { status.state = Common::Input::NfcState::NewAmiibo, memcpy(nfc_data.data(), data.data(), data.size_bytes()); memcpy(status.uuid.data(), nfc_data.data(), status.uuid_length); - SetNfc(identifier, status); + SetNfc(virtual_amiibo_identifier, status); return Info::Success; } VirtualAmiibo::Info VirtualAmiibo::ReloadAmiibo() { if (state == State::TagNearby) { - SetNfc(identifier, status); + SetNfc(virtual_amiibo_identifier, status); return Info::Success; } @@ -248,7 +248,7 @@ VirtualAmiibo::Info VirtualAmiibo::CloseAmiibo() { state = State::WaitingForAmiibo; status.state = Common::Input::NfcState::AmiiboRemoved; - SetNfc(identifier, status); + SetNfc(virtual_amiibo_identifier, status); status.tag_type = 0; return Info::Success; } diff --git a/src/network/packet.h b/src/network/packet.h index 9aa2a2c9cf..479f086a51 100644 --- a/src/network/packet.h +++ b/src/network/packet.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2017 Citra Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -5,6 +8,7 @@ #include #include +#include #include "common/common_types.h" namespace Network { @@ -118,26 +122,21 @@ private: template Packet& Packet::Read(std::vector& out_data) { - // First extract the size u32 size = 0; Read(size); out_data.resize(size); - // Then extract the data - for (std::size_t i = 0; i < out_data.size(); ++i) { - T character; - Read(character); - out_data[i] = character; + for (auto& elem : out_data) { + Read(elem); } + return *this; } template Packet& Packet::Read(std::array& out_data) { - for (std::size_t i = 0; i < out_data.size(); ++i) { - T character; - Read(character); - out_data[i] = character; + for (auto& elem : out_data) { + Read(elem); } return *this; } diff --git a/src/network/room.cpp b/src/network/room.cpp index 2069673bae..866ceb2fb8 100644 --- a/src/network/room.cpp +++ b/src/network/room.cpp @@ -832,7 +832,7 @@ void Room::RoomImpl::HandleProxyPacket(const ENetEvent* event) { in_packet.IgnoreBytes(sizeof(u8)); // Protocol - bool broadcast; + bool broadcast = false; in_packet.Read(broadcast); // Broadcast Packet out_packet; @@ -886,7 +886,7 @@ void Room::RoomImpl::HandleLdnPacket(const ENetEvent* event) { IPv4Address remote_ip; in_packet.Read(remote_ip); // Remote IP - bool broadcast; + bool broadcast = false; in_packet.Read(broadcast); // Broadcast Packet out_packet; diff --git a/src/qt_common/discord/discord_impl.cpp b/src/qt_common/discord/discord_impl.cpp index 37b24cdd57..8d03a7a407 100644 --- a/src/qt_common/discord/discord_impl.cpp +++ b/src/qt_common/discord/discord_impl.cpp @@ -10,6 +10,7 @@ #include #include #include +#undef INVALID_SOCKET #include #include diff --git a/src/shader_recompiler/backend/glasm/emit_glasm_context_get_set.cpp b/src/shader_recompiler/backend/glasm/emit_glasm_context_get_set.cpp index 47babcdc07..9b9d617875 100644 --- a/src/shader_recompiler/backend/glasm/emit_glasm_context_get_set.cpp +++ b/src/shader_recompiler/backend/glasm/emit_glasm_context_get_set.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -45,11 +48,6 @@ void GetCbuf(EmitContext& ctx, IR::Inst& inst, const IR::Value& binding, ScalarU } } -bool IsInputArray(Stage stage) { - return stage == Stage::Geometry || stage == Stage::TessellationControl || - stage == Stage::TessellationEval; -} - std::string VertexIndex(EmitContext& ctx, ScalarU32 vertex) { return IsInputArray(ctx.stage) ? fmt::format("[{}]", vertex) : ""; } diff --git a/src/shader_recompiler/backend/glasm/emit_glasm_instructions.h b/src/shader_recompiler/backend/glasm/emit_glasm_instructions.h index 6572db86dc..455e63e2c9 100644 --- a/src/shader_recompiler/backend/glasm/emit_glasm_instructions.h +++ b/src/shader_recompiler/backend/glasm/emit_glasm_instructions.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project @@ -7,6 +7,7 @@ #pragma once #include "common/common_types.h" +#include "shader_recompiler/stage.h" #include "shader_recompiler/backend/glasm/reg_alloc.h" namespace Shader::IR { @@ -18,6 +19,11 @@ class Value; namespace Shader::Backend::GLASM { +[[nodiscard]] inline bool IsInputArray(Stage stage) { + return stage == Stage::Geometry || stage == Stage::TessellationControl + || stage == Stage::TessellationEval; +} + class EmitContext; // Microinstruction emitters 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 1f4ffdd624..86b0fa13e2 100644 --- a/src/shader_recompiler/backend/glasm/emit_glasm_not_implemented.cpp +++ b/src/shader_recompiler/backend/glasm/emit_glasm_not_implemented.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -7,94 +10,92 @@ namespace Shader::Backend::GLASM { -#define NotImplemented() throw NotImplementedException("GLASM instruction {}", __LINE__) - void EmitGetRegister(EmitContext& ctx) { - NotImplemented(); + throw NotImplementedException("GLASM instruction {}", __LINE__); } void EmitSetRegister(EmitContext& ctx) { - NotImplemented(); + throw NotImplementedException("GLASM instruction {}", __LINE__); } void EmitGetPred(EmitContext& ctx) { - NotImplemented(); + throw NotImplementedException("GLASM instruction {}", __LINE__); } void EmitSetPred(EmitContext& ctx) { - NotImplemented(); + throw NotImplementedException("GLASM instruction {}", __LINE__); } void EmitSetGotoVariable(EmitContext& ctx) { - NotImplemented(); + throw NotImplementedException("GLASM instruction {}", __LINE__); } void EmitGetGotoVariable(EmitContext& ctx) { - NotImplemented(); + throw NotImplementedException("GLASM instruction {}", __LINE__); } void EmitSetIndirectBranchVariable(EmitContext& ctx) { - NotImplemented(); + throw NotImplementedException("GLASM instruction {}", __LINE__); } void EmitGetIndirectBranchVariable(EmitContext& ctx) { - NotImplemented(); + throw NotImplementedException("GLASM instruction {}", __LINE__); } void EmitGetZFlag(EmitContext& ctx) { - NotImplemented(); + throw NotImplementedException("GLASM instruction {}", __LINE__); } void EmitGetSFlag(EmitContext& ctx) { - NotImplemented(); + throw NotImplementedException("GLASM instruction {}", __LINE__); } void EmitGetCFlag(EmitContext& ctx) { - NotImplemented(); + throw NotImplementedException("GLASM instruction {}", __LINE__); } void EmitGetOFlag(EmitContext& ctx) { - NotImplemented(); + throw NotImplementedException("GLASM instruction {}", __LINE__); } void EmitSetZFlag(EmitContext& ctx) { - NotImplemented(); + throw NotImplementedException("GLASM instruction {}", __LINE__); } void EmitSetSFlag(EmitContext& ctx) { - NotImplemented(); + throw NotImplementedException("GLASM instruction {}", __LINE__); } void EmitSetCFlag(EmitContext& ctx) { - NotImplemented(); + throw NotImplementedException("GLASM instruction {}", __LINE__); } void EmitSetOFlag(EmitContext& ctx) { - NotImplemented(); + throw NotImplementedException("GLASM instruction {}", __LINE__); } void EmitGetZeroFromOp(EmitContext& ctx) { - NotImplemented(); + throw NotImplementedException("GLASM instruction {}", __LINE__); } void EmitGetSignFromOp(EmitContext& ctx) { - NotImplemented(); + throw NotImplementedException("GLASM instruction {}", __LINE__); } void EmitGetCarryFromOp(EmitContext& ctx) { - NotImplemented(); + throw NotImplementedException("GLASM instruction {}", __LINE__); } void EmitGetOverflowFromOp(EmitContext& ctx) { - NotImplemented(); + throw NotImplementedException("GLASM instruction {}", __LINE__); } void EmitGetSparseFromOp(EmitContext& ctx) { - NotImplemented(); + throw NotImplementedException("GLASM instruction {}", __LINE__); } void EmitGetInBoundsFromOp(EmitContext& ctx) { - NotImplemented(); + throw NotImplementedException("GLASM instruction {}", __LINE__); } } // namespace Shader::Backend::GLASM diff --git a/src/shader_recompiler/backend/glasm/glasm_emit_context.cpp b/src/shader_recompiler/backend/glasm/glasm_emit_context.cpp index 333a91cc58..0141d78bd1 100644 --- a/src/shader_recompiler/backend/glasm/glasm_emit_context.cpp +++ b/src/shader_recompiler/backend/glasm/glasm_emit_context.cpp @@ -1,8 +1,12 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include "shader_recompiler/backend/bindings.h" #include "shader_recompiler/backend/glasm/emit_glasm.h" +#include "shader_recompiler/backend/glasm/emit_glasm_instructions.h" #include "shader_recompiler/backend/glasm/glasm_emit_context.h" #include "shader_recompiler/frontend/ir/program.h" #include "shader_recompiler/profile.h" @@ -21,11 +25,6 @@ std::string_view InterpDecorator(Interpolation interp) { } throw InvalidArgument("Invalid interpolation {}", interp); } - -bool IsInputArray(Stage stage) { - return stage == Stage::Geometry || stage == Stage::TessellationControl || - stage == Stage::TessellationEval; -} } // Anonymous namespace EmitContext::EmitContext(IR::Program& program, Bindings& bindings, const Profile& profile_, diff --git a/src/shader_recompiler/backend/glsl/emit_glsl_composite.cpp b/src/shader_recompiler/backend/glsl/emit_glsl_composite.cpp index 14bc824be6..e1080402f0 100644 --- a/src/shader_recompiler/backend/glsl/emit_glsl_composite.cpp +++ b/src/shader_recompiler/backend/glsl/emit_glsl_composite.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -9,14 +12,13 @@ namespace Shader::Backend::GLSL { namespace { -constexpr std::string_view SWIZZLE{"xyzw"}; void CompositeInsert(EmitContext& ctx, std::string_view result, std::string_view composite, std::string_view object, u32 index) { if (result == composite) { // The result is aliased with the composite - ctx.Add("{}.{}={};", composite, SWIZZLE[index], object); + ctx.Add("{}.{}={};", composite, "xyzw"[index], object); } else { - ctx.Add("{}={};{}.{}={};", result, composite, result, SWIZZLE[index], object); + ctx.Add("{}={};{}.{}={};", result, composite, result, "xyzw"[index], object); } } } // Anonymous namespace @@ -38,17 +40,17 @@ void EmitCompositeConstructU32x4(EmitContext& ctx, IR::Inst& inst, std::string_v void EmitCompositeExtractU32x2(EmitContext& ctx, IR::Inst& inst, std::string_view composite, u32 index) { - ctx.AddU32("{}={}.{};", inst, composite, SWIZZLE[index]); + ctx.AddU32("{}={}.{};", inst, composite, "xyzw"[index]); } void EmitCompositeExtractU32x3(EmitContext& ctx, IR::Inst& inst, std::string_view composite, u32 index) { - ctx.AddU32("{}={}.{};", inst, composite, SWIZZLE[index]); + ctx.AddU32("{}={}.{};", inst, composite, "xyzw"[index]); } void EmitCompositeExtractU32x4(EmitContext& ctx, IR::Inst& inst, std::string_view composite, u32 index) { - ctx.AddU32("{}={}.{};", inst, composite, SWIZZLE[index]); + ctx.AddU32("{}={}.{};", inst, composite, "xyzw"[index]); } void EmitCompositeInsertU32x2(EmitContext& ctx, IR::Inst& inst, std::string_view composite, @@ -146,17 +148,17 @@ void EmitCompositeConstructF32x4(EmitContext& ctx, IR::Inst& inst, std::string_v void EmitCompositeExtractF32x2(EmitContext& ctx, IR::Inst& inst, std::string_view composite, u32 index) { - ctx.AddF32("{}={}.{};", inst, composite, SWIZZLE[index]); + ctx.AddF32("{}={}.{};", inst, composite, "xyzw"[index]); } void EmitCompositeExtractF32x3(EmitContext& ctx, IR::Inst& inst, std::string_view composite, u32 index) { - ctx.AddF32("{}={}.{};", inst, composite, SWIZZLE[index]); + ctx.AddF32("{}={}.{};", inst, composite, "xyzw"[index]); } void EmitCompositeExtractF32x4(EmitContext& ctx, IR::Inst& inst, std::string_view composite, u32 index) { - ctx.AddF32("{}={}.{};", inst, composite, SWIZZLE[index]); + ctx.AddF32("{}={}.{};", inst, composite, "xyzw"[index]); } void EmitCompositeInsertF32x2(EmitContext& ctx, IR::Inst& inst, std::string_view composite, @@ -203,16 +205,16 @@ void EmitCompositeExtractF64x4([[maybe_unused]] EmitContext& ctx) { void EmitCompositeInsertF64x2(EmitContext& ctx, std::string_view composite, std::string_view object, u32 index) { - ctx.Add("{}.{}={};", composite, SWIZZLE[index], object); + ctx.Add("{}.{}={};", composite, "xyzw"[index], object); } void EmitCompositeInsertF64x3(EmitContext& ctx, std::string_view composite, std::string_view object, u32 index) { - ctx.Add("{}.{}={};", composite, SWIZZLE[index], object); + ctx.Add("{}.{}={};", composite, "xyzw"[index], object); } void EmitCompositeInsertF64x4(EmitContext& ctx, std::string_view composite, std::string_view object, u32 index) { - ctx.Add("{}.{}={};", composite, SWIZZLE[index], object); + ctx.Add("{}.{}={};", composite, "xyzw"[index], object); } } // namespace Shader::Backend::GLSL diff --git a/src/shader_recompiler/backend/glsl/emit_glsl_context_get_set.cpp b/src/shader_recompiler/backend/glsl/emit_glsl_context_get_set.cpp index ffe5cd116c..b12482486e 100644 --- a/src/shader_recompiler/backend/glsl/emit_glsl_context_get_set.cpp +++ b/src/shader_recompiler/backend/glsl/emit_glsl_context_get_set.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -11,14 +14,13 @@ namespace Shader::Backend::GLSL { namespace { -constexpr char SWIZZLE[]{"xyzw"}; u32 CbufIndex(u32 offset) { return (offset / 4) % 4; } char OffsetSwizzle(u32 offset) { - return SWIZZLE[CbufIndex(offset)]; + return "xyzw"[CbufIndex(offset)]; } bool IsInputArray(Stage stage) { @@ -30,10 +32,6 @@ std::string InputVertexIndex(EmitContext& ctx, std::string_view vertex) { return IsInputArray(ctx.stage) ? fmt::format("[{}]", vertex) : ""; } -std::string_view OutputVertexIndex(EmitContext& ctx) { - return ctx.stage == Stage::TessellationControl ? "[gl_InvocationID]" : ""; -} - std::string ChooseCbuf(EmitContext& ctx, const IR::Value& binding, std::string_view index) { if (binding.IsImmediate()) { return fmt::format("{}_cbuf{}[{}]", ctx.stage_name, binding.U32(), index); @@ -279,7 +277,7 @@ void EmitSetAttribute(EmitContext& ctx, IR::Attribute attr, std::string_view val const u32 index{IR::GenericAttributeIndex(attr)}; const u32 attr_element{IR::GenericAttributeElement(attr)}; const GenericElementInfo& info{ctx.output_generics.at(index).at(attr_element)}; - const auto output_decorator{OutputVertexIndex(ctx)}; + const auto output_decorator = ctx.stage == Stage::TessellationControl ? "[gl_InvocationID]" : ""; if (info.num_components == 1) { ctx.Add("{}{}={};", info.name, output_decorator, value); } else { diff --git a/src/shader_recompiler/backend/glsl/emit_glsl_instructions.h b/src/shader_recompiler/backend/glsl/emit_glsl_instructions.h index d508b84cec..664fe7c3e1 100644 --- a/src/shader_recompiler/backend/glsl/emit_glsl_instructions.h +++ b/src/shader_recompiler/backend/glsl/emit_glsl_instructions.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project diff --git a/src/shader_recompiler/backend/glsl/emit_glsl_memory.cpp b/src/shader_recompiler/backend/glsl/emit_glsl_memory.cpp index 28bd3f5b34..5933cba4b7 100644 --- a/src/shader_recompiler/backend/glsl/emit_glsl_memory.cpp +++ b/src/shader_recompiler/backend/glsl/emit_glsl_memory.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -10,14 +13,13 @@ namespace Shader::Backend::GLSL { namespace { -constexpr char cas_loop[]{"for(;;){{uint old_value={};uint " - "cas_result=atomicCompSwap({},old_value,bitfieldInsert({},{},{},{}));" - "if(cas_result==old_value){{break;}}}}"}; - void SsboWriteCas(EmitContext& ctx, const IR::Value& binding, std::string_view offset_var, std::string_view value, std::string_view bit_offset, u32 num_bits) { const auto ssbo{fmt::format("{}_ssbo{}[{}>>2]", ctx.stage_name, binding.U32(), offset_var)}; - ctx.Add(cas_loop, ssbo, ssbo, ssbo, value, bit_offset, num_bits); + ctx.Add( + "for(;;){{uint old_value={};uint " + "cas_result=atomicCompSwap({},old_value,bitfieldInsert({},{},{},{}));" + "if(cas_result==old_value){{break;}}}}", ssbo, ssbo, ssbo, value, bit_offset, num_bits); } } // Anonymous namespace diff --git a/src/shader_recompiler/backend/glsl/emit_glsl_shared_memory.cpp b/src/shader_recompiler/backend/glsl/emit_glsl_shared_memory.cpp index 5095f5a298..a0891aa54a 100644 --- a/src/shader_recompiler/backend/glsl/emit_glsl_shared_memory.cpp +++ b/src/shader_recompiler/backend/glsl/emit_glsl_shared_memory.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -7,14 +10,13 @@ namespace Shader::Backend::GLSL { namespace { -constexpr char cas_loop[]{"for(;;){{uint old_value={};uint " - "cas_result=atomicCompSwap({},old_value,bitfieldInsert({},{},{},{}));" - "if(cas_result==old_value){{break;}}}}"}; - void SharedWriteCas(EmitContext& ctx, std::string_view offset, std::string_view value, std::string_view bit_offset, u32 num_bits) { const auto smem{fmt::format("smem[{}>>2]", offset)}; - ctx.Add(cas_loop, smem, smem, smem, value, bit_offset, num_bits); + ctx.Add( + "for(;;){{uint old_value={};uint " + "cas_result=atomicCompSwap({},old_value,bitfieldInsert({},{},{},{}));" + "if(cas_result==old_value){{break;}}}}", smem, smem, smem, value, bit_offset, num_bits); } } // Anonymous namespace diff --git a/src/shader_recompiler/backend/glsl/emit_glsl_special.cpp b/src/shader_recompiler/backend/glsl/emit_glsl_special.cpp index 67a54a84ff..920528438a 100644 --- a/src/shader_recompiler/backend/glsl/emit_glsl_special.cpp +++ b/src/shader_recompiler/backend/glsl/emit_glsl_special.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -9,9 +12,6 @@ namespace Shader::Backend::GLSL { namespace { -std::string_view OutputVertexIndex(EmitContext& ctx) { - return ctx.stage == Stage::TessellationControl ? "[gl_InvocationID]" : ""; -} void InitializeOutputVaryings(EmitContext& ctx) { if (ctx.uses_geometry_passthrough) { @@ -25,7 +25,7 @@ void InitializeOutputVaryings(EmitContext& ctx) { continue; } const auto& info_array{ctx.output_generics.at(index)}; - const auto output_decorator{OutputVertexIndex(ctx)}; + const auto output_decorator = ctx.stage == Stage::TessellationControl ? "[gl_InvocationID]" : ""; size_t element{}; while (element < info_array.size()) { const auto& info{info_array.at(element)}; diff --git a/src/shader_recompiler/backend/spirv/emit_spirv_floating_point.cpp b/src/shader_recompiler/backend/spirv/emit_spirv_floating_point.cpp index d921913b4a..43a97d1501 100644 --- a/src/shader_recompiler/backend/spirv/emit_spirv_floating_point.cpp +++ b/src/shader_recompiler/backend/spirv/emit_spirv_floating_point.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -9,7 +9,7 @@ namespace Shader::Backend::SPIRV { namespace { -Id Decorate(EmitContext& ctx, IR::Inst* inst, Id op) { +Id DecorateNoContraction(EmitContext& ctx, IR::Inst* inst, Id op) { const auto flags{inst->Flags()}; if (flags.no_contraction) { ctx.Decorate(op, spv::Decoration::NoContraction); @@ -61,27 +61,27 @@ Id EmitFPAbs64(EmitContext& ctx, Id value) { } Id EmitFPAdd16(EmitContext& ctx, IR::Inst* inst, Id a, Id b) { - return Decorate(ctx, inst, ctx.OpFAdd(ctx.F16[1], a, b)); + return DecorateNoContraction(ctx, inst, ctx.OpFAdd(ctx.F16[1], a, b)); } Id EmitFPAdd32(EmitContext& ctx, IR::Inst* inst, Id a, Id b) { - return Decorate(ctx, inst, ctx.OpFAdd(ctx.F32[1], a, b)); + return DecorateNoContraction(ctx, inst, ctx.OpFAdd(ctx.F32[1], a, b)); } Id EmitFPAdd64(EmitContext& ctx, IR::Inst* inst, Id a, Id b) { - return Decorate(ctx, inst, ctx.OpFAdd(ctx.F64[1], a, b)); + return DecorateNoContraction(ctx, inst, ctx.OpFAdd(ctx.F64[1], a, b)); } Id EmitFPFma16(EmitContext& ctx, IR::Inst* inst, Id a, Id b, Id c) { - return Decorate(ctx, inst, ctx.OpFma(ctx.F16[1], a, b, c)); + return DecorateNoContraction(ctx, inst, ctx.OpFma(ctx.F16[1], a, b, c)); } Id EmitFPFma32(EmitContext& ctx, IR::Inst* inst, Id a, Id b, Id c) { - return Decorate(ctx, inst, ctx.OpFma(ctx.F32[1], a, b, c)); + return DecorateNoContraction(ctx, inst, ctx.OpFma(ctx.F32[1], a, b, c)); } Id EmitFPFma64(EmitContext& ctx, IR::Inst* inst, Id a, Id b, Id c) { - return Decorate(ctx, inst, ctx.OpFma(ctx.F64[1], a, b, c)); + return DecorateNoContraction(ctx, inst, ctx.OpFma(ctx.F64[1], a, b, c)); } Id EmitFPMax32(EmitContext& ctx, Id a, Id b) { @@ -101,15 +101,15 @@ Id EmitFPMin64(EmitContext& ctx, Id a, Id b) { } Id EmitFPMul16(EmitContext& ctx, IR::Inst* inst, Id a, Id b) { - return Decorate(ctx, inst, ctx.OpFMul(ctx.F16[1], a, b)); + return DecorateNoContraction(ctx, inst, ctx.OpFMul(ctx.F16[1], a, b)); } Id EmitFPMul32(EmitContext& ctx, IR::Inst* inst, Id a, Id b) { - return Decorate(ctx, inst, ctx.OpFMul(ctx.F32[1], a, b)); + return DecorateNoContraction(ctx, inst, ctx.OpFMul(ctx.F32[1], a, b)); } Id EmitFPMul64(EmitContext& ctx, IR::Inst* inst, Id a, Id b) { - return Decorate(ctx, inst, ctx.OpFMul(ctx.F64[1], a, b)); + return DecorateNoContraction(ctx, inst, ctx.OpFMul(ctx.F64[1], a, b)); } Id EmitFPNeg16(EmitContext& ctx, Id value) { diff --git a/src/shader_recompiler/backend/spirv/emit_spirv_image.cpp b/src/shader_recompiler/backend/spirv/emit_spirv_image.cpp index c4c898bec9..f85e48a7e2 100644 --- a/src/shader_recompiler/backend/spirv/emit_spirv_image.cpp +++ b/src/shader_recompiler/backend/spirv/emit_spirv_image.cpp @@ -243,7 +243,7 @@ bool IsTextureMsaa(EmitContext& ctx, const IR::TextureInstInfo& info) { return ctx.textures.at(info.descriptor_index).is_multisample; } -Id Decorate(EmitContext& ctx, IR::Inst* inst, Id sample) { +Id DecorateRelaxedPrecision(EmitContext& ctx, IR::Inst* inst, Id sample) { const auto info{inst->Flags()}; if (info.relaxed_precision != 0) { ctx.Decorate(sample, spv::Decoration::RelaxedPrecision); @@ -256,14 +256,14 @@ Id Emit(MethodPtrType sparse_ptr, MethodPtrType non_sparse_ptr, EmitContext& ctx Id result_type, Args&&... args) { IR::Inst* const sparse{inst->GetAssociatedPseudoOperation(IR::Opcode::GetSparseFromOp)}; if (!sparse) { - return Decorate(ctx, inst, (ctx.*non_sparse_ptr)(result_type, std::forward(args)...)); + return DecorateRelaxedPrecision(ctx, inst, (ctx.*non_sparse_ptr)(result_type, std::forward(args)...)); } const Id struct_type{ctx.TypeStruct(ctx.U32[1], result_type)}; const Id sample{(ctx.*sparse_ptr)(struct_type, std::forward(args)...)}; const Id resident_code{ctx.OpCompositeExtract(ctx.U32[1], sample, 0U)}; sparse->SetDefinition(ctx.OpImageSparseTexelsResident(ctx.U1, resident_code)); sparse->Invalidate(); - Decorate(ctx, inst, sample); + DecorateRelaxedPrecision(ctx, inst, sample); return ctx.OpCompositeExtract(result_type, sample, 1U); } diff --git a/src/shader_recompiler/backend/spirv/emit_spirv_image_atomic.cpp b/src/shader_recompiler/backend/spirv/emit_spirv_image_atomic.cpp index dde0f6e9ca..63cd4d6e1e 100644 --- a/src/shader_recompiler/backend/spirv/emit_spirv_image_atomic.cpp +++ b/src/shader_recompiler/backend/spirv/emit_spirv_image_atomic.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -17,14 +20,13 @@ Id Image(EmitContext& ctx, IR::TextureInstInfo info) { } } -std::pair AtomicArgs(EmitContext& ctx) { +std::pair AtomicImageArgs(EmitContext& ctx) { const Id scope{ctx.Const(static_cast(spv::Scope::Device))}; const Id semantics{ctx.u32_zero_value}; return {scope, semantics}; } -Id ImageAtomicU32(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id coords, Id value, - Id (Sirit::Module::*atomic_func)(Id, Id, Id, Id, Id)) { +Id ImageAtomicU32(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id coords, Id value, Id (Sirit::Module::*atomic_func)(Id, Id, Id, Id, Id)) { if (!index.IsImmediate() || index.U32() != 0) { // TODO: handle layers throw NotImplementedException("Image indexing"); @@ -32,7 +34,7 @@ Id ImageAtomicU32(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id c const auto info{inst->Flags()}; const Id image{Image(ctx, info)}; const Id pointer{ctx.OpImageTexelPointer(ctx.image_u32, image, coords, ctx.Const(0U))}; - const auto [scope, semantics]{AtomicArgs(ctx)}; + const auto [scope, semantics] = AtomicImageArgs(ctx); return (ctx.*atomic_func)(ctx.U32[1], pointer, scope, semantics, value); } } // Anonymous namespace diff --git a/src/shader_recompiler/frontend/maxwell/indirect_branch_table_track.cpp b/src/shader_recompiler/frontend/maxwell/indirect_branch_table_track.cpp index 712aefaa0e..c1e5b8d376 100644 --- a/src/shader_recompiler/frontend/maxwell/indirect_branch_table_track.cpp +++ b/src/shader_recompiler/frontend/maxwell/indirect_branch_table_track.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -12,7 +15,7 @@ namespace Shader::Maxwell { namespace { -union Encoding { +union EncodingIBTT { u64 raw; BitField<0, 8, IR::Reg> dest_reg; BitField<8, 8, IR::Reg> src_reg; @@ -45,7 +48,7 @@ std::optional TrackLDC(Environment& env, Location block_begin, Location& po std::optional TrackSHL(Environment& env, Location block_begin, Location& pos, IR::Reg ldc_reg) { return Track(env, block_begin, pos, [ldc_reg](u64 insn, Opcode opcode) { - const Encoding shl{insn}; + const EncodingIBTT shl{insn}; return opcode == Opcode::SHL_imm && shl.dest_reg == ldc_reg; }); } @@ -53,7 +56,7 @@ std::optional TrackSHL(Environment& env, Location block_begin, Location& po std::optional TrackIMNMX(Environment& env, Location block_begin, Location& pos, IR::Reg shl_reg) { return Track(env, block_begin, pos, [shl_reg](u64 insn, Opcode opcode) { - const Encoding imnmx{insn}; + const EncodingIBTT imnmx{insn}; return opcode == Opcode::IMNMX_imm && imnmx.dest_reg == shl_reg; }); } @@ -66,8 +69,8 @@ std::optional TrackIndirectBranchTable(Environment& env if (brx_opcode != Opcode::BRX && brx_opcode != Opcode::JMX) { throw LogicError("Tracked instruction is not BRX or JMX"); } - const IR::Reg brx_reg{Encoding{brx_insn}.src_reg}; - const s32 brx_offset{static_cast(Encoding{brx_insn}.brx_offset)}; + const IR::Reg brx_reg{EncodingIBTT{brx_insn}.src_reg}; + const s32 brx_offset{static_cast(EncodingIBTT{brx_insn}.brx_offset)}; Location pos{brx_pos}; const std::optional ldc_insn{TrackLDC(env, block_begin, pos, brx_reg)}; @@ -83,14 +86,14 @@ std::optional TrackIndirectBranchTable(Environment& env if (!shl_insn) { return std::nullopt; } - const Encoding shl{*shl_insn}; + const EncodingIBTT shl{*shl_insn}; const IR::Reg shl_reg{shl.src_reg}; const std::optional imnmx_insn{TrackIMNMX(env, block_begin, pos, shl_reg)}; if (!imnmx_insn) { return std::nullopt; } - const Encoding imnmx{*imnmx_insn}; + const EncodingIBTT imnmx{*imnmx_insn}; if (imnmx.is_negative != 0) { return std::nullopt; } diff --git a/src/shader_recompiler/frontend/maxwell/translate/impl/atomic_operations_global_memory.cpp b/src/shader_recompiler/frontend/maxwell/translate/impl/atomic_operations_global_memory.cpp index 75087777dd..ada7b71374 100644 --- a/src/shader_recompiler/frontend/maxwell/translate/impl/atomic_operations_global_memory.cpp +++ b/src/shader_recompiler/frontend/maxwell/translate/impl/atomic_operations_global_memory.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project @@ -10,7 +10,7 @@ namespace Shader::Maxwell { namespace { -enum class AtomOp : u64 { +enum class AtomicGlobalMemoryOp : u64 { ADD, MIN, MAX, @@ -32,33 +32,33 @@ enum class AtomSize : u64 { S64, }; -IR::U32U64 ApplyIntegerAtomOp(IR::IREmitter& ir, const IR::U32U64& offset, const IR::U32U64& op_b, AtomOp op, AtomSize size) { +IR::U32U64 ApplyIntegerAtomOp(IR::IREmitter& ir, const IR::U32U64& offset, const IR::U32U64& op_b, AtomicGlobalMemoryOp op, AtomSize size) { bool const is_signed = size == AtomSize::S64 || size == AtomSize::S32; switch (op) { - case AtomOp::ADD: + case AtomicGlobalMemoryOp::ADD: return ir.GlobalAtomicIAdd(offset, op_b); - case AtomOp::MIN: + case AtomicGlobalMemoryOp::MIN: return ir.GlobalAtomicIMin(offset, op_b, is_signed); - case AtomOp::MAX: + case AtomicGlobalMemoryOp::MAX: return ir.GlobalAtomicIMax(offset, op_b, is_signed); - case AtomOp::INC: + case AtomicGlobalMemoryOp::INC: return ir.GlobalAtomicInc(offset, op_b); - case AtomOp::DEC: + case AtomicGlobalMemoryOp::DEC: return ir.GlobalAtomicDec(offset, op_b); - case AtomOp::AND: + case AtomicGlobalMemoryOp::AND: return ir.GlobalAtomicAnd(offset, op_b); - case AtomOp::OR: + case AtomicGlobalMemoryOp::OR: return ir.GlobalAtomicOr(offset, op_b); - case AtomOp::XOR: + case AtomicGlobalMemoryOp::XOR: return ir.GlobalAtomicXor(offset, op_b); - case AtomOp::EXCH: + case AtomicGlobalMemoryOp::EXCH: return ir.GlobalAtomicExchange(offset, op_b); default: throw NotImplementedException("Integer Atom Operation {}", op); } } -IR::Value ApplyFpAtomOp(IR::IREmitter& ir, const IR::U64& offset, const IR::Value& op_b, AtomOp op, +IR::Value ApplyFpAtomOp(IR::IREmitter& ir, const IR::U64& offset, const IR::Value& op_b, AtomicGlobalMemoryOp op, AtomSize size) { static constexpr IR::FpControl f16_control{ .no_contraction = false, @@ -71,12 +71,12 @@ IR::Value ApplyFpAtomOp(IR::IREmitter& ir, const IR::U64& offset, const IR::Valu .fmz_mode = IR::FmzMode::FTZ, }; switch (op) { - case AtomOp::ADD: + case AtomicGlobalMemoryOp::ADD: return size == AtomSize::F32 ? ir.GlobalAtomicF32Add(offset, op_b, f32_control) : ir.GlobalAtomicF16x2Add(offset, op_b, f16_control); - case AtomOp::MIN: + case AtomicGlobalMemoryOp::MIN: return ir.GlobalAtomicF16x2Min(offset, op_b, f16_control); - case AtomOp::MAX: + case AtomicGlobalMemoryOp::MAX: return ir.GlobalAtomicF16x2Max(offset, op_b, f16_control); default: throw NotImplementedException("FP Atom Operation {}", op); @@ -112,19 +112,19 @@ IR::U64 AtomOffset(TranslatorVisitor& v, u64 insn) { // ADD, INC, DEC for S64 does nothing // Only ADD does something for F32 // Only ADD, MIN and MAX does something for F16x2 -bool AtomOpNotApplicable(AtomSize size, AtomOp op) { +bool AtomOpNotApplicable(AtomSize size, AtomicGlobalMemoryOp op) { // TODO: SAFEADD switch (size) { case AtomSize::U32: case AtomSize::S32: case AtomSize::U64: - return (op == AtomOp::INC || op == AtomOp::DEC); + return (op == AtomicGlobalMemoryOp::INC || op == AtomicGlobalMemoryOp::DEC); case AtomSize::S64: - return (op == AtomOp::ADD || op == AtomOp::INC || op == AtomOp::DEC); + return (op == AtomicGlobalMemoryOp::ADD || op == AtomicGlobalMemoryOp::INC || op == AtomicGlobalMemoryOp::DEC); case AtomSize::F32: - return op != AtomOp::ADD; + return op != AtomicGlobalMemoryOp::ADD; case AtomSize::F16x2: - return !(op == AtomOp::ADD || op == AtomOp::MIN || op == AtomOp::MAX); + return !(op == AtomicGlobalMemoryOp::ADD || op == AtomicGlobalMemoryOp::MIN || op == AtomicGlobalMemoryOp::MAX); default: return false; } @@ -162,7 +162,7 @@ void StoreResult(TranslatorVisitor& v, IR::Reg dest_reg, const IR::Value& result } IR::Value ApplyAtomOp(TranslatorVisitor& v, IR::Reg operand_reg, const IR::U64& offset, - AtomSize size, AtomOp op) { + AtomSize size, AtomicGlobalMemoryOp op) { switch (size) { case AtomSize::U32: case AtomSize::S32: @@ -180,7 +180,7 @@ IR::Value ApplyAtomOp(TranslatorVisitor& v, IR::Reg operand_reg, const IR::U64& } void GlobalAtomic(TranslatorVisitor& v, IR::Reg dest_reg, IR::Reg operand_reg, - const IR::U64& offset, AtomSize size, AtomOp op, bool write_dest) { + const IR::U64& offset, AtomSize size, AtomicGlobalMemoryOp op, bool write_dest) { IR::Value result = AtomOpNotApplicable(size, op) ? LoadGlobal(v.ir, offset, size) : ApplyAtomOp(v, operand_reg, offset, size, op); @@ -195,7 +195,7 @@ void TranslatorVisitor::ATOM(u64 insn) { BitField<0, 8, IR::Reg> dest_reg; BitField<20, 8, IR::Reg> operand_reg; BitField<49, 3, AtomSize> size; - BitField<52, 4, AtomOp> op; + BitField<52, 4, AtomicGlobalMemoryOp> op; } const atom{insn}; const IR::U64 offset{AtomOffset(*this, insn)}; GlobalAtomic(*this, atom.dest_reg, atom.operand_reg, offset, atom.size, atom.op, true); @@ -206,7 +206,7 @@ void TranslatorVisitor::RED(u64 insn) { u64 raw; BitField<0, 8, IR::Reg> operand_reg; BitField<20, 3, AtomSize> size; - BitField<23, 3, AtomOp> op; + BitField<23, 3, AtomicGlobalMemoryOp> op; } const red{insn}; const IR::U64 offset{AtomOffset(*this, insn)}; GlobalAtomic(*this, IR::Reg::RZ, red.operand_reg, offset, red.size, red.op, true); diff --git a/src/shader_recompiler/frontend/maxwell/translate/impl/atomic_operations_shared_memory.cpp b/src/shader_recompiler/frontend/maxwell/translate/impl/atomic_operations_shared_memory.cpp index 5ce9112478..08a38d1dd3 100644 --- a/src/shader_recompiler/frontend/maxwell/translate/impl/atomic_operations_shared_memory.cpp +++ b/src/shader_recompiler/frontend/maxwell/translate/impl/atomic_operations_shared_memory.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -7,7 +10,7 @@ namespace Shader::Maxwell { namespace { -enum class AtomOp : u64 { +enum class AtomicSharedMemoryOp : u64 { ADD, MIN, MAX, @@ -25,26 +28,25 @@ enum class AtomsSize : u64 { U64, }; -IR::U32U64 ApplyAtomsOp(IR::IREmitter& ir, const IR::U32& offset, const IR::U32U64& op_b, AtomOp op, - bool is_signed) { +IR::U32U64 ApplyAtomsOp(IR::IREmitter& ir, const IR::U32& offset, const IR::U32U64& op_b, AtomicSharedMemoryOp op, bool is_signed) { switch (op) { - case AtomOp::ADD: + case AtomicSharedMemoryOp::ADD: return ir.SharedAtomicIAdd(offset, op_b); - case AtomOp::MIN: + case AtomicSharedMemoryOp::MIN: return ir.SharedAtomicIMin(offset, op_b, is_signed); - case AtomOp::MAX: + case AtomicSharedMemoryOp::MAX: return ir.SharedAtomicIMax(offset, op_b, is_signed); - case AtomOp::INC: + case AtomicSharedMemoryOp::INC: return ir.SharedAtomicInc(offset, op_b); - case AtomOp::DEC: + case AtomicSharedMemoryOp::DEC: return ir.SharedAtomicDec(offset, op_b); - case AtomOp::AND: + case AtomicSharedMemoryOp::AND: return ir.SharedAtomicAnd(offset, op_b); - case AtomOp::OR: + case AtomicSharedMemoryOp::OR: return ir.SharedAtomicOr(offset, op_b); - case AtomOp::XOR: + case AtomicSharedMemoryOp::XOR: return ir.SharedAtomicXor(offset, op_b); - case AtomOp::EXCH: + case AtomicSharedMemoryOp::EXCH: return ir.SharedAtomicExchange(offset, op_b); default: throw NotImplementedException("Integer Atoms Operation {}", op); @@ -87,11 +89,11 @@ void TranslatorVisitor::ATOMS(u64 insn) { BitField<8, 8, IR::Reg> addr_reg; BitField<20, 8, IR::Reg> src_reg_b; BitField<28, 2, AtomsSize> size; - BitField<52, 4, AtomOp> op; + BitField<52, 4, AtomicSharedMemoryOp> op; } const atoms{insn}; const bool size_64{atoms.size == AtomsSize::U64}; - if (size_64 && atoms.op != AtomOp::EXCH) { + if (size_64 && atoms.op != AtomicSharedMemoryOp::EXCH) { throw NotImplementedException("64-bit Atoms Operation {}", atoms.op.Value()); } const bool is_signed{atoms.size == AtomsSize::S32}; diff --git a/src/shader_recompiler/frontend/maxwell/translate/impl/floating_point_conversion_floating_point.cpp b/src/shader_recompiler/frontend/maxwell/translate/impl/floating_point_conversion_floating_point.cpp index 7f3dccc526..a15cced141 100644 --- a/src/shader_recompiler/frontend/maxwell/translate/impl/floating_point_conversion_floating_point.cpp +++ b/src/shader_recompiler/frontend/maxwell/translate/impl/floating_point_conversion_floating_point.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -6,7 +9,7 @@ namespace Shader::Maxwell { namespace { -enum class FloatFormat : u64 { +enum class FloatConversionFormat : u64 { F16 = 1, F32 = 2, F64 = 3, @@ -21,13 +24,13 @@ enum class RoundingOp : u64 { Trunc = 11, }; -[[nodiscard]] u32 WidthSize(FloatFormat width) { +[[nodiscard]] u32 WidthSize(FloatConversionFormat width) { switch (width) { - case FloatFormat::F16: + case FloatConversionFormat::F16: return 16; - case FloatFormat::F32: + case FloatConversionFormat::F32: return 32; - case FloatFormat::F64: + case FloatConversionFormat::F64: return 64; default: throw NotImplementedException("Invalid width {}", width); @@ -44,8 +47,8 @@ void F2F(TranslatorVisitor& v, u64 insn, const IR::F16F32F64& src_a, bool abs) { BitField<50, 1, u64> sat; BitField<39, 4, u64> rounding_op; BitField<39, 2, FpRounding> rounding; - BitField<10, 2, FloatFormat> src_size; - BitField<8, 2, FloatFormat> dst_size; + BitField<10, 2, FloatConversionFormat> src_size; + BitField<8, 2, FloatConversionFormat> dst_size; [[nodiscard]] RoundingOp RoundingOperation() const { constexpr u64 rounding_mask = 0x0B; @@ -59,7 +62,7 @@ void F2F(TranslatorVisitor& v, u64 insn, const IR::F16F32F64& src_a, bool abs) { IR::F16F32F64 input{v.ir.FPAbsNeg(src_a, abs, f2f.neg != 0)}; - const bool any_fp64{f2f.src_size == FloatFormat::F64 || f2f.dst_size == FloatFormat::F64}; + const bool any_fp64{f2f.src_size == FloatConversionFormat::F64 || f2f.dst_size == FloatConversionFormat::F64}; IR::FpControl fp_control{ .no_contraction = false, .rounding = IR::FpRounding::DontCare, @@ -74,13 +77,13 @@ void F2F(TranslatorVisitor& v, u64 insn, const IR::F16F32F64& src_a, bool abs) { case RoundingOp::Pass: // Make sure NANs are handled properly switch (f2f.src_size) { - case FloatFormat::F16: + case FloatConversionFormat::F16: input = v.ir.FPAdd(input, v.ir.FPConvert(16, v.ir.Imm32(0.0f)), fp_control); break; - case FloatFormat::F32: + case FloatConversionFormat::F32: input = v.ir.FPAdd(input, v.ir.Imm32(0.0f), fp_control); break; - case FloatFormat::F64: + case FloatConversionFormat::F64: input = v.ir.FPAdd(input, v.ir.Imm64(0.0), fp_control); break; } @@ -106,15 +109,15 @@ void F2F(TranslatorVisitor& v, u64 insn, const IR::F16F32F64& src_a, bool abs) { } switch (f2f.dst_size) { - case FloatFormat::F16: { + case FloatConversionFormat::F16: { const IR::F16 imm{v.ir.FPConvert(16, v.ir.Imm32(0.0f))}; v.X(f2f.dest_reg, v.ir.PackFloat2x16(v.ir.CompositeConstruct(input, imm))); break; } - case FloatFormat::F32: + case FloatConversionFormat::F32: v.F(f2f.dest_reg, input); break; - case FloatFormat::F64: + case FloatConversionFormat::F64: v.D(f2f.dest_reg, input); break; default: @@ -127,21 +130,21 @@ void TranslatorVisitor::F2F_reg(u64 insn) { union { u64 insn; BitField<49, 1, u64> abs; - BitField<10, 2, FloatFormat> src_size; + BitField<10, 2, FloatConversionFormat> src_size; BitField<41, 1, u64> selector; } const f2f{insn}; IR::F16F32F64 src_a; switch (f2f.src_size) { - case FloatFormat::F16: { + case FloatConversionFormat::F16: { auto [lhs_a, rhs_a]{Extract(ir, GetReg20(insn), Swizzle::H1_H0)}; src_a = f2f.selector != 0 ? rhs_a : lhs_a; break; } - case FloatFormat::F32: + case FloatConversionFormat::F32: src_a = GetFloatReg20(insn); break; - case FloatFormat::F64: + case FloatConversionFormat::F64: src_a = GetDoubleReg20(insn); break; default: @@ -154,21 +157,21 @@ void TranslatorVisitor::F2F_cbuf(u64 insn) { union { u64 insn; BitField<49, 1, u64> abs; - BitField<10, 2, FloatFormat> src_size; + BitField<10, 2, FloatConversionFormat> src_size; BitField<41, 1, u64> selector; } const f2f{insn}; IR::F16F32F64 src_a; switch (f2f.src_size) { - case FloatFormat::F16: { + case FloatConversionFormat::F16: { auto [lhs_a, rhs_a]{Extract(ir, GetCbuf(insn), Swizzle::H1_H0)}; src_a = f2f.selector != 0 ? rhs_a : lhs_a; break; } - case FloatFormat::F32: + case FloatConversionFormat::F32: src_a = GetFloatCbuf(insn); break; - case FloatFormat::F64: + case FloatConversionFormat::F64: src_a = GetDoubleCbuf(insn); break; default: @@ -181,7 +184,7 @@ void TranslatorVisitor::F2F_imm([[maybe_unused]] u64 insn) { union { u64 insn; BitField<49, 1, u64> abs; - BitField<10, 2, FloatFormat> src_size; + BitField<10, 2, FloatConversionFormat> src_size; BitField<41, 1, u64> selector; BitField<20, 19, u64> imm; BitField<56, 1, u64> imm_neg; @@ -189,7 +192,7 @@ void TranslatorVisitor::F2F_imm([[maybe_unused]] u64 insn) { IR::F16F32F64 src_a; switch (f2f.src_size) { - case FloatFormat::F16: { + case FloatConversionFormat::F16: { const u32 imm{static_cast(f2f.imm & 0x0000ffff)}; const IR::Value vector{ir.UnpackFloat2x16(ir.Imm32(imm | (imm << 16)))}; src_a = IR::F16{ir.CompositeExtract(vector, f2f.selector != 0 ? 0 : 1)}; @@ -198,10 +201,10 @@ void TranslatorVisitor::F2F_imm([[maybe_unused]] u64 insn) { } break; } - case FloatFormat::F32: + case FloatConversionFormat::F32: src_a = GetFloatImm20(insn); break; - case FloatFormat::F64: + case FloatConversionFormat::F64: src_a = GetDoubleImm20(insn); break; default: diff --git a/src/shader_recompiler/frontend/maxwell/translate/impl/floating_point_range_reduction.cpp b/src/shader_recompiler/frontend/maxwell/translate/impl/floating_point_range_reduction.cpp index 96e3e68e07..6a21b4d988 100644 --- a/src/shader_recompiler/frontend/maxwell/translate/impl/floating_point_range_reduction.cpp +++ b/src/shader_recompiler/frontend/maxwell/translate/impl/floating_point_range_reduction.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -7,7 +10,7 @@ namespace Shader::Maxwell { namespace { -enum class Mode : u64 { +enum class FPReduceMode : u64 { SINCOS, EX2, }; @@ -16,7 +19,7 @@ void RRO(TranslatorVisitor& v, u64 insn, const IR::F32& src) { union { u64 raw; BitField<0, 8, IR::Reg> dest_reg; - BitField<39, 1, Mode> mode; + BitField<39, 1, FPReduceMode> mode; BitField<45, 1, u64> neg; BitField<49, 1, u64> abs; } const rro{insn}; diff --git a/src/shader_recompiler/frontend/maxwell/translate/impl/integer_add_three_input.cpp b/src/shader_recompiler/frontend/maxwell/translate/impl/integer_add_three_input.cpp index 3d9877359b..056b5e3d36 100644 --- a/src/shader_recompiler/frontend/maxwell/translate/impl/integer_add_three_input.cpp +++ b/src/shader_recompiler/frontend/maxwell/translate/impl/integer_add_three_input.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -7,48 +10,48 @@ namespace Shader::Maxwell { namespace { -enum class Shift : u64 { +enum class IADD3Shift : u64 { None, Right, Left, }; -enum class Half : u64 { +enum class IADD3Half : u64 { All, Lower, Upper, }; -[[nodiscard]] IR::U32 IntegerHalf(IR::IREmitter& ir, const IR::U32& value, Half half) { +[[nodiscard]] IR::U32 IntegerHalf(IR::IREmitter& ir, const IR::U32& value, IADD3Half half) { constexpr bool is_signed{false}; switch (half) { - case Half::All: + case IADD3Half::All: return value; - case Half::Lower: + case IADD3Half::Lower: return ir.BitFieldExtract(value, ir.Imm32(0), ir.Imm32(16), is_signed); - case Half::Upper: + case IADD3Half::Upper: return ir.BitFieldExtract(value, ir.Imm32(16), ir.Imm32(16), is_signed); } throw NotImplementedException("Invalid half"); } -[[nodiscard]] IR::U32 IntegerShift(IR::IREmitter& ir, const IR::U32& value, Shift shift) { +[[nodiscard]] IR::U32 IntegerShift(IR::IREmitter& ir, const IR::U32& value, IADD3Shift shift) { switch (shift) { - case Shift::None: + case IADD3Shift::None: return value; - case Shift::Right: { + case IADD3Shift::Right: { // 33-bit RS IADD3 edge case const IR::U1 edge_case{ir.GetCarryFromOp(value)}; const IR::U32 shifted{ir.ShiftRightLogical(value, ir.Imm32(16))}; return IR::U32{ir.Select(edge_case, ir.IAdd(shifted, ir.Imm32(0x10000)), shifted)}; } - case Shift::Left: + case IADD3Shift::Left: return ir.ShiftLeftLogical(value, ir.Imm32(16)); } throw NotImplementedException("Invalid shift"); } void IADD3(TranslatorVisitor& v, u64 insn, IR::U32 op_a, IR::U32 op_b, IR::U32 op_c, - Shift shift = Shift::None) { + IADD3Shift shift = IADD3Shift::None) { union { u64 insn; BitField<0, 8, IR::Reg> dest_reg; @@ -71,7 +74,7 @@ void IADD3(TranslatorVisitor& v, u64 insn, IR::U32 op_a, IR::U32 op_b, IR::U32 o IR::U32 lhs_1{v.ir.IAdd(op_a, op_b)}; if (iadd3.x != 0) { // TODO: How does RS behave when X is set? - if (shift == Shift::Right) { + if (shift == IADD3Shift::Right) { throw NotImplementedException("IADD3 X+RS"); } const IR::U32 carry{v.ir.Select(v.ir.GetCFlag(), v.ir.Imm32(1), v.ir.Imm32(0))}; @@ -98,10 +101,10 @@ void IADD3(TranslatorVisitor& v, u64 insn, IR::U32 op_a, IR::U32 op_b, IR::U32 o void TranslatorVisitor::IADD3_reg(u64 insn) { union { u64 insn; - BitField<37, 2, Shift> shift; - BitField<35, 2, Half> half_a; - BitField<33, 2, Half> half_b; - BitField<31, 2, Half> half_c; + BitField<37, 2, IADD3Shift> shift; + BitField<35, 2, IADD3Half> half_a; + BitField<33, 2, IADD3Half> half_b; + BitField<31, 2, IADD3Half> half_c; } const iadd3{insn}; const auto op_a{IntegerHalf(ir, GetReg8(insn), iadd3.half_a)}; diff --git a/src/shader_recompiler/frontend/maxwell/translate/impl/integer_floating_point_conversion.cpp b/src/shader_recompiler/frontend/maxwell/translate/impl/integer_floating_point_conversion.cpp index 9685b7e43e..6ace8384fd 100644 --- a/src/shader_recompiler/frontend/maxwell/translate/impl/integer_floating_point_conversion.cpp +++ b/src/shader_recompiler/frontend/maxwell/translate/impl/integer_floating_point_conversion.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project @@ -11,7 +11,7 @@ namespace Shader::Maxwell { namespace { -enum class FloatFormat : u64 { +enum class IntegerToFloatFormat : u64 { F16 = 1, F32 = 2, F64 = 3, @@ -24,10 +24,10 @@ enum class IntFormat : u64 { U64 = 3, }; -union Encoding { +union EncodingIFPC { u64 raw; BitField<0, 8, IR::Reg> dest_reg; - BitField<8, 2, FloatFormat> float_format; + BitField<8, 2, IntegerToFloatFormat> float_format; BitField<10, 2, IntFormat> int_format; BitField<13, 1, u64> is_signed; BitField<39, 2, FpRounding> fp_rounding; @@ -38,16 +38,16 @@ union Encoding { }; bool Is64(u64 insn) { - return Encoding{insn}.int_format == IntFormat::U64; + return EncodingIFPC{insn}.int_format == IntFormat::U64; } -int BitSize(FloatFormat format) { +int BitSize(IntegerToFloatFormat format) { switch (format) { - case FloatFormat::F16: + case IntegerToFloatFormat::F16: return 16; - case FloatFormat::F32: + case IntegerToFloatFormat::F32: return 32; - case FloatFormat::F64: + case IntegerToFloatFormat::F64: return 64; } throw NotImplementedException("Invalid float format {}", format); @@ -62,7 +62,7 @@ IR::U32 SmallAbs(TranslatorVisitor& v, const IR::U32& value, int bitsize) { } void I2F(TranslatorVisitor& v, u64 insn, IR::U32U64 src) { - const Encoding i2f{insn}; + const EncodingIFPC i2f{insn}; if (i2f.cc != 0) { throw NotImplementedException("I2F CC"); } @@ -119,15 +119,15 @@ void I2F(TranslatorVisitor& v, u64 insn, IR::U32U64 src) { } } switch (i2f.float_format) { - case FloatFormat::F16: { + case IntegerToFloatFormat::F16: { const IR::F16 zero{v.ir.FPConvert(16, v.ir.Imm32(0.0f))}; v.X(i2f.dest_reg, v.ir.PackFloat2x16(v.ir.CompositeConstruct(value, zero))); break; } - case FloatFormat::F32: + case IntegerToFloatFormat::F32: v.F(i2f.dest_reg, value); break; - case FloatFormat::F64: { + case IntegerToFloatFormat::F64: { if (!IR::IsAligned(i2f.dest_reg, 2)) { throw NotImplementedException("Unaligned destination {}", i2f.dest_reg.Value()); } diff --git a/src/shader_recompiler/frontend/maxwell/translate/impl/integer_short_multiply_add.cpp b/src/shader_recompiler/frontend/maxwell/translate/impl/integer_short_multiply_add.cpp index a96f8707e0..26a46682b8 100644 --- a/src/shader_recompiler/frontend/maxwell/translate/impl/integer_short_multiply_add.cpp +++ b/src/shader_recompiler/frontend/maxwell/translate/impl/integer_short_multiply_add.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -15,18 +18,18 @@ enum class SelectMode : u64 { CBCC, }; -enum class Half : u64 { +enum class IMADHalf : u64 { H0, // Least-significant bits (15:0) H1, // Most-significant bits (31:16) }; -IR::U32 ExtractHalf(TranslatorVisitor& v, const IR::U32& src, Half half, bool is_signed) { - const IR::U32 offset{v.ir.Imm32(half == Half::H1 ? 16 : 0)}; +IR::U32 ExtractHalf(TranslatorVisitor& v, const IR::U32& src, IMADHalf half, bool is_signed) { + const IR::U32 offset{v.ir.Imm32(half == IMADHalf::H1 ? 16 : 0)}; return v.ir.BitFieldExtract(src, offset, v.ir.Imm32(16), is_signed); } void XMAD(TranslatorVisitor& v, u64 insn, const IR::U32& src_b, const IR::U32& src_c, - SelectMode select_mode, Half half_b, bool psl, bool mrg, bool x) { + SelectMode select_mode, IMADHalf half_b, bool psl, bool mrg, bool x) { union { u64 raw; BitField<0, 8, IR::Reg> dest_reg; @@ -34,7 +37,7 @@ void XMAD(TranslatorVisitor& v, u64 insn, const IR::U32& src_b, const IR::U32& s BitField<47, 1, u64> cc; BitField<48, 1, u64> is_a_signed; BitField<49, 1, u64> is_b_signed; - BitField<53, 1, Half> half_a; + BitField<53, 1, IMADHalf> half_a; } const xmad{insn}; if (x) { @@ -53,9 +56,9 @@ void XMAD(TranslatorVisitor& v, u64 insn, const IR::U32& src_b, const IR::U32& s case SelectMode::Default: return src_c; case SelectMode::CLO: - return ExtractHalf(v, src_c, Half::H0, false); + return ExtractHalf(v, src_c, IMADHalf::H0, false); case SelectMode::CHI: - return ExtractHalf(v, src_c, Half::H1, false); + return ExtractHalf(v, src_c, IMADHalf::H1, false); case SelectMode::CBCC: return v.ir.IAdd(v.ir.ShiftLeftLogical(src_b, v.ir.Imm32(16)), src_c); case SelectMode::CSFU: @@ -66,7 +69,7 @@ void XMAD(TranslatorVisitor& v, u64 insn, const IR::U32& src_b, const IR::U32& s IR::U32 result{v.ir.IAdd(product, op_c)}; if (mrg) { // .MRG inserts src_b [15:0] into result's [31:16]. - const IR::U32 lsb_b{ExtractHalf(v, src_b, Half::H0, false)}; + const IR::U32 lsb_b{ExtractHalf(v, src_b, IMADHalf::H0, false)}; result = v.ir.BitFieldInsert(result, lsb_b, v.ir.Imm32(16), v.ir.Imm32(16)); } if (xmad.cc) { @@ -80,7 +83,7 @@ void XMAD(TranslatorVisitor& v, u64 insn, const IR::U32& src_b, const IR::U32& s void TranslatorVisitor::XMAD_reg(u64 insn) { union { u64 raw; - BitField<35, 1, Half> half_b; + BitField<35, 1, IMADHalf> half_b; BitField<36, 1, u64> psl; BitField<37, 1, u64> mrg; BitField<38, 1, u64> x; @@ -95,7 +98,7 @@ void TranslatorVisitor::XMAD_rc(u64 insn) { union { u64 raw; BitField<50, 2, SelectMode> select_mode; - BitField<52, 1, Half> half_b; + BitField<52, 1, IMADHalf> half_b; BitField<54, 1, u64> x; } const xmad{insn}; @@ -107,7 +110,7 @@ void TranslatorVisitor::XMAD_cr(u64 insn) { union { u64 raw; BitField<50, 2, SelectMode> select_mode; - BitField<52, 1, Half> half_b; + BitField<52, 1, IMADHalf> half_b; BitField<54, 1, u64> x; BitField<55, 1, u64> psl; BitField<56, 1, u64> mrg; @@ -128,7 +131,7 @@ void TranslatorVisitor::XMAD_imm(u64 insn) { } const xmad{insn}; XMAD(*this, insn, ir.Imm32(static_cast(xmad.src_b)), GetReg39(insn), xmad.select_mode, - Half::H0, xmad.psl != 0, xmad.mrg != 0, xmad.x != 0); + IMADHalf::H0, xmad.psl != 0, xmad.mrg != 0, xmad.x != 0); } } // namespace Shader::Maxwell diff --git a/src/shader_recompiler/frontend/maxwell/translate/impl/internal_stage_buffer_entry_read.cpp b/src/shader_recompiler/frontend/maxwell/translate/impl/internal_stage_buffer_entry_read.cpp index e6345de65e..fc6f8f5a34 100644 --- a/src/shader_recompiler/frontend/maxwell/translate/impl/internal_stage_buffer_entry_read.cpp +++ b/src/shader_recompiler/frontend/maxwell/translate/impl/internal_stage_buffer_entry_read.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project @@ -10,7 +10,7 @@ namespace Shader::Maxwell { namespace { -enum class Mode : u64 { +enum class ISBERDMode : u64 { Default, Patch, Prim, @@ -24,17 +24,17 @@ enum class SZ : u64 { F32 }; -enum class Shift : u64 { +enum class ISBERDShift : u64 { Default, U16, B32, }; -IR::U32 scaleIndex(IR::IREmitter& ir, IR::U32 index, Shift shift) { +IR::U32 scaleIndex(IR::IREmitter& ir, IR::U32 index, ISBERDShift shift) { switch (shift) { - case Shift::Default: return index; - case Shift::U16: return ir.ShiftLeftLogical(index, ir.Imm32(1)); - case Shift::B32: return ir.ShiftLeftLogical(index, ir.Imm32(2)); + case ISBERDShift::Default: return index; + case ISBERDShift::U16: return ir.ShiftLeftLogical(index, ir.Imm32(1)); + case ISBERDShift::B32: return ir.ShiftLeftLogical(index, ir.Imm32(2)); default: UNREACHABLE(); } } @@ -63,9 +63,9 @@ void TranslatorVisitor::ISBERD(u64 insn) { BitField<24, 8, u32> imm; BitField<31, 1, u64> skew; BitField<32, 1, u64> o; - BitField<33, 2, Mode> mode; + BitField<33, 2, ISBERDMode> mode; BitField<36, 4, SZ> sz; - BitField<47, 2, Shift> shift; + BitField<47, 2, ISBERDShift> shift; } const isberd{insn}; IR::U32 index{}; @@ -95,18 +95,18 @@ void TranslatorVisitor::ISBERD(u64 insn) { return; } - if (isberd.mode.Value() != Mode::Default) { + if (isberd.mode.Value() != ISBERDMode::Default) { if (isberd.skew.Value()) { index = ir.IAdd(index, skewBytes(ir, SZ::U32)); } IR::F32 float_index{}; switch (isberd.mode.Value()) { - case Mode::Patch: float_index = ir.GetPatch(index.Patch()); + case ISBERDMode::Patch: float_index = ir.GetPatch(index.Patch()); break; - case Mode::Prim: float_index = ir.GetAttribute(index.Attribute()); + case ISBERDMode::Prim: float_index = ir.GetAttribute(index.Attribute()); break; - case Mode::Attr: float_index = ir.GetAttributeIndexed(index); + case ISBERDMode::Attr: float_index = ir.GetAttributeIndexed(index); break; default: UNREACHABLE(); } diff --git a/src/shader_recompiler/frontend/maxwell/translate/impl/load_store_attribute.cpp b/src/shader_recompiler/frontend/maxwell/translate/impl/load_store_attribute.cpp index e3745ce084..cf14acd5ea 100644 --- a/src/shader_recompiler/frontend/maxwell/translate/impl/load_store_attribute.cpp +++ b/src/shader_recompiler/frontend/maxwell/translate/impl/load_store_attribute.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -9,7 +12,7 @@ namespace Shader::Maxwell { namespace { -enum class Size : u64 { +enum class InterpolationSize : u64 { B32, B64, B96, @@ -29,15 +32,15 @@ enum class SampleMode : u64 { Offset, }; -u32 NumElements(Size size) { +u32 NumElements(InterpolationSize size) { switch (size) { - case Size::B32: + case InterpolationSize::B32: return 1; - case Size::B64: + case InterpolationSize::B64: return 2; - case Size::B96: + case InterpolationSize::B96: return 3; - case Size::B128: + case InterpolationSize::B128: return 4; } throw InvalidArgument("Invalid size {}", size); @@ -65,7 +68,7 @@ void TranslatorVisitor::ALD(u64 insn) { BitField<39, 8, IR::Reg> vertex_reg; BitField<32, 1, u64> o; BitField<31, 1, u64> patch; - BitField<47, 2, Size> size; + BitField<47, 2, InterpolationSize> size; } const ald{insn}; const u64 offset{ald.absolute_offset.Value()}; @@ -103,7 +106,7 @@ void TranslatorVisitor::AST(u64 insn) { BitField<20, 11, s64> relative_offset; BitField<31, 1, u64> patch; BitField<39, 8, IR::Reg> vertex_reg; - BitField<47, 2, Size> size; + BitField<47, 2, InterpolationSize> size; } const ast{insn}; if (ast.index_reg != IR::Reg::RZ) { diff --git a/src/shader_recompiler/frontend/maxwell/translate/impl/load_store_local_shared.cpp b/src/shader_recompiler/frontend/maxwell/translate/impl/load_store_local_shared.cpp index a198b2b760..545e3620a5 100644 --- a/src/shader_recompiler/frontend/maxwell/translate/impl/load_store_local_shared.cpp +++ b/src/shader_recompiler/frontend/maxwell/translate/impl/load_store_local_shared.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -7,7 +10,7 @@ namespace Shader::Maxwell { namespace { -enum class Size : u64 { +enum class LoadStoreLocalSharedSize : u64 { U8, S8, U16, @@ -45,23 +48,23 @@ std::pair WordOffset(TranslatorVisitor& v, u64 insn) { std::pair GetSize(u64 insn) { union { u64 raw; - BitField<48, 3, Size> size; + BitField<48, 3, LoadStoreLocalSharedSize> size; } const encoding{insn}; switch (encoding.size) { - case Size::U8: + case LoadStoreLocalSharedSize::U8: return {8, false}; - case Size::S8: + case LoadStoreLocalSharedSize::S8: return {8, true}; - case Size::U16: + case LoadStoreLocalSharedSize::U16: return {16, false}; - case Size::S16: + case LoadStoreLocalSharedSize::S16: return {16, true}; - case Size::B32: + case LoadStoreLocalSharedSize::B32: return {32, false}; - case Size::B64: + case LoadStoreLocalSharedSize::B64: return {64, false}; - case Size::B128: + case LoadStoreLocalSharedSize::B128: return {128, false}; default: throw NotImplementedException("Invalid size {}", encoding.size.Value()); diff --git a/src/shader_recompiler/frontend/maxwell/translate/impl/load_store_memory.cpp b/src/shader_recompiler/frontend/maxwell/translate/impl/load_store_memory.cpp index 8f2cf897d4..15c48a5c03 100644 --- a/src/shader_recompiler/frontend/maxwell/translate/impl/load_store_memory.cpp +++ b/src/shader_recompiler/frontend/maxwell/translate/impl/load_store_memory.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -30,7 +33,7 @@ enum class StoreSize : u64 { }; // See Table 27 in https://docs.nvidia.com/cuda/parallel-thread-execution/index.html -enum class LoadCache : u64 { +enum class XMEMLoadCache : u64 { CA, // Cache at all levels, likely to be accessed again CG, // Cache at global level (cache in L2 and below, not L1) CI, // ??? @@ -38,7 +41,7 @@ enum class LoadCache : u64 { }; // See Table 28 in https://docs.nvidia.com/cuda/parallel-thread-execution/index.html -enum class StoreCache : u64 { +enum class XMEMStoreCache : u64 { WB, // Cache write-back all coherent levels CG, // Cache at global level CS, // Cache streaming, likely to be accessed once @@ -83,7 +86,7 @@ void TranslatorVisitor::LDG(u64 insn) { union { u64 raw; BitField<0, 8, IR::Reg> dest_reg; - BitField<46, 2, LoadCache> cache; + BitField<46, 2, XMEMLoadCache> cache; BitField<48, 3, LoadSize> size; } const ldg{insn}; @@ -137,7 +140,7 @@ void TranslatorVisitor::STG(u64 insn) { union { u64 raw; BitField<0, 8, IR::Reg> data_reg; - BitField<46, 2, StoreCache> cache; + BitField<46, 2, XMEMStoreCache> cache; BitField<48, 3, StoreSize> size; } const stg{insn}; diff --git a/src/shader_recompiler/frontend/maxwell/translate/impl/move_predicate_to_register.cpp b/src/shader_recompiler/frontend/maxwell/translate/impl/move_predicate_to_register.cpp index 37586a65d5..25c7508577 100644 --- a/src/shader_recompiler/frontend/maxwell/translate/impl/move_predicate_to_register.cpp +++ b/src/shader_recompiler/frontend/maxwell/translate/impl/move_predicate_to_register.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -7,7 +10,7 @@ namespace Shader::Maxwell { namespace { -enum class Mode : u64 { +enum class MovePredicateFlagMode : u64 { PR, CC, }; @@ -26,12 +29,12 @@ void TranslatorVisitor::P2R_imm(u64 insn) { u64 raw; BitField<0, 8, IR::Reg> dest_reg; BitField<8, 8, IR::Reg> src; - BitField<40, 1, Mode> mode; + BitField<40, 1, MovePredicateFlagMode> mode; BitField<41, 2, u64> byte_selector; } const p2r{insn}; const u32 mask{GetImm20(insn).U32()}; - const bool pr_mode{p2r.mode == Mode::PR}; + const bool pr_mode{p2r.mode == MovePredicateFlagMode::PR}; const u32 num_items{pr_mode ? 7U : 4U}; const u32 offset{static_cast(p2r.byte_selector) * 8}; IR::U32 insert{ir.Imm32(0)}; diff --git a/src/shader_recompiler/frontend/maxwell/translate/impl/move_register_to_predicate.cpp b/src/shader_recompiler/frontend/maxwell/translate/impl/move_register_to_predicate.cpp index 2369e4cf63..fdf8638db0 100644 --- a/src/shader_recompiler/frontend/maxwell/translate/impl/move_register_to_predicate.cpp +++ b/src/shader_recompiler/frontend/maxwell/translate/impl/move_register_to_predicate.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -7,7 +10,7 @@ namespace Shader::Maxwell { namespace { -enum class Mode : u64 { +enum class PredicateFlagMode : u64 { PR, CC, }; @@ -31,12 +34,12 @@ void R2P(TranslatorVisitor& v, u64 insn, const IR::U32& mask) { union { u64 raw; BitField<8, 8, IR::Reg> src_reg; - BitField<40, 1, Mode> mode; + BitField<40, 1, PredicateFlagMode> mode; BitField<41, 2, u64> byte_selector; } const r2p{insn}; const IR::U32 src{v.X(r2p.src_reg)}; const IR::U32 count{v.ir.Imm32(1)}; - const bool pr_mode{r2p.mode == Mode::PR}; + const bool pr_mode{r2p.mode == PredicateFlagMode::PR}; const u32 num_items{pr_mode ? 7U : 4U}; const u32 offset_base{static_cast(r2p.byte_selector) * 8}; for (u32 index = 0; index < num_items; ++index) { diff --git a/src/shader_recompiler/frontend/maxwell/translate/impl/pixel_load.cpp b/src/shader_recompiler/frontend/maxwell/translate/impl/pixel_load.cpp index f8607c3d77..33fe4339fd 100644 --- a/src/shader_recompiler/frontend/maxwell/translate/impl/pixel_load.cpp +++ b/src/shader_recompiler/frontend/maxwell/translate/impl/pixel_load.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -7,7 +10,7 @@ namespace Shader::Maxwell { namespace { -enum class Mode : u64 { +enum class PixelLoadMode : u64 { Default, CovMask, Covered, @@ -20,7 +23,7 @@ enum class Mode : u64 { void TranslatorVisitor::PIXLD(u64 insn) { union { u64 raw; - BitField<31, 3, Mode> mode; + BitField<31, 3, PixelLoadMode> mode; BitField<0, 8, IR::Reg> dest_reg; BitField<8, 8, IR::Reg> addr_reg; BitField<20, 8, s64> addr_offset; @@ -34,11 +37,11 @@ void TranslatorVisitor::PIXLD(u64 insn) { throw NotImplementedException("Non-zero source register"); } switch (pixld.mode) { - case Mode::MyIndex: + case PixelLoadMode::MyIndex: X(pixld.dest_reg, ir.SampleId()); break; default: - throw NotImplementedException("Mode {}", pixld.mode.Value()); + throw NotImplementedException("PixelLoadMode {}", pixld.mode.Value()); } } diff --git a/src/shader_recompiler/frontend/maxwell/translate/impl/surface_atomic_operations.cpp b/src/shader_recompiler/frontend/maxwell/translate/impl/surface_atomic_operations.cpp index 9f8dfb45dd..e7983520e1 100644 --- a/src/shader_recompiler/frontend/maxwell/translate/impl/surface_atomic_operations.cpp +++ b/src/shader_recompiler/frontend/maxwell/translate/impl/surface_atomic_operations.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project @@ -11,7 +11,7 @@ namespace Shader::Maxwell { namespace { -enum class Type : u64 { +enum class SurfaceAtomicType : u64 { _1D = 0, _1D_BUFFER = 1, _1D_ARRAY = 2, @@ -25,7 +25,7 @@ enum class Type : u64 { /// For any would be newcomer to here: Yes - GPU dissasembly says S64 should /// be after F16x2FTZRN. However if you do plan to revert this, you MUST test /// ToTK beforehand. As the game will break with the subtle change -enum class Size : u64 { +enum class SurfaceAtomicSize : u64 { U32, S32, U64, @@ -48,46 +48,46 @@ enum class AtomicOp : u64 { EXCH, }; -enum class Clamp : u64 { +enum class SurfaceAtomicClamp : u64 { IGN, Default, TRAP, }; -TextureType GetType(Type type) { +TextureType GetType(SurfaceAtomicType type) { switch (type) { - case Type::_1D: + case SurfaceAtomicType::_1D: return TextureType::Color1D; - case Type::_1D_BUFFER: + case SurfaceAtomicType::_1D_BUFFER: return TextureType::Buffer; - case Type::_1D_ARRAY: + case SurfaceAtomicType::_1D_ARRAY: return TextureType::ColorArray1D; - case Type::_2D: + case SurfaceAtomicType::_2D: return TextureType::Color2D; - case Type::_2D_ARRAY: + case SurfaceAtomicType::_2D_ARRAY: return TextureType::ColorArray2D; - case Type::_3D: + case SurfaceAtomicType::_3D: return TextureType::Color3D; default: throw NotImplementedException("Invalid type {}", type); } } -IR::Value MakeCoords(TranslatorVisitor& v, IR::Reg reg, Type type) { +IR::Value MakeCoords(TranslatorVisitor& v, IR::Reg reg, SurfaceAtomicType type) { const auto array{[&](int index) { return v.ir.BitFieldExtract(v.X(reg + index), v.ir.Imm32(0), v.ir.Imm32(16)); }}; switch (type) { - case Type::_1D: - case Type::_1D_BUFFER: + case SurfaceAtomicType::_1D: + case SurfaceAtomicType::_1D_BUFFER: return v.X(reg); - case Type::_1D_ARRAY: + case SurfaceAtomicType::_1D_ARRAY: return v.ir.CompositeConstruct(v.X(reg), array(1)); - case Type::_2D: + case SurfaceAtomicType::_2D: return v.ir.CompositeConstruct(v.X(reg), v.X(reg + 1)); - case Type::_2D_ARRAY: + case SurfaceAtomicType::_2D_ARRAY: return v.ir.CompositeConstruct(v.X(reg), v.X(reg + 1), array(2)); - case Type::_3D: + case SurfaceAtomicType::_3D: return v.ir.CompositeConstruct(v.X(reg), v.X(reg + 1), v.X(reg + 2)); default: throw NotImplementedException("Invalid type {}", type); @@ -121,11 +121,11 @@ IR::Value ApplyAtomicOp(IR::IREmitter& ir, const IR::U32& handle, const IR::Valu } } -ImageFormat Format(Size size) { +ImageFormat Format(SurfaceAtomicSize size) { switch (size) { - case Size::U32: - case Size::S32: - case Size::SD32: + case SurfaceAtomicSize::U32: + case SurfaceAtomicSize::S32: + case SurfaceAtomicSize::SD32: return ImageFormat::R32_UINT; default: break; @@ -133,11 +133,11 @@ ImageFormat Format(Size size) { throw NotImplementedException("Invalid size {}", size); } -bool IsSizeInt32(Size size) { +bool IsSizeInt32(SurfaceAtomicSize size) { switch (size) { - case Size::U32: - case Size::S32: - case Size::SD32: + case SurfaceAtomicSize::U32: + case SurfaceAtomicSize::S32: + case SurfaceAtomicSize::SD32: return true; default: return false; @@ -145,15 +145,15 @@ bool IsSizeInt32(Size size) { } void ImageAtomOp(TranslatorVisitor& v, IR::Reg dest_reg, IR::Reg operand_reg, IR::Reg coord_reg, - std::optional bindless_reg, AtomicOp op, Clamp clamp, Size size, Type type, + std::optional bindless_reg, AtomicOp op, SurfaceAtomicClamp clamp, SurfaceAtomicSize size, SurfaceAtomicType type, u64 bound_offset, bool is_bindless, bool write_result) { - if (clamp != Clamp::IGN) { - throw NotImplementedException("Clamp {}", clamp); + if (clamp != SurfaceAtomicClamp::IGN) { + throw NotImplementedException("SurfaceAtomicClamp {}", clamp); } if (!IsSizeInt32(size)) { - throw NotImplementedException("Size {}", size); + throw NotImplementedException("SurfaceAtomicSize {}", size); } - const bool is_signed{size == Size::S32}; + const bool is_signed{size == SurfaceAtomicSize::S32}; const ImageFormat format{Format(size)}; const TextureType tex_type{GetType(type)}; const IR::Value coords{MakeCoords(v, coord_reg, type)}; @@ -178,9 +178,9 @@ void TranslatorVisitor::SUATOM(u64 insn) { u64 raw; BitField<54, 1, u64> is_bindless; BitField<29, 4, AtomicOp> op; - BitField<33, 3, Type> type; - BitField<51, 3, Size> size; - BitField<49, 2, Clamp> clamp; + BitField<33, 3, SurfaceAtomicType> type; + BitField<51, 3, SurfaceAtomicSize> size; + BitField<49, 2, SurfaceAtomicClamp> clamp; BitField<0, 8, IR::Reg> dest_reg; BitField<8, 8, IR::Reg> coord_reg; BitField<20, 8, IR::Reg> operand_reg; @@ -199,9 +199,9 @@ void TranslatorVisitor::SURED(u64 insn) { u64 raw; BitField<51, 1, u64> is_bound; BitField<24, 3, AtomicOp> op; //OK - 24 (SURedOp) - BitField<33, 3, Type> type; //OK? - 33 (Dim) - BitField<20, 3, Size> size; //? - BitField<49, 2, Clamp> clamp; //OK - 49 (Clamp4) + BitField<33, 3, SurfaceAtomicType> type; //OK? - 33 (Dim) + BitField<20, 3, SurfaceAtomicSize> size; //? + BitField<49, 2, SurfaceAtomicClamp> clamp; //OK - 49 (Clamp4) BitField<0, 8, IR::Reg> operand_reg; //RA? BitField<8, 8, IR::Reg> coord_reg; //RB? BitField<36, 13, u64> bound_offset; //OK 33 (TidB) diff --git a/src/shader_recompiler/frontend/maxwell/translate/impl/surface_load_store.cpp b/src/shader_recompiler/frontend/maxwell/translate/impl/surface_load_store.cpp index c01ab361b7..5a60c90194 100644 --- a/src/shader_recompiler/frontend/maxwell/translate/impl/surface_load_store.cpp +++ b/src/shader_recompiler/frontend/maxwell/translate/impl/surface_load_store.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -11,7 +14,7 @@ namespace Shader::Maxwell { namespace { -enum class Type : u64 { +enum class SurfaceLoadStoreType : u64 { _1D, BUFFER_1D, ARRAY_1D, @@ -20,31 +23,31 @@ enum class Type : u64 { _3D, }; -constexpr unsigned R = 1 << 0; -constexpr unsigned G = 1 << 1; -constexpr unsigned B = 1 << 2; -constexpr unsigned A = 1 << 3; +constexpr unsigned SHADER_R = 1 << 0; +constexpr unsigned SHADER_G = 1 << 1; +constexpr unsigned SHADER_B = 1 << 2; +constexpr unsigned SHADER_A = 1 << 3; constexpr std::array MASK{ 0U, // - R, // - G, // - R | G, // - B, // - R | B, // - G | B, // - R | G | B, // - A, // - R | A, // - G | A, // - R | G | A, // - B | A, // - R | B | A, // - G | B | A, // - R | G | B | A, // + SHADER_R, // + SHADER_G, // + SHADER_R | SHADER_G, // + SHADER_B, // + SHADER_R | SHADER_B, // + SHADER_G | SHADER_B, // + SHADER_R | SHADER_G | SHADER_B, // + SHADER_A, // + SHADER_R | SHADER_A, // + SHADER_G | SHADER_A, // + SHADER_R | SHADER_G | SHADER_A, // + SHADER_B | SHADER_A, // + SHADER_R | SHADER_B | SHADER_A, // + SHADER_G | SHADER_B | SHADER_A, // + SHADER_R | SHADER_G | SHADER_B | SHADER_A, // }; -enum class Size : u64 { +enum class SurfaceLoadStoreSize : u64 { U8, S8, U16, @@ -54,96 +57,96 @@ enum class Size : u64 { B128, }; -enum class Clamp : u64 { +enum class SurfaceLoadStoreClamp : u64 { IGN, Default, TRAP, }; // https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#cache-operators -enum class LoadCache : u64 { +enum class SURFLoadCache : u64 { CA, // Cache at all levels, likely to be accessed again CG, // Cache at global level (L2 and below, not L1) CI, // ??? CV, // Don't cache and fetch again (volatile) }; -enum class StoreCache : u64 { +enum class SURFStoreCache : u64 { WB, // Cache write-back all coherent levels CG, // Cache at global level (L2 and below, not L1) CS, // Cache streaming, likely to be accessed once WT, // Cache write-through (to system memory, volatile?) }; -ImageFormat Format(Size size) { +ImageFormat Format(SurfaceLoadStoreSize size) { switch (size) { - case Size::U8: + case SurfaceLoadStoreSize::U8: return ImageFormat::R8_UINT; - case Size::S8: + case SurfaceLoadStoreSize::S8: return ImageFormat::R8_SINT; - case Size::U16: + case SurfaceLoadStoreSize::U16: return ImageFormat::R16_UINT; - case Size::S16: + case SurfaceLoadStoreSize::S16: return ImageFormat::R16_SINT; - case Size::B32: + case SurfaceLoadStoreSize::B32: return ImageFormat::R32_UINT; - case Size::B64: + case SurfaceLoadStoreSize::B64: return ImageFormat::R32G32_UINT; - case Size::B128: + case SurfaceLoadStoreSize::B128: return ImageFormat::R32G32B32A32_UINT; } throw NotImplementedException("Invalid size {}", size); } -int SizeInRegs(Size size) { +int SizeInRegs(SurfaceLoadStoreSize size) { switch (size) { - case Size::U8: - case Size::S8: - case Size::U16: - case Size::S16: - case Size::B32: + case SurfaceLoadStoreSize::U8: + case SurfaceLoadStoreSize::S8: + case SurfaceLoadStoreSize::U16: + case SurfaceLoadStoreSize::S16: + case SurfaceLoadStoreSize::B32: return 1; - case Size::B64: + case SurfaceLoadStoreSize::B64: return 2; - case Size::B128: + case SurfaceLoadStoreSize::B128: return 4; } throw NotImplementedException("Invalid size {}", size); } -TextureType GetType(Type type) { +TextureType GetType(SurfaceLoadStoreType type) { switch (type) { - case Type::_1D: + case SurfaceLoadStoreType::_1D: return TextureType::Color1D; - case Type::BUFFER_1D: + case SurfaceLoadStoreType::BUFFER_1D: return TextureType::Buffer; - case Type::ARRAY_1D: + case SurfaceLoadStoreType::ARRAY_1D: return TextureType::ColorArray1D; - case Type::_2D: + case SurfaceLoadStoreType::_2D: return TextureType::Color2D; - case Type::ARRAY_2D: + case SurfaceLoadStoreType::ARRAY_2D: return TextureType::ColorArray2D; - case Type::_3D: + case SurfaceLoadStoreType::_3D: return TextureType::Color3D; } throw NotImplementedException("Invalid type {}", type); } -IR::Value MakeCoords(TranslatorVisitor& v, IR::Reg reg, Type type) { +IR::Value MakeCoords(TranslatorVisitor& v, IR::Reg reg, SurfaceLoadStoreType type) { const auto array{[&](int index) { return v.ir.BitFieldExtract(v.X(reg + index), v.ir.Imm32(0), v.ir.Imm32(16)); }}; switch (type) { - case Type::_1D: - case Type::BUFFER_1D: + case SurfaceLoadStoreType::_1D: + case SurfaceLoadStoreType::BUFFER_1D: return v.X(reg); - case Type::ARRAY_1D: + case SurfaceLoadStoreType::ARRAY_1D: return v.ir.CompositeConstruct(v.X(reg), array(1)); - case Type::_2D: + case SurfaceLoadStoreType::_2D: return v.ir.CompositeConstruct(v.X(reg), v.X(reg + 1)); - case Type::ARRAY_2D: + case SurfaceLoadStoreType::ARRAY_2D: return v.ir.CompositeConstruct(v.X(reg), v.X(reg + 1), array(2)); - case Type::_3D: + case SurfaceLoadStoreType::_3D: return v.ir.CompositeConstruct(v.X(reg), v.X(reg + 1), v.X(reg + 2)); } throw NotImplementedException("Invalid type {}", type); @@ -174,21 +177,21 @@ void TranslatorVisitor::SULD(u64 insn) { BitField<51, 1, u64> is_bound; BitField<52, 1, u64> d; BitField<23, 1, u64> ba; - BitField<33, 3, Type> type; - BitField<24, 2, LoadCache> cache; - BitField<20, 3, Size> size; // .D + BitField<33, 3, SurfaceLoadStoreType> type; + BitField<24, 2, SURFLoadCache> cache; + BitField<20, 3, SurfaceLoadStoreSize> size; // .D BitField<20, 4, u64> swizzle; // .P - BitField<49, 2, Clamp> clamp; + BitField<49, 2, SurfaceLoadStoreClamp> clamp; BitField<0, 8, IR::Reg> dest_reg; BitField<8, 8, IR::Reg> coord_reg; BitField<36, 13, u64> bound_offset; // is_bound BitField<39, 8, IR::Reg> bindless_reg; // !is_bound } const suld{insn}; - if (suld.clamp != Clamp::IGN) { - throw NotImplementedException("Clamp {}", suld.clamp.Value()); + if (suld.clamp != SurfaceLoadStoreClamp::IGN) { + throw NotImplementedException("SurfaceLoadStoreClamp {}", suld.clamp.Value()); } - if (suld.cache != LoadCache::CA && suld.cache != LoadCache::CG) { + if (suld.cache != SURFLoadCache::CA && suld.cache != SURFLoadCache::CG) { throw NotImplementedException("Cache {}", suld.cache.Value()); } const bool is_typed{suld.d != 0}; @@ -234,21 +237,21 @@ void TranslatorVisitor::SUST(u64 insn) { BitField<51, 1, u64> is_bound; BitField<52, 1, u64> d; BitField<23, 1, u64> ba; - BitField<33, 3, Type> type; - BitField<24, 2, StoreCache> cache; - BitField<20, 3, Size> size; // .D + BitField<33, 3, SurfaceLoadStoreType> type; + BitField<24, 2, SURFStoreCache> cache; + BitField<20, 3, SurfaceLoadStoreSize> size; // .D BitField<20, 4, u64> swizzle; // .P - BitField<49, 2, Clamp> clamp; + BitField<49, 2, SurfaceLoadStoreClamp> clamp; BitField<0, 8, IR::Reg> data_reg; BitField<8, 8, IR::Reg> coord_reg; BitField<36, 13, u64> bound_offset; // is_bound BitField<39, 8, IR::Reg> bindless_reg; // !is_bound } const sust{insn}; - if (sust.clamp != Clamp::IGN) { - throw NotImplementedException("Clamp {}", sust.clamp.Value()); + if (sust.clamp != SurfaceLoadStoreClamp::IGN) { + throw NotImplementedException("SurfaceLoadStoreClamp {}", sust.clamp.Value()); } - if (sust.cache != StoreCache::WB && sust.cache != StoreCache::CG) { + if (sust.cache != SURFStoreCache::WB && sust.cache != SURFStoreCache::CG) { throw NotImplementedException("Cache {}", sust.cache.Value()); } const bool is_typed{sust.d != 0}; diff --git a/src/shader_recompiler/frontend/maxwell/translate/impl/texture_fetch.cpp b/src/shader_recompiler/frontend/maxwell/translate/impl/texture_fetch.cpp index 7a9b7fff8b..809da40b25 100644 --- a/src/shader_recompiler/frontend/maxwell/translate/impl/texture_fetch.cpp +++ b/src/shader_recompiler/frontend/maxwell/translate/impl/texture_fetch.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -21,7 +24,7 @@ enum class Blod : u64 { LLA, }; -enum class TextureType : u64 { +enum class TextureFetchType : u64 { _1D, ARRAY_1D, _2D, @@ -32,46 +35,46 @@ enum class TextureType : u64 { ARRAY_CUBE, }; -Shader::TextureType GetType(TextureType type) { +Shader::TextureType GetType(TextureFetchType type) { switch (type) { - case TextureType::_1D: + case TextureFetchType::_1D: return Shader::TextureType::Color1D; - case TextureType::ARRAY_1D: + case TextureFetchType::ARRAY_1D: return Shader::TextureType::ColorArray1D; - case TextureType::_2D: + case TextureFetchType::_2D: return Shader::TextureType::Color2D; - case TextureType::ARRAY_2D: + case TextureFetchType::ARRAY_2D: return Shader::TextureType::ColorArray2D; - case TextureType::_3D: + case TextureFetchType::_3D: return Shader::TextureType::Color3D; - case TextureType::ARRAY_3D: + case TextureFetchType::ARRAY_3D: throw NotImplementedException("3D array texture type"); - case TextureType::CUBE: + case TextureFetchType::CUBE: return Shader::TextureType::ColorCube; - case TextureType::ARRAY_CUBE: + case TextureFetchType::ARRAY_CUBE: return Shader::TextureType::ColorArrayCube; } throw NotImplementedException("Invalid texture type {}", type); } -IR::Value MakeCoords(TranslatorVisitor& v, IR::Reg reg, TextureType type) { +IR::Value MakeCoords(TranslatorVisitor& v, IR::Reg reg, TextureFetchType type) { const auto read_array{[&]() -> IR::F32 { return v.ir.ConvertUToF(32, 16, v.X(reg)); }}; switch (type) { - case TextureType::_1D: + case TextureFetchType::_1D: return v.F(reg); - case TextureType::ARRAY_1D: + case TextureFetchType::ARRAY_1D: return v.ir.CompositeConstruct(v.F(reg + 1), read_array()); - case TextureType::_2D: + case TextureFetchType::_2D: return v.ir.CompositeConstruct(v.F(reg), v.F(reg + 1)); - case TextureType::ARRAY_2D: + case TextureFetchType::ARRAY_2D: return v.ir.CompositeConstruct(v.F(reg + 1), v.F(reg + 2), read_array()); - case TextureType::_3D: + case TextureFetchType::_3D: return v.ir.CompositeConstruct(v.F(reg), v.F(reg + 1), v.F(reg + 2)); - case TextureType::ARRAY_3D: + case TextureFetchType::ARRAY_3D: throw NotImplementedException("3D array texture type"); - case TextureType::CUBE: + case TextureFetchType::CUBE: return v.ir.CompositeConstruct(v.F(reg), v.F(reg + 1), v.F(reg + 2)); - case TextureType::ARRAY_CUBE: + case TextureFetchType::ARRAY_CUBE: return v.ir.CompositeConstruct(v.F(reg + 1), v.F(reg + 2), v.F(reg + 3), read_array()); } throw NotImplementedException("Invalid texture type {}", type); @@ -95,25 +98,25 @@ IR::F32 MakeLod(TranslatorVisitor& v, IR::Reg& reg, Blod blod) { throw NotImplementedException("Invalid blod {}", blod); } -IR::Value MakeOffset(TranslatorVisitor& v, IR::Reg& reg, TextureType type) { +IR::Value MakeOffset(TranslatorVisitor& v, IR::Reg& reg, TextureFetchType type) { const IR::U32 value{v.X(reg++)}; switch (type) { - case TextureType::_1D: - case TextureType::ARRAY_1D: + case TextureFetchType::_1D: + case TextureFetchType::ARRAY_1D: return v.ir.BitFieldExtract(value, v.ir.Imm32(0), v.ir.Imm32(4), true); - case TextureType::_2D: - case TextureType::ARRAY_2D: + case TextureFetchType::_2D: + case TextureFetchType::ARRAY_2D: return v.ir.CompositeConstruct( v.ir.BitFieldExtract(value, v.ir.Imm32(0), v.ir.Imm32(4), true), v.ir.BitFieldExtract(value, v.ir.Imm32(4), v.ir.Imm32(4), true)); - case TextureType::_3D: - case TextureType::ARRAY_3D: + case TextureFetchType::_3D: + case TextureFetchType::ARRAY_3D: return v.ir.CompositeConstruct( v.ir.BitFieldExtract(value, v.ir.Imm32(0), v.ir.Imm32(4), true), v.ir.BitFieldExtract(value, v.ir.Imm32(4), v.ir.Imm32(4), true), v.ir.BitFieldExtract(value, v.ir.Imm32(8), v.ir.Imm32(4), true)); - case TextureType::CUBE: - case TextureType::ARRAY_CUBE: + case TextureFetchType::CUBE: + case TextureFetchType::ARRAY_CUBE: throw NotImplementedException("Illegal offset on CUBE sample"); } throw NotImplementedException("Invalid texture type {}", type); @@ -141,7 +144,7 @@ void Impl(TranslatorVisitor& v, u64 insn, bool aoffi, Blod blod, bool lc, BitField<0, 8, IR::Reg> dest_reg; BitField<8, 8, IR::Reg> coord_reg; BitField<20, 8, IR::Reg> meta_reg; - BitField<28, 3, TextureType> type; + BitField<28, 3, TextureFetchType> type; BitField<31, 4, u64> mask; } const tex{insn}; diff --git a/src/shader_recompiler/frontend/maxwell/translate/impl/texture_fetch_swizzled.cpp b/src/shader_recompiler/frontend/maxwell/translate/impl/texture_fetch_swizzled.cpp index 50e618c2f1..d562d87f71 100644 --- a/src/shader_recompiler/frontend/maxwell/translate/impl/texture_fetch_swizzled.cpp +++ b/src/shader_recompiler/frontend/maxwell/translate/impl/texture_fetch_swizzled.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -8,14 +11,14 @@ namespace Shader::Maxwell { namespace { -enum class Precision : u64 { +enum class TextureFetchSwizzledPrecision : u64 { F16, F32, }; -union Encoding { +union EncodinTFS { u64 raw; - BitField<59, 1, Precision> precision; + BitField<59, 1, TextureFetchSwizzledPrecision> precision; BitField<53, 4, u64> encoding; BitField<49, 1, u64> nodep; BitField<28, 8, IR::Reg> dest_reg_b; @@ -26,31 +29,7 @@ union Encoding { BitField<50, 3, u64> swizzle; }; -constexpr unsigned R = 1; -constexpr unsigned G = 2; -constexpr unsigned B = 4; -constexpr unsigned A = 8; - -constexpr std::array RG_LUT{ - R, // - G, // - B, // - A, // - R | G, // - R | A, // - G | A, // - B | A, // -}; - -constexpr std::array RGBA_LUT{ - R | G | B, // - R | G | A, // - R | B | A, // - G | B | A, // - R | G | B | A, // -}; - -void CheckAlignment(IR::Reg reg, size_t alignment) { +void CheckAlignmentTFS(IR::Reg reg, size_t alignment) { if (!IR::IsAligned(reg, alignment)) { throw NotImplementedException("Unaligned source register {}", reg); } @@ -65,14 +44,14 @@ IR::F32 ReadArray(TranslatorVisitor& v, const IR::U32& value) { return v.ir.ConvertUToF(32, 16, v.ir.BitFieldExtract(value, v.ir.Imm32(0), v.ir.Imm32(16))); } -IR::Value Sample(TranslatorVisitor& v, u64 insn) { - const Encoding texs{insn}; +IR::Value SampleTFS(TranslatorVisitor& v, u64 insn) { + const EncodinTFS texs{insn}; const IR::U32 handle{v.ir.Imm32(static_cast(texs.cbuf_offset * 4))}; const IR::F32 zero{v.ir.Imm32(0.0f)}; const IR::Reg reg_a{texs.src_reg_a}; const IR::Reg reg_b{texs.src_reg_b}; IR::TextureInstInfo info{}; - if (texs.precision == Precision::F16) { + if (texs.precision == TextureFetchSwizzledPrecision::F16) { info.relaxed_precision.Assign(1); } switch (texs.encoding) { @@ -86,67 +65,67 @@ IR::Value Sample(TranslatorVisitor& v, u64 insn) { info.type.Assign(TextureType::Color2D); return v.ir.ImageSampleExplicitLod(handle, Composite(v, reg_a, reg_b), zero, {}, info); case 3: // 2D.LL - CheckAlignment(reg_a, 2); + CheckAlignmentTFS(reg_a, 2); info.type.Assign(TextureType::Color2D); return v.ir.ImageSampleExplicitLod(handle, Composite(v, reg_a, reg_a + 1), v.F(reg_b), {}, info); case 4: // 2D.DC - CheckAlignment(reg_a, 2); + CheckAlignmentTFS(reg_a, 2); info.type.Assign(TextureType::Color2D); info.is_depth.Assign(1); return v.ir.ImageSampleDrefImplicitLod(handle, Composite(v, reg_a, reg_a + 1), v.F(reg_b), {}, {}, {}, info); case 5: // 2D.LL.DC - CheckAlignment(reg_a, 2); - CheckAlignment(reg_b, 2); + CheckAlignmentTFS(reg_a, 2); + CheckAlignmentTFS(reg_b, 2); info.type.Assign(TextureType::Color2D); info.is_depth.Assign(1); return v.ir.ImageSampleDrefExplicitLod(handle, Composite(v, reg_a, reg_a + 1), v.F(reg_b + 1), v.F(reg_b), {}, info); case 6: // 2D.LZ.DC - CheckAlignment(reg_a, 2); + CheckAlignmentTFS(reg_a, 2); info.type.Assign(TextureType::Color2D); info.is_depth.Assign(1); return v.ir.ImageSampleDrefExplicitLod(handle, Composite(v, reg_a, reg_a + 1), v.F(reg_b), zero, {}, info); case 7: // ARRAY_2D - CheckAlignment(reg_a, 2); + CheckAlignmentTFS(reg_a, 2); info.type.Assign(TextureType::ColorArray2D); return v.ir.ImageSampleImplicitLod( handle, v.ir.CompositeConstruct(v.F(reg_a + 1), v.F(reg_b), ReadArray(v, v.X(reg_a))), {}, {}, {}, info); case 8: // ARRAY_2D.LZ - CheckAlignment(reg_a, 2); + CheckAlignmentTFS(reg_a, 2); info.type.Assign(TextureType::ColorArray2D); return v.ir.ImageSampleExplicitLod( handle, v.ir.CompositeConstruct(v.F(reg_a + 1), v.F(reg_b), ReadArray(v, v.X(reg_a))), zero, {}, info); case 9: // ARRAY_2D.LZ.DC - CheckAlignment(reg_a, 2); - CheckAlignment(reg_b, 2); + CheckAlignmentTFS(reg_a, 2); + CheckAlignmentTFS(reg_b, 2); info.type.Assign(TextureType::ColorArray2D); info.is_depth.Assign(1); return v.ir.ImageSampleDrefExplicitLod( handle, v.ir.CompositeConstruct(v.F(reg_a + 1), v.F(reg_b), ReadArray(v, v.X(reg_a))), v.F(reg_b + 1), zero, {}, info); case 10: // 3D - CheckAlignment(reg_a, 2); + CheckAlignmentTFS(reg_a, 2); info.type.Assign(TextureType::Color3D); return v.ir.ImageSampleImplicitLod(handle, Composite(v, reg_a, reg_a + 1, reg_b), {}, {}, {}, info); case 11: // 3D.LZ - CheckAlignment(reg_a, 2); + CheckAlignmentTFS(reg_a, 2); info.type.Assign(TextureType::Color3D); return v.ir.ImageSampleExplicitLod(handle, Composite(v, reg_a, reg_a + 1, reg_b), zero, {}, info); case 12: // CUBE - CheckAlignment(reg_a, 2); + CheckAlignmentTFS(reg_a, 2); info.type.Assign(TextureType::ColorCube); return v.ir.ImageSampleImplicitLod(handle, Composite(v, reg_a, reg_a + 1, reg_b), {}, {}, {}, info); case 13: // CUBE.LL - CheckAlignment(reg_a, 2); - CheckAlignment(reg_b, 2); + CheckAlignmentTFS(reg_a, 2); + CheckAlignmentTFS(reg_b, 2); info.type.Assign(TextureType::ColorCube); return v.ir.ImageSampleExplicitLod(handle, Composite(v, reg_a, reg_a + 1, reg_b), v.F(reg_b + 1), {}, info); @@ -155,23 +134,46 @@ IR::Value Sample(TranslatorVisitor& v, u64 insn) { } } -unsigned Swizzle(u64 insn) { - const Encoding texs{insn}; +unsigned FetchSwizzle(u64 insn) { +#define R 1 +#define G 2 +#define B 4 +#define A 8 + constexpr std::array RG_LUT{ + R, // + G, // + B, // + A, // + R | G, // + R | A, // + G | A, // + B | A, // + }; + constexpr std::array RGBA_LUT{ + R | G | B, // + R | G | A, // + R | B | A, // + G | B | A, // + R | G | B | A, // + }; +#undef R +#undef G +#undef B +#undef A + const EncodinTFS texs{insn}; const size_t encoding{texs.swizzle}; if (texs.dest_reg_b == IR::Reg::RZ) { - if (encoding >= RG_LUT.size()) { + if (encoding >= RG_LUT.size()) throw NotImplementedException("Illegal RG encoding {}", encoding); - } return RG_LUT[encoding]; } else { - if (encoding >= RGBA_LUT.size()) { + if (encoding >= RGBA_LUT.size()) throw NotImplementedException("Illegal RGBA encoding {}", encoding); - } return RGBA_LUT[encoding]; } } -IR::F32 Extract(TranslatorVisitor& v, const IR::Value& sample, unsigned component) { +IR::F32 FetchExtract(TranslatorVisitor& v, const IR::Value& sample, unsigned component) { const bool is_shadow{sample.Type() == IR::Type::F32}; if (is_shadow) { const bool is_alpha{component == 3}; @@ -181,69 +183,69 @@ IR::F32 Extract(TranslatorVisitor& v, const IR::Value& sample, unsigned componen } } -IR::Reg RegStoreComponent32(u64 insn, unsigned index) { - const Encoding texs{insn}; +IR::Reg FetchRegStoreComponent32(u64 insn, unsigned index) { + const EncodinTFS texs{insn}; switch (index) { case 0: return texs.dest_reg_a; case 1: - CheckAlignment(texs.dest_reg_a, 2); + CheckAlignmentTFS(texs.dest_reg_a, 2); return texs.dest_reg_a + 1; case 2: return texs.dest_reg_b; case 3: - CheckAlignment(texs.dest_reg_b, 2); + CheckAlignmentTFS(texs.dest_reg_b, 2); return texs.dest_reg_b + 1; } throw LogicError("Invalid store index {}", index); } -void Store32(TranslatorVisitor& v, u64 insn, const IR::Value& sample) { - const unsigned swizzle{Swizzle(insn)}; +void Store32TFS(TranslatorVisitor& v, u64 insn, const IR::Value& sample) { + const unsigned swizzle{FetchSwizzle(insn)}; unsigned store_index{0}; for (unsigned component = 0; component < 4; ++component) { if (((swizzle >> component) & 1) == 0) { continue; } - const IR::Reg dest{RegStoreComponent32(insn, store_index)}; - v.F(dest, Extract(v, sample, component)); + const IR::Reg dest{FetchRegStoreComponent32(insn, store_index)}; + v.F(dest, FetchExtract(v, sample, component)); ++store_index; } } -IR::U32 Pack(TranslatorVisitor& v, const IR::F32& lhs, const IR::F32& rhs) { +IR::U32 PackTFS(TranslatorVisitor& v, const IR::F32& lhs, const IR::F32& rhs) { return v.ir.PackHalf2x16(v.ir.CompositeConstruct(lhs, rhs)); } -void Store16(TranslatorVisitor& v, u64 insn, const IR::Value& sample) { - const unsigned swizzle{Swizzle(insn)}; +void Store16TFS(TranslatorVisitor& v, u64 insn, const IR::Value& sample) { + const unsigned swizzle{FetchSwizzle(insn)}; unsigned store_index{0}; std::array swizzled; for (unsigned component = 0; component < 4; ++component) { if (((swizzle >> component) & 1) == 0) { continue; } - swizzled[store_index] = Extract(v, sample, component); + swizzled[store_index] = FetchExtract(v, sample, component); ++store_index; } const IR::F32 zero{v.ir.Imm32(0.0f)}; - const Encoding texs{insn}; + const EncodinTFS texs{insn}; switch (store_index) { case 1: - v.X(texs.dest_reg_a, Pack(v, swizzled[0], zero)); + v.X(texs.dest_reg_a, PackTFS(v, swizzled[0], zero)); break; case 2: case 3: case 4: - v.X(texs.dest_reg_a, Pack(v, swizzled[0], swizzled[1])); + v.X(texs.dest_reg_a, PackTFS(v, swizzled[0], swizzled[1])); switch (store_index) { case 2: break; case 3: - v.X(texs.dest_reg_b, Pack(v, swizzled[2], zero)); + v.X(texs.dest_reg_b, PackTFS(v, swizzled[2], zero)); break; case 4: - v.X(texs.dest_reg_b, Pack(v, swizzled[2], swizzled[3])); + v.X(texs.dest_reg_b, PackTFS(v, swizzled[2], swizzled[3])); break; } break; @@ -252,11 +254,11 @@ void Store16(TranslatorVisitor& v, u64 insn, const IR::Value& sample) { } // Anonymous namespace void TranslatorVisitor::TEXS(u64 insn) { - const IR::Value sample{Sample(*this, insn)}; - if (Encoding{insn}.precision == Precision::F32) { - Store32(*this, insn, sample); + const IR::Value sample{SampleTFS(*this, insn)}; + if (EncodinTFS{insn}.precision == TextureFetchSwizzledPrecision::F32) { + Store32TFS(*this, insn, sample); } else { - Store16(*this, insn, sample); + Store16TFS(*this, insn, sample); } } diff --git a/src/shader_recompiler/frontend/maxwell/translate/impl/texture_gather.cpp b/src/shader_recompiler/frontend/maxwell/translate/impl/texture_gather.cpp index 3263b3c7c9..db7ef2d3cf 100644 --- a/src/shader_recompiler/frontend/maxwell/translate/impl/texture_gather.cpp +++ b/src/shader_recompiler/frontend/maxwell/translate/impl/texture_gather.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -9,7 +12,7 @@ namespace Shader::Maxwell { namespace { -enum class TextureType : u64 { +enum class TextureGatherType : u64 { _1D, ARRAY_1D, _2D, @@ -27,77 +30,77 @@ enum class OffsetType : u64 { Invalid, }; -enum class ComponentType : u64 { +enum class TextureGatherComponentType : u64 { R = 0, G = 1, B = 2, A = 3, }; -Shader::TextureType GetType(TextureType type) { +Shader::TextureType GetTextureGatherType(TextureGatherType type) { switch (type) { - case TextureType::_1D: + case TextureGatherType::_1D: return Shader::TextureType::Color1D; - case TextureType::ARRAY_1D: + case TextureGatherType::ARRAY_1D: return Shader::TextureType::ColorArray1D; - case TextureType::_2D: + case TextureGatherType::_2D: return Shader::TextureType::Color2D; - case TextureType::ARRAY_2D: + case TextureGatherType::ARRAY_2D: return Shader::TextureType::ColorArray2D; - case TextureType::_3D: + case TextureGatherType::_3D: return Shader::TextureType::Color3D; - case TextureType::ARRAY_3D: + case TextureGatherType::ARRAY_3D: throw NotImplementedException("3D array texture type"); - case TextureType::CUBE: + case TextureGatherType::CUBE: return Shader::TextureType::ColorCube; - case TextureType::ARRAY_CUBE: + case TextureGatherType::ARRAY_CUBE: return Shader::TextureType::ColorArrayCube; } throw NotImplementedException("Invalid texture type {}", type); } -IR::Value MakeCoords(TranslatorVisitor& v, IR::Reg reg, TextureType type) { +IR::Value MakeTextureGatherCoords(TranslatorVisitor& v, IR::Reg reg, TextureGatherType type) { const auto read_array{[&]() -> IR::F32 { return v.ir.ConvertUToF(32, 16, v.X(reg)); }}; switch (type) { - case TextureType::_1D: + case TextureGatherType::_1D: return v.F(reg); - case TextureType::ARRAY_1D: + case TextureGatherType::ARRAY_1D: return v.ir.CompositeConstruct(v.F(reg + 1), read_array()); - case TextureType::_2D: + case TextureGatherType::_2D: return v.ir.CompositeConstruct(v.F(reg), v.F(reg + 1)); - case TextureType::ARRAY_2D: + case TextureGatherType::ARRAY_2D: return v.ir.CompositeConstruct(v.F(reg + 1), v.F(reg + 2), read_array()); - case TextureType::_3D: + case TextureGatherType::_3D: return v.ir.CompositeConstruct(v.F(reg), v.F(reg + 1), v.F(reg + 2)); - case TextureType::ARRAY_3D: + case TextureGatherType::ARRAY_3D: throw NotImplementedException("3D array texture type"); - case TextureType::CUBE: + case TextureGatherType::CUBE: return v.ir.CompositeConstruct(v.F(reg), v.F(reg + 1), v.F(reg + 2)); - case TextureType::ARRAY_CUBE: + case TextureGatherType::ARRAY_CUBE: return v.ir.CompositeConstruct(v.F(reg + 1), v.F(reg + 2), v.F(reg + 3), read_array()); } throw NotImplementedException("Invalid texture type {}", type); } -IR::Value MakeOffset(TranslatorVisitor& v, IR::Reg& reg, TextureType type) { +IR::Value MakeOffset(TranslatorVisitor& v, IR::Reg& reg, TextureGatherType type) { const IR::U32 value{v.X(reg++)}; switch (type) { - case TextureType::_1D: - case TextureType::ARRAY_1D: + case TextureGatherType::_1D: + case TextureGatherType::ARRAY_1D: return v.ir.BitFieldExtract(value, v.ir.Imm32(0), v.ir.Imm32(6), true); - case TextureType::_2D: - case TextureType::ARRAY_2D: + case TextureGatherType::_2D: + case TextureGatherType::ARRAY_2D: return v.ir.CompositeConstruct( v.ir.BitFieldExtract(value, v.ir.Imm32(0), v.ir.Imm32(6), true), v.ir.BitFieldExtract(value, v.ir.Imm32(8), v.ir.Imm32(6), true)); - case TextureType::_3D: - case TextureType::ARRAY_3D: + case TextureGatherType::_3D: + case TextureGatherType::ARRAY_3D: return v.ir.CompositeConstruct( v.ir.BitFieldExtract(value, v.ir.Imm32(0), v.ir.Imm32(6), true), v.ir.BitFieldExtract(value, v.ir.Imm32(8), v.ir.Imm32(6), true), v.ir.BitFieldExtract(value, v.ir.Imm32(16), v.ir.Imm32(6), true)); - case TextureType::CUBE: - case TextureType::ARRAY_CUBE: + case TextureGatherType::CUBE: + case TextureGatherType::ARRAY_CUBE: throw NotImplementedException("Illegal offset on CUBE sample"); } throw NotImplementedException("Invalid texture type {}", type); @@ -116,7 +119,7 @@ std::pair MakeOffsetPTP(TranslatorVisitor& v, IR::Reg& reg return {make_vector(value1), make_vector(value2)}; } -void Impl(TranslatorVisitor& v, u64 insn, ComponentType component_type, OffsetType offset_type, +void Impl(TranslatorVisitor& v, u64 insn, TextureGatherComponentType component_type, OffsetType offset_type, bool is_bindless) { union { u64 raw; @@ -127,12 +130,12 @@ void Impl(TranslatorVisitor& v, u64 insn, ComponentType component_type, OffsetTy BitField<0, 8, IR::Reg> dest_reg; BitField<8, 8, IR::Reg> coord_reg; BitField<20, 8, IR::Reg> meta_reg; - BitField<28, 3, TextureType> type; + BitField<28, 3, TextureGatherType> type; BitField<31, 4, u64> mask; BitField<36, 13, u64> cbuf_offset; } const tld4{insn}; - const IR::Value coords{MakeCoords(v, tld4.coord_reg, tld4.type)}; + const IR::Value coords{MakeTextureGatherCoords(v, tld4.coord_reg, tld4.type)}; IR::Reg meta_reg{tld4.meta_reg}; IR::Value handle; @@ -160,7 +163,7 @@ void Impl(TranslatorVisitor& v, u64 insn, ComponentType component_type, OffsetTy dref = v.F(meta_reg++); } IR::TextureInstInfo info{}; - info.type.Assign(GetType(tld4.type)); + info.type.Assign(GetTextureGatherType(tld4.type)); info.is_depth.Assign(tld4.dc != 0 ? 1 : 0); info.gather_component.Assign(static_cast(component_type)); const IR::Value sample{[&] { @@ -187,7 +190,7 @@ void Impl(TranslatorVisitor& v, u64 insn, ComponentType component_type, OffsetTy void TranslatorVisitor::TLD4(u64 insn) { union { u64 raw; - BitField<56, 2, ComponentType> component; + BitField<56, 2, TextureGatherComponentType> component; BitField<54, 2, OffsetType> offset; } const tld4{insn}; Impl(*this, insn, tld4.component, tld4.offset, false); @@ -196,7 +199,7 @@ void TranslatorVisitor::TLD4(u64 insn) { void TranslatorVisitor::TLD4_b(u64 insn) { union { u64 raw; - BitField<38, 2, ComponentType> component; + BitField<38, 2, TextureGatherComponentType> component; BitField<36, 2, OffsetType> offset; } const tld4{insn}; Impl(*this, insn, tld4.component, tld4.offset, true); diff --git a/src/shader_recompiler/frontend/maxwell/translate/impl/texture_gather_swizzled.cpp b/src/shader_recompiler/frontend/maxwell/translate/impl/texture_gather_swizzled.cpp index e4c6581450..b96ade0ad1 100644 --- a/src/shader_recompiler/frontend/maxwell/translate/impl/texture_gather_swizzled.cpp +++ b/src/shader_recompiler/frontend/maxwell/translate/impl/texture_gather_swizzled.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -8,22 +11,22 @@ namespace Shader::Maxwell { namespace { -enum class Precision : u64 { +enum class TextureGatherSwizzledPrecision : u64 { F32, F16, }; -enum class ComponentType : u64 { +enum class TextureGatherSwizzledComponentType : u64 { R = 0, G = 1, B = 2, A = 3, }; -union Encoding { +union EncodinTGS { u64 raw; - BitField<55, 1, Precision> precision; - BitField<52, 2, ComponentType> component_type; + BitField<55, 1, TextureGatherSwizzledPrecision> precision; + BitField<52, 2, TextureGatherSwizzledComponentType> component_type; BitField<51, 1, u64> aoffi; BitField<50, 1, u64> dc; BitField<49, 1, u64> nodep; @@ -34,25 +37,25 @@ union Encoding { BitField<36, 13, u64> cbuf_offset; }; -void CheckAlignment(IR::Reg reg, size_t alignment) { +void CheckAlignmentTGS(IR::Reg reg, size_t alignment) { if (!IR::IsAligned(reg, alignment)) { throw NotImplementedException("Unaligned source register {}", reg); } } -IR::Value MakeOffset(TranslatorVisitor& v, IR::Reg reg) { +IR::Value MakeGatherOffset(TranslatorVisitor& v, IR::Reg reg) { const IR::U32 value{v.X(reg)}; return v.ir.CompositeConstruct(v.ir.BitFieldExtract(value, v.ir.Imm32(0), v.ir.Imm32(6), true), v.ir.BitFieldExtract(value, v.ir.Imm32(8), v.ir.Imm32(6), true)); } -IR::Value Sample(TranslatorVisitor& v, u64 insn) { - const Encoding tld4s{insn}; +IR::Value SampleTGS(TranslatorVisitor& v, u64 insn) { + const EncodinTGS tld4s{insn}; const IR::U32 handle{v.ir.Imm32(static_cast(tld4s.cbuf_offset * 4))}; const IR::Reg reg_a{tld4s.src_reg_a}; const IR::Reg reg_b{tld4s.src_reg_b}; IR::TextureInstInfo info{}; - if (tld4s.precision == Precision::F16) { + if (tld4s.precision == TextureGatherSwizzledPrecision::F16) { info.relaxed_precision.Assign(1); } info.gather_component.Assign(static_cast(tld4s.component_type.Value())); @@ -60,18 +63,18 @@ IR::Value Sample(TranslatorVisitor& v, u64 insn) { info.is_depth.Assign(tld4s.dc != 0 ? 1 : 0); IR::Value coords; if (tld4s.aoffi != 0) { - CheckAlignment(reg_a, 2); + CheckAlignmentTGS(reg_a, 2); coords = v.ir.CompositeConstruct(v.F(reg_a), v.F(reg_a + 1)); - IR::Value offset = MakeOffset(v, reg_b); + IR::Value offset = MakeGatherOffset(v, reg_b); if (tld4s.dc != 0) { - CheckAlignment(reg_b, 2); + CheckAlignmentTGS(reg_b, 2); IR::F32 dref = v.F(reg_b + 1); return v.ir.ImageGatherDref(handle, coords, offset, {}, dref, info); } return v.ir.ImageGather(handle, coords, offset, {}, info); } if (tld4s.dc != 0) { - CheckAlignment(reg_a, 2); + CheckAlignmentTGS(reg_a, 2); coords = v.ir.CompositeConstruct(v.F(reg_a), v.F(reg_a + 1)); IR::F32 dref = v.F(reg_b); return v.ir.ImageGatherDref(handle, coords, {}, {}, dref, info); @@ -81,50 +84,50 @@ IR::Value Sample(TranslatorVisitor& v, u64 insn) { } IR::Reg RegStoreComponent32(u64 insn, size_t index) { - const Encoding tlds4{insn}; + const EncodinTGS tlds4{insn}; switch (index) { case 0: return tlds4.dest_reg_a; case 1: - CheckAlignment(tlds4.dest_reg_a, 2); + CheckAlignmentTGS(tlds4.dest_reg_a, 2); return tlds4.dest_reg_a + 1; case 2: return tlds4.dest_reg_b; case 3: - CheckAlignment(tlds4.dest_reg_b, 2); + CheckAlignmentTGS(tlds4.dest_reg_b, 2); return tlds4.dest_reg_b + 1; } throw LogicError("Invalid store index {}", index); } -void Store32(TranslatorVisitor& v, u64 insn, const IR::Value& sample) { +void Store32TGS(TranslatorVisitor& v, u64 insn, const IR::Value& sample) { for (size_t component = 0; component < 4; ++component) { const IR::Reg dest{RegStoreComponent32(insn, component)}; v.F(dest, IR::F32{v.ir.CompositeExtract(sample, component)}); } } -IR::U32 Pack(TranslatorVisitor& v, const IR::F32& lhs, const IR::F32& rhs) { +IR::U32 PackTGS(TranslatorVisitor& v, const IR::F32& lhs, const IR::F32& rhs) { return v.ir.PackHalf2x16(v.ir.CompositeConstruct(lhs, rhs)); } -void Store16(TranslatorVisitor& v, u64 insn, const IR::Value& sample) { +void Store16TGS(TranslatorVisitor& v, u64 insn, const IR::Value& sample) { std::array swizzled; for (size_t component = 0; component < 4; ++component) { swizzled[component] = IR::F32{v.ir.CompositeExtract(sample, component)}; } - const Encoding tld4s{insn}; - v.X(tld4s.dest_reg_a, Pack(v, swizzled[0], swizzled[1])); - v.X(tld4s.dest_reg_b, Pack(v, swizzled[2], swizzled[3])); + const EncodinTGS tld4s{insn}; + v.X(tld4s.dest_reg_a, PackTGS(v, swizzled[0], swizzled[1])); + v.X(tld4s.dest_reg_b, PackTGS(v, swizzled[2], swizzled[3])); } } // Anonymous namespace void TranslatorVisitor::TLD4S(u64 insn) { - const IR::Value sample{Sample(*this, insn)}; - if (Encoding{insn}.precision == Precision::F32) { - Store32(*this, insn, sample); + const IR::Value sample{SampleTGS(*this, insn)}; + if (EncodinTGS{insn}.precision == TextureGatherSwizzledPrecision::F32) { + Store32TGS(*this, insn, sample); } else { - Store16(*this, insn, sample); + Store16TGS(*this, insn, sample); } } diff --git a/src/shader_recompiler/frontend/maxwell/translate/impl/texture_gradient.cpp b/src/shader_recompiler/frontend/maxwell/translate/impl/texture_gradient.cpp index 4ce3dd0cd0..5dff3f7b86 100644 --- a/src/shader_recompiler/frontend/maxwell/translate/impl/texture_gradient.cpp +++ b/src/shader_recompiler/frontend/maxwell/translate/impl/texture_gradient.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -9,7 +12,7 @@ namespace Shader::Maxwell { namespace { -enum class TextureType : u64 { +enum class TextureGradientType : u64 { _1D, ARRAY_1D, _2D, @@ -20,23 +23,23 @@ enum class TextureType : u64 { ARRAY_CUBE, }; -Shader::TextureType GetType(TextureType type) { +Shader::TextureType GetType(TextureGradientType type) { switch (type) { - case TextureType::_1D: + case TextureGradientType::_1D: return Shader::TextureType::Color1D; - case TextureType::ARRAY_1D: + case TextureGradientType::ARRAY_1D: return Shader::TextureType::ColorArray1D; - case TextureType::_2D: + case TextureGradientType::_2D: return Shader::TextureType::Color2D; - case TextureType::ARRAY_2D: + case TextureGradientType::ARRAY_2D: return Shader::TextureType::ColorArray2D; - case TextureType::_3D: + case TextureGradientType::_3D: return Shader::TextureType::Color3D; - case TextureType::ARRAY_3D: + case TextureGradientType::ARRAY_3D: throw NotImplementedException("3D array texture type"); - case TextureType::CUBE: + case TextureGradientType::CUBE: return Shader::TextureType::ColorCube; - case TextureType::ARRAY_CUBE: + case TextureGradientType::ARRAY_CUBE: return Shader::TextureType::ColorArrayCube; } throw NotImplementedException("Invalid texture type {}", type); @@ -50,7 +53,7 @@ IR::Value MakeOffset(TranslatorVisitor& v, IR::Reg reg, bool has_lod_clamp) { v.ir.BitFieldExtract(value, v.ir.Imm32(base + 4), v.ir.Imm32(4), true)); } -void Impl(TranslatorVisitor& v, u64 insn, bool is_bindless) { +void TextureGatherImpl(TranslatorVisitor& v, u64 insn, bool is_bindless) { union { u64 raw; BitField<49, 1, u64> nodep; @@ -60,7 +63,7 @@ void Impl(TranslatorVisitor& v, u64 insn, bool is_bindless) { BitField<0, 8, IR::Reg> dest_reg; BitField<8, 8, IR::Reg> coord_reg; BitField<20, 8, IR::Reg> derivative_reg; - BitField<28, 3, TextureType> type; + BitField<28, 3, TextureGradientType> type; BitField<31, 4, u64> mask; BitField<36, 13, u64> cbuf_offset; } const txd{insn}; @@ -88,25 +91,25 @@ void Impl(TranslatorVisitor& v, u64 insn, bool is_bindless) { return v.ir.ConvertUToF(32, 16, array_index); }}; switch (txd.type) { - case TextureType::_1D: { + case TextureGradientType::_1D: { coords = v.F(base_reg); num_derivatives = 1; last_reg = base_reg + 1; break; } - case TextureType::ARRAY_1D: { + case TextureGradientType::ARRAY_1D: { last_reg = base_reg + 1; coords = v.ir.CompositeConstruct(v.F(base_reg), read_array()); num_derivatives = 1; break; } - case TextureType::_2D: { + case TextureGradientType::_2D: { last_reg = base_reg + 2; coords = v.ir.CompositeConstruct(v.F(base_reg), v.F(base_reg + 1)); num_derivatives = 2; break; } - case TextureType::ARRAY_2D: { + case TextureGradientType::ARRAY_2D: { last_reg = base_reg + 2; coords = v.ir.CompositeConstruct(v.F(base_reg), v.F(base_reg + 1), read_array()); num_derivatives = 2; @@ -170,11 +173,11 @@ void Impl(TranslatorVisitor& v, u64 insn, bool is_bindless) { } // Anonymous namespace void TranslatorVisitor::TXD(u64 insn) { - Impl(*this, insn, false); + TextureGatherImpl(*this, insn, false); } void TranslatorVisitor::TXD_b(u64 insn) { - Impl(*this, insn, true); + TextureGatherImpl(*this, insn, true); } } // namespace Shader::Maxwell diff --git a/src/shader_recompiler/frontend/maxwell/translate/impl/texture_load.cpp b/src/shader_recompiler/frontend/maxwell/translate/impl/texture_load.cpp index 0a7821e188..6209ffe482 100644 --- a/src/shader_recompiler/frontend/maxwell/translate/impl/texture_load.cpp +++ b/src/shader_recompiler/frontend/maxwell/translate/impl/texture_load.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -9,7 +12,7 @@ namespace Shader::Maxwell { namespace { -enum class TextureType : u64 { +enum class TextureLoadType : u64 { _1D, ARRAY_1D, _2D, @@ -20,77 +23,77 @@ enum class TextureType : u64 { ARRAY_CUBE, }; -Shader::TextureType GetType(TextureType type) { +Shader::TextureType GetType(TextureLoadType type) { switch (type) { - case TextureType::_1D: + case TextureLoadType::_1D: return Shader::TextureType::Color1D; - case TextureType::ARRAY_1D: + case TextureLoadType::ARRAY_1D: return Shader::TextureType::ColorArray1D; - case TextureType::_2D: + case TextureLoadType::_2D: return Shader::TextureType::Color2D; - case TextureType::ARRAY_2D: + case TextureLoadType::ARRAY_2D: return Shader::TextureType::ColorArray2D; - case TextureType::_3D: + case TextureLoadType::_3D: return Shader::TextureType::Color3D; - case TextureType::ARRAY_3D: + case TextureLoadType::ARRAY_3D: throw NotImplementedException("3D array texture type"); - case TextureType::CUBE: + case TextureLoadType::CUBE: return Shader::TextureType::ColorCube; - case TextureType::ARRAY_CUBE: + case TextureLoadType::ARRAY_CUBE: return Shader::TextureType::ColorArrayCube; } throw NotImplementedException("Invalid texture type {}", type); } -IR::Value MakeCoords(TranslatorVisitor& v, IR::Reg reg, TextureType type) { +IR::Value MakeCoords(TranslatorVisitor& v, IR::Reg reg, TextureLoadType type) { const auto read_array{ [&]() -> IR::U32 { return v.ir.BitFieldExtract(v.X(reg), v.ir.Imm32(0), v.ir.Imm32(16)); }}; switch (type) { - case TextureType::_1D: + case TextureLoadType::_1D: return v.X(reg); - case TextureType::ARRAY_1D: + case TextureLoadType::ARRAY_1D: return v.ir.CompositeConstruct(v.X(reg + 1), read_array()); - case TextureType::_2D: + case TextureLoadType::_2D: return v.ir.CompositeConstruct(v.X(reg), v.X(reg + 1)); - case TextureType::ARRAY_2D: + case TextureLoadType::ARRAY_2D: return v.ir.CompositeConstruct(v.X(reg + 1), v.X(reg + 2), read_array()); - case TextureType::_3D: + case TextureLoadType::_3D: return v.ir.CompositeConstruct(v.X(reg), v.X(reg + 1), v.X(reg + 2)); - case TextureType::ARRAY_3D: + case TextureLoadType::ARRAY_3D: throw NotImplementedException("3D array texture type"); - case TextureType::CUBE: + case TextureLoadType::CUBE: return v.ir.CompositeConstruct(v.X(reg), v.X(reg + 1), v.X(reg + 2)); - case TextureType::ARRAY_CUBE: + case TextureLoadType::ARRAY_CUBE: return v.ir.CompositeConstruct(v.X(reg + 1), v.X(reg + 2), v.X(reg + 3), read_array()); } throw NotImplementedException("Invalid texture type {}", type); } -IR::Value MakeOffset(TranslatorVisitor& v, IR::Reg& reg, TextureType type) { +IR::Value MakeOffset(TranslatorVisitor& v, IR::Reg& reg, TextureLoadType type) { const IR::U32 value{v.X(reg++)}; switch (type) { - case TextureType::_1D: - case TextureType::ARRAY_1D: + case TextureLoadType::_1D: + case TextureLoadType::ARRAY_1D: return v.ir.BitFieldExtract(value, v.ir.Imm32(0), v.ir.Imm32(4), true); - case TextureType::_2D: - case TextureType::ARRAY_2D: + case TextureLoadType::_2D: + case TextureLoadType::ARRAY_2D: return v.ir.CompositeConstruct( v.ir.BitFieldExtract(value, v.ir.Imm32(0), v.ir.Imm32(4), true), v.ir.BitFieldExtract(value, v.ir.Imm32(4), v.ir.Imm32(4), true)); - case TextureType::_3D: - case TextureType::ARRAY_3D: + case TextureLoadType::_3D: + case TextureLoadType::ARRAY_3D: return v.ir.CompositeConstruct( v.ir.BitFieldExtract(value, v.ir.Imm32(0), v.ir.Imm32(4), true), v.ir.BitFieldExtract(value, v.ir.Imm32(4), v.ir.Imm32(4), true), v.ir.BitFieldExtract(value, v.ir.Imm32(8), v.ir.Imm32(4), true)); - case TextureType::CUBE: - case TextureType::ARRAY_CUBE: + case TextureLoadType::CUBE: + case TextureLoadType::ARRAY_CUBE: throw NotImplementedException("Illegal offset on CUBE sample"); } throw NotImplementedException("Invalid texture type {}", type); } -void Impl(TranslatorVisitor& v, u64 insn, bool is_bindless) { +void TextureLoadImpl(TranslatorVisitor& v, u64 insn, bool is_bindless) { union { u64 raw; BitField<49, 1, u64> nodep; @@ -102,7 +105,7 @@ void Impl(TranslatorVisitor& v, u64 insn, bool is_bindless) { BitField<0, 8, IR::Reg> dest_reg; BitField<8, 8, IR::Reg> coord_reg; BitField<20, 8, IR::Reg> meta_reg; - BitField<28, 3, TextureType> type; + BitField<28, 3, TextureLoadType> type; BitField<31, 4, u64> mask; BitField<36, 13, u64> cbuf_offset; } const tld{insn}; @@ -152,11 +155,11 @@ void Impl(TranslatorVisitor& v, u64 insn, bool is_bindless) { } // Anonymous namespace void TranslatorVisitor::TLD(u64 insn) { - Impl(*this, insn, false); + TextureLoadImpl(*this, insn, false); } void TranslatorVisitor::TLD_b(u64 insn) { - Impl(*this, insn, true); + TextureLoadImpl(*this, insn, true); } } // namespace Shader::Maxwell diff --git a/src/shader_recompiler/frontend/maxwell/translate/impl/texture_load_swizzled.cpp b/src/shader_recompiler/frontend/maxwell/translate/impl/texture_load_swizzled.cpp index 0362f076af..13583784bc 100644 --- a/src/shader_recompiler/frontend/maxwell/translate/impl/texture_load_swizzled.cpp +++ b/src/shader_recompiler/frontend/maxwell/translate/impl/texture_load_swizzled.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -10,38 +13,14 @@ namespace Shader::Maxwell { namespace { -enum class Precision : u64 { +enum class TextureLoadSwizzledPrecision : u64 { F16, F32, }; -constexpr unsigned R = 1; -constexpr unsigned G = 2; -constexpr unsigned B = 4; -constexpr unsigned A = 8; - -constexpr std::array RG_LUT{ - R, // - G, // - B, // - A, // - R | G, // - R | A, // - G | A, // - B | A, // -}; - -constexpr std::array RGBA_LUT{ - R | G | B, // - R | G | A, // - R | B | A, // - G | B | A, // - R | G | B | A, // -}; - -union Encoding { +union EncodinTLS { u64 raw; - BitField<59, 1, Precision> precision; + BitField<59, 1, TextureLoadSwizzledPrecision> precision; BitField<54, 1, u64> aoffi; BitField<53, 1, u64> lod; BitField<55, 1, u64> ms; @@ -55,20 +34,20 @@ union Encoding { BitField<53, 4, u64> encoding; }; -void CheckAlignment(IR::Reg reg, size_t alignment) { +void CheckAlignmentTLS(IR::Reg reg, size_t alignment) { if (!IR::IsAligned(reg, alignment)) { throw NotImplementedException("Unaligned source register {}", reg); } } -IR::Value MakeOffset(TranslatorVisitor& v, IR::Reg reg) { +IR::Value MakeLoadOffset(TranslatorVisitor& v, IR::Reg reg) { const IR::U32 value{v.X(reg)}; return v.ir.CompositeConstruct(v.ir.BitFieldExtract(value, v.ir.Imm32(0), v.ir.Imm32(4), true), v.ir.BitFieldExtract(value, v.ir.Imm32(4), v.ir.Imm32(4), true)); } -IR::Value Sample(TranslatorVisitor& v, u64 insn) { - const Encoding tlds{insn}; +IR::Value SampleTLS(TranslatorVisitor& v, u64 insn) { + const EncodinTLS tlds{insn}; const IR::U32 handle{v.ir.Imm32(static_cast(tlds.cbuf_offset * 4))}; const IR::Reg reg_a{tlds.src_reg_a}; const IR::Reg reg_b{tlds.src_reg_b}; @@ -92,56 +71,81 @@ IR::Value Sample(TranslatorVisitor& v, u64 insn) { coords = v.ir.CompositeConstruct(v.X(reg_a), v.X(reg_b)); break; case 4: - CheckAlignment(reg_a, 2); + CheckAlignmentTLS(reg_a, 2); texture_type = Shader::TextureType::Color2D; coords = v.ir.CompositeConstruct(v.X(reg_a), v.X(reg_a + 1)); - offsets = MakeOffset(v, reg_b); + offsets = MakeLoadOffset(v, reg_b); break; case 5: - CheckAlignment(reg_a, 2); + CheckAlignmentTLS(reg_a, 2); texture_type = Shader::TextureType::Color2D; coords = v.ir.CompositeConstruct(v.X(reg_a), v.X(reg_a + 1)); lod = v.X(reg_b); break; case 6: - CheckAlignment(reg_a, 2); + CheckAlignmentTLS(reg_a, 2); texture_type = Shader::TextureType::Color2D; coords = v.ir.CompositeConstruct(v.X(reg_a), v.X(reg_a + 1)); multisample = v.X(reg_b); break; case 7: - CheckAlignment(reg_a, 2); + CheckAlignmentTLS(reg_a, 2); texture_type = Shader::TextureType::Color3D; coords = v.ir.CompositeConstruct(v.X(reg_a), v.X(reg_a + 1), v.X(reg_b)); break; case 8: { - CheckAlignment(reg_b, 2); + CheckAlignmentTLS(reg_b, 2); const IR::U32 array{v.ir.BitFieldExtract(v.X(reg_a), v.ir.Imm32(0), v.ir.Imm32(16))}; texture_type = Shader::TextureType::ColorArray2D; coords = v.ir.CompositeConstruct(v.X(reg_b), v.X(reg_b + 1), array); break; } case 12: - CheckAlignment(reg_a, 2); - CheckAlignment(reg_b, 2); + CheckAlignmentTLS(reg_a, 2); + CheckAlignmentTLS(reg_b, 2); texture_type = Shader::TextureType::Color2D; coords = v.ir.CompositeConstruct(v.X(reg_a), v.X(reg_a + 1)); lod = v.X(reg_b); - offsets = MakeOffset(v, reg_b + 1); + offsets = MakeLoadOffset(v, reg_b + 1); break; default: throw NotImplementedException("Illegal encoding {}", tlds.encoding.Value()); } IR::TextureInstInfo info{}; - if (tlds.precision == Precision::F16) { + if (tlds.precision == TextureLoadSwizzledPrecision::F16) { info.relaxed_precision.Assign(1); } info.type.Assign(texture_type); return v.ir.ImageFetch(handle, coords, offsets, lod, multisample, info); } -unsigned Swizzle(u64 insn) { - const Encoding tlds{insn}; +unsigned LoadSwizzle(u64 insn) { +#define R 1 +#define G 2 +#define B 4 +#define A 8 + static constexpr std::array RG_LUT{ + R, // + G, // + B, // + A, // + R | G, // + R | A, // + G | A, // + B | A, // + }; + static constexpr std::array RGBA_LUT{ + R | G | B, // + R | G | A, // + R | B | A, // + G | B | A, // + R | G | B | A, // + }; +#undef R +#undef G +#undef B +#undef A + const EncodinTLS tlds{insn}; const size_t encoding{tlds.swizzle}; if (tlds.dest_reg_b == IR::Reg::RZ) { if (encoding >= RG_LUT.size()) { @@ -156,73 +160,73 @@ unsigned Swizzle(u64 insn) { } } -IR::F32 Extract(TranslatorVisitor& v, const IR::Value& sample, unsigned component) { +IR::F32 LoadExtract(TranslatorVisitor& v, const IR::Value& sample, unsigned component) { return IR::F32{v.ir.CompositeExtract(sample, component)}; } -IR::Reg RegStoreComponent32(u64 insn, unsigned index) { - const Encoding tlds{insn}; +IR::Reg LoadRegStoreComponent32(u64 insn, unsigned index) { + const EncodinTLS tlds{insn}; switch (index) { case 0: return tlds.dest_reg_a; case 1: - CheckAlignment(tlds.dest_reg_a, 2); + CheckAlignmentTLS(tlds.dest_reg_a, 2); return tlds.dest_reg_a + 1; case 2: return tlds.dest_reg_b; case 3: - CheckAlignment(tlds.dest_reg_b, 2); + CheckAlignmentTLS(tlds.dest_reg_b, 2); return tlds.dest_reg_b + 1; } throw LogicError("Invalid store index {}", index); } -void Store32(TranslatorVisitor& v, u64 insn, const IR::Value& sample) { - const unsigned swizzle{Swizzle(insn)}; +void Store32TLS(TranslatorVisitor& v, u64 insn, const IR::Value& sample) { + const unsigned swizzle{LoadSwizzle(insn)}; unsigned store_index{0}; for (unsigned component = 0; component < 4; ++component) { if (((swizzle >> component) & 1) == 0) { continue; } - const IR::Reg dest{RegStoreComponent32(insn, store_index)}; - v.F(dest, Extract(v, sample, component)); + const IR::Reg dest{LoadRegStoreComponent32(insn, store_index)}; + v.F(dest, LoadExtract(v, sample, component)); ++store_index; } } -IR::U32 Pack(TranslatorVisitor& v, const IR::F32& lhs, const IR::F32& rhs) { +IR::U32 PackTLS(TranslatorVisitor& v, const IR::F32& lhs, const IR::F32& rhs) { return v.ir.PackHalf2x16(v.ir.CompositeConstruct(lhs, rhs)); } -void Store16(TranslatorVisitor& v, u64 insn, const IR::Value& sample) { - const unsigned swizzle{Swizzle(insn)}; +void Store16TLS(TranslatorVisitor& v, u64 insn, const IR::Value& sample) { + const unsigned swizzle{LoadSwizzle(insn)}; unsigned store_index{0}; std::array swizzled; for (unsigned component = 0; component < 4; ++component) { if (((swizzle >> component) & 1) == 0) { continue; } - swizzled[store_index] = Extract(v, sample, component); + swizzled[store_index] = LoadExtract(v, sample, component); ++store_index; } const IR::F32 zero{v.ir.Imm32(0.0f)}; - const Encoding tlds{insn}; + const EncodinTLS tlds{insn}; switch (store_index) { case 1: - v.X(tlds.dest_reg_a, Pack(v, swizzled[0], zero)); + v.X(tlds.dest_reg_a, PackTLS(v, swizzled[0], zero)); break; case 2: case 3: case 4: - v.X(tlds.dest_reg_a, Pack(v, swizzled[0], swizzled[1])); + v.X(tlds.dest_reg_a, PackTLS(v, swizzled[0], swizzled[1])); switch (store_index) { case 2: break; case 3: - v.X(tlds.dest_reg_b, Pack(v, swizzled[2], zero)); + v.X(tlds.dest_reg_b, PackTLS(v, swizzled[2], zero)); break; case 4: - v.X(tlds.dest_reg_b, Pack(v, swizzled[2], swizzled[3])); + v.X(tlds.dest_reg_b, PackTLS(v, swizzled[2], swizzled[3])); break; } break; @@ -231,11 +235,11 @@ void Store16(TranslatorVisitor& v, u64 insn, const IR::Value& sample) { } // Anonymous namespace void TranslatorVisitor::TLDS(u64 insn) { - const IR::Value sample{Sample(*this, insn)}; - if (Encoding{insn}.precision == Precision::F32) { - Store32(*this, insn, sample); + const IR::Value sample{SampleTLS(*this, insn)}; + if (EncodinTLS{insn}.precision == TextureLoadSwizzledPrecision::F32) { + Store32TLS(*this, insn, sample); } else { - Store16(*this, insn, sample); + Store16TLS(*this, insn, sample); } } } // namespace Shader::Maxwell diff --git a/src/shader_recompiler/frontend/maxwell/translate/impl/texture_mipmap_level.cpp b/src/shader_recompiler/frontend/maxwell/translate/impl/texture_mipmap_level.cpp index eeb49444f2..a093e22f1a 100644 --- a/src/shader_recompiler/frontend/maxwell/translate/impl/texture_mipmap_level.cpp +++ b/src/shader_recompiler/frontend/maxwell/translate/impl/texture_mipmap_level.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -9,7 +12,7 @@ namespace Shader::Maxwell { namespace { -enum class TextureType : u64 { +enum class TextureMipmapLevelType : u64 { _1D, ARRAY_1D, _2D, @@ -20,53 +23,53 @@ enum class TextureType : u64 { ARRAY_CUBE, }; -Shader::TextureType GetType(TextureType type) { +Shader::TextureType GetType(TextureMipmapLevelType type) { switch (type) { - case TextureType::_1D: + case TextureMipmapLevelType::_1D: return Shader::TextureType::Color1D; - case TextureType::ARRAY_1D: + case TextureMipmapLevelType::ARRAY_1D: return Shader::TextureType::ColorArray1D; - case TextureType::_2D: + case TextureMipmapLevelType::_2D: return Shader::TextureType::Color2D; - case TextureType::ARRAY_2D: + case TextureMipmapLevelType::ARRAY_2D: return Shader::TextureType::ColorArray2D; - case TextureType::_3D: + case TextureMipmapLevelType::_3D: return Shader::TextureType::Color3D; - case TextureType::ARRAY_3D: + case TextureMipmapLevelType::ARRAY_3D: throw NotImplementedException("3D array texture type"); - case TextureType::CUBE: + case TextureMipmapLevelType::CUBE: return Shader::TextureType::ColorCube; - case TextureType::ARRAY_CUBE: + case TextureMipmapLevelType::ARRAY_CUBE: return Shader::TextureType::ColorArrayCube; } throw NotImplementedException("Invalid texture type {}", type); } -IR::Value MakeCoords(TranslatorVisitor& v, IR::Reg reg, TextureType type) { +IR::Value MakeCoords(TranslatorVisitor& v, IR::Reg reg, TextureMipmapLevelType type) { // The ISA reads an array component here, but this is not needed on high level shading languages // We are dropping this information. switch (type) { - case TextureType::_1D: + case TextureMipmapLevelType::_1D: return v.F(reg); - case TextureType::ARRAY_1D: + case TextureMipmapLevelType::ARRAY_1D: return v.F(reg + 1); - case TextureType::_2D: + case TextureMipmapLevelType::_2D: return v.ir.CompositeConstruct(v.F(reg), v.F(reg + 1)); - case TextureType::ARRAY_2D: + case TextureMipmapLevelType::ARRAY_2D: return v.ir.CompositeConstruct(v.F(reg + 1), v.F(reg + 2)); - case TextureType::_3D: + case TextureMipmapLevelType::_3D: return v.ir.CompositeConstruct(v.F(reg), v.F(reg + 1), v.F(reg + 2)); - case TextureType::ARRAY_3D: + case TextureMipmapLevelType::ARRAY_3D: throw NotImplementedException("3D array texture type"); - case TextureType::CUBE: + case TextureMipmapLevelType::CUBE: return v.ir.CompositeConstruct(v.F(reg), v.F(reg + 1), v.F(reg + 2)); - case TextureType::ARRAY_CUBE: + case TextureMipmapLevelType::ARRAY_CUBE: return v.ir.CompositeConstruct(v.F(reg + 1), v.F(reg + 2), v.F(reg + 3)); } throw NotImplementedException("Invalid texture type {}", type); } -void Impl(TranslatorVisitor& v, u64 insn, bool is_bindless) { +void TextureMipmapLevelImpl(TranslatorVisitor& v, u64 insn, bool is_bindless) { union { u64 raw; BitField<49, 1, u64> nodep; @@ -74,7 +77,7 @@ void Impl(TranslatorVisitor& v, u64 insn, bool is_bindless) { BitField<0, 8, IR::Reg> dest_reg; BitField<8, 8, IR::Reg> coord_reg; BitField<20, 8, IR::Reg> meta_reg; - BitField<28, 3, TextureType> type; + BitField<28, 3, TextureMipmapLevelType> type; BitField<31, 4, u64> mask; BitField<36, 13, u64> cbuf_offset; } const tmml{insn}; @@ -113,11 +116,11 @@ void Impl(TranslatorVisitor& v, u64 insn, bool is_bindless) { } // Anonymous namespace void TranslatorVisitor::TMML(u64 insn) { - Impl(*this, insn, false); + TextureMipmapLevelImpl(*this, insn, false); } void TranslatorVisitor::TMML_b(u64 insn) { - Impl(*this, insn, true); + TextureMipmapLevelImpl(*this, insn, true); } } // namespace Shader::Maxwell diff --git a/src/shader_recompiler/frontend/maxwell/translate/impl/texture_query.cpp b/src/shader_recompiler/frontend/maxwell/translate/impl/texture_query.cpp index 39af625596..9ca2a67cad 100644 --- a/src/shader_recompiler/frontend/maxwell/translate/impl/texture_query.cpp +++ b/src/shader_recompiler/frontend/maxwell/translate/impl/texture_query.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -9,24 +12,24 @@ namespace Shader::Maxwell { namespace { -enum class Mode : u64 { +enum class TextureQueryMode : u64 { Dimension = 1, TextureType = 2, SamplePos = 5, }; -IR::Value Query(TranslatorVisitor& v, const IR::U32& handle, Mode mode, IR::Reg src_reg, u64 mask) { +IR::Value Query(TranslatorVisitor& v, const IR::U32& handle, TextureQueryMode mode, IR::Reg src_reg, u64 mask) { switch (mode) { - case Mode::Dimension: { + case TextureQueryMode::Dimension: { const bool needs_num_mips{((mask >> 3) & 1) != 0}; const IR::U1 skip_mips{v.ir.Imm1(!needs_num_mips)}; const IR::U32 lod{v.X(src_reg)}; return v.ir.ImageQueryDimension(handle, lod, skip_mips); } - case Mode::TextureType: - case Mode::SamplePos: + case TextureQueryMode::TextureType: + case TextureQueryMode::SamplePos: default: - throw NotImplementedException("Mode {}", mode); + throw NotImplementedException("TextureQueryMode {}", mode); } } @@ -36,7 +39,7 @@ void Impl(TranslatorVisitor& v, u64 insn, std::optional cbuf_offset) { BitField<49, 1, u64> nodep; BitField<0, 8, IR::Reg> dest_reg; BitField<8, 8, IR::Reg> src_reg; - BitField<22, 3, Mode> mode; + BitField<22, 3, TextureQueryMode> mode; BitField<31, 4, u64> mask; } const txq{insn}; diff --git a/src/shader_recompiler/ir_opt/lower_fp16_to_fp32.cpp b/src/shader_recompiler/ir_opt/lower_fp16_to_fp32.cpp index 71e12b3e4d..5ef836dc9f 100644 --- a/src/shader_recompiler/ir_opt/lower_fp16_to_fp32.cpp +++ b/src/shader_recompiler/ir_opt/lower_fp16_to_fp32.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -6,7 +9,7 @@ namespace Shader::Optimization { namespace { -IR::Opcode Replace(IR::Opcode op) { +IR::Opcode ReplaceFP16ToFP32(IR::Opcode op) { switch (op) { case IR::Opcode::FPAbs16: return IR::Opcode::FPAbs32; @@ -131,7 +134,7 @@ IR::Opcode Replace(IR::Opcode op) { void LowerFp16ToFp32(IR::Program& program) { for (IR::Block* const block : program.blocks) { for (IR::Inst& inst : block->Instructions()) { - inst.ReplaceOpcode(Replace(inst.GetOpcode())); + inst.ReplaceOpcode(ReplaceFP16ToFP32(inst.GetOpcode())); } } } diff --git a/src/shader_recompiler/ir_opt/lower_fp64_to_fp32.cpp b/src/shader_recompiler/ir_opt/lower_fp64_to_fp32.cpp index 5db7a38add..1ae1b82ebd 100644 --- a/src/shader_recompiler/ir_opt/lower_fp64_to_fp32.cpp +++ b/src/shader_recompiler/ir_opt/lower_fp64_to_fp32.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -49,7 +52,7 @@ IR::Value F32ToPackedF64(IR::IREmitter& ir, const IR::Value& raw) { return ir.CompositeConstruct(lo, hi); } -IR::Opcode Replace(IR::Opcode op) { +IR::Opcode ReplaceFP64ToFP32(IR::Opcode op) { switch (op) { case IR::Opcode::FPAbs64: return IR::Opcode::FPAbs32; @@ -154,7 +157,7 @@ IR::Opcode Replace(IR::Opcode op) { } } -void Lower(IR::Block& block, IR::Inst& inst) { +void LowerFP64ToFP32(IR::Block& block, IR::Inst& inst) { switch (inst.GetOpcode()) { case IR::Opcode::PackDouble2x32: { IR::IREmitter ir(block, IR::Block::InstructionList::s_iterator_to(inst)); @@ -167,7 +170,7 @@ void Lower(IR::Block& block, IR::Inst& inst) { break; } default: - inst.ReplaceOpcode(Replace(inst.GetOpcode())); + inst.ReplaceOpcode(ReplaceFP64ToFP32(inst.GetOpcode())); break; } } @@ -177,7 +180,7 @@ void Lower(IR::Block& block, IR::Inst& inst) { void LowerFp64ToFp32(IR::Program& program) { for (IR::Block* const block : program.blocks) { for (IR::Inst& inst : block->Instructions()) { - Lower(*block, inst); + LowerFP64ToFP32(*block, inst); } } } diff --git a/src/shader_recompiler/ir_opt/lower_int64_to_int32.cpp b/src/shader_recompiler/ir_opt/lower_int64_to_int32.cpp index cdb58f46b3..fd4fde772b 100644 --- a/src/shader_recompiler/ir_opt/lower_int64_to_int32.cpp +++ b/src/shader_recompiler/ir_opt/lower_int64_to_int32.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -181,7 +184,7 @@ void ShiftRightArithmetic64To32(IR::Block& block, IR::Inst& inst) { inst.ReplaceUsesWith(ir.CompositeConstruct(ret_lo, ret_hi)); } -void Lower(IR::Block& block, IR::Inst& inst) { +void LowerI64ToI32(IR::Block& block, IR::Inst& inst) { switch (inst.GetOpcode()) { case IR::Opcode::PackUint2x32: case IR::Opcode::UnpackUint2x32: @@ -229,7 +232,7 @@ void LowerInt64ToInt32(IR::Program& program) { for (auto it = program.post_order_blocks.rbegin(); it != end; ++it) { IR::Block* const block{*it}; for (IR::Inst& inst : block->Instructions()) { - Lower(*block, inst); + LowerI64ToI32(*block, inst); } } } diff --git a/src/shader_recompiler/stage.h b/src/shader_recompiler/stage.h index 9af0a1b720..a8cafd53a0 100644 --- a/src/shader_recompiler/stage.h +++ b/src/shader_recompiler/stage.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -20,8 +23,8 @@ enum class Stage : u32 { }; constexpr u32 MaxStageTypes = 6; -[[nodiscard]] constexpr Stage StageFromIndex(size_t index) noexcept { - return static_cast(static_cast(Stage::VertexB) + index); +[[nodiscard]] constexpr Stage StageFromIndex(std::size_t index) noexcept { + return static_cast(static_cast(Stage::VertexB) + index); } } // namespace Shader diff --git a/src/tests/CMakeLists.txt b/src/tests/CMakeLists.txt index 875c40604c..7de0898b58 100644 --- a/src/tests/CMakeLists.txt +++ b/src/tests/CMakeLists.txt @@ -37,3 +37,5 @@ if (NOT MSVC) $<$:-Wno-unused-parameter> $<$:-Wno-missing-field-initializers>) endif() + +set_target_properties(tests PROPERTIES UNITY_BUILD OFF) diff --git a/src/tests/common/bit_field.cpp b/src/tests/common/bit_field.cpp index 2d23ade06e..b915b7c089 100644 --- a/src/tests/common/bit_field.cpp +++ b/src/tests/common/bit_field.cpp @@ -1,12 +1,9 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: 2019 Citra Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later -#define VMA_IMPLEMENTATION -#include "video_core/vulkan_common/vma.h" - #include #include #include @@ -93,3 +90,6 @@ TEST_CASE("BitField", "[common]") { 0b11000111, }}); } + +#define VMA_IMPLEMENTATION +#include "video_core/vulkan_common/vma.h" diff --git a/src/tests/input_common/calibration_configuration_job.cpp b/src/tests/input_common/calibration_configuration_job.cpp index 6ded0dfc86..84ec4fd3b2 100644 --- a/src/tests/input_common/calibration_configuration_job.cpp +++ b/src/tests/input_common/calibration_configuration_job.cpp @@ -103,7 +103,7 @@ TEST_CASE("CalibrationConfigurationJob completed", "[input_common]") { .y = 200, }}); - InputCommon::CemuhookUDP::CalibrationConfigurationJob::Status status{}; + InputCommon::CemuhookUDP::CalibrationConfigurationJob::CalibrationStatus status{}; u16 min_x{}; u16 min_y{}; u16 max_x{}; @@ -111,10 +111,10 @@ TEST_CASE("CalibrationConfigurationJob completed", "[input_common]") { InputCommon::CemuhookUDP::CalibrationConfigurationJob job( server.GetHost(), server.GetPort(), [&status, - &complete_event](InputCommon::CemuhookUDP::CalibrationConfigurationJob::Status status_) { + &complete_event](InputCommon::CemuhookUDP::CalibrationConfigurationJob::CalibrationStatus status_) { status = status_; if (status == - InputCommon::CemuhookUDP::CalibrationConfigurationJob::Status::Completed) { + InputCommon::CemuhookUDP::CalibrationConfigurationJob::CalibrationStatus::Completed) { complete_event.Set(); } }, @@ -126,7 +126,7 @@ TEST_CASE("CalibrationConfigurationJob completed", "[input_common]") { }); complete_event.WaitUntil(std::chrono::system_clock::now() + std::chrono::seconds(10)); - REQUIRE(status == InputCommon::CemuhookUDP::CalibrationConfigurationJob::Status::Completed); + REQUIRE(status == InputCommon::CemuhookUDP::CalibrationConfigurationJob::CalibrationStatus::Completed); REQUIRE(min_x == 0); REQUIRE(min_y == 0); REQUIRE(max_x == 200); diff --git a/src/video_core/CMakeLists.txt b/src/video_core/CMakeLists.txt index 362b068656..205d02ca78 100644 --- a/src/video_core/CMakeLists.txt +++ b/src/video_core/CMakeLists.txt @@ -16,7 +16,6 @@ endif() add_library(video_core STATIC buffer_cache/buffer_base.h buffer_cache/buffer_cache_base.h - buffer_cache/buffer_cache.cpp buffer_cache/buffer_cache.h buffer_cache/memory_tracker_base.h buffer_cache/usage_tracker.h diff --git a/src/video_core/buffer_cache/buffer_cache.cpp b/src/video_core/buffer_cache/buffer_cache.cpp deleted file mode 100644 index 533255e005..0000000000 --- a/src/video_core/buffer_cache/buffer_cache.cpp +++ /dev/null @@ -1,14 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project -// SPDX-License-Identifier: GPL-3.0-or-later - -// SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project -// SPDX-License-Identifier: GPL-3.0-or-later - -#include "video_core/buffer_cache/buffer_cache_base.h" -#include "video_core/control/channel_state_cache.inc" - -namespace VideoCommon { - -template class VideoCommon::ChannelSetupCaches; - -} // namespace VideoCommon diff --git a/src/video_core/compatible_formats.cpp b/src/video_core/compatible_formats.cpp index 87d69ebc53..c025dd0edb 100644 --- a/src/video_core/compatible_formats.cpp +++ b/src/video_core/compatible_formats.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -23,10 +26,9 @@ constexpr std::array VIEW_CLASS_128_BITS{ constexpr std::array VIEW_CLASS_96_BITS{ PixelFormat::R32G32B32_FLOAT, + PixelFormat::R32G32B32A32_SINT, + PixelFormat::R32G32B32A32_UINT, }; -// Missing formats: -// PixelFormat::RGB32UI, -// PixelFormat::RGB32I, constexpr std::array VIEW_CLASS_64_BITS{ PixelFormat::R32G32_FLOAT, PixelFormat::R32G32_UINT, diff --git a/src/video_core/control/channel_state_cache.cpp b/src/video_core/control/channel_state_cache.cpp index f8c6a762d2..4ab071e37d 100644 --- a/src/video_core/control/channel_state_cache.cpp +++ b/src/video_core/control/channel_state_cache.cpp @@ -1,7 +1,13 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: 2022 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later -#include "video_core/control/channel_state_cache.inc" +#include "video_core/buffer_cache/buffer_cache_base.h" +#include "video_core/control/channel_state.h" +#include "video_core/control/channel_state_cache.h" +#include "video_core/texture_cache/texture_cache_base.h" namespace VideoCommon { @@ -9,6 +15,82 @@ ChannelInfo::ChannelInfo(Tegra::Control::ChannelState& channel_state) : maxwell3d{*channel_state.maxwell_3d}, kepler_compute{*channel_state.kepler_compute}, gpu_memory{*channel_state.memory_manager}, program_id{channel_state.program_id} {} +template +ChannelSetupCaches

::~ChannelSetupCaches() = default; + +template +void ChannelSetupCaches

::CreateChannel(struct Tegra::Control::ChannelState& channel) { + std::unique_lock lk(config_mutex); + ASSERT(channel_map.find(channel.bind_id) == channel_map.end() && channel.bind_id >= 0); + auto new_id = [this, &channel]() { + if (!free_channel_ids.empty()) { + auto id = free_channel_ids.front(); + free_channel_ids.pop_front(); + new (&channel_storage[id]) P(channel); + return id; + } + channel_storage.emplace_back(channel); + return channel_storage.size() - 1; + }(); + channel_map.emplace(channel.bind_id, new_id); + if (current_channel_id != UNSET_CHANNEL) { + channel_state = &channel_storage[current_channel_id]; + } + active_channel_ids.push_back(new_id); + auto as_it = address_spaces.find(channel.memory_manager->GetID()); + if (as_it != address_spaces.end()) { + as_it->second.ref_count++; + return; + } + AddressSpaceRef new_gpu_mem_ref{ + .ref_count = 1, + .storage_id = address_spaces.size(), + .gpu_memory = channel.memory_manager.get(), + }; + address_spaces.emplace(channel.memory_manager->GetID(), new_gpu_mem_ref); + OnGPUASRegister(channel.memory_manager->GetID()); +} + +/// Bind a channel for execution. +template +void ChannelSetupCaches

::BindToChannel(s32 id) { + std::unique_lock lk(config_mutex); + auto it = channel_map.find(id); + ASSERT(it != channel_map.end() && id >= 0); + current_channel_id = it->second; + channel_state = &channel_storage[current_channel_id]; + maxwell3d = &channel_state->maxwell3d; + kepler_compute = &channel_state->kepler_compute; + gpu_memory = &channel_state->gpu_memory; + program_id = channel_state->program_id; + current_address_space = gpu_memory->GetID(); +} + +/// Erase channel's channel_state. +template +void ChannelSetupCaches

::EraseChannel(s32 id) { + std::unique_lock lk(config_mutex); + const auto it = channel_map.find(id); + ASSERT(it != channel_map.end() && id >= 0); + const auto this_id = it->second; + free_channel_ids.push_back(this_id); + channel_map.erase(it); + if (this_id == current_channel_id) { + current_channel_id = UNSET_CHANNEL; + channel_state = nullptr; + maxwell3d = nullptr; + kepler_compute = nullptr; + gpu_memory = nullptr; + program_id = 0; + } else if (current_channel_id != UNSET_CHANNEL) { + channel_state = &channel_storage[current_channel_id]; + } + active_channel_ids.erase( + std::find(active_channel_ids.begin(), active_channel_ids.end(), this_id)); +} + template class VideoCommon::ChannelSetupCaches; +template class VideoCommon::ChannelSetupCaches; +template class VideoCommon::ChannelSetupCaches; } // namespace VideoCommon diff --git a/src/video_core/control/channel_state_cache.inc b/src/video_core/control/channel_state_cache.inc deleted file mode 100644 index d882d8222f..0000000000 --- a/src/video_core/control/channel_state_cache.inc +++ /dev/null @@ -1,88 +0,0 @@ -// SPDX-FileCopyrightText: 2022 yuzu Emulator Project -// SPDX-License-Identifier: GPL-3.0-or-later - -#include - -#include "video_core/control/channel_state.h" -#include "video_core/control/channel_state_cache.h" -#include "video_core/engines/kepler_compute.h" -#include "video_core/engines/maxwell_3d.h" -#include "video_core/memory_manager.h" - -namespace VideoCommon { - -template -ChannelSetupCaches

::~ChannelSetupCaches() = default; - -template -void ChannelSetupCaches

::CreateChannel(struct Tegra::Control::ChannelState& channel) { - std::unique_lock lk(config_mutex); - ASSERT(channel_map.find(channel.bind_id) == channel_map.end() && channel.bind_id >= 0); - auto new_id = [this, &channel]() { - if (!free_channel_ids.empty()) { - auto id = free_channel_ids.front(); - free_channel_ids.pop_front(); - new (&channel_storage[id]) P(channel); - return id; - } - channel_storage.emplace_back(channel); - return channel_storage.size() - 1; - }(); - channel_map.emplace(channel.bind_id, new_id); - if (current_channel_id != UNSET_CHANNEL) { - channel_state = &channel_storage[current_channel_id]; - } - active_channel_ids.push_back(new_id); - auto as_it = address_spaces.find(channel.memory_manager->GetID()); - if (as_it != address_spaces.end()) { - as_it->second.ref_count++; - return; - } - AddressSpaceRef new_gpu_mem_ref{ - .ref_count = 1, - .storage_id = address_spaces.size(), - .gpu_memory = channel.memory_manager.get(), - }; - address_spaces.emplace(channel.memory_manager->GetID(), new_gpu_mem_ref); - OnGPUASRegister(channel.memory_manager->GetID()); -} - -/// Bind a channel for execution. -template -void ChannelSetupCaches

::BindToChannel(s32 id) { - std::unique_lock lk(config_mutex); - auto it = channel_map.find(id); - ASSERT(it != channel_map.end() && id >= 0); - current_channel_id = it->second; - channel_state = &channel_storage[current_channel_id]; - maxwell3d = &channel_state->maxwell3d; - kepler_compute = &channel_state->kepler_compute; - gpu_memory = &channel_state->gpu_memory; - program_id = channel_state->program_id; - current_address_space = gpu_memory->GetID(); -} - -/// Erase channel's channel_state. -template -void ChannelSetupCaches

::EraseChannel(s32 id) { - std::unique_lock lk(config_mutex); - const auto it = channel_map.find(id); - ASSERT(it != channel_map.end() && id >= 0); - const auto this_id = it->second; - free_channel_ids.push_back(this_id); - channel_map.erase(it); - if (this_id == current_channel_id) { - current_channel_id = UNSET_CHANNEL; - channel_state = nullptr; - maxwell3d = nullptr; - kepler_compute = nullptr; - gpu_memory = nullptr; - program_id = 0; - } else if (current_channel_id != UNSET_CHANNEL) { - channel_state = &channel_storage[current_channel_id]; - } - active_channel_ids.erase( - std::find(active_channel_ids.begin(), active_channel_ids.end(), this_id)); -} - -} // namespace VideoCommon diff --git a/src/video_core/dirty_flags.cpp b/src/video_core/dirty_flags.cpp index c2ecc12f56..8d345cffec 100644 --- a/src/video_core/dirty_flags.cpp +++ b/src/video_core/dirty_flags.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2019 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -75,3 +78,6 @@ void SetupDirtyFlags(Maxwell3D::DirtyState::Tables& tables) { } } // namespace VideoCommon::Dirty + +#undef OFF +#undef NUM diff --git a/src/video_core/renderer_opengl/gl_buffer_cache.cpp b/src/video_core/renderer_opengl/gl_buffer_cache.cpp index 59829b667f..52164d3524 100644 --- a/src/video_core/renderer_opengl/gl_buffer_cache.cpp +++ b/src/video_core/renderer_opengl/gl_buffer_cache.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project @@ -12,18 +12,12 @@ #include "video_core/renderer_opengl/gl_buffer_cache.h" #include "video_core/renderer_opengl/gl_device.h" #include "video_core/renderer_opengl/maxwell_to_gl.h" +#include "video_core/renderer_opengl/gl_rasterizer.h" namespace OpenGL { namespace { using VideoCore::Surface::PixelFormat; -struct BindlessSSBO { - GLuint64EXT address; - GLsizei length; - GLsizei padding; -}; -static_assert(sizeof(BindlessSSBO) == sizeof(GLuint) * 4); - constexpr std::array PROGRAM_LUT{ GL_VERTEX_PROGRAM_NV, GL_TESS_CONTROL_PROGRAM_NV, GL_TESS_EVALUATION_PROGRAM_NV, GL_GEOMETRY_PROGRAM_NV, GL_FRAGMENT_PROGRAM_NV, diff --git a/src/video_core/renderer_opengl/gl_compute_pipeline.cpp b/src/video_core/renderer_opengl/gl_compute_pipeline.cpp index d1c61be743..6eb786781d 100644 --- a/src/video_core/renderer_opengl/gl_compute_pipeline.cpp +++ b/src/video_core/renderer_opengl/gl_compute_pipeline.cpp @@ -19,8 +19,8 @@ using Shader::ImageBufferDescriptor; using Tegra::Texture::TexturePair; using VideoCommon::ImageId; -constexpr u32 MAX_TEXTURES = 64; -constexpr u32 MAX_IMAGES = 16; +constexpr u32 MAX_COMPUTE_TEXTURES = 64; +constexpr u32 MAX_COMPUTE_IMAGES = 16; size_t ComputePipelineKey::Hash() const noexcept { return static_cast( @@ -56,10 +56,10 @@ ComputePipeline::ComputePipeline(const Device& device, TextureCache& texture_cac num_image_buffers = Shader::NumDescriptors(info.image_buffer_descriptors); const u32 num_textures{num_texture_buffers + Shader::NumDescriptors(info.texture_descriptors)}; - ASSERT(num_textures <= MAX_TEXTURES); + ASSERT(num_textures <= MAX_COMPUTE_TEXTURES); const u32 num_images{num_image_buffers + Shader::NumDescriptors(info.image_descriptors)}; - ASSERT(num_images <= MAX_IMAGES); + ASSERT(num_images <= MAX_COMPUTE_IMAGES); const bool is_glasm{assembly_program.handle != 0}; const u32 num_storage_buffers{Shader::NumDescriptors(info.storage_buffers_descriptors)}; @@ -92,11 +92,11 @@ void ComputePipeline::Configure() { } texture_cache.SynchronizeComputeDescriptors(); - boost::container::static_vector views; - boost::container::static_vector samplers; - std::array gl_samplers; - std::array textures; - std::array images; + boost::container::static_vector views; + boost::container::static_vector samplers; + std::array gl_samplers; + std::array textures; + std::array images; GLsizei sampler_binding{}; GLsizei texture_binding{}; GLsizei image_binding{}; diff --git a/src/video_core/renderer_opengl/gl_graphics_pipeline.cpp b/src/video_core/renderer_opengl/gl_graphics_pipeline.cpp index ee3498428e..6c4e80fbfd 100644 --- a/src/video_core/renderer_opengl/gl_graphics_pipeline.cpp +++ b/src/video_core/renderer_opengl/gl_graphics_pipeline.cpp @@ -36,8 +36,8 @@ using Shader::TextureDescriptor; using Tegra::Texture::TexturePair; using VideoCommon::ImageId; -constexpr u32 MAX_TEXTURES = 64; -constexpr u32 MAX_IMAGES = 8; +constexpr u32 MAX_GRAPHICS_TEXTURES = 64; +constexpr u32 MAX_GRAPHICS_IMAGES = 8; GLenum Stage(size_t stage_index) { switch (stage_index) { @@ -221,8 +221,8 @@ GraphicsPipeline::GraphicsPipeline(const Device& device, TextureCache& texture_c info.storage_buffers_descriptors, [](const auto& desc) { return desc.is_written; }); uses_local_memory |= info.uses_local_memory; } - ASSERT(num_textures <= MAX_TEXTURES); - ASSERT(num_images <= MAX_IMAGES); + ASSERT(num_textures <= MAX_GRAPHICS_TEXTURES); + ASSERT(num_images <= MAX_GRAPHICS_IMAGES); const auto backend = ::Settings::values.renderer_backend.GetValue(); const bool assembly_shaders = backend == Settings::RendererBackend::OpenGL_GLASM; @@ -278,8 +278,8 @@ GraphicsPipeline::GraphicsPipeline(const Device& device, TextureCache& texture_c template bool GraphicsPipeline::ConfigureImpl(bool is_indexed) { - std::array views; - std::array samplers; + std::array views; + std::array samplers; size_t views_index{}; size_t samplers_index{}; @@ -452,9 +452,9 @@ bool GraphicsPipeline::ConfigureImpl(bool is_indexed) { GLsizei texture_binding = 0; GLsizei image_binding = 0; GLsizei sampler_binding{}; - std::array textures; - std::array images; - std::array gl_samplers; + std::array textures; + std::array images; + std::array gl_samplers; const auto prepare_stage{[&](size_t stage) { buffer_cache.runtime.SetImagePointers(&textures[texture_binding], &images[image_binding]); buffer_cache.BindHostStageBuffers(stage); diff --git a/src/video_core/renderer_opengl/gl_rasterizer.h b/src/video_core/renderer_opengl/gl_rasterizer.h index 6eae51ff7d..cbfef3ff61 100644 --- a/src/video_core/renderer_opengl/gl_rasterizer.h +++ b/src/video_core/renderer_opengl/gl_rasterizer.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: 2015 Citra Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -256,7 +259,7 @@ private: BlitImageHelper blit_image; boost::container::static_vector image_view_indices; - std::array image_view_ids; + std::array image_view_ids; boost::container::static_vector sampler_handles; std::array texture_handles{}; std::array image_handles{}; diff --git a/src/video_core/renderer_opengl/gl_state_tracker.cpp b/src/video_core/renderer_opengl/gl_state_tracker.cpp index d53b422cac..eda54caf66 100644 --- a/src/video_core/renderer_opengl/gl_state_tracker.cpp +++ b/src/video_core/renderer_opengl/gl_state_tracker.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2019 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -241,3 +244,6 @@ void StateTracker::InvalidateState() { StateTracker::StateTracker() : flags{&default_flags} {} } // namespace OpenGL + +#undef OFF +#undef NUM diff --git a/src/video_core/renderer_opengl/gl_texture_cache.cpp b/src/video_core/renderer_opengl/gl_texture_cache.cpp index 958988f27e..e8bc8c2cb3 100644 --- a/src/video_core/renderer_opengl/gl_texture_cache.cpp +++ b/src/video_core/renderer_opengl/gl_texture_cache.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2019 yuzu Emulator Project @@ -23,6 +23,7 @@ #include "video_core/surface.h" #include "video_core/texture_cache/formatter.h" #include "video_core/texture_cache/samples_helper.h" +#include "video_core/texture_cache/types.h" #include "video_core/texture_cache/util.h" namespace OpenGL { @@ -628,9 +629,10 @@ void TextureCacheRuntime::EmulateCopyImage(Image& dst, Image& src, } void TextureCacheRuntime::BlitFramebuffer(Framebuffer* dst, Framebuffer* src, - const Region2D& dst_region, const Region2D& src_region, - Tegra::Engines::Fermi2D::Filter filter, - Tegra::Engines::Fermi2D::Operation operation) { + const VideoCommon::Region2D& dst_region, const VideoCommon::Region2D& src_region, + Tegra::Engines::Fermi2D::Filter filter, + Tegra::Engines::Fermi2D::Operation operation +) { state_tracker.NotifyScissor0(); state_tracker.NotifyRasterizeEnable(); state_tracker.NotifyFramebufferSRGB(); @@ -1102,10 +1104,10 @@ bool Image::ScaleDown(bool ignore) { return true; } -ImageView::ImageView(TextureCacheRuntime& runtime, const VideoCommon::ImageViewInfo& info, - ImageId image_id_, Image& image, const SlotVector&) - : VideoCommon::ImageViewBase{info, image.info, image_id_, image.gpu_addr}, - views{runtime.null_image_views} { +ImageView::ImageView(TextureCacheRuntime& runtime, const VideoCommon::ImageViewInfo& info, VideoCommon::ImageId image_id_, Image& image, const Common::SlotVector&) + : VideoCommon::ImageViewBase{info, image.info, image_id_, image.gpu_addr} + , views{runtime.null_image_views} +{ const Device& device = runtime.device; if (True(image.flags & ImageFlagBits::Converted)) { const bool is_srgb = IsPixelFormatSRGB(info.format); @@ -1130,18 +1132,18 @@ ImageView::ImageView(TextureCacheRuntime& runtime, const VideoCommon::ImageViewI swizzle[3] = info.w_source; } switch (info.type) { - case ImageViewType::e1DArray: + case VideoCommon::ImageViewType::e1DArray: flat_range.extent.layers = 1; [[fallthrough]]; - case ImageViewType::e1D: + case VideoCommon::ImageViewType::e1D: SetupView(Shader::TextureType::Color1D); SetupView(Shader::TextureType::ColorArray1D); break; - case ImageViewType::e2DArray: + case VideoCommon::ImageViewType::e2DArray: flat_range.extent.layers = 1; [[fallthrough]]; - case ImageViewType::e2D: - case ImageViewType::Rect: + case VideoCommon::ImageViewType::e2D: + case VideoCommon::ImageViewType::Rect: if (True(flags & VideoCommon::ImageViewFlagBits::Slice)) { // 2D and 2D array views on a 3D textures are used exclusively for render targets ASSERT(info.range.extent.levels == 1); @@ -1157,41 +1159,41 @@ ImageView::ImageView(TextureCacheRuntime& runtime, const VideoCommon::ImageViewI SetupView(Shader::TextureType::ColorArray2D); } break; - case ImageViewType::e3D: + case VideoCommon::ImageViewType::e3D: SetupView(Shader::TextureType::Color3D); break; - case ImageViewType::CubeArray: + case VideoCommon::ImageViewType::CubeArray: flat_range.extent.layers = 6; [[fallthrough]]; - case ImageViewType::Cube: + case VideoCommon::ImageViewType::Cube: SetupView(Shader::TextureType::ColorCube); SetupView(Shader::TextureType::ColorArrayCube); break; - case ImageViewType::Buffer: + case VideoCommon::ImageViewType::Buffer: ASSERT(false); break; } switch (info.type) { - case ImageViewType::e1D: + case VideoCommon::ImageViewType::e1D: default_handle = Handle(Shader::TextureType::Color1D); break; - case ImageViewType::e1DArray: + case VideoCommon::ImageViewType::e1DArray: default_handle = Handle(Shader::TextureType::ColorArray1D); break; - case ImageViewType::e2D: - case ImageViewType::Rect: + case VideoCommon::ImageViewType::e2D: + case VideoCommon::ImageViewType::Rect: default_handle = Handle(Shader::TextureType::Color2D); break; - case ImageViewType::e2DArray: + case VideoCommon::ImageViewType::e2DArray: default_handle = Handle(Shader::TextureType::ColorArray2D); break; - case ImageViewType::e3D: + case VideoCommon::ImageViewType::e3D: default_handle = Handle(Shader::TextureType::Color3D); break; - case ImageViewType::Cube: + case VideoCommon::ImageViewType::Cube: default_handle = Handle(Shader::TextureType::ColorCube); break; - case ImageViewType::CubeArray: + case VideoCommon::ImageViewType::CubeArray: default_handle = Handle(Shader::TextureType::ColorArrayCube); break; default: diff --git a/src/video_core/renderer_opengl/gl_texture_cache.h b/src/video_core/renderer_opengl/gl_texture_cache.h index dfcef4b0b6..dbe7f48382 100644 --- a/src/video_core/renderer_opengl/gl_texture_cache.h +++ b/src/video_core/renderer_opengl/gl_texture_cache.h @@ -33,14 +33,6 @@ class Image; class ImageView; class Sampler; -using Common::SlotVector; -using VideoCommon::ImageId; -using VideoCommon::ImageViewId; -using VideoCommon::ImageViewType; -using VideoCommon::NUM_RT; -using VideoCommon::Region2D; -using VideoCommon::RenderTargets; - struct FormatProperties { GLenum compatibility_class; bool compatibility_by_size; @@ -114,8 +106,8 @@ public: void EmulateCopyImage(Image& dst, Image& src, std::span copies); - void BlitFramebuffer(Framebuffer* dst, Framebuffer* src, const Region2D& dst_region, - const Region2D& src_region, Tegra::Engines::Fermi2D::Filter filter, + void BlitFramebuffer(Framebuffer* dst, Framebuffer* src, const VideoCommon::Region2D& dst_region, + const VideoCommon::Region2D& src_region, Tegra::Engines::Fermi2D::Filter filter, Tegra::Engines::Fermi2D::Operation operation); void AccelerateImageUpload(Image& image, const StagingBufferMap& map, @@ -251,8 +243,8 @@ class ImageView : public VideoCommon::ImageViewBase { friend Image; public: - explicit ImageView(TextureCacheRuntime&, const VideoCommon::ImageViewInfo&, ImageId, Image&, - const SlotVector&); + explicit ImageView(TextureCacheRuntime&, const VideoCommon::ImageViewInfo&, VideoCommon::ImageId, Image&, + const Common::SlotVector&); explicit ImageView(TextureCacheRuntime&, const VideoCommon::ImageInfo&, const VideoCommon::ImageViewInfo&, GPUVAddr); explicit ImageView(TextureCacheRuntime&, const VideoCommon::ImageInfo& info, @@ -340,7 +332,7 @@ private: class Framebuffer { public: - explicit Framebuffer(TextureCacheRuntime&, std::span color_buffers, + explicit Framebuffer(TextureCacheRuntime&, std::span color_buffers, ImageView* depth_buffer, const VideoCommon::RenderTargets& key); ~Framebuffer(); diff --git a/src/video_core/renderer_vulkan/blit_image.cpp b/src/video_core/renderer_vulkan/blit_image.cpp index 789f4da2ed..92aede13c0 100644 --- a/src/video_core/renderer_vulkan/blit_image.cpp +++ b/src/video_core/renderer_vulkan/blit_image.cpp @@ -34,8 +34,6 @@ namespace Vulkan { -using VideoCommon::ImageViewType; - namespace { [[nodiscard]] VkImageAspectFlags AspectMaskFromFormat(VideoCore::Surface::PixelFormat format) { @@ -69,7 +67,7 @@ namespace { }; } -struct PushConstants { +struct BlitPushConstants { std::array tex_scale; std::array tex_offset; }; @@ -394,7 +392,7 @@ void BindBlitState(vk::CommandBuffer cmdbuf, VkPipelineLayout layout, const Regi static_cast(src_size.width); const float scale_y = static_cast(src_region.end.y - src_region.start.y) / static_cast(src_size.height); - const PushConstants push_constants{ + const BlitPushConstants push_constants{ .tex_scale = {scale_x, scale_y}, .tex_offset = {static_cast(src_region.start.x) / static_cast(src_size.width), static_cast(src_region.start.y) / @@ -414,7 +412,7 @@ VkExtent2D GetConversionExtent(const ImageView& src_image_view) { }; } -void TransitionImageLayout(vk::CommandBuffer& cmdbuf, VkImage image, VkImageLayout target_layout, +void BlitImageTransitionImageLayout(vk::CommandBuffer& cmdbuf, VkImage image, VkImageLayout target_layout, VkImageLayout source_layout = VK_IMAGE_LAYOUT_GENERAL) { constexpr VkFlags flags{VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT | VK_ACCESS_SHADER_READ_BIT}; @@ -507,11 +505,11 @@ BlitImageHelper::BlitImageHelper(const Device& device_, Scheduler& scheduler_, descriptor_pool.Allocator(*two_textures_set_layout, TEXTURE_DESCRIPTOR_BANK_INFO<2>)}, one_texture_pipeline_layout(device.GetLogical().CreatePipelineLayout(PipelineLayoutCreateInfo( one_texture_set_layout.address(), - PUSH_CONSTANT_RANGE))), + PUSH_CONSTANT_RANGE))), two_textures_pipeline_layout( device.GetLogical().CreatePipelineLayout(PipelineLayoutCreateInfo( two_textures_set_layout.address(), - PUSH_CONSTANT_RANGE))), + PUSH_CONSTANT_RANGE))), clear_color_pipeline_layout(device.GetLogical().CreatePipelineLayout(PipelineLayoutCreateInfo( nullptr, PUSH_CONSTANT_RANGE))), full_screen_vert(BuildShader(device, FULL_SCREEN_TRIANGLE_VERT_SPV)), @@ -578,7 +576,7 @@ void BlitImageHelper::BlitColor(const Framebuffer* dst_framebuffer, VkImageView scheduler.RequestOutsideRenderPassOperationContext(); scheduler.Record([this, dst_framebuffer, src_image_view, src_image, src_sampler, dst_region, src_region, src_size, pipeline, layout](vk::CommandBuffer cmdbuf) { - TransitionImageLayout(cmdbuf, src_image, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL); + BlitImageTransitionImageLayout(cmdbuf, src_image, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL); BeginRenderPass(cmdbuf, dst_framebuffer); const VkDescriptorSet descriptor_set = one_texture_descriptor_allocator.Commit(); UpdateOneTextureDescriptorSet(device, descriptor_set, src_sampler, src_image_view); @@ -765,7 +763,7 @@ void BlitImageHelper::Convert(VkPipeline pipeline, const Framebuffer* dst_frameb .offset = offset, .extent = extent, }; - const PushConstants push_constants{ + const BlitPushConstants push_constants{ .tex_scale = {viewport.width, viewport.height}, .tex_offset = {0.0f, 0.0f}, }; @@ -811,7 +809,7 @@ void BlitImageHelper::ConvertDepthStencil(VkPipeline pipeline, const Framebuffer .offset = offset, .extent = extent, }; - const PushConstants push_constants{ + const BlitPushConstants push_constants{ .tex_scale = {viewport.width, viewport.height}, .tex_offset = {0.0f, 0.0f}, }; diff --git a/src/video_core/renderer_vulkan/fixed_pipeline_state.cpp b/src/video_core/renderer_vulkan/fixed_pipeline_state.cpp index 06cbd9e6da..3ab8b6cffe 100644 --- a/src/video_core/renderer_vulkan/fixed_pipeline_state.cpp +++ b/src/video_core/renderer_vulkan/fixed_pipeline_state.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2019 yuzu Emulator Project @@ -18,27 +18,6 @@ namespace Vulkan { namespace { -constexpr size_t POINT = 0; -constexpr size_t LINE = 1; -constexpr size_t POLYGON = 2; -constexpr std::array POLYGON_OFFSET_ENABLE_LUT = { - POINT, // Points - LINE, // Lines - LINE, // LineLoop - LINE, // LineStrip - POLYGON, // Triangles - POLYGON, // TriangleStrip - POLYGON, // TriangleFan - POLYGON, // Quads - POLYGON, // QuadStrip - POLYGON, // Polygon - LINE, // LinesAdjacency - LINE, // LineStripAdjacency - POLYGON, // TrianglesAdjacency - POLYGON, // TriangleStripAdjacency - POLYGON, // Patches -}; - void RefreshXfbState(VideoCommon::TransformFeedbackState& state, const Maxwell& regs) { std::ranges::transform(regs.transform_feedback.controls, state.layouts.begin(), [](const auto& layout) { @@ -270,6 +249,27 @@ void FixedPipelineState::DynamicState::Refresh2(const Maxwell& regs, rasterize_enable.Assign(regs.rasterize_enable != 0 ? 1 : 0); primitive_restart_enable.Assign(regs.primitive_restart.enabled != 0 ? 1 : 0); + + constexpr size_t ENABLE_POINT = 0; + constexpr size_t ENABLE_LINE = 1; + constexpr size_t ENABLE_POLYGON = 2; + constexpr std::array POLYGON_OFFSET_ENABLE_LUT = { + ENABLE_POINT, // Points + ENABLE_LINE, // Lines + ENABLE_LINE, // LineLoop + ENABLE_LINE, // LineStrip + ENABLE_POLYGON, // Triangles + ENABLE_POLYGON, // TriangleStrip + ENABLE_POLYGON, // TriangleFan + ENABLE_POLYGON, // Quads + ENABLE_POLYGON, // QuadStrip + ENABLE_POLYGON, // Polygon + ENABLE_LINE, // LinesAdjacency + ENABLE_LINE, // LineStripAdjacency + ENABLE_POLYGON, // TrianglesAdjacency + ENABLE_POLYGON, // TriangleStripAdjacency + ENABLE_POLYGON, // Patches + }; depth_bias_enable.Assign(enabled_lut[POLYGON_OFFSET_ENABLE_LUT[topology_index]] != 0 ? 1 : 0); } diff --git a/src/video_core/renderer_vulkan/present/fsr.cpp b/src/video_core/renderer_vulkan/present/fsr.cpp index ba6252ed95..de10397af1 100644 --- a/src/video_core/renderer_vulkan/present/fsr.cpp +++ b/src/video_core/renderer_vulkan/present/fsr.cpp @@ -23,7 +23,7 @@ namespace Vulkan { using namespace FSR; -using PushConstants = std::array; +using FsrPushConstants = std::array; FSR::FSR(const Device& device, MemoryAllocator& memory_allocator, size_t image_count, VkExtent2D extent) @@ -96,7 +96,7 @@ void FSR::CreatePipelineLayouts() { const VkPushConstantRange range{ .stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT, .offset = 0, - .size = sizeof(PushConstants), + .size = sizeof(FsrPushConstants), }; VkPipelineLayoutCreateInfo ci{ .sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, @@ -168,8 +168,8 @@ VkImageView FSR::Draw(Scheduler& scheduler, size_t image_index, VkImage source_i const f32 viewport_height = (crop_rect.bottom - crop_rect.top) * input_image_height; const f32 viewport_y = crop_rect.top * input_image_height; - PushConstants easu_con{}; - PushConstants rcas_con{}; + FsrPushConstants easu_con{}; + FsrPushConstants rcas_con{}; FsrEasuConOffset(easu_con.data() + 0, easu_con.data() + 4, easu_con.data() + 8, easu_con.data() + 12, viewport_width, viewport_height, input_image_width, input_image_height, output_image_width, output_image_height, viewport_x, diff --git a/src/video_core/renderer_vulkan/present/layer.cpp b/src/video_core/renderer_vulkan/present/layer.cpp index b462c672cc..92f67d0e55 100644 --- a/src/video_core/renderer_vulkan/present/layer.cpp +++ b/src/video_core/renderer_vulkan/present/layer.cpp @@ -7,9 +7,6 @@ #include #include "video_core/present.h" #include "video_core/renderer_vulkan/present/anti_alias_pass.h" -/* X11 defines */ -#undef Success -#undef BadValue #include "video_core/renderer_vulkan/vk_rasterizer.h" #include "common/settings.h" diff --git a/src/video_core/renderer_vulkan/vk_rasterizer.cpp b/src/video_core/renderer_vulkan/vk_rasterizer.cpp index f867980a6f..6e63bdf18b 100644 --- a/src/video_core/renderer_vulkan/vk_rasterizer.cpp +++ b/src/video_core/renderer_vulkan/vk_rasterizer.cpp @@ -45,12 +45,6 @@ namespace Vulkan { -using Maxwell = Tegra::Engines::Maxwell3D::Regs; -using MaxwellDrawState = Tegra::Engines::DrawManager::State; -using VideoCommon::ImageViewId; -using VideoCommon::ImageViewType; - - namespace { struct DrawParams { u32 base_instance; @@ -61,7 +55,7 @@ struct DrawParams { bool is_indexed; }; -VkViewport GetViewportState(const Device& device, const Maxwell& regs, size_t index, float scale) { +VkViewport GetViewportState(const Device& device, const Tegra::Engines::Maxwell3D::Regs& regs, size_t index, float scale) { const auto& src = regs.viewport_transform[index]; const auto conv = [scale](float value) { float new_value = value * scale; @@ -77,9 +71,9 @@ VkViewport GetViewportState(const Device& device, const Maxwell& regs, size_t in float y = conv(src.translate_y - src.scale_y); float height = conv(src.scale_y * 2.0f); - const bool lower_left = regs.window_origin.mode != Maxwell::WindowOrigin::Mode::UpperLeft; + const bool lower_left = regs.window_origin.mode != Tegra::Engines::Maxwell3D::Regs::WindowOrigin::Mode::UpperLeft; const bool y_negate = !device.IsNvViewportSwizzleSupported() && - src.swizzle.y == Maxwell::ViewportSwizzle::NegativeY; + src.swizzle.y == Tegra::Engines::Maxwell3D::Regs::ViewportSwizzle::NegativeY; if (lower_left) { // Flip by surface clip height @@ -93,7 +87,7 @@ VkViewport GetViewportState(const Device& device, const Maxwell& regs, size_t in height = -height; } - const float reduce_z = regs.depth_mode == Maxwell::DepthMode::MinusOneToOne ? 1.0f : 0.0f; + const float reduce_z = regs.depth_mode == Tegra::Engines::Maxwell3D::Regs::DepthMode::MinusOneToOne ? 1.0f : 0.0f; VkViewport viewport{ .x = x, .y = y, @@ -109,7 +103,7 @@ VkViewport GetViewportState(const Device& device, const Maxwell& regs, size_t in return viewport; } -VkRect2D GetScissorState(const Maxwell& regs, size_t index, u32 up_scale = 1, u32 down_shift = 0) { +VkRect2D GetScissorState(const Tegra::Engines::Maxwell3D::Regs& regs, size_t index, u32 up_scale = 1, u32 down_shift = 0) { const auto& src = regs.scissor_test[index]; VkRect2D scissor{}; const auto scale_up = [&](s32 value) -> s32 { @@ -126,7 +120,7 @@ VkRect2D GetScissorState(const Maxwell& regs, size_t index, u32 up_scale = 1, u3 : std::max(converted_value + acumm, 1); }; - const bool lower_left = regs.window_origin.mode != Maxwell::WindowOrigin::Mode::UpperLeft; + const bool lower_left = regs.window_origin.mode != Tegra::Engines::Maxwell3D::Regs::WindowOrigin::Mode::UpperLeft; const s32 clip_height = regs.surface_clip.height; // Flip coordinates if lower left @@ -151,7 +145,7 @@ VkRect2D GetScissorState(const Maxwell& regs, size_t index, u32 up_scale = 1, u3 return scissor; } -DrawParams MakeDrawParams(const MaxwellDrawState& draw_state, u32 num_instances, bool is_indexed) { +DrawParams MakeDrawParams(const Tegra::Engines::DrawManager::State& draw_state, u32 num_instances, bool is_indexed) { DrawParams params{ .base_instance = draw_state.base_instance, .num_instances = num_instances, @@ -162,11 +156,11 @@ DrawParams MakeDrawParams(const MaxwellDrawState& draw_state, u32 num_instances, }; // 6 triangle vertices per quad, base vertex is part of the index // See BindQuadIndexBuffer for more details - if (draw_state.topology == Maxwell::PrimitiveTopology::Quads) { + if (draw_state.topology == Tegra::Engines::Maxwell3D::Regs::PrimitiveTopology::Quads) { params.num_vertices = (params.num_vertices / 4) * 6; params.base_vertex = 0; params.is_indexed = true; - } else if (draw_state.topology == Maxwell::PrimitiveTopology::QuadStrip) { + } else if (draw_state.topology == Tegra::Engines::Maxwell3D::Regs::PrimitiveTopology::QuadStrip) { params.num_vertices = (params.num_vertices - 2) / 2 * 6; params.base_vertex = 0; params.is_indexed = true; @@ -1107,8 +1101,8 @@ void RasterizerVulkan::HandleTransformFeedback() { GPU::Logging::GPULogger::GetInstance().LogExtensionUsage( "VK_EXT_transform_feedback", "HandleTransformFeedback"); } - UNIMPLEMENTED_IF(regs.IsShaderConfigEnabled(Maxwell::ShaderType::TessellationInit) || - regs.IsShaderConfigEnabled(Maxwell::ShaderType::Tessellation)); + UNIMPLEMENTED_IF(regs.IsShaderConfigEnabled(Tegra::Engines::Maxwell3D::Regs::ShaderType::TessellationInit) || + regs.IsShaderConfigEnabled(Tegra::Engines::Maxwell3D::Regs::ShaderType::Tessellation)); } } @@ -1121,7 +1115,7 @@ void RasterizerVulkan::UpdateViewportsState(Tegra::Engines::Maxwell3D::Regs& reg float y = static_cast(regs.surface_clip.y); float width = (std::max)(1.0f, static_cast(regs.surface_clip.width)); float height = (std::max)(1.0f, static_cast(regs.surface_clip.height)); - if (regs.window_origin.mode != Maxwell::WindowOrigin::Mode::UpperLeft) { + if (regs.window_origin.mode != Tegra::Engines::Maxwell3D::Regs::WindowOrigin::Mode::UpperLeft) { y += height; height = -height; } @@ -1151,7 +1145,7 @@ void RasterizerVulkan::UpdateViewportsState(Tegra::Engines::Maxwell3D::Regs& reg GetViewportState(device, regs, 14, scale), GetViewportState(device, regs, 15, scale), }; scheduler.Record([this, viewport_list](vk::CommandBuffer cmdbuf) { - const u32 num_viewports = std::min(device.GetMaxViewports(), Maxwell::NumViewports); + const u32 num_viewports = std::min(device.GetMaxViewports(), Tegra::Engines::Maxwell3D::Regs::NumViewports); const vk::Span viewports(viewport_list.data(), num_viewports); cmdbuf.SetViewport(0, viewports); }); @@ -1166,7 +1160,7 @@ void RasterizerVulkan::UpdateScissorsState(Tegra::Engines::Maxwell3D::Regs& regs u32 y = regs.surface_clip.y; u32 width = (std::max)(1u, static_cast(regs.surface_clip.width)); u32 height = (std::max)(1u, static_cast(regs.surface_clip.height)); - if (regs.window_origin.mode != Maxwell::WindowOrigin::Mode::UpperLeft) { + if (regs.window_origin.mode != Tegra::Engines::Maxwell3D::Regs::WindowOrigin::Mode::UpperLeft) { y = regs.surface_clip.height - (y + height); } VkRect2D scissor{}; @@ -1204,7 +1198,7 @@ void RasterizerVulkan::UpdateScissorsState(Tegra::Engines::Maxwell3D::Regs& regs GetScissorState(regs, 15, up_scale, down_shift), }; scheduler.Record([this, scissor_list](vk::CommandBuffer cmdbuf) { - const u32 num_scissors = std::min(device.GetMaxViewports(), Maxwell::NumViewports); + const u32 num_scissors = std::min(device.GetMaxViewports(), Tegra::Engines::Maxwell3D::Regs::NumViewports); const vk::Span scissors(scissor_list.data(), num_scissors); cmdbuf.SetScissor(0, scissors); }); @@ -1505,25 +1499,25 @@ void RasterizerVulkan::UpdateDepthBiasEnable(Tegra::Engines::Maxwell3D::Regs& re if (!state_tracker.TouchDepthBiasEnable()) { return; } - constexpr size_t POINT = 0; - constexpr size_t LINE = 1; - constexpr size_t POLYGON = 2; + constexpr size_t ENABLE_POINT = 0; + constexpr size_t ENABLE_LINE = 1; + constexpr size_t ENABLE_POLYGON = 2; static constexpr std::array POLYGON_OFFSET_ENABLE_LUT = { - POINT, // Points - LINE, // Lines - LINE, // LineLoop - LINE, // LineStrip - POLYGON, // Triangles - POLYGON, // TriangleStrip - POLYGON, // TriangleFan - POLYGON, // Quads - POLYGON, // QuadStrip - POLYGON, // Polygon - LINE, // LinesAdjacency - LINE, // LineStripAdjacency - POLYGON, // TrianglesAdjacency - POLYGON, // TriangleStripAdjacency - POLYGON, // Patches + ENABLE_POINT, // Points + ENABLE_LINE, // Lines + ENABLE_LINE, // LineLoop + ENABLE_LINE, // LineStrip + ENABLE_POLYGON, // Triangles + ENABLE_POLYGON, // TriangleStrip + ENABLE_POLYGON, // TriangleFan + ENABLE_POLYGON, // Quads + ENABLE_POLYGON, // QuadStrip + ENABLE_POLYGON, // Polygon + ENABLE_LINE, // LinesAdjacency + ENABLE_LINE, // LineStripAdjacency + ENABLE_POLYGON, // TrianglesAdjacency + ENABLE_POLYGON, // TriangleStripAdjacency + ENABLE_POLYGON, // Patches }; const std::array enabled_lut{ regs.polygon_offset_point_enable, @@ -1556,11 +1550,11 @@ void RasterizerVulkan::UpdateDepthClampEnable(Tegra::Engines::Maxwell3D::Regs& r return; } bool is_enabled = !(regs.viewport_clip_control.geometry_clip == - Maxwell::ViewportClipControl::GeometryClip::Passthrough || + Tegra::Engines::Maxwell3D::Regs::ViewportClipControl::GeometryClip::Passthrough || regs.viewport_clip_control.geometry_clip == - Maxwell::ViewportClipControl::GeometryClip::FrustumXYZ || + Tegra::Engines::Maxwell3D::Regs::ViewportClipControl::GeometryClip::FrustumXYZ || regs.viewport_clip_control.geometry_clip == - Maxwell::ViewportClipControl::GeometryClip::FrustumZ); + Tegra::Engines::Maxwell3D::Regs::ViewportClipControl::GeometryClip::FrustumZ); scheduler.Record( [is_enabled](vk::CommandBuffer cmdbuf) { cmdbuf.SetDepthClampEnableEXT(is_enabled); }); } @@ -1627,16 +1621,16 @@ void RasterizerVulkan::UpdateStencilOp(Tegra::Engines::Maxwell3D::Regs& regs) { if (!state_tracker.TouchStencilOp()) { return; } - const Maxwell::StencilOp::Op fail = regs.stencil_front_op.fail; - const Maxwell::StencilOp::Op zfail = regs.stencil_front_op.zfail; - const Maxwell::StencilOp::Op zpass = regs.stencil_front_op.zpass; - const Maxwell::ComparisonOp compare = regs.stencil_front_op.func; + const Tegra::Engines::Maxwell3D::Regs::StencilOp::Op fail = regs.stencil_front_op.fail; + const Tegra::Engines::Maxwell3D::Regs::StencilOp::Op zfail = regs.stencil_front_op.zfail; + const Tegra::Engines::Maxwell3D::Regs::StencilOp::Op zpass = regs.stencil_front_op.zpass; + const Tegra::Engines::Maxwell3D::Regs::ComparisonOp compare = regs.stencil_front_op.func; if (regs.stencil_two_side_enable) { // Separate stencil op per face - const Maxwell::StencilOp::Op back_fail = regs.stencil_back_op.fail; - const Maxwell::StencilOp::Op back_zfail = regs.stencil_back_op.zfail; - const Maxwell::StencilOp::Op back_zpass = regs.stencil_back_op.zpass; - const Maxwell::ComparisonOp back_compare = regs.stencil_back_op.func; + const Tegra::Engines::Maxwell3D::Regs::StencilOp::Op back_fail = regs.stencil_back_op.fail; + const Tegra::Engines::Maxwell3D::Regs::StencilOp::Op back_zfail = regs.stencil_back_op.zfail; + const Tegra::Engines::Maxwell3D::Regs::StencilOp::Op back_zpass = regs.stencil_back_op.zpass; + const Tegra::Engines::Maxwell3D::Regs::ComparisonOp back_compare = regs.stencil_back_op.func; scheduler.Record([fail, zfail, zpass, compare, back_fail, back_zfail, back_zpass, back_compare](vk::CommandBuffer cmdbuf) { cmdbuf.SetStencilOpEXT(VK_STENCIL_FACE_FRONT_BIT, MaxwellToVK::StencilOp(fail), @@ -1673,8 +1667,8 @@ void RasterizerVulkan::UpdateBlending(Tegra::Engines::Maxwell3D::Regs& regs) { } if (state_tracker.TouchColorMask()) { - std::array setup_masks{}; - for (size_t index = 0; index < Maxwell::NumRenderTargets; index++) { + std::array setup_masks{}; + for (size_t index = 0; index < Tegra::Engines::Maxwell3D::Regs::NumRenderTargets; index++) { const auto& mask = regs.color_mask[regs.color_mask_common ? 0 : index]; auto& current = setup_masks[index]; if (mask.R) { @@ -1696,7 +1690,7 @@ void RasterizerVulkan::UpdateBlending(Tegra::Engines::Maxwell3D::Regs& regs) { } if (state_tracker.TouchBlendEnable()) { - std::array setup_enables{}; + std::array setup_enables{}; std::ranges::transform( regs.blend.enable, setup_enables.begin(), [&](const auto& is_enabled) { return is_enabled != 0 ? VK_TRUE : VK_FALSE; }); @@ -1706,7 +1700,7 @@ void RasterizerVulkan::UpdateBlending(Tegra::Engines::Maxwell3D::Regs& regs) { } if (state_tracker.TouchBlendEquations()) { - std::array setup_blends{}; + std::array setup_blends{}; const auto blend_setup = [&](auto& host_blend, const auto& guest_blend) { host_blend.srcColorBlendFactor = MaxwellToVK::BlendFactor(guest_blend.color_source); @@ -1732,12 +1726,12 @@ void RasterizerVulkan::UpdateBlending(Tegra::Engines::Maxwell3D::Regs& regs) { } // Copy first blend state to all other targets - for (size_t index = 1; index < Maxwell::NumRenderTargets; index++) { + for (size_t index = 1; index < Tegra::Engines::Maxwell3D::Regs::NumRenderTargets; index++) { setup_blends[index] = setup_blends[0]; } } else { // Per-target blending - for (size_t index = 0; index < Maxwell::NumRenderTargets; index++) { + for (size_t index = 0; index < Tegra::Engines::Maxwell3D::Regs::NumRenderTargets; index++) { blend_setup(setup_blends[index], regs.blend_per_target[index]); } } @@ -1771,13 +1765,13 @@ void RasterizerVulkan::UpdateVertexInput(Tegra::Engines::Maxwell3D::Regs& regs) // generating dirty state. Track the highest dirty attribute and update all attributes until // that one. size_t highest_dirty_attr{}; - for (size_t index = 0; index < Maxwell::NumVertexAttributes; ++index) { + for (size_t index = 0; index < Tegra::Engines::Maxwell3D::Regs::NumVertexAttributes; ++index) { if (dirty[Dirty::VertexAttribute0 + index]) { highest_dirty_attr = index; } } for (size_t index = 0; index < highest_dirty_attr; ++index) { - const Maxwell::VertexAttribute attribute{regs.vertex_attrib_format[index]}; + const Tegra::Engines::Maxwell3D::Regs::VertexAttribute attribute{regs.vertex_attrib_format[index]}; const u32 binding{attribute.buffer}; dirty[Dirty::VertexAttribute0 + index] = false; dirty[Dirty::VertexBinding0 + static_cast(binding)] = true; @@ -1792,7 +1786,7 @@ void RasterizerVulkan::UpdateVertexInput(Tegra::Engines::Maxwell3D::Regs& regs) }); } } - for (size_t index = 0; index < Maxwell::NumVertexAttributes; ++index) { + for (size_t index = 0; index < Tegra::Engines::Maxwell3D::Regs::NumVertexAttributes; ++index) { if (!dirty[Dirty::VertexBinding0 + index]) { continue; } diff --git a/src/video_core/renderer_vulkan/vk_state_tracker.cpp b/src/video_core/renderer_vulkan/vk_state_tracker.cpp index 79967d540a..dc5326bfbb 100644 --- a/src/video_core/renderer_vulkan/vk_state_tracker.cpp +++ b/src/video_core/renderer_vulkan/vk_state_tracker.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project @@ -273,3 +273,6 @@ StateTracker::StateTracker() : flags{&default_flags}, default_flags{}, invalidation_flags{MakeInvalidationFlags()} {} } // namespace Vulkan + +#undef OFF +#undef NUM diff --git a/src/video_core/renderer_vulkan/vk_texture_cache.cpp b/src/video_core/renderer_vulkan/vk_texture_cache.cpp index d51564dcb3..7241cda903 100644 --- a/src/video_core/renderer_vulkan/vk_texture_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_texture_cache.cpp @@ -275,7 +275,7 @@ constexpr VkBorderColor ConvertBorderColor(const std::array& color) { return VK_COMPONENT_SWIZZLE_ZERO; } -[[nodiscard]] VkImageViewType ImageViewType(Shader::TextureType type) { +[[nodiscard]] VkImageViewType ToImageViewType(Shader::TextureType type) { switch (type) { case Shader::TextureType::Color1D: return VK_IMAGE_VIEW_TYPE_1D; @@ -300,7 +300,7 @@ constexpr VkBorderColor ConvertBorderColor(const std::array& color) { return VK_IMAGE_VIEW_TYPE_2D; } -[[nodiscard]] VkImageViewType ImageViewType(VideoCommon::ImageViewType type) { +[[nodiscard]] VkImageViewType ToImageViewType(VideoCommon::ImageViewType type) { switch (type) { case VideoCommon::ImageViewType::e1D: return VK_IMAGE_VIEW_TYPE_1D; @@ -2139,7 +2139,7 @@ ImageView::ImageView(TextureCacheRuntime& runtime, const VideoCommon::ImageViewI }; const auto create = [&](TextureType tex_type, std::optional num_layers) { VkImageViewCreateInfo ci{create_info}; - ci.viewType = ImageViewType(tex_type); + ci.viewType = ToImageViewType(tex_type); if (num_layers) { ci.subresourceRange.layerCount = *num_layers; } @@ -2178,7 +2178,7 @@ ImageView::ImageView(TextureCacheRuntime& runtime, const VideoCommon::ImageViewI } } -ImageView::ImageView(TextureCacheRuntime& runtime, const VideoCommon::ImageViewInfo& info, ImageId image_id_, Image& image, const SlotVector& slot_imgs) +ImageView::ImageView(TextureCacheRuntime& runtime, const VideoCommon::ImageViewInfo& info, ImageId image_id_, Image& image, const Common::SlotVector& slot_imgs) : ImageView{runtime, info, image_id_, image} { slot_images = &slot_imgs; @@ -2272,7 +2272,7 @@ vk::ImageView ImageView::MakeView(VkFormat vk_format, VkImageAspectFlags aspect_ .pNext = nullptr, .flags = 0, .image = image_handle, - .viewType = ImageViewType(type), + .viewType = ToImageViewType(type), .format = vk_format, .components{ .r = VK_COMPONENT_SWIZZLE_IDENTITY, diff --git a/src/video_core/shader_environment.cpp b/src/video_core/shader_environment.cpp index 5f5633d4d1..7dae933c9a 100644 --- a/src/video_core/shader_environment.cpp +++ b/src/video_core/shader_environment.cpp @@ -32,8 +32,6 @@ constexpr std::array MAGIC_NUMBER{'y', 'u', 'z', 'u', 'c', 'a', 'c', 'h constexpr size_t INST_SIZE = sizeof(u64); -using Maxwell = Tegra::Engines::Maxwell3D::Regs; - static u64 MakeCbufKey(u32 index, u32 offset) { return (static_cast(index) << 32) | offset; } @@ -286,34 +284,34 @@ Tegra::Texture::TICEntry GenericEnvironment::ReadTextureInfo(GPUVAddr tic_addr, GraphicsEnvironment::GraphicsEnvironment(Tegra::Engines::Maxwell3D& maxwell3d_, Tegra::MemoryManager& gpu_memory_, - Maxwell::ShaderType program, GPUVAddr program_base_, + Tegra::Engines::Maxwell3D::Regs::ShaderType program, GPUVAddr program_base_, u32 start_address_) : GenericEnvironment{gpu_memory_, program_base_, start_address_}, maxwell3d{&maxwell3d_} { gpu_memory->ReadBlock(program_base + start_address, &sph, sizeof(sph)); initial_offset = sizeof(sph); gp_passthrough_mask = maxwell3d->regs.post_vtg_shader_attrib_skip_mask; switch (program) { - case Maxwell::ShaderType::VertexA: + case Tegra::Engines::Maxwell3D::Regs::ShaderType::VertexA: stage = Shader::Stage::VertexA; stage_index = 0; break; - case Maxwell::ShaderType::VertexB: + case Tegra::Engines::Maxwell3D::Regs::ShaderType::VertexB: stage = Shader::Stage::VertexB; stage_index = 0; break; - case Maxwell::ShaderType::TessellationInit: + case Tegra::Engines::Maxwell3D::Regs::ShaderType::TessellationInit: stage = Shader::Stage::TessellationControl; stage_index = 1; break; - case Maxwell::ShaderType::Tessellation: + case Tegra::Engines::Maxwell3D::Regs::ShaderType::Tessellation: stage = Shader::Stage::TessellationEval; stage_index = 2; break; - case Maxwell::ShaderType::Geometry: + case Tegra::Engines::Maxwell3D::Regs::ShaderType::Geometry: stage = Shader::Stage::Geometry; stage_index = 3; break; - case Maxwell::ShaderType::Pixel: + case Tegra::Engines::Maxwell3D::Regs::ShaderType::Pixel: stage = Shader::Stage::Fragment; stage_index = 4; break; @@ -369,7 +367,7 @@ std::optional GraphicsEnvironment::GetReplaceConstBuffe Shader::TextureType GraphicsEnvironment::ReadTextureType(u32 handle) { const auto& regs{maxwell3d->regs}; - const bool via_header_index{regs.sampler_binding == Maxwell::SamplerBinding::ViaHeaderBinding}; + const bool via_header_index{regs.sampler_binding == Tegra::Engines::Maxwell3D::Regs::SamplerBinding::ViaHeaderBinding}; auto entry = ReadTextureInfo(regs.tex_header.Address(), regs.tex_header.limit, via_header_index, handle); const Shader::TextureType result{ConvertTextureType(entry)}; @@ -379,7 +377,7 @@ Shader::TextureType GraphicsEnvironment::ReadTextureType(u32 handle) { Shader::TexturePixelFormat GraphicsEnvironment::ReadTexturePixelFormat(u32 handle) { const auto& regs{maxwell3d->regs}; - const bool via_header_index{regs.sampler_binding == Maxwell::SamplerBinding::ViaHeaderBinding}; + const bool via_header_index{regs.sampler_binding == Tegra::Engines::Maxwell3D::Regs::SamplerBinding::ViaHeaderBinding}; auto entry = ReadTextureInfo(regs.tex_header.Address(), regs.tex_header.limit, via_header_index, handle); const Shader::TexturePixelFormat result(ConvertTexturePixelFormat(entry)); diff --git a/src/video_core/texture_cache/formatter.h b/src/video_core/texture_cache/formatter.h index 33c32645a2..fb48beae99 100644 --- a/src/video_core/texture_cache/formatter.h +++ b/src/video_core/texture_cache/formatter.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -6,10 +9,12 @@ #include #include - #include "video_core/surface.h" #include "video_core/texture_cache/types.h" +#if FMT_VERSION >= 120100 +#include +#else template <> struct fmt::formatter : fmt::formatter { template @@ -17,213 +22,110 @@ struct fmt::formatter : fmt::formatter : fmt::formatter const string_view name = [type] { using VideoCommon::ImageType; switch (type) { - case ImageType::e1D: - return "1D"; - case ImageType::e2D: - return "2D"; - case ImageType::e3D: - return "3D"; - case ImageType::Linear: - return "Linear"; - case ImageType::Buffer: - return "Buffer"; + case ImageType::e1D: return "1D"; + case ImageType::e2D: return "2D"; + case ImageType::e3D: return "3D"; + case ImageType::Linear: return "Linear"; + case ImageType::Buffer: return "Buffer"; } return "Invalid"; }(); return formatter::format(name, ctx); } }; +#endif template <> struct fmt::formatter { @@ -263,8 +161,7 @@ struct fmt::formatter { template auto format(const VideoCommon::Extent3D& extent, FormatContext& ctx) const { - return fmt::format_to(ctx.out(), "{{{}, {}, {}}}", extent.width, extent.height, - extent.depth); + return fmt::format_to(ctx.out(), "{{{}, {}, {}}}", extent.width, extent.height, extent.depth); } }; diff --git a/src/video_core/texture_cache/texture_cache.cpp b/src/video_core/texture_cache/texture_cache.cpp index 8a9a32f44a..a5b15df680 100644 --- a/src/video_core/texture_cache/texture_cache.cpp +++ b/src/video_core/texture_cache/texture_cache.cpp @@ -1,7 +1,9 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later -#include "video_core/control/channel_state_cache.inc" #include "video_core/texture_cache/texture_cache_base.h" namespace VideoCommon { @@ -10,6 +12,4 @@ TextureCacheChannelInfo::TextureCacheChannelInfo(Tegra::Control::ChannelState& s : ChannelInfo(state), graphics_image_table{gpu_memory}, graphics_sampler_table{gpu_memory}, compute_image_table{gpu_memory}, compute_sampler_table{gpu_memory} {} -template class VideoCommon::ChannelSetupCaches; - } // namespace VideoCommon diff --git a/src/video_core/vulkan_common/vulkan.h b/src/video_core/vulkan_common/vulkan.h index 2cc0f0d7f0..ab0ff73eec 100644 --- a/src/video_core/vulkan_common/vulkan.h +++ b/src/video_core/vulkan_common/vulkan.h @@ -22,6 +22,20 @@ #include +// X11 defines +#ifdef Success +# undef Success +#endif +#ifdef BadValue +# undef BadValue +#endif +#ifdef GrayScale +# undef GrayScale +#endif +#ifdef KeyPress +# undef KeyPress +#endif + // Define maintenance 7-9 extension names (not yet in official Vulkan headers) #ifndef VK_KHR_MAINTENANCE_7_EXTENSION_NAME #define VK_KHR_MAINTENANCE_7_EXTENSION_NAME "VK_KHR_maintenance7" diff --git a/src/web_service/web_backend.cpp b/src/web_service/web_backend.cpp index 60b11fff5a..08413cbeb8 100644 --- a/src/web_service/web_backend.cpp +++ b/src/web_service/web_backend.cpp @@ -17,6 +17,7 @@ #endif #endif #include +#undef INVALID_SOCKET #ifdef __GNUC__ #pragma GCC diagnostic pop #endif diff --git a/src/yuzu/CMakeLists.txt b/src/yuzu/CMakeLists.txt index 1ed1fdff2a..e5b1a816c1 100644 --- a/src/yuzu/CMakeLists.txt +++ b/src/yuzu/CMakeLists.txt @@ -463,4 +463,6 @@ endif() # Remember that the linker is incredibly stupid. target_link_libraries(yuzu PRIVATE OpenSSL::SSL OpenSSL::Crypto SDL2::SDL2) +set_target_properties(yuzu PROPERTIES UNITY_BUILD OFF) + create_target_directory_groups(yuzu) diff --git a/src/yuzu/applets/qt_profile_select.cpp b/src/yuzu/applets/qt_profile_select.cpp index ace6be4d3e..616fb64163 100644 --- a/src/yuzu/applets/qt_profile_select.cpp +++ b/src/yuzu/applets/qt_profile_select.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project @@ -24,22 +24,15 @@ #include "yuzu/util/controller_navigation.h" namespace { -QString FormatUserEntryText(const QString& username, Common::UUID uuid) { - return QtProfileSelectionDialog::tr( - "%1\n%2", "%1 is the profile username, %2 is the formatted UUID (e.g. " - "00112233-4455-6677-8899-AABBCCDDEEFF))") - .arg(username, QString::fromStdString(uuid.FormattedString())); -} - -QString GetImagePath(Common::UUID uuid) { +QString GetProfileImagePath(const Common::UUID uuid) { const auto path = Common::FS::GetEdenPath(Common::FS::EdenPath::NANDDir) / fmt::format("system/save/8000000000000010/su/avators/{}.jpg", uuid.FormattedString()); return QString::fromStdString(Common::FS::PathToUTF8String(path)); } -QPixmap GetIcon(Common::UUID uuid) { - QPixmap icon{GetImagePath(uuid)}; +QPixmap GetProfileIcon(Common::UUID uuid) { + QPixmap icon{GetProfileImagePath(uuid)}; if (!icon) { icon.fill(Qt::black); @@ -118,8 +111,11 @@ QtProfileSelectionDialog::QtProfileSelectionDialog( const auto username = Common::StringFromFixedZeroTerminatedBuffer( reinterpret_cast(profile.username.data()), profile.username.size()); - list_items.push_back(QList{new QStandardItem{ - GetIcon(user), FormatUserEntryText(QString::fromStdString(username), user)}}); + auto const text = QtProfileSelectionDialog::tr( + "%1\n%2", "%1 is the profile username, %2 is the formatted UUID (e.g. " + "00112233-4455-6677-8899-AABBCCDDEEFF))") + .arg(QString::fromStdString(username), QString::fromStdString(user.FormattedString())); + list_items.push_back(QList{new QStandardItem{GetProfileIcon(user), text}}); } for (const auto& item : list_items) diff --git a/src/yuzu/configuration/configure_input_player.cpp b/src/yuzu/configuration/configure_input_player.cpp index 821825f6e1..70e25cc124 100644 --- a/src/yuzu/configuration/configure_input_player.cpp +++ b/src/yuzu/configuration/configure_input_player.cpp @@ -39,7 +39,7 @@ const std::array namespace { -QString GetKeyName(int key_code) { +QString GetInputKeyName(int key_code) { switch (key_code) { case Qt::Key_Shift: return QObject::tr("Shift"); @@ -54,7 +54,7 @@ QString GetKeyName(int key_code) { } } -QString GetButtonName(Common::Input::ButtonNames button_name) { +QString GetInputButtonName(Common::Input::ButtonNames button_name) { switch (button_name) { case Common::Input::ButtonNames::ButtonLeft: return QObject::tr("Left"); @@ -191,7 +191,7 @@ QString ConfigureInputPlayer::ButtonToText(const Common::ParamPackage& param) { // Retrieve the names from Qt if (param.Get("engine", "") == "keyboard") { - const QString button_str = GetKeyName(param.Get("code", 0)); + const QString button_str = GetInputKeyName(param.Get("code", 0)); return QObject::tr("%1%2%3%4").arg(turbo, toggle, inverted, button_str); } @@ -228,7 +228,7 @@ QString ConfigureInputPlayer::ButtonToText(const Common::ParamPackage& param) { } } - QString button_name = GetButtonName(common_button_name); + QString button_name = GetInputButtonName(common_button_name); if (param.Has("hat")) { return QObject::tr("%1%2%3Hat %4").arg(turbo, toggle, inverted, button_name); } diff --git a/src/yuzu/configuration/configure_input_player_widget.cpp b/src/yuzu/configuration/configure_input_player_widget.cpp index 790a860002..cc4667079b 100644 --- a/src/yuzu/configuration/configure_input_player_widget.cpp +++ b/src/yuzu/configuration/configure_input_player_widget.cpp @@ -955,12 +955,12 @@ void PlayerControlPreview::DrawGCController(QPainter& p, const QPointF center) { battery_values[Core::HID::EmulatedDeviceIndex::LeftIndex]); } -constexpr std::array symbol_a = { +static constexpr std::array symbol_a = { -1.085f, -5.2f, 1.085f, -5.2f, 5.085f, 5.0f, 2.785f, 5.0f, 1.785f, 2.65f, -1.785f, 2.65f, -2.785f, 5.0f, -5.085f, 5.0f, -1.4f, 1.0f, 0.0f, -2.8f, 1.4f, 1.0f, -1.4f, 1.0f, -5.085f, 5.0f, }; -constexpr std::array symbol_b = { +static constexpr std::array symbol_b = { -4.0f, 0.0f, -4.0f, 0.0f, -4.0f, -0.1f, -3.8f, -5.1f, 1.8f, -5.0f, 2.3f, -4.9f, 2.6f, -4.8f, 2.8f, -4.7f, 2.9f, -4.6f, 3.1f, -4.5f, 3.2f, -4.4f, 3.4f, -4.3f, 3.4f, -4.2f, 3.5f, -4.1f, 3.7f, -4.0f, 3.7f, -3.9f, 3.8f, -3.8f, 3.8f, -3.7f, 3.9f, -3.6f, 3.9f, @@ -986,24 +986,19 @@ constexpr std::array symbol_b = { 1.9f, -2.9f, 1.9f, -3.0f, 1.8f, -3.1f, 1.6f, -3.2f, 1.6f, -3.3f, 1.3f, -3.4f, -1.9f, -3.3f, -1.9f, -3.2f, -1.8f, -1.0f, 0.2f, -1.1f, 0.3f, -1.1f, -4.0f, 0.0f, }; - -constexpr std::array symbol_y = { +static constexpr std::array symbol_y = { -4.79f, -4.9f, -2.44f, -4.9f, 0.0f, -0.9f, 2.44f, -4.9f, 4.79f, -4.9f, 1.05f, 1.0f, 1.05f, 5.31f, -1.05f, 5.31f, -1.05f, 1.0f, }; - -constexpr std::array symbol_x = { +static constexpr std::array symbol_x = { -4.4f, -5.0f, -2.0f, -5.0f, 0.0f, -1.7f, 2.0f, -5.0f, 4.4f, -5.0f, 1.2f, 0.0f, 4.4f, 5.0f, 2.0f, 5.0f, 0.0f, 1.7f, -2.0f, 5.0f, -4.4f, 5.0f, -1.2f, 0.0f, - }; - -constexpr std::array symbol_l = { +static constexpr std::array symbol_l = { 2.4f, -3.23f, 2.4f, 2.1f, 5.43f, 2.1f, 5.43f, 3.22f, 0.98f, 3.22f, 0.98f, -3.23f, 2.4f, -3.23f, }; - -constexpr std::array symbol_r = { +static constexpr std::array symbol_r = { 1.0f, 0.0f, 1.0f, -0.1f, 1.1f, -3.3f, 4.3f, -3.2f, 5.1f, -3.1f, 5.4f, -3.0f, 5.6f, -2.9f, 5.7f, -2.8f, 5.9f, -2.7f, 5.9f, -2.6f, 6.0f, -2.5f, 6.1f, -2.3f, 6.2f, -2.2f, 6.2f, -2.1f, 6.3f, -2.0f, 6.3f, -1.9f, 6.2f, -0.8f, 6.2f, -0.7f, 6.1f, -0.6f, 6.1f, -0.5f, 6.0f, -0.4f, @@ -1021,14 +1016,12 @@ constexpr std::array symbol_r = { 4.9f, -1.7f, 4.9f, -1.8f, 4.8f, -1.9f, 4.8f, -2.0f, 4.6f, -2.1f, 4.3f, -2.2f, 2.3f, -2.1f, 2.3f, -2.0f, 2.4f, -0.5f, 4.2f, -0.5f, 1.0f, 0.0f, }; - -constexpr std::array symbol_zl = { +static constexpr std::array symbol_zl = { -2.6f, -2.13f, -5.6f, -2.13f, -5.6f, -3.23f, -0.8f, -3.23f, -0.8f, -2.13f, -4.4f, 2.12f, -0.7f, 2.12f, -0.7f, 3.22f, -6.0f, 3.22f, -6.0f, 2.12f, 2.4f, -3.23f, 2.4f, 2.1f, 5.43f, 2.1f, 5.43f, 3.22f, 0.98f, 3.22f, 0.98f, -3.23f, 2.4f, -3.23f, -6.0f, 2.12f, }; - -constexpr std::array symbol_sl = { +static constexpr std::array symbol_sl = { -3.0f, -3.65f, -2.76f, -4.26f, -2.33f, -4.76f, -1.76f, -5.09f, -1.13f, -5.26f, -0.94f, -4.77f, -0.87f, -4.11f, -1.46f, -3.88f, -1.91f, -3.41f, -2.05f, -2.78f, -1.98f, -2.13f, -1.59f, -1.61f, -0.96f, -1.53f, -0.56f, -2.04f, -0.38f, -2.67f, -0.22f, -3.31f, 0.0f, @@ -1042,7 +1035,7 @@ constexpr std::array symbol_sl = { 3.23f, 2.4f, -2.1f, 2.4f, -2.1f, 5.43f, -3.22f, 5.43f, -3.22f, 0.98f, 3.23f, 0.98f, 3.23f, 2.4f, -3.09f, -2.34f, }; -constexpr std::array symbol_zr = { +static constexpr std::array symbol_zr = { -2.6f, -2.13f, -5.6f, -2.13f, -5.6f, -3.23f, -0.8f, -3.23f, -0.8f, -2.13f, -4.4f, 2.12f, -0.7f, 2.12f, -0.7f, 3.22f, -6.0f, 3.22f, -6.0f, 2.12f, @@ -1064,8 +1057,7 @@ constexpr std::array symbol_zr = { -1.2f, 4.9f, -1.7f, 4.9f, -1.8f, 4.8f, -1.9f, 4.8f, -2.0f, 4.6f, -2.1f, 4.3f, -2.2f, 2.3f, -2.1f, 2.3f, -2.0f, 2.4f, -0.5f, 4.2f, -0.5f, 1.0f, 0.0f, -6.0f, 2.12f, }; - -constexpr std::array symbol_sr = { +static constexpr std::array symbol_sr = { -3.0f, -3.65f, -2.76f, -4.26f, -2.33f, -4.76f, -1.76f, -5.09f, -1.13f, -5.26f, -0.94f, -4.77f, -0.87f, -4.11f, -1.46f, -3.88f, -1.91f, -3.41f, -2.05f, -2.78f, -1.98f, -2.13f, -1.59f, -1.61f, -0.96f, -1.53f, -0.56f, -2.04f, -0.38f, -2.67f, -0.22f, -3.31f, 0.0f, -3.93f, 0.34f, -4.49f, @@ -1097,34 +1089,28 @@ constexpr std::array symbol_sr = { -3.09f, -2.34f, }; - -constexpr std::array symbol_c = { +static constexpr std::array symbol_c = { 2.86f, 7.57f, 0.99f, 7.94f, -0.91f, 7.87f, -2.73f, 7.31f, -4.23f, 6.14f, -5.2f, 4.51f, -5.65f, 2.66f, -5.68f, 0.75f, -5.31f, -1.12f, -4.43f, -2.81f, -3.01f, -4.08f, -1.24f, -4.78f, 0.66f, -4.94f, 2.54f, -4.67f, 4.33f, -4.0f, 4.63f, -2.27f, 3.37f, -2.7f, 1.6f, -3.4f, -0.3f, -3.5f, -2.09f, -2.87f, -3.34f, -1.45f, -3.91f, 0.37f, -3.95f, 2.27f, -3.49f, 4.12f, -2.37f, 5.64f, -0.65f, 6.44f, 1.25f, 6.47f, 3.06f, 5.89f, 4.63f, 4.92f, 4.63f, 6.83f, }; - -constexpr std::array symbol_charging = { +static constexpr std::array symbol_charging = { 6.5f, -1.0f, 1.0f, -1.0f, 1.0f, -3.0f, -6.5f, 1.0f, -1.0f, 1.0f, -1.0f, 3.0f, }; - -constexpr std::array house = { +static constexpr std::array house = { -1.3f, 0.0f, -0.93f, 0.0f, -0.93f, 1.15f, 0.93f, 1.15f, 0.93f, 0.0f, 1.3f, 0.0f, 0.0f, -1.2f, -1.3f, 0.0f, -0.43f, 0.0f, -0.43f, .73f, 0.43f, .73f, 0.43f, 0.0f, }; - -constexpr std::array up_arrow_button = { +static constexpr std::array up_arrow_button = { 9.1f, -9.1f, 9.1f, -30.0f, 8.1f, -30.1f, 7.7f, -30.1f, -8.6f, -30.0f, -9.0f, -29.8f, -9.3f, -29.5f, -9.5f, -29.1f, -9.1f, -28.7f, -9.1f, -9.1f, 0.0f, 0.6f, }; - -constexpr std::array up_arrow_symbol = { +static constexpr std::array up_arrow_symbol = { 0.0f, -3.0f, -3.0f, 2.0f, 3.0f, 2.0f, }; - -constexpr std::array trigger_button = { +static constexpr std::array trigger_button = { 5.5f, -12.6f, 5.8f, -12.6f, 6.7f, -12.5f, 8.1f, -12.3f, 8.6f, -12.2f, 9.2f, -12.0f, 9.5f, -11.9f, 9.9f, -11.8f, 10.6f, -11.5f, 11.0f, -11.3f, 11.2f, -11.2f, 11.4f, -11.1f, 11.8f, -10.9f, 12.0f, -10.8f, 12.2f, -10.7f, 12.4f, -10.5f, 12.6f, -10.4f, 12.8f, -10.3f, @@ -1137,8 +1123,7 @@ constexpr std::array trigger_button = { -17.0f, 13.8f, -17.0f, 13.6f, -16.4f, -11.4f, -16.3f, -11.6f, -16.1f, -11.8f, -15.7f, -12.0f, -15.5f, -12.1f, -15.1f, -12.3f, -14.6f, -12.4f, -13.4f, -12.5f, }; - -constexpr std::array pro_left_trigger = { +static constexpr std::array pro_left_trigger = { -65.2f, -132.6f, -68.2f, -134.1f, -71.3f, -135.5f, -74.4f, -136.7f, -77.6f, -137.6f, -80.9f, -138.1f, -84.3f, -138.3f, -87.6f, -138.3f, -91.0f, -138.1f, -94.3f, -137.8f, -97.6f, -137.3f, -100.9f, -136.7f, -107.5f, -135.3f, -110.7f, @@ -1148,14 +1133,12 @@ constexpr std::array pro_left_trigger = { -155.3f, -104.0f, -152.0f, -104.3f, -148.7f, -104.5f, -145.3f, -104.8f, -35.5f, -117.2f, -38.5f, -118.7f, -41.4f, -120.3f, -44.4f, -121.8f, -50.4f, -124.9f, }; - -constexpr std::array pro_body_top = { +static constexpr std::array pro_body_top = { 0.0f, -115.4f, -4.4f, -116.1f, -69.7f, -131.3f, -66.4f, -131.9f, -63.1f, -132.3f, -56.4f, -133.0f, -53.1f, -133.3f, -49.8f, -133.5f, -43.1f, -133.8f, -39.8f, -134.0f, -36.5f, -134.1f, -16.4f, -134.4f, -13.1f, -134.4f, 0.0f, -134.1f, }; - -constexpr std::array pro_left_handle = { +static constexpr std::array pro_left_handle = { -178.7f, -47.5f, -179.0f, -46.1f, -179.3f, -44.6f, -182.0f, -29.8f, -182.3f, -28.4f, -182.6f, -26.9f, -182.8f, -25.4f, -183.1f, -23.9f, -183.3f, -22.4f, -183.6f, -21.0f, -183.8f, -19.5f, -184.1f, -18.0f, -184.3f, -16.5f, -184.6f, -15.1f, -184.8f, -13.6f, @@ -1186,8 +1169,7 @@ constexpr std::array pro_left_handle = { -104.0f, 66.8f, -103.1f, 65.6f, -101.1f, 63.3f, -100.0f, 62.3f, -98.8f, 61.4f, -97.6f, 60.6f, -97.9f, 59.5f, -98.8f, 58.3f, -101.5f, 54.6f, -102.4f, 53.4f, }; - -constexpr std::array pro_body = { +static constexpr std::array pro_body = { -0.7f, -129.1f, -54.3f, -129.1f, -55.0f, -129.1f, -57.8f, -129.0f, -58.5f, -129.0f, -60.7f, -128.9f, -61.4f, -128.9f, -62.8f, -128.8f, -63.5f, -128.8f, -65.7f, -128.7f, -66.4f, -128.7f, -67.8f, -128.6f, -68.5f, -128.6f, -69.2f, -128.5f, -70.0f, -128.5f, @@ -1238,8 +1220,7 @@ constexpr std::array pro_body = { -81.2f, 57.2f, -80.5f, 57.1f, -79.8f, 57.1f, -78.4f, 57.0f, -77.7f, 57.0f, -75.5f, 56.9f, -74.8f, 56.9f, -71.9f, 56.8f, -71.2f, 56.8f, 0.0f, 56.8f, }; - -constexpr std::array gc_body = { +static constexpr std::array gc_body = { 0.0f, -138.03f, -4.91f, -138.01f, -8.02f, -137.94f, -11.14f, -137.82f, -14.25f, -137.67f, -17.37f, -137.48f, -20.48f, -137.25f, -23.59f, -137.0f, -26.69f, -136.72f, -29.8f, -136.41f, -32.9f, -136.07f, -35.99f, -135.71f, -39.09f, -135.32f, -42.18f, @@ -1286,8 +1267,7 @@ constexpr std::array gc_body = { -23.7f, -12.78f, -24.05f, -9.68f, -24.33f, -6.57f, -24.55f, -3.45f, -24.69f, 0.0f, -24.69f, }; - -constexpr std::array gc_left_body = { +static constexpr std::array gc_left_body = { -74.59f, -97.22f, -70.17f, -94.19f, -65.95f, -90.89f, -62.06f, -87.21f, -58.58f, -83.14f, -55.58f, -78.7f, -53.08f, -73.97f, -51.05f, -69.01f, -49.46f, -63.89f, -48.24f, -58.67f, -47.36f, -53.39f, -46.59f, -48.09f, -45.7f, -42.8f, -44.69f, @@ -1311,8 +1291,7 @@ constexpr std::array gc_left_body = { -125.62f, -106.86f, -120.37f, -107.95f, -115.05f, -108.56f, -109.7f, -108.69f, -104.35f, -108.36f, -99.05f, -107.6f, -93.82f, -106.41f, -88.72f, -104.79f, -83.78f, -102.7f, }; - -constexpr std::array left_gc_trigger = { +static constexpr std::array left_gc_trigger = { -99.69f, -125.04f, -101.81f, -126.51f, -104.02f, -127.85f, -106.3f, -129.06f, -108.65f, -130.12f, -111.08f, -130.99f, -113.58f, -131.62f, -116.14f, -131.97f, -121.26f, -131.55f, -123.74f, -130.84f, -126.17f, -129.95f, -128.53f, -128.9f, -130.82f, -127.71f, -133.03f, @@ -1325,8 +1304,7 @@ constexpr std::array left_gc_trigger = { -116.58f, -114.72f, -117.51f, -112.3f, -118.41f, -109.87f, -119.29f, -107.44f, -120.16f, -105.0f, -121.0f, -100.11f, -122.65f, }; - -constexpr std::array gc_button_x = { +static constexpr std::array gc_button_x = { 142.1f, -50.67f, 142.44f, -48.65f, 142.69f, -46.62f, 142.8f, -44.57f, 143.0f, -42.54f, 143.56f, -40.57f, 144.42f, -38.71f, 145.59f, -37.04f, 147.08f, -35.64f, 148.86f, -34.65f, 150.84f, -34.11f, 152.88f, -34.03f, 154.89f, -34.38f, 156.79f, -35.14f, 158.49f, -36.28f, @@ -1338,8 +1316,7 @@ constexpr std::array gc_button_x = { 140.0f, -69.99f, 138.82f, -68.32f, 138.13f, -66.4f, 138.09f, -64.36f, 138.39f, -62.34f, 139.05f, -60.41f, 139.91f, -58.55f, 140.62f, -56.63f, 141.21f, -54.67f, 141.67f, -52.67f, }; - -constexpr std::array gc_button_y = { +static constexpr std::array gc_button_y = { 104.02f, -75.23f, 106.01f, -75.74f, 108.01f, -76.15f, 110.04f, -76.42f, 112.05f, -76.78f, 113.97f, -77.49f, 115.76f, -78.49f, 117.33f, -79.79f, 118.6f, -81.39f, 119.46f, -83.25f, 119.84f, -85.26f, 119.76f, -87.3f, 119.24f, -89.28f, 118.33f, -91.11f, 117.06f, -92.71f, @@ -1351,8 +1328,7 @@ constexpr std::array gc_button_y = { 84.92f, -71.61f, 86.68f, -70.57f, 88.65f, -70.03f, 90.69f, -70.15f, 92.68f, -70.61f, 94.56f, -71.42f, 96.34f, -72.43f, 98.2f, -73.29f, 100.11f, -74.03f, 102.06f, -74.65f, }; - -constexpr std::array gc_button_z = { +static constexpr std::array gc_button_z = { 95.74f, -126.41f, 98.34f, -126.38f, 100.94f, -126.24f, 103.53f, -126.01f, 106.11f, -125.7f, 108.69f, -125.32f, 111.25f, -124.87f, 113.8f, -124.34f, 116.33f, -123.73f, 118.84f, -123.05f, 121.33f, -122.3f, 123.79f, -121.47f, 126.23f, -120.56f, 128.64f, -119.58f, 131.02f, -118.51f, @@ -1364,8 +1340,7 @@ constexpr std::array gc_button_z = { 111.08f, -116.93f, 108.7f, -117.99f, 106.33f, -119.05f, 103.95f, -120.11f, 99.2f, -122.23f, 96.82f, -123.29f, 94.44f, -124.34f, }; - -constexpr std::array left_joycon_body = { +static constexpr std::array left_joycon_body = { -145.0f, -78.9f, -145.0f, -77.9f, -145.0f, 85.6f, -145.0f, 85.6f, -168.3f, 85.5f, -169.3f, 85.4f, -171.3f, 85.1f, -172.3f, 84.9f, -173.4f, 84.7f, -174.3f, 84.5f, -175.3f, 84.2f, -176.3f, 83.8f, -177.3f, 83.5f, -178.2f, 83.1f, -179.2f, 82.7f, @@ -1384,8 +1359,7 @@ constexpr std::array left_joycon_body = { -175.9f, -79.1f, -174.9f, -79.5f, -173.9f, -79.8f, -170.9f, -80.6f, -169.9f, -80.8f, -167.9f, -81.1f, -166.9f, -81.2f, -165.8f, -81.2f, -145.0f, -80.9f, }; - -constexpr std::array left_joycon_trigger = { +static constexpr std::array left_joycon_trigger = { -166.8f, -83.3f, -167.9f, -83.2f, -168.9f, -83.1f, -170.0f, -83.0f, -171.0f, -82.8f, -172.1f, -82.6f, -173.1f, -82.4f, -174.2f, -82.1f, -175.2f, -81.9f, -176.2f, -81.5f, -177.2f, -81.2f, -178.2f, -80.8f, -180.1f, -80.0f, -181.1f, -79.5f, -182.0f, -79.0f, @@ -1404,8 +1378,7 @@ constexpr std::array left_joycon_trigger = { -158.7f, -79.0f, -157.7f, -79.5f, -156.8f, -80.0f, -155.8f, -80.4f, -154.9f, -80.9f, -154.2f, -81.6f, -154.3f, -82.6f, -155.2f, -83.3f, -156.2f, -83.3f, }; - -constexpr std::array handheld_body = { +static constexpr std::array handheld_body = { -137.3f, -81.9f, -137.6f, -81.8f, -137.8f, -81.6f, -138.0f, -81.3f, -138.1f, -81.1f, -138.1f, -80.8f, -138.2f, -78.7f, -138.2f, -78.4f, -138.3f, -78.1f, -138.7f, -77.3f, -138.9f, -77.0f, -139.0f, -76.8f, -139.2f, -76.5f, -139.5f, -76.3f, -139.7f, -76.1f, @@ -1421,8 +1394,7 @@ constexpr std::array handheld_body = { 137.8f, -81.6f, 137.6f, -81.8f, 137.3f, -81.9f, 137.1f, -81.9f, 120.0f, -70.0f, -120.0f, -70.0f, -120.0f, 70.0f, 120.0f, 70.0f, 120.0f, -70.0f, 137.1f, -81.9f, }; - -constexpr std::array handheld_bezel = { +static constexpr std::array handheld_bezel = { -131.4f, -75.9f, -132.2f, -75.7f, -132.9f, -75.3f, -134.2f, -74.3f, -134.7f, -73.6f, -135.1f, -72.8f, -135.4f, -72.0f, -135.5f, -71.2f, -135.5f, -70.4f, -135.2f, 76.7f, -134.8f, 77.5f, -134.3f, 78.1f, -133.7f, 78.8f, -133.1f, 79.2f, -132.3f, 79.6f, @@ -1432,8 +1404,7 @@ constexpr std::array handheld_bezel = { 133.1f, -75.3f, 132.3f, -75.6f, 130.7f, -76.0f, 129.8f, -76.0f, -112.9f, -62.2f, 112.9f, -62.2f, 112.9f, 62.2f, -112.9f, 62.2f, -112.9f, -62.2f, 129.8f, -76.0f, }; - -constexpr std::array handheld_buttons = { +static constexpr std::array handheld_buttons = { -82.48f, -82.95f, -82.53f, -82.95f, -106.69f, -82.96f, -106.73f, -82.98f, -106.78f, -83.01f, -106.81f, -83.05f, -106.83f, -83.1f, -106.83f, -83.15f, -106.82f, -83.93f, -106.81f, -83.99f, -106.8f, -84.04f, -106.78f, -84.08f, -106.76f, -84.13f, -106.73f, -84.18f, -106.7f, -84.22f, @@ -1447,8 +1418,7 @@ constexpr std::array handheld_buttons = { -82.24f, -83.93f, -82.23f, -83.83f, -82.23f, -83.78f, -82.24f, -83.1f, -82.26f, -83.05f, -82.29f, -83.01f, -82.33f, -82.97f, -82.38f, -82.95f, }; - -constexpr std::array left_joycon_slider = { +static constexpr std::array left_joycon_slider = { -23.7f, -118.2f, -23.7f, -117.3f, -23.7f, 96.6f, -22.8f, 96.6f, -21.5f, 97.2f, -21.5f, 98.1f, -21.2f, 106.7f, -20.8f, 107.5f, -20.1f, 108.2f, -19.2f, 108.2f, -16.4f, 108.1f, -15.8f, 107.5f, -15.8f, 106.5f, -15.8f, 62.8f, -16.3f, 61.9f, -15.8f, 61.0f, -17.3f, @@ -1459,8 +1429,7 @@ constexpr std::array left_joycon_slider = { -75.2f, -16.4f, -76.7f, -16.0f, -77.6f, -15.8f, -78.5f, -15.8f, -79.4f, -15.8f, -80.4f, -15.8f, -118.2f, -15.8f, -118.2f, -18.3f, -118.2f, }; - -constexpr std::array left_joycon_sideview = { +static constexpr std::array left_joycon_sideview = { -158.8f, -133.5f, -159.8f, -133.5f, -173.5f, -133.3f, -174.5f, -133.0f, -175.4f, -132.6f, -176.2f, -132.1f, -177.0f, -131.5f, -177.7f, -130.9f, -178.3f, -130.1f, -179.4f, -128.5f, -179.8f, -127.6f, -180.4f, -125.7f, -180.6f, -124.7f, -180.7f, -123.8f, -180.7f, -122.8f, @@ -1476,8 +1445,7 @@ constexpr std::array left_joycon_sideview = { -151.4f, -131.4f, -152.2f, -131.9f, -153.1f, -132.3f, -155.9f, -133.3f, -156.8f, -133.5f, -157.8f, -133.5f, }; - -constexpr std::array left_joycon_body_trigger = { +static constexpr std::array left_joycon_body_trigger = { -146.1f, -124.3f, -146.0f, -122.0f, -145.8f, -119.7f, -145.7f, -117.4f, -145.4f, -112.8f, -145.3f, -110.5f, -145.0f, -105.9f, -144.9f, -103.6f, -144.6f, -99.1f, -144.5f, -96.8f, -144.5f, -89.9f, -144.5f, -87.6f, -144.5f, -83.0f, -144.5f, -80.7f, -144.5f, -80.3f, @@ -1487,8 +1455,7 @@ constexpr std::array left_joycon_body_trigger = { -129.7f, -110.3f, -134.2f, -110.5f, -136.4f, -111.4f, -138.1f, -112.8f, -139.4f, -114.7f, -140.5f, -116.8f, -141.4f, -118.9f, -143.3f, -123.1f, -144.6f, -124.9f, -146.2f, -126.0f, }; - -constexpr std::array left_joycon_topview = { +static constexpr std::array left_joycon_topview = { -184.8f, -20.8f, -185.6f, -21.1f, -186.4f, -21.5f, -187.1f, -22.1f, -187.8f, -22.6f, -188.4f, -23.2f, -189.6f, -24.5f, -190.2f, -25.2f, -190.7f, -25.9f, -191.1f, -26.7f, -191.4f, -27.5f, -191.6f, -28.4f, -191.7f, -29.2f, -191.7f, -30.1f, -191.5f, -47.7f, @@ -1500,8 +1467,7 @@ constexpr std::array left_joycon_topview = { -143.0f, -60.6f, -136.9f, -60.7f, -130.7f, -60.8f, -123.7f, -60.9f, -117.5f, -61.0f, -110.5f, -61.1f, -94.4f, -60.4f, -94.4f, -59.5f, -94.4f, -20.6f, }; - -constexpr std::array left_joycon_slider_topview = { +static constexpr std::array left_joycon_slider_topview = { -95.1f, -51.5f, -95.0f, -51.5f, -91.2f, -51.6f, -91.2f, -51.7f, -91.1f, -52.4f, -91.1f, -52.6f, -91.0f, -54.1f, -86.3f, -54.0f, -86.0f, -53.9f, -85.9f, -53.8f, -85.6f, -53.4f, -85.5f, -53.2f, -85.5f, -53.1f, -85.4f, -52.9f, -85.4f, -52.8f, -85.3f, -52.4f, -85.3f, -52.3f, -85.4f, -27.2f, @@ -1510,8 +1476,7 @@ constexpr std::array left_joycon_slider_topview = { -90.4f, -25.8f, -90.7f, -25.9f, -90.8f, -26.0f, -90.9f, -26.3f, -91.0f, -26.4f, -91.0f, -26.5f, -91.1f, -26.7f, -91.1f, -26.9f, -91.2f, -28.9f, -95.2f, -29.1f, -95.2f, -29.2f, }; - -constexpr std::array left_joycon_sideview_zl = { +static constexpr std::array left_joycon_sideview_zl = { -148.9f, -128.2f, -148.7f, -126.6f, -148.4f, -124.9f, -148.2f, -123.3f, -147.9f, -121.7f, -147.7f, -120.1f, -147.4f, -118.5f, -147.2f, -116.9f, -146.9f, -115.3f, -146.4f, -112.1f, -146.1f, -110.5f, -145.9f, -108.9f, -145.6f, -107.3f, -144.2f, -107.3f, -142.6f, -107.5f, @@ -1522,8 +1487,7 @@ constexpr std::array left_joycon_sideview_zl = { -138.3f, -126.4f, -139.9f, -126.9f, -141.4f, -127.5f, -142.9f, -128.0f, -144.5f, -128.5f, -146.0f, -129.0f, -147.6f, -129.4f, }; - -constexpr std::array left_joystick_sideview = { +static constexpr std::array left_joystick_sideview = { -14.7f, -3.8f, -15.2f, -5.6f, -15.2f, -7.6f, -15.5f, -17.6f, -17.4f, -18.3f, -19.4f, -18.2f, -21.3f, -17.6f, -22.8f, -16.4f, -23.4f, -14.5f, -23.4f, -12.5f, -24.1f, -8.6f, -24.8f, -6.7f, -25.3f, -4.8f, -25.7f, -2.8f, -25.9f, -0.8f, -26.0f, 1.2f, -26.0f, 3.2f, -25.8f, 5.2f, @@ -1537,8 +1501,7 @@ constexpr std::array left_joystick_sideview = { 3.5f, -11.5f, 1.5f, -11.9f, -0.5f, -12.0f, -2.5f, -11.8f, -4.4f, -11.3f, -6.2f, -10.4f, -8.0f, -9.4f, -9.6f, -8.2f, -10.9f, -6.7f, -11.9f, -4.9f, -12.8f, -3.2f, -13.5f, -3.8f, }; - -constexpr std::array left_joystick_L_topview = { +static constexpr std::array left_joystick_L_topview = { -186.7f, -43.7f, -186.4f, -43.7f, -110.6f, -43.4f, -110.6f, -43.1f, -110.7f, -34.3f, -110.7f, -34.0f, -110.8f, -33.7f, -111.1f, -32.9f, -111.2f, -32.6f, -111.4f, -32.3f, -111.5f, -32.1f, -111.7f, -31.8f, -111.8f, -31.5f, -112.0f, -31.3f, -112.2f, -31.0f, @@ -1553,8 +1516,7 @@ constexpr std::array left_joystick_L_topview = { -188.8f, -40.2f, -188.7f, -41.1f, -188.7f, -41.4f, -188.6f, -41.7f, -188.0f, -43.1f, -187.9f, -43.4f, -187.6f, -43.6f, -187.3f, -43.7f, }; - -constexpr std::array left_joystick_ZL_topview = { +static constexpr std::array left_joystick_ZL_topview = { -179.4f, -53.3f, -177.4f, -53.3f, -111.2f, -53.3f, -111.3f, -53.3f, -111.5f, -58.6f, -111.8f, -60.5f, -112.2f, -62.4f, -113.1f, -66.1f, -113.8f, -68.0f, -114.5f, -69.8f, -115.3f, -71.5f, -116.3f, -73.2f, -117.3f, -74.8f, -118.5f, -76.4f, -119.8f, -77.8f, diff --git a/src/yuzu/configuration/configure_motion_touch.cpp b/src/yuzu/configuration/configure_motion_touch.cpp index d1bcac12aa..d462c4c0c6 100644 --- a/src/yuzu/configuration/configure_motion_touch.cpp +++ b/src/yuzu/configuration/configure_motion_touch.cpp @@ -37,17 +37,17 @@ CalibrationConfigurationDialog::CalibrationConfigurationDialog(QWidget* parent, using namespace InputCommon::CemuhookUDP; job = std::make_unique( host, port, - [this](CalibrationConfigurationJob::Status status) { + [this](CalibrationConfigurationJob::CalibrationStatus status) { QMetaObject::invokeMethod(this, [status, this] { QString text; switch (status) { - case CalibrationConfigurationJob::Status::Ready: + case CalibrationConfigurationJob::CalibrationStatus::Ready: text = tr("Touch the top left corner
of your touchpad."); break; - case CalibrationConfigurationJob::Status::Stage1Completed: + case CalibrationConfigurationJob::CalibrationStatus::Stage1Completed: text = tr("Now touch the bottom right corner
of your touchpad."); break; - case CalibrationConfigurationJob::Status::Completed: + case CalibrationConfigurationJob::CalibrationStatus::Completed: text = tr("Configuration completed!"); break; default: @@ -55,7 +55,7 @@ CalibrationConfigurationDialog::CalibrationConfigurationDialog(QWidget* parent, } UpdateLabelText(text); }); - if (status == CalibrationConfigurationJob::Status::Completed) { + if (status == CalibrationConfigurationJob::CalibrationStatus::Completed) { QMetaObject::invokeMethod(this, [this] { UpdateButtonText(tr("OK")); }); } }, diff --git a/src/yuzu/configuration/configure_profile_manager.cpp b/src/yuzu/configuration/configure_profile_manager.cpp index 0d86fb5ef9..75bf18f0ae 100644 --- a/src/yuzu/configuration/configure_profile_manager.cpp +++ b/src/yuzu/configuration/configure_profile_manager.cpp @@ -36,7 +36,7 @@ namespace { -QString GetImagePath(const Common::UUID& uuid) { +QString GetImagePath(const Common::UUID uuid) { const auto path = Common::FS::GetEdenPath(Common::FS::EdenPath::NANDDir) / fmt::format("system/save/8000000000000010/su/avators/{}.jpg", uuid.FormattedString()); diff --git a/src/yuzu/configuration/configure_ringcon.cpp b/src/yuzu/configuration/configure_ringcon.cpp index 4c842bd069..8fb7d6e575 100644 --- a/src/yuzu/configuration/configure_ringcon.cpp +++ b/src/yuzu/configuration/configure_ringcon.cpp @@ -29,7 +29,7 @@ const std::array namespace { -QString GetKeyName(int key_code) { +QString GetRingconKeyName(int key_code) { switch (key_code) { case Qt::Key_Shift: return QObject::tr("Shift"); @@ -44,7 +44,7 @@ QString GetKeyName(int key_code) { } } -QString GetButtonName(Common::Input::ButtonNames button_name) { +QString GetRingconButtonName(Common::Input::ButtonNames button_name) { switch (button_name) { case Common::Input::ButtonNames::ButtonLeft: return QObject::tr("Left"); @@ -99,7 +99,7 @@ QString GetButtonName(Common::Input::ButtonNames button_name) { } } -void SetAnalogParam(const Common::ParamPackage& input_param, Common::ParamPackage& analog_param, +void SetRingconAnalogParam(const Common::ParamPackage& input_param, Common::ParamPackage& analog_param, const std::string& button_name) { // The poller returned a complete axis, so set all the buttons if (input_param.Has("axis_x") && input_param.Has("axis_y")) { @@ -156,7 +156,7 @@ ConfigureRingController::ConfigureRingController(QWidget* parent, analog_map_buttons[sub_button_id], [=, this](const Common::ParamPackage& params) { Common::ParamPackage param = emulated_controller->GetRingParam(); - SetAnalogParam(params, param, analog_sub_buttons[sub_button_id]); + SetRingconAnalogParam(params, param, analog_sub_buttons[sub_button_id]); emulated_controller->SetRingParam(param); }, InputCommon::Polling::InputType::Stick); @@ -401,7 +401,7 @@ QString ConfigureRingController::ButtonToText(const Common::ParamPackage& param) // Retrieve the names from Qt if (param.Get("engine", "") == "keyboard") { - const QString button_str = GetKeyName(param.Get("code", 0)); + const QString button_str = GetRingconKeyName(param.Get("code", 0)); return QObject::tr("%1%2").arg(toggle, button_str); } @@ -438,7 +438,7 @@ QString ConfigureRingController::ButtonToText(const Common::ParamPackage& param) } } - QString button_name = GetButtonName(common_button_name); + QString button_name = GetRingconButtonName(common_button_name); if (param.Has("hat")) { return QObject::tr("%1%2Hat %3").arg(toggle, inverted, button_name); } diff --git a/src/yuzu/configuration/configure_touch_from_button.cpp b/src/yuzu/configuration/configure_touch_from_button.cpp index bbd52e4bfa..55954725ea 100644 --- a/src/yuzu/configuration/configure_touch_from_button.cpp +++ b/src/yuzu/configuration/configure_touch_from_button.cpp @@ -15,7 +15,7 @@ #include "yuzu/configuration/configure_touch_from_button.h" #include "yuzu/configuration/configure_touch_widget.h" -static QString GetKeyName(int key_code) { +static QString GetTouchKeyName(int key_code) { switch (key_code) { case Qt::Key_Shift: return QObject::tr("Shift"); @@ -30,13 +30,13 @@ static QString GetKeyName(int key_code) { } } -static QString ButtonToText(const Common::ParamPackage& param) { +static QString TouchButtonToText(const Common::ParamPackage& param) { if (!param.Has("engine")) { return QObject::tr("[not set]"); } if (param.Get("engine", "") == "keyboard") { - return GetKeyName(param.Get("code", 0)); + return GetTouchKeyName(param.Get("code", 0)); } if (param.Get("engine", "") == "sdl") { @@ -116,7 +116,7 @@ void ConfigureTouchFromButton::UpdateUiDisplay() { for (const auto& button_str : touch_maps[selected_index].buttons) { Common::ParamPackage package{button_str}; - QStandardItem* button = new QStandardItem(ButtonToText(package)); + QStandardItem* button = new QStandardItem(TouchButtonToText(package)); button->setData(QString::fromStdString(button_str)); button->setEditable(false); QStandardItem* xcoord = new QStandardItem(QString::number(package.Get("x", 0))); @@ -238,10 +238,10 @@ void ConfigureTouchFromButton::GetButtonInput(const int row_index, const bool is binding_list_model->removeRow(row_index); } else { cell->setText( - ButtonToText(Common::ParamPackage{cell->data().toString().toStdString()})); + TouchButtonToText(Common::ParamPackage{cell->data().toString().toStdString()})); } } else { - cell->setText(ButtonToText(params)); + cell->setText(TouchButtonToText(params)); cell->setData(QString::fromStdString(params.Serialize())); } }; diff --git a/src/yuzu/util/controller_navigation.cpp b/src/yuzu/util/controller_navigation.cpp index 0dbfca243e..e4f7219fb9 100644 --- a/src/yuzu/util/controller_navigation.cpp +++ b/src/yuzu/util/controller_navigation.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -55,11 +58,11 @@ void ControllerNavigation::ControllerUpdateEvent(Core::HID::ControllerTriggerTyp void ControllerNavigation::ControllerUpdateButton() { const auto controller_type = player1_controller->GetNpadStyleIndex(); - const auto& player1_buttons = player1_controller->GetButtonsValues(); - const auto& handheld_buttons = handheld_controller->GetButtonsValues(); + const auto& player1_btns = player1_controller->GetButtonsValues(); + const auto& handheld_btns = handheld_controller->GetButtonsValues(); - for (std::size_t i = 0; i < player1_buttons.size(); ++i) { - const bool button = player1_buttons[i].value || handheld_buttons[i].value; + for (std::size_t i = 0; i < player1_btns.size(); ++i) { + const bool button = player1_btns[i].value || handheld_btns[i].value; // Trigger only once button_values[i].locked = button == button_values[i].value; button_values[i].value = button; diff --git a/src/yuzu/util/overlay_dialog.cpp b/src/yuzu/util/overlay_dialog.cpp index 2d50f22acb..1969b940d9 100644 --- a/src/yuzu/util/overlay_dialog.cpp +++ b/src/yuzu/util/overlay_dialog.cpp @@ -13,15 +13,6 @@ #include "ui_overlay_dialog.h" #include "yuzu/util/overlay_dialog.h" -namespace { - -constexpr float BASE_TITLE_FONT_SIZE = 14.0f; -constexpr float BASE_FONT_SIZE = 18.0f; -constexpr float BASE_WIDTH = 1280.0f; -constexpr float BASE_HEIGHT = 720.0f; - -} // Anonymous namespace - OverlayDialog::OverlayDialog(QWidget* parent, Core::System& system, const QString& title_text, const QString& body_text, const QString& left_button_text, const QString& right_button_text, Qt::Alignment alignment, diff --git a/src/yuzu/util/overlay_dialog.h b/src/yuzu/util/overlay_dialog.h index a2c9079e64..26dbf3b231 100644 --- a/src/yuzu/util/overlay_dialog.h +++ b/src/yuzu/util/overlay_dialog.h @@ -100,4 +100,9 @@ private: std::unique_ptr input_interpreter; std::jthread input_thread; + + static constexpr float BASE_TITLE_FONT_SIZE = 14.0f; + static constexpr float BASE_FONT_SIZE = 18.0f; + static constexpr float BASE_WIDTH = 1280.0f; + static constexpr float BASE_HEIGHT = 720.0f; }; diff --git a/src/yuzu_cmd/CMakeLists.txt b/src/yuzu_cmd/CMakeLists.txt index 8f92525ad6..4aa90fc91a 100644 --- a/src/yuzu_cmd/CMakeLists.txt +++ b/src/yuzu_cmd/CMakeLists.txt @@ -55,8 +55,6 @@ if(WIN32) endif() endif() -create_target_directory_groups(yuzu-cmd) - # needed for vma if (NOT MSVC) target_compile_options(yuzu-cmd PRIVATE @@ -65,3 +63,7 @@ if (NOT MSVC) $<$:-Wno-unused-parameter> $<$:-Wno-missing-field-initializers>) endif() + +set_target_properties(yuzu-cmd PROPERTIES UNITY_BUILD OFF) + +create_target_directory_groups(yuzu-cmd) diff --git a/src/yuzu_room_standalone/main.cpp b/src/yuzu_room_standalone/main.cpp index 3129fb9dd9..157d583104 100644 --- a/src/yuzu_room_standalone/main.cpp +++ b/src/yuzu_room_standalone/main.cpp @@ -1,6 +1,7 @@ -#include +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later -using namespace std; +#include int main() {