mirror of
https://git.eden-emu.dev/eden-emu/eden
synced 2026-05-25 00:17:00 +02:00
[hle/service{nvdrv,apm}] fixes for TetrisSwitch (#3983)
- testriswitch submits buffers with a fence id of -1, just skip them instead of trying to process them? - apm:u, which is removed, but hey, backwards compat never hurted - another instance of shared_memory crashing NPad Signed-off-by: lizzie <lizzie@eden-emu.dev> Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/3983 Reviewed-by: MaranBr <maranbr@eden-emu.dev> Reviewed-by: CamilleLaVey <camillelavey99@gmail.com>
This commit is contained in:
parent
90164197dc
commit
2aa2ac7d9a
5 changed files with 37 additions and 29 deletions
|
|
@ -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-FileCopyrightText: Copyright 2018 yuzu Emulator Project
|
||||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
|
|
@ -15,12 +18,11 @@ void LoopProcess(Core::System& system) {
|
||||||
auto module = std::make_shared<Module>();
|
auto module = std::make_shared<Module>();
|
||||||
auto server_manager = std::make_unique<ServerManager>(system);
|
auto server_manager = std::make_unique<ServerManager>(system);
|
||||||
|
|
||||||
server_manager->RegisterNamedService(
|
server_manager->RegisterNamedService("apm", std::make_shared<APM>(system, module, system.GetAPMController(), "apm"));
|
||||||
"apm", std::make_shared<APM>(system, module, system.GetAPMController(), "apm"));
|
server_manager->RegisterNamedService("apm:am", std::make_shared<APM>(system, module, system.GetAPMController(), "apm:am"));
|
||||||
server_manager->RegisterNamedService(
|
// Removed on [+8.0.0] but kept for compatibility
|
||||||
"apm:am", std::make_shared<APM>(system, module, system.GetAPMController(), "apm:am"));
|
server_manager->RegisterNamedService("apm:p", std::make_shared<APM>(system, module, system.GetAPMController(), "apm:p"));
|
||||||
server_manager->RegisterNamedService(
|
server_manager->RegisterNamedService("apm:sys", std::make_shared<APM_Sys>(system, system.GetAPMController()));
|
||||||
"apm:sys", std::make_shared<APM_Sys>(system, system.GetAPMController()));
|
|
||||||
ServerManager::RunServer(std::move(server_manager));
|
ServerManager::RunServer(std::move(server_manager));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -79,7 +79,9 @@ void nvdisp_disp0::Composite(std::span<const Nvnflinger::HwcLayer> sorted_layers
|
||||||
});
|
});
|
||||||
|
|
||||||
for (size_t i = 0; i < layer.acquire_fence.num_fences; i++) {
|
for (size_t i = 0; i < layer.acquire_fence.num_fences; i++) {
|
||||||
output_fences.push_back(layer.acquire_fence.fences[i]);
|
if (layer.acquire_fence.fences[i].id >= 0) {
|
||||||
|
output_fences.push_back(layer.acquire_fence.fences[i]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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-FileCopyrightText: Copyright 2021 yuzu Emulator Project
|
||||||
// SPDX-FileCopyrightText: Copyright 2012 The Android Open Source Project
|
// SPDX-FileCopyrightText: Copyright 2012 The Android Open Source Project
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
@ -15,10 +18,8 @@ namespace Service::android {
|
||||||
|
|
||||||
class Fence {
|
class Fence {
|
||||||
public:
|
public:
|
||||||
constexpr Fence() = default;
|
|
||||||
|
|
||||||
static constexpr Fence NoFence() {
|
static constexpr Fence NoFence() {
|
||||||
Fence fence;
|
Fence fence{};
|
||||||
fence.fences[0].id = -1;
|
fence.fences[0].id = -1;
|
||||||
fence.fences[1].id = -1;
|
fence.fences[1].id = -1;
|
||||||
fence.fences[2].id = -1;
|
fence.fences[2].id = -1;
|
||||||
|
|
@ -26,7 +27,6 @@ public:
|
||||||
return fence;
|
return fence;
|
||||||
}
|
}
|
||||||
|
|
||||||
public:
|
|
||||||
u32 num_fences{};
|
u32 num_fences{};
|
||||||
std::array<Service::Nvidia::NvFence, 4> fences{};
|
std::array<Service::Nvidia::NvFence, 4> fences{};
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -712,6 +712,11 @@ bool NPad::SetNpadMode(u64 aruid, Core::HID::NpadIdType& new_npad_id, Core::HID:
|
||||||
}
|
}
|
||||||
|
|
||||||
auto& controller = GetControllerFromNpadIdType(aruid, npad_id);
|
auto& controller = GetControllerFromNpadIdType(aruid, npad_id);
|
||||||
|
if (!controller.shared_memory) {
|
||||||
|
LOG_WARNING(Service_HID, "shared_memory is null for npad_id={}", npad_id);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
if (controller.shared_memory->assignment_mode != assignment_mode) {
|
if (controller.shared_memory->assignment_mode != assignment_mode) {
|
||||||
controller.shared_memory->assignment_mode = assignment_mode;
|
controller.shared_memory->assignment_mode = assignment_mode;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -303,26 +303,25 @@ struct GPU::Impl {
|
||||||
free_swap_counters.pop_front();
|
free_swap_counters.pop_front();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
const auto wait_fence =
|
const auto wait_fence = RequestSyncOperation([this, current_request_counter, &layers, &fences, num_fences] {
|
||||||
RequestSyncOperation([this, current_request_counter, &layers, &fences, num_fences] {
|
auto& syncpoint_manager = host1x.GetSyncpointManager();
|
||||||
auto& syncpoint_manager = host1x.GetSyncpointManager();
|
if (num_fences == 0) {
|
||||||
if (num_fences == 0) {
|
renderer->Composite(layers);
|
||||||
renderer->Composite(layers);
|
}
|
||||||
}
|
const auto executer = [this, current_request_counter, layers_copy = layers]() {
|
||||||
const auto executer = [this, current_request_counter, layers_copy = layers]() {
|
{
|
||||||
{
|
std::unique_lock<std::mutex> lk(request_swap_mutex);
|
||||||
std::unique_lock<std::mutex> lk(request_swap_mutex);
|
if (--request_swap_counters[current_request_counter] != 0) {
|
||||||
if (--request_swap_counters[current_request_counter] != 0) {
|
return;
|
||||||
return;
|
|
||||||
}
|
|
||||||
free_swap_counters.push_back(current_request_counter);
|
|
||||||
}
|
}
|
||||||
renderer->Composite(layers_copy);
|
free_swap_counters.push_back(current_request_counter);
|
||||||
};
|
|
||||||
for (size_t i = 0; i < num_fences; i++) {
|
|
||||||
syncpoint_manager.RegisterGuestAction(fences[i].id, fences[i].value, executer);
|
|
||||||
}
|
}
|
||||||
});
|
renderer->Composite(layers_copy);
|
||||||
|
};
|
||||||
|
for (size_t i = 0; i < num_fences; i++) {
|
||||||
|
syncpoint_manager.RegisterGuestAction(fences[i].id, fences[i].value, executer);
|
||||||
|
}
|
||||||
|
});
|
||||||
gpu_thread.TickGPU();
|
gpu_thread.TickGPU();
|
||||||
WaitForSyncOperation(wait_fence);
|
WaitForSyncOperation(wait_fence);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue