From eee06fba4beb569cc8be28c25d9f23abc50b0dfe Mon Sep 17 00:00:00 2001 From: lizzie Date: Tue, 17 Mar 2026 08:42:34 +0000 Subject: [PATCH 01/72] [cmake] Allow proper unity builds Signed-off-by: lizzie --- .../adsp/apps/opus/opus_decode_object.cpp | 13 +- .../adsp/apps/opus/opus_decoder.cpp | 8 +- .../opus/opus_multistream_decode_object.cpp | 12 +- src/audio_core/in/audio_in.cpp | 3 + .../renderer/command/effect/capture.cpp | 6 +- src/core/arm/dynarmic/arm_dynarmic.h | 19 +- src/core/file_sys/romfs.cpp | 18 +- src/core/hle/service/audio/audio_in.cpp | 14 +- .../hle/service/audio/audio_in_manager.cpp | 18 +- src/core/hle/service/audio/audio_out.cpp | 12 +- .../hle/service/audio/audio_out_manager.cpp | 15 +- src/core/hle/service/audio/audio_renderer.cpp | 9 +- .../service/audio/audio_renderer_manager.cpp | 5 +- .../service/bcat/news/news_data_service.cpp | 17 +- .../bcat/news/news_database_service.cpp | 6 +- src/core/hle/service/nifm/nifm.cpp | 3 +- .../service/nvnflinger/hos_binder_driver.h | 5 + src/core/hle/service/olsc/daemon_controller.h | 2 + .../olsc/olsc_service_for_application.h | 5 + .../olsc/olsc_service_for_system_service.h | 2 + .../service/olsc/remote_storage_controller.h | 2 + .../service/vi/application_display_service.h | 5 + src/core/loader/kip.cpp | 10 +- src/core/loader/nro.cpp | 14 +- src/core/loader/nso.cpp | 8 +- src/hid_core/hidbus/starlink.cpp | 6 +- src/hid_core/hidbus/stubbed.cpp | 6 +- src/hid_core/irsensor/moment_processor.cpp | 21 +- src/input_common/drivers/camera.cpp | 9 +- src/input_common/drivers/mouse.cpp | 34 +-- src/input_common/drivers/touch_screen.cpp | 19 +- src/input_common/drivers/virtual_amiibo.cpp | 8 +- .../backend/glsl/emit_glsl_composite.cpp | 26 +- .../glsl/emit_glsl_context_get_set.cpp | 6 +- .../backend/glsl/emit_glsl_memory.cpp | 12 +- .../backend/glsl/emit_glsl_shared_memory.cpp | 12 +- .../spirv/emit_spirv_floating_point.cpp | 22 +- .../backend/spirv/emit_spirv_image.cpp | 6 +- .../maxwell/indirect_branch_table_track.cpp | 17 +- .../impl/atomic_operations_global_memory.cpp | 50 ++-- .../impl/atomic_operations_shared_memory.cpp | 30 ++- .../impl/floating_point_range_reduction.cpp | 7 +- .../integer_floating_point_conversion.cpp | 8 +- .../impl/internal_stage_buffer_entry_read.cpp | 14 +- .../translate/impl/load_store_attribute.cpp | 19 +- .../impl/load_store_local_shared.cpp | 21 +- .../impl/move_predicate_to_register.cpp | 9 +- .../impl/move_register_to_predicate.cpp | 9 +- .../maxwell/translate/impl/pixel_load.cpp | 11 +- .../impl/surface_atomic_operations.cpp | 74 ++--- .../translate/impl/surface_load_store.cpp | 89 ++++--- .../maxwell/translate/impl/texture_fetch.cpp | 61 +++-- .../translate/impl/texture_fetch_swizzled.cpp | 132 ++++----- .../maxwell/translate/impl/texture_gather.cpp | 73 ++--- .../impl/texture_gather_swizzled.cpp | 53 ++-- .../translate/impl/texture_gradient.cpp | 39 +-- .../maxwell/translate/impl/texture_load.cpp | 67 ++--- .../translate/impl/texture_load_swizzled.cpp | 112 ++++---- .../translate/impl/texture_mipmap_level.cpp | 49 ++-- .../maxwell/translate/impl/texture_query.cpp | 17 +- .../ir_opt/lower_fp16_to_fp32.cpp | 7 +- .../ir_opt/lower_fp64_to_fp32.cpp | 11 +- .../ir_opt/lower_int64_to_int32.cpp | 7 +- src/video_core/CMakeLists.txt | 1 - src/video_core/buffer_cache/buffer_cache.cpp | 14 - src/video_core/compatible_formats.cpp | 8 +- .../control/channel_state_cache.cpp | 84 +++++- .../control/channel_state_cache.inc | 88 ------ src/video_core/renderer_vulkan/blit_image.cpp | 4 +- .../renderer_vulkan/present/layer.cpp | 3 - src/video_core/texture_cache/formatter.h | 252 +----------------- .../texture_cache/texture_cache.cpp | 6 +- src/video_core/vulkan_common/vulkan.h | 8 + 73 files changed, 860 insertions(+), 1012 deletions(-) delete mode 100644 src/video_core/buffer_cache/buffer_cache.cpp delete mode 100644 src/video_core/control/channel_state_cache.inc 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/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/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/file_sys/romfs.cpp b/src/core/file_sys/romfs.cpp index 9cf4928cd9..1d85a500d0 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, 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/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/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/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/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/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/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/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/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..3452efafa8 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) { 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/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/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_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_floating_point_conversion.cpp b/src/shader_recompiler/frontend/maxwell/translate/impl/integer_floating_point_conversion.cpp index 9685b7e43e..77d3f64068 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 @@ -24,7 +24,7 @@ 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; @@ -38,7 +38,7 @@ union Encoding { }; bool Is64(u64 insn) { - return Encoding{insn}.int_format == IntFormat::U64; + return EncodingIFPC{insn}.int_format == IntFormat::U64; } int BitSize(FloatFormat 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"); } 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..d20210aa35 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, @@ -63,7 +63,7 @@ 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; } const isberd{insn}; @@ -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/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..7e954cb53d 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, @@ -44,7 +47,7 @@ constexpr std::array MASK{ R | G | B | A, // }; -enum class Size : u64 { +enum class SurfaceLoadStoreSize : u64 { U8, S8, U16, @@ -54,7 +57,7 @@ enum class Size : u64 { B128, }; -enum class Clamp : u64 { +enum class SurfaceLoadStoreClamp : u64 { IGN, Default, TRAP, @@ -75,75 +78,75 @@ enum class StoreCache : u64 { 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,19 +177,19 @@ 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<33, 3, SurfaceLoadStoreType> type; BitField<24, 2, LoadCache> cache; - BitField<20, 3, Size> size; // .D + 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) { throw NotImplementedException("Cache {}", suld.cache.Value()); @@ -234,19 +237,19 @@ 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<33, 3, SurfaceLoadStoreType> type; BitField<24, 2, StoreCache> cache; - BitField<20, 3, Size> size; // .D + 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) { throw NotImplementedException("Cache {}", sust.cache.Value()); 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..8dfc87b757 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); @@ -156,17 +135,40 @@ IR::Value Sample(TranslatorVisitor& v, u64 insn) { } unsigned Swizzle(u64 insn) { - const Encoding texs{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]; } } @@ -182,23 +184,23 @@ IR::F32 Extract(TranslatorVisitor& v, const IR::Value& sample, unsigned componen } IR::Reg RegStoreComponent32(u64 insn, unsigned index) { - const Encoding texs{insn}; + 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) { +void Store32TFS(TranslatorVisitor& v, u64 insn, const IR::Value& sample) { const unsigned swizzle{Swizzle(insn)}; unsigned store_index{0}; for (unsigned component = 0; component < 4; ++component) { @@ -211,11 +213,11 @@ void Store32(TranslatorVisitor& v, u64 insn, const IR::Value& sample) { } } -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) { +void Store16TFS(TranslatorVisitor& v, u64 insn, const IR::Value& sample) { const unsigned swizzle{Swizzle(insn)}; unsigned store_index{0}; std::array swizzled; @@ -227,23 +229,23 @@ void Store16(TranslatorVisitor& v, u64 insn, const IR::Value& sample) { ++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..6a3efbe57b 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,7 +37,7 @@ 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); } @@ -46,13 +49,13 @@ IR::Value MakeOffset(TranslatorVisitor& v, IR::Reg reg) { 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); 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..87d2897c1e 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,7 +34,7 @@ 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); } @@ -67,8 +46,8 @@ IR::Value MakeOffset(TranslatorVisitor& v, IR::Reg reg) { 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,38 +71,38 @@ 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); 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); @@ -133,7 +112,7 @@ IR::Value Sample(TranslatorVisitor& v, u64 insn) { 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); @@ -141,7 +120,32 @@ IR::Value Sample(TranslatorVisitor& v, u64 insn) { } unsigned Swizzle(u64 insn) { - const Encoding tlds{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()) { @@ -161,23 +165,23 @@ IR::F32 Extract(TranslatorVisitor& v, const IR::Value& sample, unsigned componen } IR::Reg RegStoreComponent32(u64 insn, unsigned index) { - const Encoding tlds{insn}; + 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) { +void Store32TLS(TranslatorVisitor& v, u64 insn, const IR::Value& sample) { const unsigned swizzle{Swizzle(insn)}; unsigned store_index{0}; for (unsigned component = 0; component < 4; ++component) { @@ -190,11 +194,11 @@ void Store32(TranslatorVisitor& v, u64 insn, const IR::Value& sample) { } } -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) { +void Store16TLS(TranslatorVisitor& v, u64 insn, const IR::Value& sample) { const unsigned swizzle{Swizzle(insn)}; unsigned store_index{0}; std::array swizzled; @@ -206,23 +210,23 @@ void Store16(TranslatorVisitor& v, u64 insn, const IR::Value& sample) { ++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/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/renderer_vulkan/blit_image.cpp b/src/video_core/renderer_vulkan/blit_image.cpp index 789f4da2ed..be7ea62ef5 100644 --- a/src/video_core/renderer_vulkan/blit_image.cpp +++ b/src/video_core/renderer_vulkan/blit_image.cpp @@ -414,7 +414,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}; @@ -578,7 +578,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); 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/texture_cache/formatter.h b/src/video_core/texture_cache/formatter.h index 33c32645a2..8976b46199 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 @@ -5,256 +8,12 @@ #include +#include #include #include "video_core/surface.h" #include "video_core/texture_cache/types.h" -template <> -struct fmt::formatter : fmt::formatter { - template - auto format(VideoCore::Surface::PixelFormat format, FormatContext& ctx) const { - using VideoCore::Surface::PixelFormat; - const string_view name = [format] { - switch (format) { - case PixelFormat::A8B8G8R8_UNORM: - return "A8B8G8R8_UNORM"; - case PixelFormat::A8B8G8R8_SNORM: - return "A8B8G8R8_SNORM"; - case PixelFormat::A8B8G8R8_SINT: - return "A8B8G8R8_SINT"; - case PixelFormat::A8B8G8R8_UINT: - return "A8B8G8R8_UINT"; - case PixelFormat::R5G6B5_UNORM: - return "R5G6B5_UNORM"; - case PixelFormat::B5G6R5_UNORM: - return "B5G6R5_UNORM"; - case PixelFormat::A1R5G5B5_UNORM: - return "A1R5G5B5_UNORM"; - case PixelFormat::A2B10G10R10_UNORM: - return "A2B10G10R10_UNORM"; - case PixelFormat::A2B10G10R10_UINT: - return "A2B10G10R10_UINT"; - case PixelFormat::A2R10G10B10_UNORM: - return "A2R10G10B10_UNORM"; - case PixelFormat::A1B5G5R5_UNORM: - return "A1B5G5R5_UNORM"; - case PixelFormat::A5B5G5R1_UNORM: - return "A5B5G5R1_UNORM"; - case PixelFormat::R8_UNORM: - return "R8_UNORM"; - case PixelFormat::R8_SNORM: - return "R8_SNORM"; - case PixelFormat::R8_SINT: - return "R8_SINT"; - case PixelFormat::R8_UINT: - return "R8_UINT"; - case PixelFormat::R16G16B16A16_FLOAT: - return "R16G16B16A16_FLOAT"; - case PixelFormat::R16G16B16A16_UNORM: - return "R16G16B16A16_UNORM"; - case PixelFormat::R16G16B16A16_SNORM: - return "R16G16B16A16_SNORM"; - case PixelFormat::R16G16B16A16_SINT: - return "R16G16B16A16_SINT"; - case PixelFormat::R16G16B16A16_UINT: - return "R16G16B16A16_UINT"; - case PixelFormat::B10G11R11_FLOAT: - return "B10G11R11_FLOAT"; - case PixelFormat::R32G32B32A32_UINT: - return "R32G32B32A32_UINT"; - case PixelFormat::BC1_RGBA_UNORM: - return "BC1_RGBA_UNORM"; - case PixelFormat::BC2_UNORM: - return "BC2_UNORM"; - case PixelFormat::BC3_UNORM: - return "BC3_UNORM"; - case PixelFormat::BC4_UNORM: - return "BC4_UNORM"; - case PixelFormat::BC4_SNORM: - return "BC4_SNORM"; - case PixelFormat::BC5_UNORM: - return "BC5_UNORM"; - case PixelFormat::BC5_SNORM: - return "BC5_SNORM"; - case PixelFormat::BC7_UNORM: - return "BC7_UNORM"; - case PixelFormat::BC6H_UFLOAT: - return "BC6H_UFLOAT"; - case PixelFormat::BC6H_SFLOAT: - return "BC6H_SFLOAT"; - case PixelFormat::ASTC_2D_4X4_UNORM: - return "ASTC_2D_4X4_UNORM"; - case PixelFormat::B8G8R8A8_UNORM: - return "B8G8R8A8_UNORM"; - case PixelFormat::R32G32B32A32_FLOAT: - return "R32G32B32A32_FLOAT"; - case PixelFormat::R32G32B32A32_SINT: - return "R32G32B32A32_SINT"; - case PixelFormat::R32G32_FLOAT: - return "R32G32_FLOAT"; - case PixelFormat::R32G32_SINT: - return "R32G32_SINT"; - case PixelFormat::R32_FLOAT: - return "R32_FLOAT"; - case PixelFormat::R16_FLOAT: - return "R16_FLOAT"; - case PixelFormat::R16_UNORM: - return "R16_UNORM"; - case PixelFormat::R16_SNORM: - return "R16_SNORM"; - case PixelFormat::R16_UINT: - return "R16_UINT"; - case PixelFormat::R16_SINT: - return "R16_SINT"; - case PixelFormat::R16G16_UNORM: - return "R16G16_UNORM"; - case PixelFormat::R16G16_FLOAT: - return "R16G16_FLOAT"; - case PixelFormat::R16G16_UINT: - return "R16G16_UINT"; - case PixelFormat::R16G16_SINT: - return "R16G16_SINT"; - case PixelFormat::R16G16_SNORM: - return "R16G16_SNORM"; - case PixelFormat::R32G32B32_FLOAT: - return "R32G32B32_FLOAT"; - case PixelFormat::A8B8G8R8_SRGB: - return "A8B8G8R8_SRGB"; - case PixelFormat::R8G8_UNORM: - return "R8G8_UNORM"; - case PixelFormat::R8G8_SNORM: - return "R8G8_SNORM"; - case PixelFormat::R8G8_SINT: - return "R8G8_SINT"; - case PixelFormat::R8G8_UINT: - return "R8G8_UINT"; - case PixelFormat::R32G32_UINT: - return "R32G32_UINT"; - case PixelFormat::R16G16B16X16_FLOAT: - return "R16G16B16X16_FLOAT"; - case PixelFormat::R32_UINT: - return "R32_UINT"; - case PixelFormat::R32_SINT: - return "R32_SINT"; - case PixelFormat::ASTC_2D_8X8_UNORM: - return "ASTC_2D_8X8_UNORM"; - case PixelFormat::ASTC_2D_8X5_UNORM: - return "ASTC_2D_8X5_UNORM"; - case PixelFormat::ASTC_2D_5X4_UNORM: - return "ASTC_2D_5X4_UNORM"; - case PixelFormat::B8G8R8A8_SRGB: - return "B8G8R8A8_SRGB"; - case PixelFormat::BC1_RGBA_SRGB: - return "BC1_RGBA_SRGB"; - case PixelFormat::BC2_SRGB: - return "BC2_SRGB"; - case PixelFormat::BC3_SRGB: - return "BC3_SRGB"; - case PixelFormat::BC7_SRGB: - return "BC7_SRGB"; - case PixelFormat::A4B4G4R4_UNORM: - return "A4B4G4R4_UNORM"; - case PixelFormat::G4R4_UNORM: - return "G4R4_UNORM"; - case PixelFormat::ASTC_2D_4X4_SRGB: - return "ASTC_2D_4X4_SRGB"; - case PixelFormat::ASTC_2D_8X8_SRGB: - return "ASTC_2D_8X8_SRGB"; - case PixelFormat::ASTC_2D_8X5_SRGB: - return "ASTC_2D_8X5_SRGB"; - case PixelFormat::ASTC_2D_5X4_SRGB: - return "ASTC_2D_5X4_SRGB"; - case PixelFormat::ASTC_2D_5X5_UNORM: - return "ASTC_2D_5X5_UNORM"; - case PixelFormat::ASTC_2D_5X5_SRGB: - return "ASTC_2D_5X5_SRGB"; - case PixelFormat::ASTC_2D_10X8_UNORM: - return "ASTC_2D_10X8_UNORM"; - case PixelFormat::ASTC_2D_10X8_SRGB: - return "ASTC_2D_10X8_SRGB"; - case PixelFormat::ASTC_2D_6X6_UNORM: - return "ASTC_2D_6X6_UNORM"; - case PixelFormat::ASTC_2D_6X6_SRGB: - return "ASTC_2D_6X6_SRGB"; - case PixelFormat::ASTC_2D_10X6_UNORM: - return "ASTC_2D_10X6_UNORM"; - case PixelFormat::ASTC_2D_10X6_SRGB: - return "ASTC_2D_10X6_SRGB"; - case PixelFormat::ASTC_2D_10X5_UNORM: - return "ASTC_2D_10X5_UNORM"; - case PixelFormat::ASTC_2D_10X5_SRGB: - return "ASTC_2D_10X5_SRGB"; - case PixelFormat::ASTC_2D_10X10_UNORM: - return "ASTC_2D_10X10_UNORM"; - case PixelFormat::ASTC_2D_10X10_SRGB: - return "ASTC_2D_10X10_SRGB"; - case PixelFormat::ASTC_2D_12X10_UNORM: - return "ASTC_2D_12X10_UNORM"; - case PixelFormat::ASTC_2D_12X10_SRGB: - return "ASTC_2D_12X10_SRGB"; - case PixelFormat::ASTC_2D_12X12_UNORM: - return "ASTC_2D_12X12_UNORM"; - case PixelFormat::ASTC_2D_12X12_SRGB: - return "ASTC_2D_12X12_SRGB"; - case PixelFormat::ASTC_2D_8X6_UNORM: - return "ASTC_2D_8X6_UNORM"; - case PixelFormat::ASTC_2D_8X6_SRGB: - return "ASTC_2D_8X6_SRGB"; - case PixelFormat::ASTC_2D_6X5_UNORM: - return "ASTC_2D_6X5_UNORM"; - case PixelFormat::ASTC_2D_6X5_SRGB: - return "ASTC_2D_6X5_SRGB"; - case PixelFormat::E5B9G9R9_FLOAT: - return "E5B9G9R9_FLOAT"; - case PixelFormat::D32_FLOAT: - return "D32_FLOAT"; - case PixelFormat::D16_UNORM: - return "D16_UNORM"; - case PixelFormat::X8_D24_UNORM: - return "X8_D24_UNORM"; - case PixelFormat::S8_UINT: - return "S8_UINT"; - case PixelFormat::D24_UNORM_S8_UINT: - return "D24_UNORM_S8_UINT"; - case PixelFormat::S8_UINT_D24_UNORM: - return "S8_UINT_D24_UNORM"; - case PixelFormat::D32_FLOAT_S8_UINT: - return "D32_FLOAT_S8_UINT"; - case PixelFormat::MaxDepthStencilFormat: - case PixelFormat::Invalid: - return "Invalid"; - } - return "Invalid"; - }(); - return formatter::format(name, ctx); - } -}; - -template <> -struct fmt::formatter : fmt::formatter { - template - auto format(VideoCommon::ImageType type, FormatContext& ctx) const { - 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"; - } - return "Invalid"; - }(); - return formatter::format(name, ctx); - } -}; - template <> struct fmt::formatter { constexpr auto parse(fmt::format_parse_context& ctx) { @@ -263,8 +22,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..eea3fe20b5 100644 --- a/src/video_core/vulkan_common/vulkan.h +++ b/src/video_core/vulkan_common/vulkan.h @@ -22,6 +22,14 @@ #include +/* X11 defines */ +#ifdef Success +# undef Success +#endif +#ifdef BadValue +# undef BadValue +#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" From 37a56afe58017b201b5e6e5e9bfc7de2b595f39f Mon Sep 17 00:00:00 2001 From: lizzie Date: Tue, 17 Mar 2026 22:56:45 +0000 Subject: [PATCH 02/72] FIX FMT --- src/video_core/texture_cache/formatter.h | 143 ++++++++++++++++++++++- 1 file changed, 141 insertions(+), 2 deletions(-) diff --git a/src/video_core/texture_cache/formatter.h b/src/video_core/texture_cache/formatter.h index 8976b46199..fb48beae99 100644 --- a/src/video_core/texture_cache/formatter.h +++ b/src/video_core/texture_cache/formatter.h @@ -8,12 +8,151 @@ #include -#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 + auto format(VideoCore::Surface::PixelFormat format, FormatContext& ctx) const { + using VideoCore::Surface::PixelFormat; + const string_view name = [format] { + switch (format) { + case PixelFormat::A8B8G8R8_UNORM: return "A8B8G8R8_UNORM"; + case PixelFormat::A8B8G8R8_SNORM: return "A8B8G8R8_SNORM"; + case PixelFormat::A8B8G8R8_SINT: return "A8B8G8R8_SINT"; + case PixelFormat::A8B8G8R8_UINT: return "A8B8G8R8_UINT"; + case PixelFormat::R5G6B5_UNORM: return "R5G6B5_UNORM"; + case PixelFormat::B5G6R5_UNORM: return "B5G6R5_UNORM"; + case PixelFormat::A1R5G5B5_UNORM: return "A1R5G5B5_UNORM"; + case PixelFormat::A2B10G10R10_UNORM: return "A2B10G10R10_UNORM"; + case PixelFormat::A2B10G10R10_UINT: return "A2B10G10R10_UINT"; + case PixelFormat::A2R10G10B10_UNORM: return "A2R10G10B10_UNORM"; + case PixelFormat::A1B5G5R5_UNORM: return "A1B5G5R5_UNORM"; + case PixelFormat::A5B5G5R1_UNORM: return "A5B5G5R1_UNORM"; + case PixelFormat::R8_UNORM: return "R8_UNORM"; + case PixelFormat::R8_SNORM: return "R8_SNORM"; + case PixelFormat::R8_SINT: return "R8_SINT"; + case PixelFormat::R8_UINT: return "R8_UINT"; + case PixelFormat::R16G16B16A16_FLOAT: return "R16G16B16A16_FLOAT"; + case PixelFormat::R16G16B16A16_UNORM: return "R16G16B16A16_UNORM"; + case PixelFormat::R16G16B16A16_SNORM: return "R16G16B16A16_SNORM"; + case PixelFormat::R16G16B16A16_SINT: return "R16G16B16A16_SINT"; + case PixelFormat::R16G16B16A16_UINT: return "R16G16B16A16_UINT"; + case PixelFormat::B10G11R11_FLOAT: return "B10G11R11_FLOAT"; + case PixelFormat::R32G32B32A32_UINT: return "R32G32B32A32_UINT"; + case PixelFormat::BC1_RGBA_UNORM: return "BC1_RGBA_UNORM"; + case PixelFormat::BC2_UNORM: return "BC2_UNORM"; + case PixelFormat::BC3_UNORM: return "BC3_UNORM"; + case PixelFormat::BC4_UNORM: return "BC4_UNORM"; + case PixelFormat::BC4_SNORM: return "BC4_SNORM"; + case PixelFormat::BC5_UNORM: return "BC5_UNORM"; + case PixelFormat::BC5_SNORM: return "BC5_SNORM"; + case PixelFormat::BC7_UNORM: return "BC7_UNORM"; + case PixelFormat::BC6H_UFLOAT: return "BC6H_UFLOAT"; + case PixelFormat::BC6H_SFLOAT: return "BC6H_SFLOAT"; + case PixelFormat::ASTC_2D_4X4_UNORM: return "ASTC_2D_4X4_UNORM"; + case PixelFormat::B8G8R8A8_UNORM: return "B8G8R8A8_UNORM"; + case PixelFormat::R32G32B32A32_FLOAT: return "R32G32B32A32_FLOAT"; + case PixelFormat::R32G32B32A32_SINT: return "R32G32B32A32_SINT"; + case PixelFormat::R32G32_FLOAT: return "R32G32_FLOAT"; + case PixelFormat::R32G32_SINT: return "R32G32_SINT"; + case PixelFormat::R32_FLOAT: return "R32_FLOAT"; + case PixelFormat::R16_FLOAT: return "R16_FLOAT"; + case PixelFormat::R16_UNORM: return "R16_UNORM"; + case PixelFormat::R16_SNORM: return "R16_SNORM"; + case PixelFormat::R16_UINT: return "R16_UINT"; + case PixelFormat::R16_SINT: return "R16_SINT"; + case PixelFormat::R16G16_UNORM: return "R16G16_UNORM"; + case PixelFormat::R16G16_FLOAT: return "R16G16_FLOAT"; + case PixelFormat::R16G16_UINT: return "R16G16_UINT"; + case PixelFormat::R16G16_SINT: return "R16G16_SINT"; + case PixelFormat::R16G16_SNORM: return "R16G16_SNORM"; + case PixelFormat::R32G32B32_FLOAT: return "R32G32B32_FLOAT"; + case PixelFormat::A8B8G8R8_SRGB: return "A8B8G8R8_SRGB"; + case PixelFormat::R8G8_UNORM: return "R8G8_UNORM"; + case PixelFormat::R8G8_SNORM: return "R8G8_SNORM"; + case PixelFormat::R8G8_SINT: return "R8G8_SINT"; + case PixelFormat::R8G8_UINT: return "R8G8_UINT"; + case PixelFormat::R32G32_UINT: return "R32G32_UINT"; + case PixelFormat::R16G16B16X16_FLOAT: return "R16G16B16X16_FLOAT"; + case PixelFormat::R32_UINT: return "R32_UINT"; + case PixelFormat::R32_SINT: return "R32_SINT"; + case PixelFormat::ASTC_2D_8X8_UNORM: return "ASTC_2D_8X8_UNORM"; + case PixelFormat::ASTC_2D_8X5_UNORM: return "ASTC_2D_8X5_UNORM"; + case PixelFormat::ASTC_2D_5X4_UNORM: return "ASTC_2D_5X4_UNORM"; + case PixelFormat::B8G8R8A8_SRGB: return "B8G8R8A8_SRGB"; + case PixelFormat::BC1_RGBA_SRGB: return "BC1_RGBA_SRGB"; + case PixelFormat::BC2_SRGB: return "BC2_SRGB"; + case PixelFormat::BC3_SRGB: return "BC3_SRGB"; + case PixelFormat::BC7_SRGB: return "BC7_SRGB"; + case PixelFormat::A4B4G4R4_UNORM: return "A4B4G4R4_UNORM"; + case PixelFormat::G4R4_UNORM: return "G4R4_UNORM"; + case PixelFormat::ASTC_2D_4X4_SRGB: return "ASTC_2D_4X4_SRGB"; + case PixelFormat::ASTC_2D_8X8_SRGB: return "ASTC_2D_8X8_SRGB"; + case PixelFormat::ASTC_2D_8X5_SRGB: return "ASTC_2D_8X5_SRGB"; + case PixelFormat::ASTC_2D_5X4_SRGB: return "ASTC_2D_5X4_SRGB"; + case PixelFormat::ASTC_2D_5X5_UNORM: return "ASTC_2D_5X5_UNORM"; + case PixelFormat::ASTC_2D_5X5_SRGB: return "ASTC_2D_5X5_SRGB"; + case PixelFormat::ASTC_2D_10X8_UNORM: return "ASTC_2D_10X8_UNORM"; + case PixelFormat::ASTC_2D_10X8_SRGB: return "ASTC_2D_10X8_SRGB"; + case PixelFormat::ASTC_2D_6X6_UNORM: return "ASTC_2D_6X6_UNORM"; + case PixelFormat::ASTC_2D_6X6_SRGB: return "ASTC_2D_6X6_SRGB"; + case PixelFormat::ASTC_2D_10X6_UNORM: return "ASTC_2D_10X6_UNORM"; + case PixelFormat::ASTC_2D_10X6_SRGB: return "ASTC_2D_10X6_SRGB"; + case PixelFormat::ASTC_2D_10X5_UNORM: return "ASTC_2D_10X5_UNORM"; + case PixelFormat::ASTC_2D_10X5_SRGB: return "ASTC_2D_10X5_SRGB"; + case PixelFormat::ASTC_2D_10X10_UNORM: return "ASTC_2D_10X10_UNORM"; + case PixelFormat::ASTC_2D_10X10_SRGB: return "ASTC_2D_10X10_SRGB"; + case PixelFormat::ASTC_2D_12X10_UNORM: return "ASTC_2D_12X10_UNORM"; + case PixelFormat::ASTC_2D_12X10_SRGB: return "ASTC_2D_12X10_SRGB"; + case PixelFormat::ASTC_2D_12X12_UNORM: return "ASTC_2D_12X12_UNORM"; + case PixelFormat::ASTC_2D_12X12_SRGB: return "ASTC_2D_12X12_SRGB"; + case PixelFormat::ASTC_2D_8X6_UNORM: return "ASTC_2D_8X6_UNORM"; + case PixelFormat::ASTC_2D_8X6_SRGB: return "ASTC_2D_8X6_SRGB"; + case PixelFormat::ASTC_2D_6X5_UNORM: return "ASTC_2D_6X5_UNORM"; + case PixelFormat::ASTC_2D_6X5_SRGB: return "ASTC_2D_6X5_SRGB"; + case PixelFormat::E5B9G9R9_FLOAT: return "E5B9G9R9_FLOAT"; + case PixelFormat::D32_FLOAT: return "D32_FLOAT"; + case PixelFormat::D16_UNORM: return "D16_UNORM"; + case PixelFormat::X8_D24_UNORM: return "X8_D24_UNORM"; + case PixelFormat::S8_UINT: return "S8_UINT"; + case PixelFormat::D24_UNORM_S8_UINT: return "D24_UNORM_S8_UINT"; + case PixelFormat::S8_UINT_D24_UNORM: return "S8_UINT_D24_UNORM"; + case PixelFormat::D32_FLOAT_S8_UINT: return "D32_FLOAT_S8_UINT"; + case PixelFormat::MaxDepthStencilFormat: return "MaxDepthStencilFormat"; + case PixelFormat::Invalid: return "Invalid"; + } + return "Invalid"; + }(); + return formatter::format(name, ctx); + } +}; + +template <> +struct fmt::formatter : fmt::formatter { + template + auto format(VideoCommon::ImageType type, FormatContext& ctx) const { + 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"; + } + return "Invalid"; + }(); + return formatter::format(name, ctx); + } +}; +#endif + template <> struct fmt::formatter { constexpr auto parse(fmt::format_parse_context& ctx) { From 1036f84ac37c95893bc9c77b3bda9d22c3175cc3 Mon Sep 17 00:00:00 2001 From: lizzie Date: Tue, 17 Mar 2026 23:28:24 +0000 Subject: [PATCH 03/72] fix with bigger batch sizes --- src/common/x64/cpu_detect.cpp | 4 +- .../backend/arm64/emit_arm64_memory.cpp | 2 +- .../glasm/emit_glasm_context_get_set.cpp | 8 +-- .../backend/glasm/emit_glasm_instructions.h | 7 ++- .../glasm/emit_glasm_not_implemented.cpp | 49 +++++++++-------- .../backend/glasm/glasm_emit_context.cpp | 8 +-- .../glsl/emit_glsl_context_get_set.cpp | 6 +- .../backend/glsl/emit_glsl_instructions.h | 2 +- .../backend/glsl/emit_glsl_special.cpp | 8 +-- .../backend/spirv/emit_spirv_image_atomic.cpp | 10 ++-- ...oating_point_conversion_floating_point.cpp | 55 ++++++++++--------- .../impl/integer_add_three_input.cpp | 35 ++++++------ .../integer_floating_point_conversion.cpp | 18 +++--- .../impl/integer_short_multiply_add.cpp | 27 +++++---- .../impl/internal_stage_buffer_entry_read.cpp | 12 ++-- .../translate/impl/load_store_memory.cpp | 11 ++-- .../translate/impl/surface_load_store.cpp | 12 ++-- .../translate/impl/texture_fetch_swizzled.cpp | 16 +++--- .../impl/texture_gather_swizzled.cpp | 4 +- .../translate/impl/texture_load_swizzled.cpp | 22 ++++---- 20 files changed, 164 insertions(+), 152 deletions(-) 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/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/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..580811bf30 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 @@ -18,6 +18,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..50cc9a301b 100644 --- a/src/shader_recompiler/backend/glasm/glasm_emit_context.cpp +++ b/src/shader_recompiler/backend/glasm/glasm_emit_context.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,11 +24,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_context_get_set.cpp b/src/shader_recompiler/backend/glsl/emit_glsl_context_get_set.cpp index 3452efafa8..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 @@ -32,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); @@ -281,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_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_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/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/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 77d3f64068..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 @@ -11,7 +11,7 @@ namespace Shader::Maxwell { namespace { -enum class FloatFormat : u64 { +enum class IntegerToFloatFormat : u64 { F16 = 1, F32 = 2, F64 = 3, @@ -27,7 +27,7 @@ enum class IntFormat : u64 { 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; @@ -41,13 +41,13 @@ bool Is64(u64 insn) { 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); @@ -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 d20210aa35..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 @@ -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(); } } @@ -65,7 +65,7 @@ void TranslatorVisitor::ISBERD(u64 insn) { BitField<32, 1, u64> o; 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{}; 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/surface_load_store.cpp b/src/shader_recompiler/frontend/maxwell/translate/impl/surface_load_store.cpp index 7e954cb53d..795e5a1c84 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 @@ -64,14 +64,14 @@ enum class SurfaceLoadStoreClamp : u64 { }; // 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 @@ -178,7 +178,7 @@ void TranslatorVisitor::SULD(u64 insn) { BitField<52, 1, u64> d; BitField<23, 1, u64> ba; BitField<33, 3, SurfaceLoadStoreType> type; - BitField<24, 2, LoadCache> cache; + BitField<24, 2, SURFLoadCache> cache; BitField<20, 3, SurfaceLoadStoreSize> size; // .D BitField<20, 4, u64> swizzle; // .P BitField<49, 2, SurfaceLoadStoreClamp> clamp; @@ -191,7 +191,7 @@ void TranslatorVisitor::SULD(u64 insn) { 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}; @@ -238,7 +238,7 @@ void TranslatorVisitor::SUST(u64 insn) { BitField<52, 1, u64> d; BitField<23, 1, u64> ba; BitField<33, 3, SurfaceLoadStoreType> type; - BitField<24, 2, StoreCache> cache; + BitField<24, 2, SURFStoreCache> cache; BitField<20, 3, SurfaceLoadStoreSize> size; // .D BitField<20, 4, u64> swizzle; // .P BitField<49, 2, SurfaceLoadStoreClamp> clamp; @@ -251,7 +251,7 @@ void TranslatorVisitor::SUST(u64 insn) { 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_swizzled.cpp b/src/shader_recompiler/frontend/maxwell/translate/impl/texture_fetch_swizzled.cpp index 8dfc87b757..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 @@ -134,7 +134,7 @@ IR::Value SampleTFS(TranslatorVisitor& v, u64 insn) { } } -unsigned Swizzle(u64 insn) { +unsigned FetchSwizzle(u64 insn) { #define R 1 #define G 2 #define B 4 @@ -173,7 +173,7 @@ unsigned Swizzle(u64 insn) { } } -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}; @@ -183,7 +183,7 @@ IR::F32 Extract(TranslatorVisitor& v, const IR::Value& sample, unsigned componen } } -IR::Reg RegStoreComponent32(u64 insn, unsigned index) { +IR::Reg FetchRegStoreComponent32(u64 insn, unsigned index) { const EncodinTFS texs{insn}; switch (index) { case 0: @@ -201,14 +201,14 @@ IR::Reg RegStoreComponent32(u64 insn, unsigned index) { } void Store32TFS(TranslatorVisitor& v, u64 insn, const IR::Value& sample) { - const unsigned swizzle{Swizzle(insn)}; + 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; } } @@ -218,14 +218,14 @@ IR::U32 PackTFS(TranslatorVisitor& v, const IR::F32& lhs, const IR::F32& rhs) { } void Store16TFS(TranslatorVisitor& v, u64 insn, const IR::Value& sample) { - const unsigned swizzle{Swizzle(insn)}; + 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)}; 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 6a3efbe57b..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 @@ -43,7 +43,7 @@ void CheckAlignmentTGS(IR::Reg reg, size_t alignment) { } } -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)); @@ -65,7 +65,7 @@ IR::Value SampleTGS(TranslatorVisitor& v, u64 insn) { if (tld4s.aoffi != 0) { 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) { CheckAlignmentTGS(reg_b, 2); IR::F32 dref = v.F(reg_b + 1); 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 87d2897c1e..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 @@ -40,7 +40,7 @@ void CheckAlignmentTLS(IR::Reg reg, size_t alignment) { } } -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)); @@ -74,7 +74,7 @@ IR::Value SampleTLS(TranslatorVisitor& v, u64 insn) { 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: CheckAlignmentTLS(reg_a, 2); @@ -106,7 +106,7 @@ IR::Value SampleTLS(TranslatorVisitor& v, u64 insn) { 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()); @@ -119,7 +119,7 @@ IR::Value SampleTLS(TranslatorVisitor& v, u64 insn) { return v.ir.ImageFetch(handle, coords, offsets, lod, multisample, info); } -unsigned Swizzle(u64 insn) { +unsigned LoadSwizzle(u64 insn) { #define R 1 #define G 2 #define B 4 @@ -160,11 +160,11 @@ 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) { +IR::Reg LoadRegStoreComponent32(u64 insn, unsigned index) { const EncodinTLS tlds{insn}; switch (index) { case 0: @@ -182,14 +182,14 @@ IR::Reg RegStoreComponent32(u64 insn, unsigned index) { } void Store32TLS(TranslatorVisitor& v, u64 insn, const IR::Value& sample) { - const unsigned swizzle{Swizzle(insn)}; + 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; } } @@ -199,14 +199,14 @@ IR::U32 PackTLS(TranslatorVisitor& v, const IR::F32& lhs, const IR::F32& rhs) { } void Store16TLS(TranslatorVisitor& v, u64 insn, const IR::Value& sample) { - const unsigned swizzle{Swizzle(insn)}; + 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)}; From 5a866bb216853a8abb82262160edf639637fe7e8 Mon Sep 17 00:00:00 2001 From: lizzie Date: Tue, 17 Mar 2026 23:42:16 +0000 Subject: [PATCH 04/72] fixup dynarmic, and dont forget push constants --- src/video_core/renderer_vulkan/blit_image.cpp | 22 +++++++++---------- .../renderer_vulkan/present/fsr.cpp | 12 +++++----- src/video_core/shader_environment.cpp | 20 ++++++++--------- 3 files changed, 26 insertions(+), 28 deletions(-) diff --git a/src/video_core/renderer_vulkan/blit_image.cpp b/src/video_core/renderer_vulkan/blit_image.cpp index be7ea62ef5..44385f1654 100644 --- a/src/video_core/renderer_vulkan/blit_image.cpp +++ b/src/video_core/renderer_vulkan/blit_image.cpp @@ -69,7 +69,7 @@ namespace { }; } -struct PushConstants { +struct BlitPushConstants { std::array tex_scale; std::array tex_offset; }; @@ -394,13 +394,13 @@ 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) / static_cast(src_size.height)}, }; - cmdbuf.PushConstants(layout, VK_SHADER_STAGE_VERTEX_BIT, push_constants); + cmdbuf.BlitPushConstants(layout, VK_SHADER_STAGE_VERTEX_BIT, push_constants); } VkExtent2D GetConversionExtent(const ImageView& src_image_view) { @@ -507,11 +507,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)), @@ -709,7 +709,7 @@ void BlitImageHelper::ClearColor(const Framebuffer* dst_framebuffer, u8 color_ma (color_mask & 0x4) ? 1.0f : 0.0f, (color_mask & 0x8) ? 1.0f : 0.0f}; cmdbuf.SetBlendConstants(blend_color.data()); BindBlitState(cmdbuf, dst_region); - cmdbuf.PushConstants(layout, VK_SHADER_STAGE_FRAGMENT_BIT, clear_color); + cmdbuf.BlitPushConstants(layout, VK_SHADER_STAGE_FRAGMENT_BIT, clear_color); cmdbuf.Draw(3, 1, 0, 0); }); scheduler.InvalidateState(); @@ -733,7 +733,7 @@ void BlitImageHelper::ClearDepthStencil(const Framebuffer* dst_framebuffer, bool cmdbuf.SetBlendConstants(blend_constants.data()); cmdbuf.BindPipeline(VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline); BindBlitState(cmdbuf, dst_region); - cmdbuf.PushConstants(layout, VK_SHADER_STAGE_FRAGMENT_BIT, clear_depth); + cmdbuf.BlitPushConstants(layout, VK_SHADER_STAGE_FRAGMENT_BIT, clear_depth); cmdbuf.Draw(3, 1, 0, 0); }); scheduler.InvalidateState(); @@ -765,7 +765,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}, }; @@ -777,7 +777,7 @@ void BlitImageHelper::Convert(VkPipeline pipeline, const Framebuffer* dst_frameb nullptr); cmdbuf.SetViewport(0, viewport); cmdbuf.SetScissor(0, scissor); - cmdbuf.PushConstants(layout, VK_SHADER_STAGE_VERTEX_BIT, push_constants); + cmdbuf.BlitPushConstants(layout, VK_SHADER_STAGE_VERTEX_BIT, push_constants); cmdbuf.Draw(3, 1, 0, 0); }); scheduler.InvalidateState(); @@ -811,7 +811,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}, }; @@ -823,7 +823,7 @@ void BlitImageHelper::ConvertDepthStencil(VkPipeline pipeline, const Framebuffer nullptr); cmdbuf.SetViewport(0, viewport); cmdbuf.SetScissor(0, scissor); - cmdbuf.PushConstants(layout, VK_SHADER_STAGE_VERTEX_BIT, push_constants); + cmdbuf.BlitPushConstants(layout, VK_SHADER_STAGE_VERTEX_BIT, push_constants); cmdbuf.Draw(3, 1, 0, 0); }); scheduler.InvalidateState(); diff --git a/src/video_core/renderer_vulkan/present/fsr.cpp b/src/video_core/renderer_vulkan/present/fsr.cpp index ba6252ed95..599acbd141 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, @@ -190,7 +190,7 @@ VkImageView FSR::Draw(Scheduler& scheduler, size_t image_index, VkImage source_i cmdbuf.BindPipeline(VK_PIPELINE_BIND_POINT_GRAPHICS, easu_pipeline); cmdbuf.BindDescriptorSets(VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, easu_descriptor_set, {}); - cmdbuf.PushConstants(pipeline_layout, VK_SHADER_STAGE_FRAGMENT_BIT, easu_con); + cmdbuf.FsrPushConstants(pipeline_layout, VK_SHADER_STAGE_FRAGMENT_BIT, easu_con); cmdbuf.Draw(3, 1, 0, 0); cmdbuf.EndRenderPass(); @@ -200,7 +200,7 @@ VkImageView FSR::Draw(Scheduler& scheduler, size_t image_index, VkImage source_i cmdbuf.BindPipeline(VK_PIPELINE_BIND_POINT_GRAPHICS, rcas_pipeline); cmdbuf.BindDescriptorSets(VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, rcas_descriptor_set, {}); - cmdbuf.PushConstants(pipeline_layout, VK_SHADER_STAGE_FRAGMENT_BIT, rcas_con); + cmdbuf.FsrPushConstants(pipeline_layout, VK_SHADER_STAGE_FRAGMENT_BIT, rcas_con); cmdbuf.Draw(3, 1, 0, 0); cmdbuf.EndRenderPass(); 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)); From daa8ef88cc1276e4fb1686c41dca492f5df6ea7b Mon Sep 17 00:00:00 2001 From: lizzie Date: Tue, 17 Mar 2026 23:53:07 +0000 Subject: [PATCH 05/72] fixup more compile issues --- src/video_core/dirty_flags.cpp | 3 + .../renderer_opengl/gl_state_tracker.cpp | 3 + .../renderer_opengl/gl_texture_cache.h | 18 ++--- src/video_core/renderer_vulkan/blit_image.cpp | 12 ++- .../renderer_vulkan/present/fsr.cpp | 4 +- .../renderer_vulkan/vk_rasterizer.cpp | 76 +++++++++---------- .../renderer_vulkan/vk_state_tracker.cpp | 3 + .../renderer_vulkan/vk_texture_cache.cpp | 8 +- 8 files changed, 60 insertions(+), 67 deletions(-) diff --git a/src/video_core/dirty_flags.cpp b/src/video_core/dirty_flags.cpp index c2ecc12f56..fa92563628 100644 --- a/src/video_core/dirty_flags.cpp +++ b/src/video_core/dirty_flags.cpp @@ -75,3 +75,6 @@ void SetupDirtyFlags(Maxwell3D::DirtyState::Tables& tables) { } } // namespace VideoCommon::Dirty + +#undef OFF +#undef NUM diff --git a/src/video_core/renderer_opengl/gl_state_tracker.cpp b/src/video_core/renderer_opengl/gl_state_tracker.cpp index d53b422cac..4430124b7b 100644 --- a/src/video_core/renderer_opengl/gl_state_tracker.cpp +++ b/src/video_core/renderer_opengl/gl_state_tracker.cpp @@ -241,3 +241,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.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 44385f1654..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) { @@ -400,7 +398,7 @@ void BindBlitState(vk::CommandBuffer cmdbuf, VkPipelineLayout layout, const Regi static_cast(src_region.start.y) / static_cast(src_size.height)}, }; - cmdbuf.BlitPushConstants(layout, VK_SHADER_STAGE_VERTEX_BIT, push_constants); + cmdbuf.PushConstants(layout, VK_SHADER_STAGE_VERTEX_BIT, push_constants); } VkExtent2D GetConversionExtent(const ImageView& src_image_view) { @@ -709,7 +707,7 @@ void BlitImageHelper::ClearColor(const Framebuffer* dst_framebuffer, u8 color_ma (color_mask & 0x4) ? 1.0f : 0.0f, (color_mask & 0x8) ? 1.0f : 0.0f}; cmdbuf.SetBlendConstants(blend_color.data()); BindBlitState(cmdbuf, dst_region); - cmdbuf.BlitPushConstants(layout, VK_SHADER_STAGE_FRAGMENT_BIT, clear_color); + cmdbuf.PushConstants(layout, VK_SHADER_STAGE_FRAGMENT_BIT, clear_color); cmdbuf.Draw(3, 1, 0, 0); }); scheduler.InvalidateState(); @@ -733,7 +731,7 @@ void BlitImageHelper::ClearDepthStencil(const Framebuffer* dst_framebuffer, bool cmdbuf.SetBlendConstants(blend_constants.data()); cmdbuf.BindPipeline(VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline); BindBlitState(cmdbuf, dst_region); - cmdbuf.BlitPushConstants(layout, VK_SHADER_STAGE_FRAGMENT_BIT, clear_depth); + cmdbuf.PushConstants(layout, VK_SHADER_STAGE_FRAGMENT_BIT, clear_depth); cmdbuf.Draw(3, 1, 0, 0); }); scheduler.InvalidateState(); @@ -777,7 +775,7 @@ void BlitImageHelper::Convert(VkPipeline pipeline, const Framebuffer* dst_frameb nullptr); cmdbuf.SetViewport(0, viewport); cmdbuf.SetScissor(0, scissor); - cmdbuf.BlitPushConstants(layout, VK_SHADER_STAGE_VERTEX_BIT, push_constants); + cmdbuf.PushConstants(layout, VK_SHADER_STAGE_VERTEX_BIT, push_constants); cmdbuf.Draw(3, 1, 0, 0); }); scheduler.InvalidateState(); @@ -823,7 +821,7 @@ void BlitImageHelper::ConvertDepthStencil(VkPipeline pipeline, const Framebuffer nullptr); cmdbuf.SetViewport(0, viewport); cmdbuf.SetScissor(0, scissor); - cmdbuf.BlitPushConstants(layout, VK_SHADER_STAGE_VERTEX_BIT, push_constants); + cmdbuf.PushConstants(layout, VK_SHADER_STAGE_VERTEX_BIT, push_constants); cmdbuf.Draw(3, 1, 0, 0); }); scheduler.InvalidateState(); diff --git a/src/video_core/renderer_vulkan/present/fsr.cpp b/src/video_core/renderer_vulkan/present/fsr.cpp index 599acbd141..de10397af1 100644 --- a/src/video_core/renderer_vulkan/present/fsr.cpp +++ b/src/video_core/renderer_vulkan/present/fsr.cpp @@ -190,7 +190,7 @@ VkImageView FSR::Draw(Scheduler& scheduler, size_t image_index, VkImage source_i cmdbuf.BindPipeline(VK_PIPELINE_BIND_POINT_GRAPHICS, easu_pipeline); cmdbuf.BindDescriptorSets(VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, easu_descriptor_set, {}); - cmdbuf.FsrPushConstants(pipeline_layout, VK_SHADER_STAGE_FRAGMENT_BIT, easu_con); + cmdbuf.PushConstants(pipeline_layout, VK_SHADER_STAGE_FRAGMENT_BIT, easu_con); cmdbuf.Draw(3, 1, 0, 0); cmdbuf.EndRenderPass(); @@ -200,7 +200,7 @@ VkImageView FSR::Draw(Scheduler& scheduler, size_t image_index, VkImage source_i cmdbuf.BindPipeline(VK_PIPELINE_BIND_POINT_GRAPHICS, rcas_pipeline); cmdbuf.BindDescriptorSets(VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, rcas_descriptor_set, {}); - cmdbuf.FsrPushConstants(pipeline_layout, VK_SHADER_STAGE_FRAGMENT_BIT, rcas_con); + cmdbuf.PushConstants(pipeline_layout, VK_SHADER_STAGE_FRAGMENT_BIT, rcas_con); cmdbuf.Draw(3, 1, 0, 0); cmdbuf.EndRenderPass(); diff --git a/src/video_core/renderer_vulkan/vk_rasterizer.cpp b/src/video_core/renderer_vulkan/vk_rasterizer.cpp index f867980a6f..9dacbd8d64 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); }); @@ -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..32225c9fa3 100644 --- a/src/video_core/renderer_vulkan/vk_state_tracker.cpp +++ b/src/video_core/renderer_vulkan/vk_state_tracker.cpp @@ -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..6bc610cc35 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; } @@ -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, From f5537313138d97fa48a074d7d52649fa04c55014 Mon Sep 17 00:00:00 2001 From: lizzie Date: Tue, 17 Mar 2026 23:58:07 +0000 Subject: [PATCH 06/72] fuck? --- src/audio_core/in/audio_in_system.cpp | 8 ++++---- src/audio_core/out/audio_out_system.cpp | 7 +++---- src/video_core/dirty_flags.cpp | 3 +++ src/video_core/renderer_opengl/gl_state_tracker.cpp | 3 +++ src/video_core/renderer_vulkan/vk_state_tracker.cpp | 2 +- 5 files changed, 14 insertions(+), 9 deletions(-) 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/video_core/dirty_flags.cpp b/src/video_core/dirty_flags.cpp index fa92563628..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 diff --git a/src/video_core/renderer_opengl/gl_state_tracker.cpp b/src/video_core/renderer_opengl/gl_state_tracker.cpp index 4430124b7b..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 diff --git a/src/video_core/renderer_vulkan/vk_state_tracker.cpp b/src/video_core/renderer_vulkan/vk_state_tracker.cpp index 32225c9fa3..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 From 65489a8f5928eb1e4682d1de63c8305d58d21b18 Mon Sep 17 00:00:00 2001 From: lizzie Date: Wed, 18 Mar 2026 00:03:10 +0000 Subject: [PATCH 07/72] more fs fixes --- src/core/file_sys/fs_save_data_types.h | 8 ++++---- src/core/file_sys/fsmitm_romfsbuild.cpp | 2 +- src/core/file_sys/fsmitm_romfsbuild.h | 2 +- src/core/file_sys/romfs.cpp | 2 +- src/core/hle/service/ro/ro_results.h | 2 ++ 5 files changed, 9 insertions(+), 7 deletions(-) diff --git a/src/core/file_sys/fs_save_data_types.h b/src/core/file_sys/fs_save_data_types.h index cdefe908d5..133494bb1c 100644 --- a/src/core/file_sys/fs_save_data_types.h +++ b/src/core/file_sys/fs_save_data_types.h @@ -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..5652aa1947 100644 --- a/src/core/file_sys/fsmitm_romfsbuild.cpp +++ b/src/core/file_sys/fsmitm_romfsbuild.cpp @@ -11,7 +11,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..35f02d0d09 100644 --- a/src/core/file_sys/fsmitm_romfsbuild.h +++ b/src/core/file_sys/fsmitm_romfsbuild.h @@ -9,7 +9,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 1d85a500d0..120a6fd503 100644 --- a/src/core/file_sys/romfs.cpp +++ b/src/core/file_sys/romfs.cpp @@ -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/hle/service/ro/ro_results.h b/src/core/hle/service/ro/ro_results.h index 00f05c5a59..1f96caa15c 100644 --- a/src/core/hle/service/ro/ro_results.h +++ b/src/core/hle/service/ro/ro_results.h @@ -1,6 +1,8 @@ // 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 { From d17e8043e0a55606cbcc2ab0bf0834a4f7514f15 Mon Sep 17 00:00:00 2001 From: lizzie Date: Wed, 18 Mar 2026 00:08:19 +0000 Subject: [PATCH 08/72] fix pragma once in even MORE core stuff --- src/core/file_sys/fs_save_data_types.h | 2 +- src/core/file_sys/fsmitm_romfsbuild.cpp | 3 +++ src/core/file_sys/fsmitm_romfsbuild.h | 3 +++ src/core/hle/kernel/svc/svc_memory.cpp | 22 +++++++++---------- .../hle/kernel/svc/svc_process_memory.cpp | 6 ++--- .../hle/service/olsc/native_handle_holder.h | 2 ++ .../olsc/transfer_task_list_controller.h | 2 ++ src/core/hle/service/ro/ro_results.h | 3 +++ 8 files changed, 28 insertions(+), 15 deletions(-) diff --git a/src/core/file_sys/fs_save_data_types.h b/src/core/file_sys/fs_save_data_types.h index 133494bb1c..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 diff --git a/src/core/file_sys/fsmitm_romfsbuild.cpp b/src/core/file_sys/fsmitm_romfsbuild.cpp index 5652aa1947..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 diff --git a/src/core/file_sys/fsmitm_romfsbuild.h b/src/core/file_sys/fsmitm_romfsbuild.h index 35f02d0d09..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 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/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/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/ro/ro_results.h b/src/core/hle/service/ro/ro_results.h index 1f96caa15c..906378bc7f 100644 --- a/src/core/hle/service/ro/ro_results.h +++ b/src/core/hle/service/ro/ro_results.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 From f12fa481a82a87279a3c13005fa2cb25d7fdb758 Mon Sep 17 00:00:00 2001 From: lizzie Date: Wed, 18 Mar 2026 00:13:28 +0000 Subject: [PATCH 09/72] FIX BSD DEFINE IN FUCKING BSD?, fix INVALID_SOCKET on httplib --- .../hle/service/bcat/news/builtin_news.cpp | 1 + src/core/hle/service/sockets/bsd.cpp | 178 +++++++++--------- src/core/hle/service/sockets/bsd.h | 20 +- src/core/hle/service/sockets/sockets.cpp | 4 +- src/core/hle/service/ssl/ssl.cpp | 4 +- src/frontend_common/update_checker.cpp | 1 + src/qt_common/discord/discord_impl.cpp | 1 + src/web_service/web_backend.cpp | 1 + 8 files changed, 107 insertions(+), 103 deletions(-) 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/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..60de147636 100644 --- a/src/core/hle/service/sockets/bsd.h +++ b/src/core/hle/service/sockets/bsd.h @@ -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..c0cd8fdbd6 100644 --- a/src/core/hle/service/sockets/sockets.cpp +++ b/src/core/hle/service/sockets/sockets.cpp @@ -12,8 +12,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/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/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/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 From c907f8f0e455a1da7ed03a9fffc7a00ff799e9e3 Mon Sep 17 00:00:00 2001 From: lizzie Date: Wed, 18 Mar 2026 00:18:08 +0000 Subject: [PATCH 10/72] fix YET ANOTHER STUPID PRAGMA ONCE --- src/core/hle/service/sockets/bsd.h | 2 +- src/core/hle/service/sockets/sockets.cpp | 3 +++ src/core/hle/service/vi/system_display_service.h | 4 +++- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/core/hle/service/sockets/bsd.h b/src/core/hle/service/sockets/bsd.h index 60de147636..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 diff --git a/src/core/hle/service/sockets/sockets.cpp b/src/core/hle/service/sockets/sockets.cpp index c0cd8fdbd6..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 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" From a64747a96382dea36717e366b8ac36973aec0df5 Mon Sep 17 00:00:00 2001 From: lizzie Date: Wed, 18 Mar 2026 00:31:33 +0000 Subject: [PATCH 11/72] more qt fixes --- src/video_core/vulkan_common/vulkan.h | 8 +++++++- src/yuzu/applets/qt_profile_select.cpp | 17 ++++++++++------- .../configuration/configure_input_player.cpp | 10 +++++----- .../configuration/configure_profile_manager.cpp | 2 +- src/yuzu/configuration/configure_ringcon.cpp | 10 +++++----- .../configure_touch_from_button.cpp | 12 ++++++------ src/yuzu/util/overlay_dialog.cpp | 9 --------- src/yuzu/util/overlay_dialog.h | 5 +++++ 8 files changed, 39 insertions(+), 34 deletions(-) diff --git a/src/video_core/vulkan_common/vulkan.h b/src/video_core/vulkan_common/vulkan.h index eea3fe20b5..ab0ff73eec 100644 --- a/src/video_core/vulkan_common/vulkan.h +++ b/src/video_core/vulkan_common/vulkan.h @@ -22,13 +22,19 @@ #include -/* X11 defines */ +// 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 diff --git a/src/yuzu/applets/qt_profile_select.cpp b/src/yuzu/applets/qt_profile_select.cpp index ace6be4d3e..1c8c8dfea2 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,22 @@ #include "yuzu/util/controller_navigation.h" namespace { -QString FormatUserEntryText(const QString& username, Common::UUID uuid) { +QString FormatProfileUserEntryText(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 +118,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..1d22d42dce 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"); @@ -187,11 +187,11 @@ QString ConfigureInputPlayer::ButtonToText(const Common::ParamPackage& param) { const QString inverted = QString::fromStdString(param.Get("inverted", false) ? "!" : ""); const QString invert = QString::fromStdString(param.Get("invert", "+") == "-" ? "-" : ""); const QString turbo = QString::fromStdString(param.Get("turbo", false) ? "$" : ""); - const auto common_button_name = input_subsystem->GetButtonName(param); + const auto common_button_name = input_subsystem->GetInputButtonName(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_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..627e201a41 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"); @@ -397,11 +397,11 @@ QString ConfigureRingController::ButtonToText(const Common::ParamPackage& param) const QString toggle = QString::fromStdString(param.Get("toggle", false) ? "~" : ""); const QString inverted = QString::fromStdString(param.Get("inverted", false) ? "!" : ""); - const auto common_button_name = input_subsystem->GetButtonName(param); + const auto common_button_name = input_subsystem->GetRingconButtonName(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/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; }; From 1666722849e1b327fcf8b14356fb754666297237 Mon Sep 17 00:00:00 2001 From: lizzie Date: Wed, 18 Mar 2026 00:34:01 +0000 Subject: [PATCH 12/72] EVEN MORE FIXES --- .../configure_input_player_widget.cpp | 118 ++++++------------ src/yuzu/util/controller_navigation.cpp | 11 +- 2 files changed, 47 insertions(+), 82 deletions(-) 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/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; From fe4cb3318bd4fd104005ccf9614a923890c3acf2 Mon Sep 17 00:00:00 2001 From: lizzie Date: Wed, 18 Mar 2026 00:39:44 +0000 Subject: [PATCH 13/72] stupid 1 --- src/yuzu/configuration/configure_input_player.cpp | 2 +- src/yuzu/configuration/configure_ringcon.cpp | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/yuzu/configuration/configure_input_player.cpp b/src/yuzu/configuration/configure_input_player.cpp index 1d22d42dce..70e25cc124 100644 --- a/src/yuzu/configuration/configure_input_player.cpp +++ b/src/yuzu/configuration/configure_input_player.cpp @@ -187,7 +187,7 @@ QString ConfigureInputPlayer::ButtonToText(const Common::ParamPackage& param) { const QString inverted = QString::fromStdString(param.Get("inverted", false) ? "!" : ""); const QString invert = QString::fromStdString(param.Get("invert", "+") == "-" ? "-" : ""); const QString turbo = QString::fromStdString(param.Get("turbo", false) ? "$" : ""); - const auto common_button_name = input_subsystem->GetInputButtonName(param); + const auto common_button_name = input_subsystem->GetButtonName(param); // Retrieve the names from Qt if (param.Get("engine", "") == "keyboard") { diff --git a/src/yuzu/configuration/configure_ringcon.cpp b/src/yuzu/configuration/configure_ringcon.cpp index 627e201a41..8fb7d6e575 100644 --- a/src/yuzu/configuration/configure_ringcon.cpp +++ b/src/yuzu/configuration/configure_ringcon.cpp @@ -99,7 +99,7 @@ QString GetRingconButtonName(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); @@ -397,7 +397,7 @@ QString ConfigureRingController::ButtonToText(const Common::ParamPackage& param) const QString toggle = QString::fromStdString(param.Get("toggle", false) ? "~" : ""); const QString inverted = QString::fromStdString(param.Get("inverted", false) ? "!" : ""); - const auto common_button_name = input_subsystem->GetRingconButtonName(param); + const auto common_button_name = input_subsystem->GetButtonName(param); // Retrieve the names from Qt if (param.Get("engine", "") == "keyboard") { From ff5d24ada66c3139d848933b53bce329ab3cc4ba Mon Sep 17 00:00:00 2001 From: lizzie Date: Wed, 18 Mar 2026 00:46:52 +0000 Subject: [PATCH 14/72] yay it works --- src/yuzu/applets/qt_profile_select.cpp | 7 ------- 1 file changed, 7 deletions(-) diff --git a/src/yuzu/applets/qt_profile_select.cpp b/src/yuzu/applets/qt_profile_select.cpp index 1c8c8dfea2..616fb64163 100644 --- a/src/yuzu/applets/qt_profile_select.cpp +++ b/src/yuzu/applets/qt_profile_select.cpp @@ -24,13 +24,6 @@ #include "yuzu/util/controller_navigation.h" namespace { -QString FormatProfileUserEntryText(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 GetProfileImagePath(const Common::UUID uuid) { const auto path = Common::FS::GetEdenPath(Common::FS::EdenPath::NANDDir) / From e5813cdc6b8c1979ff10d2c84d3bd5094fcd53e5 Mon Sep 17 00:00:00 2001 From: lizzie Date: Wed, 18 Mar 2026 01:07:54 +0000 Subject: [PATCH 15/72] ENABLE_UNITY_BUILD --- CMakeLists.txt | 3 +++ docs/Options.md | 1 + src/CMakeLists.txt | 5 +++++ 3 files changed, 9 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 42717c496d..805b46e9dc 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -66,6 +66,9 @@ if (YUZU_STATIC_ROOM) set(fmt_FORCE_BUNDLED ON) endif() +# my unity/jumbo build +option(ENABLE_UNITY_BUILD "Enable Unity/Jumbo build" OFF) + # 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..cb5ab28869 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 5000) +endif() + # Dynarmic if (ARCHITECTURE_x86_64 OR ARCHITECTURE_arm64 AND NOT YUZU_STATIC_ROOM) add_subdirectory(dynarmic) From 957fa8b09e9babaf17cecf533c2e4b1561079f1f Mon Sep 17 00:00:00 2001 From: lizzie Date: Wed, 18 Mar 2026 01:40:27 +0000 Subject: [PATCH 16/72] fix openg --- .../renderer_opengl/gl_buffer_cache.cpp | 10 +---- .../renderer_opengl/gl_compute_pipeline.cpp | 18 ++++----- .../renderer_opengl/gl_graphics_pipeline.cpp | 18 ++++----- .../renderer_opengl/gl_rasterizer.h | 5 ++- .../renderer_opengl/gl_texture_cache.cpp | 38 +++++++++---------- .../renderer_vulkan/vk_texture_cache.cpp | 2 +- 6 files changed, 44 insertions(+), 47 deletions(-) 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_texture_cache.cpp b/src/video_core/renderer_opengl/gl_texture_cache.cpp index 958988f27e..29e00534cf 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 @@ -1103,7 +1103,7 @@ bool Image::ScaleDown(bool ignore) { } ImageView::ImageView(TextureCacheRuntime& runtime, const VideoCommon::ImageViewInfo& info, - ImageId image_id_, Image& image, const SlotVector&) + 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; @@ -1130,18 +1130,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 +1157,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_vulkan/vk_texture_cache.cpp b/src/video_core/renderer_vulkan/vk_texture_cache.cpp index 6bc610cc35..7241cda903 100644 --- a/src/video_core/renderer_vulkan/vk_texture_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_texture_cache.cpp @@ -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; From 3140f2a75459c56f184b6f09bb51de15cdf780fe Mon Sep 17 00:00:00 2001 From: lizzie Date: Wed, 18 Mar 2026 03:00:04 +0000 Subject: [PATCH 17/72] fix polygon lut name issue --- .../renderer_vulkan/fixed_pipeline_state.cpp | 44 +++++++++---------- .../renderer_vulkan/vk_rasterizer.cpp | 36 +++++++-------- 2 files changed, 40 insertions(+), 40 deletions(-) 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/vk_rasterizer.cpp b/src/video_core/renderer_vulkan/vk_rasterizer.cpp index 9dacbd8d64..6e63bdf18b 100644 --- a/src/video_core/renderer_vulkan/vk_rasterizer.cpp +++ b/src/video_core/renderer_vulkan/vk_rasterizer.cpp @@ -1499,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, From 40346dd6bcd8ac71b345b59636f32fe8426e4975 Mon Sep 17 00:00:00 2001 From: lizzie Date: Wed, 18 Mar 2026 07:26:22 +0000 Subject: [PATCH 18/72] qrc buildage exclude --- CMakeLists.txt | 4 ++++ src/yuzu/CMakeLists.txt | 40 ++++++++++++++++++++++++++-------------- 2 files changed, 30 insertions(+), 14 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 805b46e9dc..454d910776 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -68,6 +68,10 @@ endif() # my unity/jumbo build option(ENABLE_UNITY_BUILD "Enable Unity/Jumbo build" OFF) +if(MSVC AND ENABLE_UNITY_BUILD) + # Unity builds need big objects for MSVC... + add_compile_options(/bigobj) +endif() # qt stuff option(ENABLE_QT "Enable the Qt frontend" ON) diff --git a/src/yuzu/CMakeLists.txt b/src/yuzu/CMakeLists.txt index 1ed1fdff2a..f0cd9cbe10 100644 --- a/src/yuzu/CMakeLists.txt +++ b/src/yuzu/CMakeLists.txt @@ -2,7 +2,7 @@ # SPDX-License-Identifier: GPL-3.0-or-later set(CMAKE_AUTOMOC ON) -set(CMAKE_AUTORCC ON) +set(CMAKE_AUTORCC OFF) set(CMAKE_AUTOUIC ON) set(CMAKE_INCLUDE_CURRENT_DIR ON) @@ -269,6 +269,10 @@ file(GLOB COMPAT_LIST file(GLOB_RECURSE ICONS ${PROJECT_SOURCE_DIR}/dist/icons/*) file(GLOB_RECURSE THEMES ${PROJECT_SOURCE_DIR}/dist/qt_themes/*) +file(GLOB QRC_COMPAT_LIST ${PROJECT_BINARY_DIR}/dist/compatibility_list/compatibility_list.qrc) +file(GLOB_RECURSE QRC_ICONS ${PROJECT_SOURCE_DIR}/dist/icons/*.qrc) +file(GLOB_RECURSE QRC_THEMES ${PROJECT_SOURCE_DIR}/dist/qt_themes/*.qrc) + if (ENABLE_UPDATE_CHECKER) target_compile_definitions(yuzu PUBLIC ENABLE_UPDATE_CHECKER) endif() @@ -341,26 +345,34 @@ if (ENABLE_QT_TRANSLATION) qt_add_translation(LANGUAGES_QM ${PROJECT_SOURCE_DIR}/dist/english_plurals/en.ts) # Build a QRC file from the QM file list - set(LANGUAGES_QRC ${CMAKE_CURRENT_BINARY_DIR}/languages.qrc) - file(WRITE ${LANGUAGES_QRC} "\n") + set(QRC_LANGUAGES ${CMAKE_CURRENT_BINARY_DIR}/languages.qrc) + file(WRITE ${QRC_LANGUAGES} "\n") foreach (QM ${LANGUAGES_QM}) get_filename_component(QM_FILE ${QM} NAME) - file(APPEND ${LANGUAGES_QRC} "${QM_FILE}\n") + file(APPEND ${QRC_LANGUAGES} "${QM_FILE}\n") endforeach (QM) - file(APPEND ${LANGUAGES_QRC} "") - - # Add the QRC file to package in all QM files - qt_add_resources(LANGUAGES ${LANGUAGES_QRC}) + file(APPEND ${QRC_LANGUAGES} "") else() set(LANGUAGES) endif() -target_sources(yuzu - PRIVATE - ${COMPAT_LIST} - ${ICONS} - ${LANGUAGES} - ${THEMES}) +target_sources(yuzu PRIVATE + ${COMPAT_LIST} + ${ICONS} + ${THEMES} + ${LANGUAGES} +) + +# Add the QRC file to package in all QM files +qt_add_resources( + ${QRC_COMPAT_LIST} + ${QRC_ICONS} + ${QRC_THEMES} + LANGUAGES ${QRC_LANGUAGES} + OUTPUT_TARGETS ${QRC_OUTPUT_TARGETS} +) +set_source_files_properties(${QRC_OUTPUT_TARGETS} PROPERTIES SKIP_UNITY_BUILD_INCLUSION ON) +target_sources(yuzu PRIVATE ${QRC_OUTPUT_TARGETS}) # TODO(crueter): Move Assets.car/icon/icns handling to its own Module. if (APPLE) From 55878b2e9942a51c2cadba412c83052e373f6a0f Mon Sep 17 00:00:00 2001 From: lizzie Date: Wed, 18 Mar 2026 07:28:12 +0000 Subject: [PATCH 19/72] fix cityhash --- src/common/cityhash.cpp | 17 +++++++++-------- src/yuzu_room_standalone/main.cpp | 5 +++-- 2 files changed, 12 insertions(+), 10 deletions(-) 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/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() { From d19a2bc01adcc7b89d08e0a272640aea9f4de8d5 Mon Sep 17 00:00:00 2001 From: lizzie Date: Wed, 18 Mar 2026 07:38:12 +0000 Subject: [PATCH 20/72] fix? --- src/shader_recompiler/backend/glasm/emit_glasm_instructions.h | 1 + src/shader_recompiler/backend/glasm/glasm_emit_context.cpp | 1 + src/video_core/renderer_opengl/gl_texture_cache.cpp | 1 + 3 files changed, 3 insertions(+) diff --git a/src/shader_recompiler/backend/glasm/emit_glasm_instructions.h b/src/shader_recompiler/backend/glasm/emit_glasm_instructions.h index 580811bf30..455e63e2c9 100644 --- a/src/shader_recompiler/backend/glasm/emit_glasm_instructions.h +++ b/src/shader_recompiler/backend/glasm/emit_glasm_instructions.h @@ -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 { diff --git a/src/shader_recompiler/backend/glasm/glasm_emit_context.cpp b/src/shader_recompiler/backend/glasm/glasm_emit_context.cpp index 50cc9a301b..0141d78bd1 100644 --- a/src/shader_recompiler/backend/glasm/glasm_emit_context.cpp +++ b/src/shader_recompiler/backend/glasm/glasm_emit_context.cpp @@ -6,6 +6,7 @@ #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" diff --git a/src/video_core/renderer_opengl/gl_texture_cache.cpp b/src/video_core/renderer_opengl/gl_texture_cache.cpp index 29e00534cf..0e6a57a37b 100644 --- a/src/video_core/renderer_opengl/gl_texture_cache.cpp +++ b/src/video_core/renderer_opengl/gl_texture_cache.cpp @@ -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 { From 4dfd184b16fb808cc019af269eaef14dbc0d546d Mon Sep 17 00:00:00 2001 From: lizzie Date: Wed, 18 Mar 2026 07:46:12 +0000 Subject: [PATCH 21/72] fix? --- .../renderer_opengl/gl_texture_cache.cpp | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/video_core/renderer_opengl/gl_texture_cache.cpp b/src/video_core/renderer_opengl/gl_texture_cache.cpp index 0e6a57a37b..e8bc8c2cb3 100644 --- a/src/video_core/renderer_opengl/gl_texture_cache.cpp +++ b/src/video_core/renderer_opengl/gl_texture_cache.cpp @@ -629,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(); @@ -1103,10 +1104,10 @@ bool Image::ScaleDown(bool ignore) { return true; } -ImageView::ImageView(TextureCacheRuntime& runtime, const VideoCommon::ImageViewInfo& info, - ImageId image_id_, Image& image, const Common::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); From 674e97e383d27b346be26b1827339f62a99577ec Mon Sep 17 00:00:00 2001 From: crueter Date: Wed, 1 Apr 2026 01:53:58 -0400 Subject: [PATCH 22/72] Fix comp Signed-off-by: crueter --- CMakeLists.txt | 1 + src/network/packet.h | 1 + src/yuzu/CMakeLists.txt | 2 +- 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 454d910776..aa25ce9c44 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -69,6 +69,7 @@ endif() # my unity/jumbo build option(ENABLE_UNITY_BUILD "Enable Unity/Jumbo build" OFF) if(MSVC AND ENABLE_UNITY_BUILD) + message(STATUS "Unity build") # Unity builds need big objects for MSVC... add_compile_options(/bigobj) endif() diff --git a/src/network/packet.h b/src/network/packet.h index 9aa2a2c9cf..8c6acd7200 100644 --- a/src/network/packet.h +++ b/src/network/packet.h @@ -5,6 +5,7 @@ #include #include +#include #include "common/common_types.h" namespace Network { diff --git a/src/yuzu/CMakeLists.txt b/src/yuzu/CMakeLists.txt index f0cd9cbe10..70bfad7151 100644 --- a/src/yuzu/CMakeLists.txt +++ b/src/yuzu/CMakeLists.txt @@ -364,7 +364,7 @@ target_sources(yuzu PRIVATE ) # Add the QRC file to package in all QM files -qt_add_resources( +qt_add_resources(yuzu ${QRC_COMPAT_LIST} ${QRC_ICONS} ${QRC_THEMES} From 055e61947599606f5cc036b92882d994884bad16 Mon Sep 17 00:00:00 2001 From: crueter Date: Wed, 1 Apr 2026 02:01:09 -0400 Subject: [PATCH 23/72] Some build fixes Signed-off-by: crueter --- src/input_common/drivers/udp_client.cpp | 14 +++++++------- src/input_common/drivers/udp_client.h | 4 ++-- src/network/packet.h | 15 +++++---------- src/network/room.cpp | 4 ++-- .../calibration_configuration_job.cpp | 8 ++++---- src/yuzu/configuration/configure_motion_touch.cpp | 10 +++++----- 6 files changed, 25 insertions(+), 30 deletions(-) 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..65095b43f4 100644 --- a/src/input_common/drivers/udp_client.h +++ b/src/input_common/drivers/udp_client.h @@ -163,7 +163,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 +176,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/network/packet.h b/src/network/packet.h index 8c6acd7200..428f7d6453 100644 --- a/src/network/packet.h +++ b/src/network/packet.h @@ -119,26 +119,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/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/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")); }); } }, From 42e1c9b4d87329084c1f3516f5c00a0b2f366611 Mon Sep 17 00:00:00 2001 From: crueter Date: Wed, 1 Apr 2026 02:02:32 -0400 Subject: [PATCH 24/72] Fix rdoc Signed-off-by: crueter --- src/core/tools/renderdoc.cpp | 6 ++++-- src/core/tools/renderdoc.h | 4 +--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/core/tools/renderdoc.cpp b/src/core/tools/renderdoc.cpp index 5fab291fe5..e49dac64a0 100644 --- a/src/core/tools/renderdoc.cpp +++ b/src/core/tools/renderdoc.cpp @@ -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}; }; From a9aa0cce4ab041cde2862133d130810ae3a7851c Mon Sep 17 00:00:00 2001 From: crueter Date: Wed, 1 Apr 2026 02:27:20 -0400 Subject: [PATCH 25/72] barely-working VMA fix Signed-off-by: crueter --- src/CMakeLists.txt | 2 +- .../translate/impl/surface_load_store.cpp | 38 +++++++++---------- src/video_core/vulkan_common/vma.h | 7 ++++ src/yuzu/CMakeLists.txt | 1 + 4 files changed, 28 insertions(+), 20 deletions(-) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index cb5ab28869..c184d3b493 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -9,7 +9,7 @@ include_directories(.) if (ENABLE_UNITY_BUILD) set(CMAKE_UNITY_BUILD ON) - set(CMAKE_UNITY_BUILD_BATCH_SIZE 5000) + set(CMAKE_UNITY_BUILD_BATCH_SIZE 100) endif() # Dynarmic 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 795e5a1c84..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 @@ -23,28 +23,28 @@ enum class SurfaceLoadStoreType : 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 SurfaceLoadStoreSize : u64 { diff --git a/src/video_core/vulkan_common/vma.h b/src/video_core/vulkan_common/vma.h index e022b2bf7d..4a76b775b8 100644 --- a/src/video_core/vulkan_common/vma.h +++ b/src/video_core/vulkan_common/vma.h @@ -7,6 +7,11 @@ #include "video_core/vulkan_common/vulkan.h" +// #if !defined(VMA_IMPLEMENTATION) && !defined(VMA_IMPLEMENTED) +// #define VMA_IMPLEMENTED +// #define VMA_IMPLEMENTATION +// #endif + #define VMA_STATIC_VULKAN_FUNCTIONS 0 #define VMA_DYNAMIC_VULKAN_FUNCTIONS 1 @@ -19,3 +24,5 @@ #ifdef _MSC_VER #pragma warning( pop ) #endif + +// #undef VMA_IMPLEMENTATION diff --git a/src/yuzu/CMakeLists.txt b/src/yuzu/CMakeLists.txt index 70bfad7151..41fb404220 100644 --- a/src/yuzu/CMakeLists.txt +++ b/src/yuzu/CMakeLists.txt @@ -266,6 +266,7 @@ endif() file(GLOB COMPAT_LIST ${PROJECT_BINARY_DIR}/dist/compatibility_list/compatibility_list.qrc ${PROJECT_BINARY_DIR}/dist/compatibility_list/compatibility_list.json) + file(GLOB_RECURSE ICONS ${PROJECT_SOURCE_DIR}/dist/icons/*) file(GLOB_RECURSE THEMES ${PROJECT_SOURCE_DIR}/dist/qt_themes/*) From 03c8e0f74f2f4645b4a3dcc1ba859e7d2e101e42 Mon Sep 17 00:00:00 2001 From: crueter Date: Wed, 1 Apr 2026 02:41:49 -0400 Subject: [PATCH 26/72] ACTUALLY fix VMA garbage Signed-off-by: crueter --- src/tests/CMakeLists.txt | 2 ++ src/tests/common/bit_field.cpp | 6 ++--- src/video_core/vulkan_common/vma.h | 7 ----- src/yuzu/CMakeLists.txt | 43 +++++++++++------------------- src/yuzu_cmd/CMakeLists.txt | 6 +++-- 5 files changed, 25 insertions(+), 39 deletions(-) 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..6fdabd9b3f 100644 --- a/src/tests/common/bit_field.cpp +++ b/src/tests/common/bit_field.cpp @@ -4,9 +4,6 @@ // 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/video_core/vulkan_common/vma.h b/src/video_core/vulkan_common/vma.h index 4a76b775b8..e022b2bf7d 100644 --- a/src/video_core/vulkan_common/vma.h +++ b/src/video_core/vulkan_common/vma.h @@ -7,11 +7,6 @@ #include "video_core/vulkan_common/vulkan.h" -// #if !defined(VMA_IMPLEMENTATION) && !defined(VMA_IMPLEMENTED) -// #define VMA_IMPLEMENTED -// #define VMA_IMPLEMENTATION -// #endif - #define VMA_STATIC_VULKAN_FUNCTIONS 0 #define VMA_DYNAMIC_VULKAN_FUNCTIONS 1 @@ -24,5 +19,3 @@ #ifdef _MSC_VER #pragma warning( pop ) #endif - -// #undef VMA_IMPLEMENTATION diff --git a/src/yuzu/CMakeLists.txt b/src/yuzu/CMakeLists.txt index 41fb404220..e5b1a816c1 100644 --- a/src/yuzu/CMakeLists.txt +++ b/src/yuzu/CMakeLists.txt @@ -2,7 +2,7 @@ # SPDX-License-Identifier: GPL-3.0-or-later set(CMAKE_AUTOMOC ON) -set(CMAKE_AUTORCC OFF) +set(CMAKE_AUTORCC ON) set(CMAKE_AUTOUIC ON) set(CMAKE_INCLUDE_CURRENT_DIR ON) @@ -266,14 +266,9 @@ endif() file(GLOB COMPAT_LIST ${PROJECT_BINARY_DIR}/dist/compatibility_list/compatibility_list.qrc ${PROJECT_BINARY_DIR}/dist/compatibility_list/compatibility_list.json) - file(GLOB_RECURSE ICONS ${PROJECT_SOURCE_DIR}/dist/icons/*) file(GLOB_RECURSE THEMES ${PROJECT_SOURCE_DIR}/dist/qt_themes/*) -file(GLOB QRC_COMPAT_LIST ${PROJECT_BINARY_DIR}/dist/compatibility_list/compatibility_list.qrc) -file(GLOB_RECURSE QRC_ICONS ${PROJECT_SOURCE_DIR}/dist/icons/*.qrc) -file(GLOB_RECURSE QRC_THEMES ${PROJECT_SOURCE_DIR}/dist/qt_themes/*.qrc) - if (ENABLE_UPDATE_CHECKER) target_compile_definitions(yuzu PUBLIC ENABLE_UPDATE_CHECKER) endif() @@ -346,34 +341,26 @@ if (ENABLE_QT_TRANSLATION) qt_add_translation(LANGUAGES_QM ${PROJECT_SOURCE_DIR}/dist/english_plurals/en.ts) # Build a QRC file from the QM file list - set(QRC_LANGUAGES ${CMAKE_CURRENT_BINARY_DIR}/languages.qrc) - file(WRITE ${QRC_LANGUAGES} "\n") + set(LANGUAGES_QRC ${CMAKE_CURRENT_BINARY_DIR}/languages.qrc) + file(WRITE ${LANGUAGES_QRC} "\n") foreach (QM ${LANGUAGES_QM}) get_filename_component(QM_FILE ${QM} NAME) - file(APPEND ${QRC_LANGUAGES} "${QM_FILE}\n") + file(APPEND ${LANGUAGES_QRC} "${QM_FILE}\n") endforeach (QM) - file(APPEND ${QRC_LANGUAGES} "") + file(APPEND ${LANGUAGES_QRC} "") + + # Add the QRC file to package in all QM files + qt_add_resources(LANGUAGES ${LANGUAGES_QRC}) else() set(LANGUAGES) endif() -target_sources(yuzu PRIVATE - ${COMPAT_LIST} - ${ICONS} - ${THEMES} - ${LANGUAGES} -) - -# Add the QRC file to package in all QM files -qt_add_resources(yuzu - ${QRC_COMPAT_LIST} - ${QRC_ICONS} - ${QRC_THEMES} - LANGUAGES ${QRC_LANGUAGES} - OUTPUT_TARGETS ${QRC_OUTPUT_TARGETS} -) -set_source_files_properties(${QRC_OUTPUT_TARGETS} PROPERTIES SKIP_UNITY_BUILD_INCLUSION ON) -target_sources(yuzu PRIVATE ${QRC_OUTPUT_TARGETS}) +target_sources(yuzu + PRIVATE + ${COMPAT_LIST} + ${ICONS} + ${LANGUAGES} + ${THEMES}) # TODO(crueter): Move Assets.car/icon/icns handling to its own Module. if (APPLE) @@ -476,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_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) From f91a2b824880100246ca727cf0e24969ceea42ba Mon Sep 17 00:00:00 2001 From: crueter Date: Wed, 1 Apr 2026 04:06:35 -0400 Subject: [PATCH 27/72] MSVC fixes Signed-off-by: crueter --- src/core/core_timing.cpp | 1 + src/core/file_sys/vfs/vfs.cpp | 6 ++++++ src/core/file_sys/vfs/vfs_vector.h | 4 ++++ src/core/hle/service/bcat/news/overwrite_event_holder.cpp | 2 ++ src/core/hle/service/caps/caps_manager.cpp | 2 ++ src/core/hle/service/fatal/fatal.cpp | 2 ++ src/core/hle/service/filesystem/filesystem.cpp | 4 ++++ src/core/hle/service/psc/time/clocks/system_clock_core.h | 2 ++ src/core/hle/service/psc/time/system_clock.h | 2 ++ src/core/memory/cheat_engine.cpp | 2 ++ src/core/reporter.cpp | 2 ++ src/core/tools/freezer.cpp | 2 ++ 12 files changed, 31 insertions(+) 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/vfs/vfs.cpp b/src/core/file_sys/vfs/vfs.cpp index b85b843e3e..15efb34efb 100644 --- a/src/core/file_sys/vfs/vfs.cpp +++ b/src/core/file_sys/vfs/vfs.cpp @@ -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..7676e9f3c4 100644 --- a/src/core/file_sys/vfs/vfs_vector.h +++ b/src/core/file_sys/vfs/vfs_vector.h @@ -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/service/bcat/news/overwrite_event_holder.cpp b/src/core/hle/service/bcat/news/overwrite_event_holder.cpp index 1712971e4d..39c75a7a65 100644 --- a/src/core/hle/service/bcat/news/overwrite_event_holder.cpp +++ b/src/core/hle/service/bcat/news/overwrite_event_holder.cpp @@ -6,6 +6,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/psc/time/clocks/system_clock_core.h b/src/core/hle/service/psc/time/clocks/system_clock_core.h index 0b928432fb..1283b16623 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 @@ -10,6 +10,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..240c529511 100644 --- a/src/core/hle/service/psc/time/system_clock.h +++ b/src/core/hle/service/psc/time/system_clock.h @@ -16,6 +16,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/memory/cheat_engine.cpp b/src/core/memory/cheat_engine.cpp index dcfd23644f..6e95fbae94 100644 --- a/src/core/memory/cheat_engine.cpp +++ b/src/core/memory/cheat_engine.cpp @@ -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..bce4b3910e 100644 --- a/src/core/reporter.cpp +++ b/src/core/reporter.cpp @@ -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", From f42563a9394740f6a7e6dd317322efd86907165a Mon Sep 17 00:00:00 2001 From: crueter Date: Wed, 1 Apr 2026 04:25:12 -0400 Subject: [PATCH 28/72] Unity batch size Signed-off-by: crueter --- CMakeLists.txt | 4 ++++ src/CMakeLists.txt | 2 +- src/core/hle/kernel/svc.cpp | 4 ++++ src/core/hle/service/hle_ipc.cpp | 2 ++ 4 files changed, 11 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index aa25ce9c44..b67ea9037b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -68,6 +68,10 @@ endif() # my unity/jumbo build option(ENABLE_UNITY_BUILD "Enable Unity/Jumbo build" OFF) + +# 0 compiles all files in +set(UNITY_BATCH_SIZE 0 CACHE STRING "Unity build batch size") + if(MSVC AND ENABLE_UNITY_BUILD) message(STATUS "Unity build") # Unity builds need big objects for MSVC... diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index c184d3b493..d0992b6886 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -9,7 +9,7 @@ include_directories(.) if (ENABLE_UNITY_BUILD) set(CMAKE_UNITY_BUILD ON) - set(CMAKE_UNITY_BUILD_BATCH_SIZE 100) + set(CMAKE_UNITY_BUILD_BATCH_SIZE ${UNITY_BATCH_SIZE}) endif() # Dynarmic diff --git a/src/core/hle/kernel/svc.cpp b/src/core/hle/kernel/svc.cpp index faf6a6432d..8fd9ec0451 100644 --- a/src/core/hle/kernel/svc.cpp +++ b/src/core/hle/kernel/svc.cpp @@ -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/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_) From 3af13c87bc6fadb66acca11629c92ef978ba704f Mon Sep 17 00:00:00 2001 From: crueter Date: Wed, 1 Apr 2026 04:28:45 -0400 Subject: [PATCH 29/72] Limit on MSVC Signed-off-by: crueter --- CMakeLists.txt | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index b67ea9037b..74365e2edb 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -70,7 +70,15 @@ endif() option(ENABLE_UNITY_BUILD "Enable Unity/Jumbo build" OFF) # 0 compiles all files in -set(UNITY_BATCH_SIZE 0 CACHE STRING "Unity build batch size") +# 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") From 7e1c57567ed364e4ea5642ba409662e04e3e877c Mon Sep 17 00:00:00 2001 From: crueter Date: Wed, 1 Apr 2026 03:38:07 -0400 Subject: [PATCH 30/72] Fix build Signed-off-by: crueter --- src/shader_recompiler/stage.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/shader_recompiler/stage.h b/src/shader_recompiler/stage.h index 9af0a1b720..d2786f2b7d 100644 --- a/src/shader_recompiler/stage.h +++ b/src/shader_recompiler/stage.h @@ -20,8 +20,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 From 2d4129e1605413fc4b566e45e1c4ea971a0aa612 Mon Sep 17 00:00:00 2001 From: crueter Date: Wed, 1 Apr 2026 03:40:21 -0400 Subject: [PATCH 31/72] Fix license headers --- src/core/file_sys/vfs/vfs.cpp | 2 +- src/core/file_sys/vfs/vfs_vector.h | 2 +- src/core/hle/kernel/svc.cpp | 2 +- src/core/hle/service/bcat/news/overwrite_event_holder.cpp | 3 +++ src/core/hle/service/psc/time/clocks/system_clock_core.h | 3 +++ src/core/hle/service/psc/time/system_clock.h | 3 +++ src/core/memory/cheat_engine.cpp | 2 +- src/core/reporter.cpp | 2 +- src/core/tools/renderdoc.cpp | 2 +- src/input_common/drivers/udp_client.h | 3 +++ src/network/packet.h | 3 +++ src/shader_recompiler/stage.h | 3 +++ src/tests/common/bit_field.cpp | 2 +- 13 files changed, 25 insertions(+), 7 deletions(-) diff --git a/src/core/file_sys/vfs/vfs.cpp b/src/core/file_sys/vfs/vfs.cpp index 15efb34efb..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 diff --git a/src/core/file_sys/vfs/vfs_vector.h b/src/core/file_sys/vfs/vfs_vector.h index 7676e9f3c4..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 diff --git a/src/core/hle/kernel/svc.cpp b/src/core/hle/kernel/svc.cpp index 8fd9ec0451..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 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 39c75a7a65..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 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 1283b16623..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 diff --git a/src/core/hle/service/psc/time/system_clock.h b/src/core/hle/service/psc/time/system_clock.h index 240c529511..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 diff --git a/src/core/memory/cheat_engine.cpp b/src/core/memory/cheat_engine.cpp index 6e95fbae94..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 diff --git a/src/core/reporter.cpp b/src/core/reporter.cpp index bce4b3910e..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 diff --git a/src/core/tools/renderdoc.cpp b/src/core/tools/renderdoc.cpp index e49dac64a0..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 diff --git a/src/input_common/drivers/udp_client.h b/src/input_common/drivers/udp_client.h index 65095b43f4..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 diff --git a/src/network/packet.h b/src/network/packet.h index 428f7d6453..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 diff --git a/src/shader_recompiler/stage.h b/src/shader_recompiler/stage.h index d2786f2b7d..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 diff --git a/src/tests/common/bit_field.cpp b/src/tests/common/bit_field.cpp index 6fdabd9b3f..b915b7c089 100644 --- a/src/tests/common/bit_field.cpp +++ b/src/tests/common/bit_field.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: 2019 Citra Emulator Project From 79f29abcba91bd835cb05b4635874c829fe5233c Mon Sep 17 00:00:00 2001 From: crueter Date: Wed, 1 Apr 2026 21:02:20 +0200 Subject: [PATCH 32/72] [core] Fix renderdoc API garbage (#3816) Signed-off-by: crueter Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/3816 --- src/core/tools/renderdoc.cpp | 8 +++++--- src/core/tools/renderdoc.h | 4 +--- 2 files changed, 6 insertions(+), 6 deletions(-) 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}; }; From 9ace6742d7ee764c6a5bc38b21fff7cf874f4f1f Mon Sep 17 00:00:00 2001 From: lizzie Date: Wed, 1 Apr 2026 21:59:37 +0200 Subject: [PATCH 33/72] [docs] update multiplayer section with metaserver info (#3722) Signed-off-by: lizzie Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/3722 Reviewed-by: DraVee Reviewed-by: crueter Co-authored-by: lizzie Co-committed-by: lizzie --- docs/Deps.md | 2 +- docs/user/Multiplayer.md | 50 ++++++++++++++++++++++++++++------------ 2 files changed, 36 insertions(+), 16 deletions(-) diff --git a/docs/Deps.md b/docs/Deps.md index a34e838534..80caf1685f 100644 --- a/docs/Deps.md +++ b/docs/Deps.md @@ -334,7 +334,7 @@ pacman -Syuu --needed --noconfirm $packages

HaikuOS ```sh -pkgman install git cmake patch libfmt_devel nlohmann_json lz4_devel opus_devel boost1.89_devel vulkan_devel qt6_base_devel qt6_declarative_devel libsdl2_devel ffmpeg7_devel libx11_devel enet_devel catch2_devel quazip1_qt5_devel qt6_5compat_devel glslang qt6_devel qt6_charts_devel +pkgman install git cmake patch libfmt_devel nlohmann_json lz4_devel opus_devel boost1.90_devel vulkan_devel qt6_base_devel qt6_declarative_devel libsdl2_devel ffmpeg7_devel libx11_devel enet_devel catch2_devel quazip1_qt5_devel qt6_5compat_devel glslang qt6_devel qt6_charts_devel ``` [Caveats](./Caveats.md#haikuos). diff --git a/docs/user/Multiplayer.md b/docs/user/Multiplayer.md index a501ba1d02..57c4495f46 100644 --- a/docs/user/Multiplayer.md +++ b/docs/user/Multiplayer.md @@ -56,7 +56,7 @@ Use this when you need to connect to a multiplayer room for LDN functionality in - Multiplayer Options Configured in Eden Settings - Network Access -## Steps +### Steps There are 2 primary methods that you can use to connect to an existing room, depending on how the room is hosted. - Joining a Public Lobby @@ -70,7 +70,7 @@ There are 2 primary methods that you can use to connect to an existing room, dep -### Joining a Public Lobby +## Joining a Public Lobby 1. Open Eden and navigate to *Multiplayer → Browse Public Game Lobby*. 2. The **Public Room Browser** will now open and display a list of publicly accessible rooms. Find one you want to connect to and double click it. @@ -90,7 +90,7 @@ If the hoster has not made the lobby public, or you don't want to find it in the --- -# Hosting a Multiplayer Room +## Hosting a Multiplayer Room Use this guide for when you want to host a multiplayer lobby to play with others in Eden. In order to have someone access the room from outside your local network, see the *Access Your Multiplayer Room Externally* section for next steps. **Click [Here](https://evilperson1337.notion.site/Hosting-a-Multiplayer-Room-2c357c2edaf6819481dbe8a99926cea2) for a version of this guide with images & visual elements.** @@ -100,7 +100,7 @@ Use this guide for when you want to host a multiplayer lobby to play with others - Network Access - Ability to allow programs through the firewall on your device. -## Steps +### Steps 1. Open Eden and navigate to *Emulation → Multiplayer → Create Room.* 2. Fill out the following information in the popup dialog box. @@ -120,7 +120,7 @@ Use this guide for when you want to host a multiplayer lobby to play with others --- -# Access Your Multiplayer Room Externally +## Access Your Multiplayer Room Externally Quite often the person with whom you want to play is located off of your internal network (LAN). If you want to host a room and play with them you will need to get your devices to communicate with each other. This guide will go over your options on how to do this so that you can play together. **Click [Here](https://evilperson1337.notion.site/Access-Your-Multiplayer-Room-Externally-2c357c2edaf681c0ab2ce2ee624d809d) for a version of this guide with images & visual elements.** @@ -129,9 +129,9 @@ Quite often the person with whom you want to play is located off of your interna - Eden set up and Functioning - Network Access -## Options +### Options -### Port Forwarding +#### Port Forwarding - **Difficulty Level**: High @@ -148,8 +148,9 @@ The process works by creating a static mapping—often called a “port-forward For our purposes we would pick the port we want to expose (*e.g. 24872*) and we would access our router's configuration and create a port-forward rule to send the traffic from an external connection to your local machine over our specified port (*24872)*. The exact way to do so, varies greatly by router manufacturer - and sometimes require contacting your ISP to do so depending on your agreement. You can look up your router on [*portforward.com*](https://portforward.com/router.htm) which may have instructions on how to do so for your specific equipment. If it is not there, you will have to use Google/ChatGPT to determine the steps for your equipment. +Remember you can't have one port open for multiple devices at the same time - you must only host from one device (or do more convoluted networking which we will not cover here). -### Use a Tunnelling Service +#### Use a Tunnelling Service - **Difficulty Level**: Easy