From 41ab8bf1c8e60ccced6bbae2299f9df3ec27ab30 Mon Sep 17 00:00:00 2001 From: lizzie Date: Sun, 20 Sep 2026 07:03:36 +0000 Subject: [PATCH] 2026-09-20 07:03:36 Signed-off-by: lizzie --- .../sink/circular_buffer_sink_info.cpp | 2 +- src/audio_core/renderer/sink/sink_info_base.h | 37 +++++++-------- .../dynarmic/backend/x64/emit_x64_memory.h | 12 +++-- .../abstract_button_handler.cpp | 20 ++++---- .../backend/spirv/emit_spirv.cpp | 47 +++++++++---------- .../backend/spirv/spirv_emit_context.h | 1 + 6 files changed, 63 insertions(+), 56 deletions(-) diff --git a/src/audio_core/renderer/sink/circular_buffer_sink_info.cpp b/src/audio_core/renderer/sink/circular_buffer_sink_info.cpp index 0ede02b6b4..3688c0ffe8 100644 --- a/src/audio_core/renderer/sink/circular_buffer_sink_info.cpp +++ b/src/audio_core/renderer/sink/circular_buffer_sink_info.cpp @@ -35,7 +35,7 @@ void CircularBufferSinkInfo::Update(BehaviorInfo::ErrorInfo& error_info, OutStat auto current_params{reinterpret_cast(parameter.data())}; auto current_state{reinterpret_cast(state.data())}; - if (in_use == buffer_params->in_use && !buffer_unmapped) { + if (in_use == bool(buffer_params->in_use) && !buffer_unmapped) { error_info.error_code = ResultSuccess; error_info.address = CpuAddr(0); out_status.writeOffset = current_state->last_pos2; diff --git a/src/audio_core/renderer/sink/sink_info_base.h b/src/audio_core/renderer/sink/sink_info_base.h index b368f7ba48..ac9c014075 100644 --- a/src/audio_core/renderer/sink/sink_info_base.h +++ b/src/audio_core/renderer/sink/sink_info_base.h @@ -31,10 +31,10 @@ public: }; struct DeviceInParameter { - /* 0x000 */ char name[0x100]; + /* 0x000 */ u8 name[0x100]; /* 0x100 */ u32 input_count; /* 0x104 */ std::array inputs; - /* 0x10A */ char unk10A[0x1]; + /* 0x10A */ u8 unk10A[0x1]; /* 0x10B */ bool downmix_enabled; /* 0x10C */ std::array downmix_coeff; }; @@ -43,7 +43,7 @@ public: struct DeviceState { /* 0x00 */ UpsamplerInfo* upsampler_info; /* 0x08 */ std::array, 4> downmix_coeff; - /* 0x18 */ char unk18[0x18]; + /* 0x18 */ u8 unk18[0x18]; }; static_assert(sizeof(DeviceState) == 0x30, "DeviceState has the wrong size!"); @@ -55,8 +55,8 @@ public: /* 0x14 */ u32 previous_pos; /* 0x18 */ SampleFormat format; /* 0x1C */ std::array inputs; - /* 0x22 */ bool in_use; - /* 0x23 */ char unk23[0x5]; + /* 0x22 */ u8 in_use; + /* 0x23 */ u8 unk23[0x5]; }; static_assert(sizeof(CircularBufferInParameter) == 0x28, "CircularBufferInParameter has the wrong size!"); @@ -65,16 +65,16 @@ public: /* 0x00 */ u32 last_pos2; /* 0x04 */ s32 current_pos; /* 0x08 */ u32 last_pos; - /* 0x0C */ char unk0C[0x4]; + /* 0x0C */ u8 unk0C[0x4]; /* 0x10 */ AddressInfo address_info; }; static_assert(sizeof(CircularBufferState) == 0x30, "CircularBufferState has the wrong size!"); struct InParameter { /* 0x000 */ Type type; - /* 0x001 */ bool in_use; + /* 0x001 */ u8 in_use; /* 0x004 */ u32 node_id; - /* 0x008 */ char unk08[0x18]; + /* 0x008 */ u8 unk08[0x18]; union { /* 0x020 */ DeviceInParameter device; /* 0x020 */ CircularBufferInParameter circular_buffer; @@ -84,7 +84,7 @@ public: struct OutStatus { /* 0x00 */ u32 writeOffset; - /* 0x04 */ char unk04[0x1C]; + /* 0x04 */ u8 unk04[0x1C]; }; // size == 0x20 static_assert(sizeof(OutStatus) == 0x20, "SinkInfoBase::OutStatus has the wrong size!"); @@ -162,19 +162,18 @@ public: u8* GetParameter(); protected: - /// Type of this sink - Type type{Type::Invalid}; - /// Is this sink in use? - bool in_use{}; - /// Is this sink's buffer unmapped? Circular only - bool buffer_unmapped{}; - /// Node id for this sink - u32 node_id{}; /// State buffer for this sink std::array state{}; /// Parameter buffer for this sink - std::array - parameter{}; + std::array parameter{}; + /// Type of this sink + Type type{Type::Invalid}; + /// Node id for this sink + u32 node_id{}; + /// Is this sink in use? + bool in_use : 1 = false; + /// Is this sink's buffer unmapped? Circular only + bool buffer_unmapped : 1 = false; }; } // namespace AudioCore::Renderer diff --git a/src/dynarmic/src/dynarmic/backend/x64/emit_x64_memory.h b/src/dynarmic/src/dynarmic/backend/x64/emit_x64_memory.h index d072b9963d..e9c2b7cc03 100644 --- a/src/dynarmic/src/dynarmic/backend/x64/emit_x64_memory.h +++ b/src/dynarmic/src/dynarmic/backend/x64/emit_x64_memory.h @@ -170,13 +170,19 @@ template<> // check for marked bit, use as unmapped if marked if (ctx.conf.page_table_marked_bit) { - code.bt(page, *ctx.conf.page_table_marked_bit); - code.jc(abort, code.T_NEAR); + auto const marked_bit = *ctx.conf.page_table_marked_bit; + if (s64(s32(1 << marked_bit)) == s64(1 << marked_bit)) { + code.test(page, s32(1 << marked_bit)); + code.jnz(abort, code.T_NEAR); + } else { + code.bt(page, marked_bit); + code.jc(abort, code.T_NEAR); + } } // mask away attributes if (ctx.conf.page_table_pointer_mask == 0) { code.test(page, page); - } else if (std::in_range(ctx.conf.page_table_pointer_mask)) { + } else if (s64(s32(ctx.conf.page_table_pointer_mask)) == s64(ctx.conf.page_table_pointer_mask)) { code.and_(page, ctx.conf.page_table_pointer_mask); } else { code.mov(tmp, ctx.conf.page_table_pointer_mask); diff --git a/src/hid_core/resources/abstracted_pad/abstract_button_handler.cpp b/src/hid_core/resources/abstracted_pad/abstract_button_handler.cpp index 239fc7656e..aaa566e8d7 100644 --- a/src/hid_core/resources/abstracted_pad/abstract_button_handler.cpp +++ b/src/hid_core/resources/abstracted_pad/abstract_button_handler.cpp @@ -79,8 +79,10 @@ void NpadAbstractButtonHandler::UpdateAllButtonLifo() { Core::HID::NpadIdType npad_id = properties_handler->GetNpadId(); for (std::size_t i = 0; i < AruidIndexMax; i++) { auto* data = applet_resource_holder->applet_resource->GetAruidDataByIndex(i); - auto& npad_entry = data->shared_memory_format->npad.npad_entry[NpadIdTypeToIndex(npad_id)]; - UpdateButtonLifo(npad_entry, data->aruid); + if (auto const shfmt = data->shared_memory_format; shfmt) { + auto& npad_entry = shfmt->npad.npad_entry[NpadIdTypeToIndex(npad_id)]; + UpdateButtonLifo(npad_entry, data->aruid); + } } } @@ -88,19 +90,19 @@ void NpadAbstractButtonHandler::UpdateCoreBatteryState() { Core::HID::NpadIdType npad_id = properties_handler->GetNpadId(); for (std::size_t i = 0; i < AruidIndexMax; i++) { auto* data = applet_resource_holder->applet_resource->GetAruidDataByIndex(i); - auto& npad_entry = data->shared_memory_format->npad.npad_entry[NpadIdTypeToIndex(npad_id)]; - UpdateButtonLifo(npad_entry, data->aruid); + if (auto const shfmt = data->shared_memory_format; shfmt) { + auto& npad_entry = shfmt->npad.npad_entry[NpadIdTypeToIndex(npad_id)]; + UpdateButtonLifo(npad_entry, data->aruid); + } } } void NpadAbstractButtonHandler::UpdateButtonState(u64 aruid) { Core::HID::NpadIdType npad_id = properties_handler->GetNpadId(); - auto* data = applet_resource_holder->applet_resource->GetAruidData(aruid); - if (data == nullptr) { - return; + if (auto data = applet_resource_holder->applet_resource->GetAruidData(aruid); data) { + auto& npad_entry = data->shared_memory_format->npad.npad_entry[NpadIdTypeToIndex(npad_id)]; + UpdateButtonLifo(npad_entry, aruid); } - auto& npad_entry = data->shared_memory_format->npad.npad_entry[NpadIdTypeToIndex(npad_id)]; - UpdateButtonLifo(npad_entry, aruid); } Result NpadAbstractButtonHandler::SetHomeProtection(bool is_enabled, u64 aruid) { diff --git a/src/shader_recompiler/backend/spirv/emit_spirv.cpp b/src/shader_recompiler/backend/spirv/emit_spirv.cpp index c221888c09..5e07f91edf 100644 --- a/src/shader_recompiler/backend/spirv/emit_spirv.cpp +++ b/src/shader_recompiler/backend/spirv/emit_spirv.cpp @@ -496,31 +496,30 @@ void SetupCapabilities(const Profile& profile, const Info& info, EmitContext& ct } void PatchPhiNodes(IR::Program& program, EmitContext& ctx) { - // Flatten all leading PHIs from each block into a vector - std::vector phi_instructions; - for (IR::Block* block : program.blocks) { - for (auto it = block->begin(); it != block->end(); ++it) { - if (it->GetOpcode() != IR::Opcode::Phi) - break; - phi_instructions.push_back(&*it); - } - } - - if (phi_instructions.empty()) { - return; // nothing to patch - } - - // Start "before" first PHI; advance on phi_arg == 0 - size_t phi_index = static_cast(-1); - - ctx.PatchDeferredPhi([&](size_t phi_arg, Id parent) -> std::pair { - if (phi_arg == 0) { - ++phi_index; - } - IR::Inst* phi = phi_instructions[phi_index]; - return { ctx.Def(phi->Arg(phi_arg)), parent }; - }); + // Flatten all leading PHIs from each block into a vector + std::vector phi_instructions; + for (IR::Block* block : program.blocks) { + for (auto it = block->begin(); it != block->end(); ++it) { + if (it->GetOpcode() != IR::Opcode::Phi) + break; + phi_instructions.push_back(&*it); } + } + + if (phi_instructions.empty()) { + return; // nothing to patch + } + + // Start "before" first PHI; advance on phi_arg == 0 + ctx.phi_index = std::size_t(-1); + ctx.PatchDeferredPhi([&ctx, phi_insts = std::move(phi_instructions)](size_t phi_arg, Id parent) -> std::pair { + if (phi_arg == 0) { + ++ctx.phi_index; + } + IR::Inst* phi = phi_insts[ctx.phi_index]; + return { ctx.Def(phi->Arg(phi_arg)), parent }; + }); +} } // Anonymous namespace std::vector EmitSPIRV(const Profile& profile, const RuntimeInfo& runtime_info, IR::Program& program, Bindings& bindings) { diff --git a/src/shader_recompiler/backend/spirv/spirv_emit_context.h b/src/shader_recompiler/backend/spirv/spirv_emit_context.h index 7edc104708..8fee47fa29 100644 --- a/src/shader_recompiler/backend/spirv/spirv_emit_context.h +++ b/src/shader_recompiler/backend/spirv/spirv_emit_context.h @@ -371,6 +371,7 @@ public: // Sirit::Id doesn't play nice with *::set<> ::Common::unordered_set non_uniform_ids; + size_t phi_index{}; bool uses_nonuniform_sampled_image{}; bool uses_nonuniform_storage_image{};