Compare commits

..

5 Commits

Author SHA1 Message Date
PavelBARABANOV b2e80a5b5d header 2026-09-12 16:19:54 +03:00
PavelBARABANOV 03e4e9201f [ns] use GetApplicationControlData3 for cmd23 in IReadOnlyApplicationControlDataInterface 2026-09-12 16:19:20 +03:00
PavelBARABANOV a82c6a4fba [android] handle empty programId in Game.settingsName 2026-09-12 16:18:28 +03:00
PavelBARABANOV 413b6060e0 [am] Bruno FIX OVERLAY 2.0 2026-09-12 16:17:10 +03:00
PavelBARABANOV 4c63d973e1 [dynarmic:] TST + B.NE for marked bit 2026-09-12 16:16:18 +03:00
5 changed files with 22 additions and 42 deletions
@@ -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: 2023 yuzu Emulator Project
@@ -37,7 +37,7 @@ class Game(
val settingsName: String
get() {
val programIdLong = programId.toLong()
val programIdLong = programId.toLongOrNull() ?: 0L
return if (programIdLong == 0L) {
FileUtil.getFilename(Uri.parse(path))
} else {
@@ -47,7 +47,7 @@ class Game(
val programIdHex: String
get() {
val programIdLong = programId.toLong()
val programIdLong = programId.toLongOrNull() ?: 0L
return if (programIdLong == 0L) {
"0"
} else {
+2 -29
View File
@@ -22,7 +22,6 @@
#include <sys/mman.h>
#include <unistd.h>
#include "common/scope_exit.h"
#include "common/literals.h"
#if defined(__linux__)
#include <sys/random.h>
@@ -527,28 +526,7 @@ public:
#elif defined(__OpenBSD__)
fd = shm_open_anon(O_RDWR | O_CREAT | O_EXCL | O_NOFOLLOW, 0600);
#elif defined(__FreeBSD__)
int n_page_sizes = getpagesizes(nullptr, 0);
if (n_page_sizes > 0) {
std::vector<size_t> page_sizes(n_page_sizes);
if (getpagesizes(page_sizes.data(), n_page_sizes) > 0) {
size_t max_size = page_sizes[0];
size_t max_index = 0;
for (size_t i = 0; i < page_sizes.size(); ++i) {
using namespace Common::Literals;
if (page_sizes[i] <= 4_GiB) {
max_size = (std::max)(max_size, page_sizes[i]);
max_index = i;
}
}
LOG_WARNING(Common_Memory, "using largepage of size {} #{}", max_size, max_index);
// Do not use SHM_LARGEPAGE_ALLOC_HARD, will infinitely hang on vm_reclaim on most systems
fd = shm_create_largepage(SHM_ANON, O_RDWR, max_index, SHM_LARGEPAGE_ALLOC_DEFAULT, 0600);
}
}
if (fd < 0) {
LOG_WARNING(Common_Memory, "unable to force largepage: {}", strerror(errno));
fd = shm_open(SHM_ANON, O_RDWR, 0600);
}
fd = shm_open(SHM_ANON, O_RDWR, 0600);
#elif defined(__APPLE__) || defined(__managarm__)
// macOS doesn't have memfd_create, use anonymous temporary file
char template_path[] = "/tmp/eden_mem_XXXXXX";
@@ -580,12 +558,7 @@ public:
close(fd);
}
} else {
int map_flags =MAP_SHARED | MAP_NOCORE;
#ifdef __FreeBSD__
// Prevent dirty tracking of memfd
map_flags |= MAP_NOSYNC;
#endif
backing_base = static_cast<u8*>(mmap(nullptr, backing_size, PROT_READ | PROT_WRITE, map_flags, fd, 0));
backing_base = static_cast<u8*>(mmap(nullptr, backing_size, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_NOCORE, fd, 0));
}
if (backing_base == MAP_FAILED) {
LOG_CRITICAL(HW_Memory, "mmap failed: {}", strerror(errno));
@@ -73,16 +73,20 @@ Result DisplayLayerManager::CreateManagedDisplayLayer(u64* out_layer_id) {
R_TRY(m_manager_display_service->CreateManagedLayer(
out_layer_id, 0, display_id, Service::AppletResourceUserId{m_process->GetProcessId()}));
m_manager_display_service->SetLayerVisibility(m_visible, *out_layer_id);
(void)m_display_service->GetContainer()->SetLayerStackMask(*out_layer_id,
this->GetLayerStackMask());
if (m_applet_id != AppletId::Application) {
(void)m_manager_display_service->SetLayerBlending(m_blending_enabled, *out_layer_id);
if (m_applet_id == AppletId::OverlayDisplay) {
(void)m_manager_display_service->SetLayerZIndex(-1, *out_layer_id);
(void)m_display_service->GetContainer()->SetLayerIsOverlay(*out_layer_id, true);
(void)m_manager_display_service->SetLayerZIndex(Overlay, *out_layer_id);
} else {
(void)m_manager_display_service->SetLayerZIndex(1, *out_layer_id);
(void)m_manager_display_service->SetLayerZIndex(Foreground, *out_layer_id);
}
}
(void)m_display_service->GetContainer()->SetLayerZIndex(*out_layer_id, true);
m_display_service->GetContainer()->SetLayerZIndex(*out_layer_id, true);
m_managed_display_layers.emplace(*out_layer_id);
R_SUCCEED();
@@ -122,14 +126,16 @@ Result DisplayLayerManager::IsSystemBufferSharingEnabled() {
// Ensure the overlay layer is visible
m_manager_display_service->SetLayerVisibility(m_visible, m_system_shared_layer_id);
m_manager_display_service->SetLayerBlending(m_blending_enabled, m_system_shared_layer_id);
s32 initial_z = 1;
(void)m_display_service->GetContainer()->SetLayerZIndex(m_system_shared_layer_id, true);
(void)m_manager_display_service->SetLayerBlending(m_blending_enabled, m_system_shared_layer_id);
s32 initial_z = Foreground;
if (m_applet_id == AppletId::OverlayDisplay) {
initial_z = -1;
initial_z = Overlay;
(void)m_manager_display_service->SetLayerZIndex(initial_z, m_system_shared_layer_id);
(void)m_display_service->GetContainer()->SetLayerIsOverlay(m_system_shared_layer_id, true);
}
m_manager_display_service->SetLayerZIndex(initial_z, m_system_shared_layer_id);
m_display_service->GetContainer()->SetLayerZIndex(m_system_shared_layer_id, true);
m_managed_display_layers.emplace(m_system_shared_layer_id);
R_SUCCEED();
}
@@ -142,6 +142,7 @@ IReadOnlyApplicationControlDataInterface::IReadOnlyApplicationControlDataInterfa
{10, &IReadOnlyApplicationControlDataInterface::ListApplicationIcon, "ListApplicationIcon"},
{13, &IReadOnlyApplicationControlDataInterface::ListApplicationTitle, "ListApplicationTitle"},
{19, D<&IReadOnlyApplicationControlDataInterface::GetApplicationControlData3>, "GetApplicationControlData"},
{23, D<&IReadOnlyApplicationControlDataInterface::GetApplicationControlData3>, "GetApplicationControlData"},
};
// clang-format on
@@ -274,8 +274,8 @@ std::pair<oaknut::XReg, oaknut::XReg> InlinePageTableEmitVAddrLookup(oaknut::Cod
code.LDR(Xscratch0, Xpagetable, Xscratch0);
if (ctx.conf.page_table_marked_bit) {
// check for marked bit
code.TBNZ(Xscratch0, *ctx.conf.page_table_marked_bit, *fallback);
code.TST(Xscratch0, 1ULL << *ctx.conf.page_table_marked_bit);
code.B(NE, *fallback);
}
if (ctx.conf.page_table_pointer_mask != 0) {