Compare commits

..

3 Commits

Author SHA1 Message Date
Shinmegumi
c15a08620c Fix license headers in vk_query_cache.h 2025-12-26 02:35:12 +01:00
Shinmegumi
c692c3f7b0 Fix license headers in vk_buffer_cache.h 2025-12-26 02:35:12 +01:00
wildcard
51392bacc2 [VK]Improve query reset before use so that now queries are reset outside render pass and are batched
Note to testers, please enable validation layers and see if there are any errors related to queries not being reset before every use, Thanks.
2025-12-26 02:35:12 +01:00
27 changed files with 123 additions and 94 deletions

View File

@@ -217,6 +217,7 @@ else()
--disable-ffmpeg --disable-ffmpeg
--disable-ffprobe --disable-ffprobe
--disable-network --disable-network
--disable-postproc
--disable-swresample --disable-swresample
--enable-decoder=h264 --enable-decoder=h264
--enable-decoder=vp8 --enable-decoder=vp8

View File

@@ -39,6 +39,7 @@ android {
buildFeatures { buildFeatures {
viewBinding = true viewBinding = true
buildConfig = true
} }
compileOptions { compileOptions {

View File

@@ -14,8 +14,6 @@ android.useAndroidX=true
# Kotlin code style for this project: "official" or "obsolete": # Kotlin code style for this project: "official" or "obsolete":
kotlin.code.style=official kotlin.code.style=official
kotlin.parallel.tasks.in.project=true kotlin.parallel.tasks.in.project=true
android.defaults.buildfeatures.buildconfig=true
# Android Gradle plugin 8.0.2 # Android Gradle plugin 8.0.2
android.suppressUnsupportedCompileSdk=34 android.suppressUnsupportedCompileSdk=34
android.native.buildOutput=verbose android.native.buildOutput=verbose

View File

@@ -34,8 +34,8 @@ struct Member {
struct RoomInformation { struct RoomInformation {
std::string name; ///< Name of the server std::string name; ///< Name of the server
std::string description; ///< Server description std::string description; ///< Server description
u32 member_slots{}; ///< Maximum number of members in this room u32 member_slots; ///< Maximum number of members in this room
u16 port{}; ///< The port of this room u16 port; ///< The port of this room
GameInfo preferred_game; ///< Game to advertise that you want to play GameInfo preferred_game; ///< Game to advertise that you want to play
std::string host_username; ///< Forum username of the host std::string host_username; ///< Forum username of the host
}; };
@@ -46,8 +46,8 @@ struct Room {
std::string id; std::string id;
std::string verify_uid; ///< UID used for verification std::string verify_uid; ///< UID used for verification
std::string ip; std::string ip;
u32 net_version{}; u32 net_version;
bool has_password = false; bool has_password;
std::vector<Member> members; std::vector<Member> members;
}; };

View File

@@ -219,6 +219,11 @@ public:
} }
} }
bool ClearBackingRegion(size_t physical_offset, size_t length) {
// TODO: This does not seem to be possible on Windows.
return false;
}
void EnableDirectMappedAddress() { void EnableDirectMappedAddress() {
// TODO // TODO
UNREACHABLE(); UNREACHABLE();
@@ -612,6 +617,24 @@ public:
ASSERT_MSG(ret == 0, "mprotect failed: {}", strerror(errno)); ASSERT_MSG(ret == 0, "mprotect failed: {}", strerror(errno));
} }
bool ClearBackingRegion(size_t physical_offset, size_t length) {
#ifdef __linux__
// Only incur syscall cost IF memset would be slower (theshold = 16MiB)
// TODO(lizzie): Smarter way to dynamically get this threshold (broadwell != raptor lake) for example
if (length >= 2097152UL * 8) {
// Set MADV_REMOVE on backing map to destroy it instantly.
// This also deletes the area from the backing file.
int ret = madvise(backing_base + physical_offset, length, MADV_REMOVE);
ASSERT_MSG(ret == 0, "madvise failed: {}", strerror(errno));
return true;
} else {
return false;
}
#else
return false;
#endif
}
void EnableDirectMappedAddress() { void EnableDirectMappedAddress() {
virtual_base = nullptr; virtual_base = nullptr;
} }
@@ -739,7 +762,9 @@ void HostMemory::Protect(size_t virtual_offset, size_t length, MemoryPermission
} }
void HostMemory::ClearBackingRegion(size_t physical_offset, size_t length, u32 fill_value) { void HostMemory::ClearBackingRegion(size_t physical_offset, size_t length, u32 fill_value) {
std::memset(backing_base + physical_offset, fill_value, length); if (!impl || fill_value != 0 || !impl->ClearBackingRegion(physical_offset, length)) {
std::memset(backing_base + physical_offset, fill_value, length);
}
} }
void HostMemory::EnableDirectMappedAddress() { void HostMemory::EnableDirectMappedAddress() {

View File

@@ -21,7 +21,7 @@ namespace Core::Frontend {
struct CabinetParameters { struct CabinetParameters {
Service::NFP::TagInfo tag_info; Service::NFP::TagInfo tag_info;
Service::NFP::RegisterInfo register_info; Service::NFP::RegisterInfo register_info;
Service::NFP::CabinetMode mode{}; Service::NFP::CabinetMode mode;
}; };
using CabinetCallback = std::function<void(bool, const std::string&)>; using CabinetCallback = std::function<void(bool, const std::string&)>;

View File

@@ -1,6 +1,3 @@
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later // SPDX-License-Identifier: GPL-2.0-or-later
@@ -23,9 +20,9 @@ struct KeyboardInitializeParameters {
std::u16string initial_text; std::u16string initial_text;
char16_t left_optional_symbol_key; char16_t left_optional_symbol_key;
char16_t right_optional_symbol_key; char16_t right_optional_symbol_key;
u32 max_text_length{}; u32 max_text_length;
u32 min_text_length{}; u32 min_text_length;
s32 initial_cursor_position{}; s32 initial_cursor_position;
Service::AM::Frontend::SwkbdType type; Service::AM::Frontend::SwkbdType type;
Service::AM::Frontend::SwkbdPasswordMode password_mode; Service::AM::Frontend::SwkbdPasswordMode password_mode;
Service::AM::Frontend::SwkbdTextDrawType text_draw_type; Service::AM::Frontend::SwkbdTextDrawType text_draw_type;
@@ -37,12 +34,12 @@ struct KeyboardInitializeParameters {
}; };
struct InlineAppearParameters { struct InlineAppearParameters {
u32 max_text_length{}; u32 max_text_length;
u32 min_text_length{}; u32 min_text_length;
f32 key_top_scale_x{}; f32 key_top_scale_x;
f32 key_top_scale_y{}; f32 key_top_scale_y;
f32 key_top_translate_x{}; f32 key_top_translate_x;
f32 key_top_translate_y{}; f32 key_top_translate_y;
Service::AM::Frontend::SwkbdType type; Service::AM::Frontend::SwkbdType type;
Service::AM::Frontend::SwkbdKeyDisableFlags key_disable_flags; Service::AM::Frontend::SwkbdKeyDisableFlags key_disable_flags;
bool key_top_as_floating; bool key_top_as_floating;
@@ -53,7 +50,7 @@ struct InlineAppearParameters {
struct InlineTextParameters { struct InlineTextParameters {
std::u16string input_text; std::u16string input_text;
s32 cursor_position{}; s32 cursor_position;
}; };
class SoftwareKeyboardApplet : public Applet { class SoftwareKeyboardApplet : public Applet {

View File

@@ -1,6 +1,3 @@
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later // SPDX-License-Identifier: GPL-3.0-or-later
@@ -82,7 +79,7 @@ using DeviceHandle = u64;
// This is nn::nfc::TagInfo // This is nn::nfc::TagInfo
struct TagInfo { struct TagInfo {
UniqueSerialNumber uuid{}; UniqueSerialNumber uuid;
u8 uuid_length; u8 uuid_length;
INSERT_PADDING_BYTES(0x15); INSERT_PADDING_BYTES(0x15);
NfcProtocol protocol; NfcProtocol protocol;

View File

@@ -1,6 +1,3 @@
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
// SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later // SPDX-License-Identifier: GPL-3.0-or-later
@@ -318,7 +315,7 @@ static_assert(sizeof(ModelInfo) == 0x40, "ModelInfo is an invalid size");
// This is nn::nfp::RegisterInfo // This is nn::nfp::RegisterInfo
struct RegisterInfo { struct RegisterInfo {
Service::Mii::CharInfo mii_char_info; Service::Mii::CharInfo mii_char_info;
WriteDate creation_date{}; WriteDate creation_date;
AmiiboName amiibo_name; AmiiboName amiibo_name;
u8 font_region; u8 font_region;
INSERT_PADDING_BYTES(0x7A); INSERT_PADDING_BYTES(0x7A);

View File

@@ -164,7 +164,7 @@ IPlatformServiceManager::IPlatformServiceManager(Core::System& system_, const ch
// Rebuild shared fonts from data ncas or synthesize // Rebuild shared fonts from data ncas or synthesize
impl->shared_font = std::make_shared<Kernel::PhysicalMemory>(SHARED_FONT_MEM_SIZE); impl->shared_font = std::make_shared<Kernel::PhysicalMemory>(SHARED_FONT_MEM_SIZE);
for (auto& font : SHARED_FONTS) { for (auto font : SHARED_FONTS) {
FileSys::VirtualFile romfs; FileSys::VirtualFile romfs;
const auto nca = const auto nca =
nand->GetEntry(static_cast<u64>(font.first), FileSys::ContentRecordType::Data); nand->GetEntry(static_cast<u64>(font.first), FileSys::ContentRecordType::Data);
@@ -261,7 +261,7 @@ Result IPlatformServiceManager::GetSharedFontInOrderOfPriority(
out_font_sizes.size(), impl->shared_font_regions.size()}); out_font_sizes.size(), impl->shared_font_regions.size()});
for (size_t i = 0; i < max_size; i++) { for (size_t i = 0; i < max_size; i++) {
auto& region = impl->GetSharedFontRegion(i); auto region = impl->GetSharedFontRegion(i);
out_font_codes[i] = static_cast<u32>(i); out_font_codes[i] = static_cast<u32>(i);
out_font_offsets[i] = region.offset; out_font_offsets[i] = region.offset;

View File

@@ -48,7 +48,7 @@ private:
void Save(); void Save();
PlayTimeDatabase database; PlayTimeDatabase database;
u64 running_program_id{}; u64 running_program_id;
std::jthread play_time_thread; std::jthread play_time_thread;
}; };

View File

@@ -1,6 +1,3 @@
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
// SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later // SPDX-License-Identifier: GPL-2.0-or-later

View File

@@ -1,6 +1,3 @@
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
// SPDX-FileCopyrightText: Copyright 2017 Citra Emulator Project // SPDX-FileCopyrightText: Copyright 2017 Citra Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later // SPDX-License-Identifier: GPL-2.0-or-later
@@ -56,7 +53,7 @@ struct ChatEntry {
/// Represents a system status message. /// Represents a system status message.
struct StatusMessageEntry { struct StatusMessageEntry {
StatusMessageTypes type{}; ///< Type of the message StatusMessageTypes type; ///< Type of the message
/// Subject of the message. i.e. the user who is joining/leaving/being banned, etc. /// Subject of the message. i.e. the user who is joining/leaving/being banned, etc.
std::string nickname; std::string nickname;
std::string username; std::string username;

View File

@@ -1705,26 +1705,21 @@ Binding BufferCache<P>::StorageBufferBinding(GPUVAddr ssbo_addr, u32 cbuf_index,
return NULL_BINDING; return NULL_BINDING;
} }
// xbzk: New size logic. Fixes MCI.
// If ever the * comment below prove wrong, the 'if' block may be removed.
const auto size = [&]() { const auto size = [&]() {
const bool is_nvn_cbuf = cbuf_index == 0; const bool is_nvn_cbuf = cbuf_index == 0;
// The NVN driver buffer (index 0) is known to pack the SSBO address followed by its size.
if (is_nvn_cbuf) { if (is_nvn_cbuf) {
// * The NVN driver buffer (index 0) is known to pack the SSBO address followed by its size. const u32 ssbo_size = gpu_memory->Read<u32>(ssbo_addr + 8);
const u64 next_qword = gpu_memory->Read<u64>(ssbo_addr + 8); if (ssbo_size != 0) {
const u32 upper_32 = static_cast<u32>(next_qword >> 32); return ssbo_size;
// Hardware-based detection: GPU addresses have non-zero upper bits
if (upper_32 == 0) {
// This is a size field, not a GPU address
return static_cast<u32>(next_qword); // Return lower_32
} }
} }
// Fall through: either not NVN cbuf (Doom Eternal & +), or NVN but ssbo_addr+8 is a GPU address (MCI) // Other titles (notably Doom Eternal) may use STG/LDG on buffer addresses in custom defined
// cbufs, which do not store the sizes adjacent to the addresses, so use the fully
// mapped buffer size for now.
const u32 memory_layout_size = static_cast<u32>(gpu_memory->GetMemoryLayoutSize(gpu_addr)); const u32 memory_layout_size = static_cast<u32>(gpu_memory->GetMemoryLayoutSize(gpu_addr));
// Cap at 8MB to prevent allocator overflow from misinterpreted addresses
return (std::min)(memory_layout_size, static_cast<u32>(8_MiB)); return (std::min)(memory_layout_size, static_cast<u32>(8_MiB));
}(); }();
// Alignment only applies to the offset of the buffer // Alignment only applies to the offset of the buffer
const u32 alignment = runtime.GetStorageBufferAlignment(); const u32 alignment = runtime.GetStorageBufferAlignment();
const GPUVAddr aligned_gpu_addr = Common::AlignDown(gpu_addr, alignment); const GPUVAddr aligned_gpu_addr = Common::AlignDown(gpu_addr, alignment);

View File

@@ -1,6 +1,3 @@
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
// SPDX-FileCopyrightText: 2021 yuzu Emulator Project // SPDX-FileCopyrightText: 2021 yuzu Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later // SPDX-License-Identifier: GPL-3.0-or-later
@@ -20,7 +17,7 @@ void Scheduler::Push(s32 channel, CommandList&& entries) {
std::unique_lock lk(scheduling_guard); std::unique_lock lk(scheduling_guard);
auto it = channels.find(channel); auto it = channels.find(channel);
ASSERT(it != channels.end()); ASSERT(it != channels.end());
auto& channel_state = it->second; auto channel_state = it->second;
gpu.BindChannel(channel_state->bind_id); gpu.BindChannel(channel_state->bind_id);
channel_state->dma_pusher->Push(std::move(entries)); channel_state->dma_pusher->Push(std::move(entries));
channel_state->dma_pusher->DispatchCalls(); channel_state->dma_pusher->DispatchCalls();

View File

@@ -27,7 +27,7 @@
#include "video_core/query_cache/query_cache_base.h" #include "video_core/query_cache/query_cache_base.h"
#include "video_core/query_cache/query_stream.h" #include "video_core/query_cache/query_stream.h"
#include "video_core/query_cache/types.h" #include "video_core/query_cache/types.h"
namespace Vulkan { class Scheduler; }
namespace VideoCommon { namespace VideoCommon {
using Maxwell = Tegra::Engines::Maxwell3D; using Maxwell = Tegra::Engines::Maxwell3D;
@@ -222,6 +222,12 @@ void QueryCacheBase<Traits>::CounterReset(QueryType counter_type) {
streamer->ResetCounter(); streamer->ResetCounter();
} }
// Called at frame start to batch vkCmdResetQueryPool outside render passes.
template <typename Traits>
void QueryCacheBase<Traits>::FramePrologueResets(Vulkan::Scheduler& scheduler) {
impl->runtime.FramePrologueResets(scheduler);
}
template <typename Traits> template <typename Traits>
void QueryCacheBase<Traits>::BindToChannel(s32 id) { void QueryCacheBase<Traits>::BindToChannel(s32 id) {
VideoCommon::ChannelSetupCaches<VideoCommon::ChannelInfo>::BindToChannel(id); VideoCommon::ChannelSetupCaches<VideoCommon::ChannelInfo>::BindToChannel(id);

View File

@@ -1,3 +1,6 @@
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later // SPDX-License-Identifier: GPL-3.0-or-later
@@ -21,7 +24,9 @@
namespace VideoCore { namespace VideoCore {
class RasterizerInterface; class RasterizerInterface;
} }
namespace Vulkan {
class Scheduler;
}
namespace Tegra { namespace Tegra {
class GPU; class GPU;
} }
@@ -53,7 +58,7 @@ public:
RuntimeType& runtime_); RuntimeType& runtime_);
~QueryCacheBase(); ~QueryCacheBase();
void FramePrologueResets(Vulkan::Scheduler& scheduler);
void InvalidateRegion(VAddr addr, std::size_t size) { void InvalidateRegion(VAddr addr, std::size_t size) {
IterateCache<true>(addr, size, IterateCache<true>(addr, size,
[this](QueryLocation location) { InvalidateQuery(location); }); [this](QueryLocation location) { InvalidateQuery(location); });

View File

@@ -156,7 +156,7 @@ public:
ReserveHostQuery(); ReserveHostQuery();
// Ensure outside render pass /* Ensure outside render pass
scheduler.RequestOutsideRenderPassOperationContext(); scheduler.RequestOutsideRenderPassOperationContext();
// Reset query pool outside render pass // Reset query pool outside render pass
@@ -167,7 +167,7 @@ public:
// Manually restart the render pass (required for vkCmdClearAttachments, etc.) // Manually restart the render pass (required for vkCmdClearAttachments, etc.)
scheduler.RequestRenderpass(texture_cache.GetFramebuffer()); scheduler.RequestRenderpass(texture_cache.GetFramebuffer());
*/
// Begin query inside the newly started render pass // Begin query inside the newly started render pass
scheduler.Record([query_pool = current_query_pool, scheduler.Record([query_pool = current_query_pool,
query_index = current_bank_slot](vk::CommandBuffer cmdbuf) { query_index = current_bank_slot](vk::CommandBuffer cmdbuf) {
@@ -402,6 +402,13 @@ public:
} }
} }
VkQueryPool GetOrCreateCurrentPoolForPrologue() {
if (!current_bank || current_bank->IsClosed()) {
ReserveBank();
}
return current_query_pool;
}
private: private:
template <typename Func> template <typename Func>
void ApplyBankOp(VideoCommon::HostQueryBase* query, Func&& func) { void ApplyBankOp(VideoCommon::HostQueryBase* query, Func&& func) {
@@ -1305,6 +1312,19 @@ void QueryCacheRuntime::ResumeHostConditionalRendering() {
impl->is_hcr_running = true; impl->is_hcr_running = true;
} }
void QueryCacheRuntime::FramePrologueResets(Scheduler& scheduler) {
// Reset the occlusion queries we plan to use this frame in one go.
// Ensure this is recorded OUTSIDE any render pass.
const VkQueryPool pool = impl->sample_streamer.GetOrCreateCurrentPoolForPrologue();
scheduler.RequestOutsideRenderPassOperationContext();
scheduler.Record([pool](vk::CommandBuffer cmdbuf) {
// Reset the whole bank so subsequent BeginQuery calls don't need per-slot resets.
cmdbuf.ResetQueryPool(pool,
/*first*/ 0,
/*count*/ SamplesQueryBank::BANK_SIZE);
});
}
void QueryCacheRuntime::HostConditionalRenderingCompareValueImpl(VideoCommon::LookupData object, void QueryCacheRuntime::HostConditionalRenderingCompareValueImpl(VideoCommon::LookupData object,
bool is_equal) { bool is_equal) {
{ {

View File

@@ -1,3 +1,6 @@
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later // SPDX-License-Identifier: GPL-3.0-or-later
@@ -20,7 +23,7 @@ namespace Vulkan {
class Device; class Device;
class Scheduler; class Scheduler;
class StagingBufferPool; class StagingBufferPool;
class Scheduler;
struct QueryCacheRuntimeImpl; struct QueryCacheRuntimeImpl;
class QueryCacheRuntime { class QueryCacheRuntime {
@@ -33,7 +36,7 @@ public:
ComputePassDescriptorQueue& compute_pass_descriptor_queue, ComputePassDescriptorQueue& compute_pass_descriptor_queue,
DescriptorPool& descriptor_pool, TextureCache& texture_cache_); DescriptorPool& descriptor_pool, TextureCache& texture_cache_);
~QueryCacheRuntime(); ~QueryCacheRuntime();
void FramePrologueResets(Scheduler& scheduler);
template <typename SyncValuesType> template <typename SyncValuesType>
void SyncValues(std::span<SyncValuesType> values, VkBuffer base_src_buffer = nullptr); void SyncValues(std::span<SyncValuesType> values, VkBuffer base_src_buffer = nullptr);

View File

@@ -108,7 +108,7 @@ VkViewport GetViewportState(const Device& device, const Maxwell& regs, size_t in
VkRect2D GetScissorState(const Maxwell& regs, size_t index, u32 up_scale = 1, u32 down_shift = 0) { VkRect2D GetScissorState(const Maxwell& regs, size_t index, u32 up_scale = 1, u32 down_shift = 0) {
const auto& src = regs.scissor_test[index]; const auto& src = regs.scissor_test[index];
VkRect2D scissor{}; VkRect2D scissor;
const auto scale_up = [&](s32 value) -> s32 { const auto scale_up = [&](s32 value) -> s32 {
if (value == 0) { if (value == 0) {
return 0U; return 0U;
@@ -374,7 +374,7 @@ void RasterizerVulkan::Clear(u32 layer_count) {
} }
UpdateViewportsState(regs); UpdateViewportsState(regs);
VkRect2D default_scissor{}; VkRect2D default_scissor;
default_scissor.offset.x = 0; default_scissor.offset.x = 0;
default_scissor.offset.y = 0; default_scissor.offset.y = 0;
default_scissor.extent.width = (std::numeric_limits<s32>::max)(); default_scissor.extent.width = (std::numeric_limits<s32>::max)();

View File

@@ -257,6 +257,11 @@ u64 Scheduler::SubmitExecution(VkSemaphore signal_semaphore, VkSemaphore wait_se
void Scheduler::AllocateNewContext() { void Scheduler::AllocateNewContext() {
// Enable counters once again. These are disabled when a command buffer is finished. // Enable counters once again. These are disabled when a command buffer is finished.
// Record per frame query resets outside any render pass, before the first draw.
if (query_cache) {
query_cache->FramePrologueResets(*this);
}
} }
void Scheduler::InvalidateState() { void Scheduler::InvalidateState() {

View File

@@ -1,6 +1,3 @@
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
// SPDX-FileCopyrightText: 2016 Citra Emulator Project // SPDX-FileCopyrightText: 2016 Citra Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later // SPDX-License-Identifier: GPL-2.0-or-later
@@ -74,11 +71,11 @@ private:
std::unique_ptr<InputProfiles> profiles; std::unique_ptr<InputProfiles> profiles;
std::array<ConfigureInputPlayer*, 8> player_controllers{}; std::array<ConfigureInputPlayer*, 8> player_controllers;
std::array<QWidget*, 8> player_tabs{}; std::array<QWidget*, 8> player_tabs;
// Checkboxes representing the "Connected Controllers". // Checkboxes representing the "Connected Controllers".
std::array<QCheckBox*, 8> connected_controller_checkboxes{}; std::array<QCheckBox*, 8> connected_controller_checkboxes;
ConfigureInputAdvanced* advanced = nullptr; ConfigureInputAdvanced* advanced;
Core::System& system; Core::System& system;
}; };

View File

@@ -1,6 +1,3 @@
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
// SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project // SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later // SPDX-License-Identifier: GPL-2.0-or-later
@@ -692,10 +689,10 @@ void PlayerControlPreview::DrawHandheldController(QPainter& p, const QPointF cen
{ {
// Draw joysticks // Draw joysticks
using namespace Settings::NativeAnalog; using namespace Settings::NativeAnalog;
const auto& l_stick = QPointF(stick_values[LStick].x.value, stick_values[LStick].y.value); const auto l_stick = QPointF(stick_values[LStick].x.value, stick_values[LStick].y.value);
const auto& l_button = button_values[Settings::NativeButton::LStick]; const auto l_button = button_values[Settings::NativeButton::LStick];
const auto& r_stick = QPointF(stick_values[RStick].x.value, stick_values[RStick].y.value); const auto r_stick = QPointF(stick_values[RStick].x.value, stick_values[RStick].y.value);
const auto& r_button = button_values[Settings::NativeButton::RStick]; const auto r_button = button_values[Settings::NativeButton::RStick];
DrawJoystick(p, center + QPointF(-171, -41) + (l_stick * 4), 1.0f, l_button); DrawJoystick(p, center + QPointF(-171, -41) + (l_stick * 4), 1.0f, l_button);
DrawJoystick(p, center + QPointF(171, 8) + (r_stick * 4), 1.0f, r_button); DrawJoystick(p, center + QPointF(171, 8) + (r_stick * 4), 1.0f, r_button);

View File

@@ -1,6 +1,3 @@
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
// SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project // SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later // SPDX-License-Identifier: GPL-2.0-or-later
@@ -217,7 +214,7 @@ private:
bool mapping_active{}; bool mapping_active{};
int blink_counter{}; int blink_counter{};
int callback_key{}; int callback_key;
QColor button_color{}; QColor button_color{};
ColorMapping colors{}; ColorMapping colors{};
Core::HID::LedPattern led_pattern{0, 0, 0, 0}; Core::HID::LedPattern led_pattern{0, 0, 0, 0};

View File

@@ -1495,7 +1495,7 @@ void MainWindow::OnAppFocusStateChanged(Qt::ApplicationState state) {
(state & (Qt::ApplicationHidden | Qt::ApplicationInactive))) { (state & (Qt::ApplicationHidden | Qt::ApplicationInactive))) {
auto_paused = true; auto_paused = true;
OnPauseGame(); OnPauseGame();
} else if (!emu_thread->IsRunning() && auto_paused && (state & Qt::ApplicationActive)) { } else if (!emu_thread->IsRunning() && auto_paused && state == Qt::ApplicationActive) {
auto_paused = false; auto_paused = false;
OnStartGame(); OnStartGame();
} }
@@ -1505,7 +1505,7 @@ void MainWindow::OnAppFocusStateChanged(Qt::ApplicationState state) {
(state & (Qt::ApplicationHidden | Qt::ApplicationInactive))) { (state & (Qt::ApplicationHidden | Qt::ApplicationInactive))) {
Settings::values.audio_muted = true; Settings::values.audio_muted = true;
auto_muted = true; auto_muted = true;
} else if (auto_muted && (state & Qt::ApplicationActive)) { } else if (auto_muted && state == Qt::ApplicationActive) {
Settings::values.audio_muted = false; Settings::values.audio_muted = false;
auto_muted = false; auto_muted = false;
} }

View File

@@ -482,13 +482,13 @@ private:
MultiplayerState* multiplayer_state = nullptr; MultiplayerState* multiplayer_state = nullptr;
GRenderWindow* render_window = nullptr; GRenderWindow* render_window;
GameList* game_list = nullptr; GameList* game_list;
LoadingScreen* loading_screen = nullptr; LoadingScreen* loading_screen;
QTimer shutdown_timer; QTimer shutdown_timer;
OverlayDialog* shutdown_dialog{}; OverlayDialog* shutdown_dialog{};
GameListPlaceholder* game_list_placeholder = nullptr; GameListPlaceholder* game_list_placeholder;
std::vector<VkDeviceInfo::Record> vk_device_records; std::vector<VkDeviceInfo::Record> vk_device_records;
@@ -531,7 +531,7 @@ private:
QString startup_icon_theme; QString startup_icon_theme;
// Debugger panes // Debugger panes
ControllerDialog* controller_dialog = nullptr; ControllerDialog* controller_dialog;
QAction* actions_recent_files[max_recent_files_item]; QAction* actions_recent_files[max_recent_files_item];
@@ -543,7 +543,7 @@ private:
QTranslator translator; QTranslator translator;
// Install progress dialog // Install progress dialog
QProgressDialog* install_progress = nullptr; QProgressDialog* install_progress;
// Last game booted, used for multi-process apps // Last game booted, used for multi-process apps
QString last_filename_booted; QString last_filename_booted;

View File

@@ -1,6 +1,3 @@
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
// SPDX-FileCopyrightText: Copyright 2017 Citra Emulator Project // SPDX-FileCopyrightText: Copyright 2017 Citra Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later // SPDX-License-Identifier: GPL-2.0-or-later
@@ -178,7 +175,7 @@ public:
private: private:
QString username; QString username;
QString nickname; QString nickname;
u64 title_id{}; u64 title_id;
QString game_name; QString game_name;
}; };