aboutsummaryrefslogtreecommitdiff
path: root/src/core
diff options
context:
space:
mode:
authorSDK-Chan <sdkchan@eden-emu.dev>2025-08-14 14:30:09 +0200
committercrueter <crueter@eden-emu.dev>2025-08-14 14:30:09 +0200
commitc36cc0d3ee14bc35cf1aa5d38b3f4fe23da8ff9f (patch)
treecffffbcb574f68d7a0429368e735f7fa9911ae00 /src/core
parent444b9f361eeb71d06025597d0e0ab2de2c94a4be (diff)
[core/nvdrv] Fix Random Unmap Memory Clearing (#176)
Now memory should only be unmapped after it was mapped. Could eventually fix some graphical errors, and improve performance. Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/176 Reviewed-by: Shinmegumi <shinmegumi@eden-emu.dev> Co-authored-by: SDK-Chan <sdkchan@eden-emu.dev> Co-committed-by: SDK-Chan <sdkchan@eden-emu.dev>
Diffstat (limited to 'src/core')
-rw-r--r--src/core/hle/service/nvdrv/devices/nvhost_as_gpu.cpp23
-rw-r--r--src/core/hle/service/nvdrv/devices/nvhost_as_gpu.h6
2 files changed, 19 insertions, 10 deletions
diff --git a/src/core/hle/service/nvdrv/devices/nvhost_as_gpu.cpp b/src/core/hle/service/nvdrv/devices/nvhost_as_gpu.cpp
index 68fe388741..029a9d9cd5 100644
--- a/src/core/hle/service/nvdrv/devices/nvhost_as_gpu.cpp
+++ b/src/core/hle/service/nvdrv/devices/nvhost_as_gpu.cpp
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: 2021 yuzu Emulator Project
// SPDX-FileCopyrightText: 2021 Skyline Team and Contributors
// SPDX-License-Identifier: GPL-3.0-or-later
@@ -312,7 +315,7 @@ NvResult nvhost_as_gpu::Remap(std::span<IoctlRemapEntry> entries) {
NvResult nvhost_as_gpu::MapBufferEx(IoctlMapBufferEx& params) {
LOG_DEBUG(Service_NVDRV,
"called, flags={:X}, nvmap_handle={:X}, buffer_offset={}, mapping_size={}"
- ", offset={}",
+ ", offset=0x{:X}",
params.flags, params.handle, params.buffer_offset, params.mapping_size,
params.offset);
@@ -406,19 +409,21 @@ NvResult nvhost_as_gpu::MapBufferEx(IoctlMapBufferEx& params) {
mapping_map[params.offset] = mapping;
}
+ map_buffer_offsets.insert(params.offset);
+
return NvResult::Success;
}
NvResult nvhost_as_gpu::UnmapBuffer(IoctlUnmapBuffer& params) {
- LOG_DEBUG(Service_NVDRV, "called, offset=0x{:X}", params.offset);
+ if (map_buffer_offsets.find(params.offset) != map_buffer_offsets.end()) {
+ LOG_DEBUG(Service_NVDRV, "called, offset=0x{:X}", params.offset);
- std::scoped_lock lock(mutex);
+ std::scoped_lock lock(mutex);
- if (!vm.initialised) {
- return NvResult::BadValue;
- }
+ if (!vm.initialised) {
+ return NvResult::BadValue;
+ }
- try {
auto mapping{mapping_map.at(params.offset)};
if (!mapping->fixed) {
@@ -440,10 +445,8 @@ NvResult nvhost_as_gpu::UnmapBuffer(IoctlUnmapBuffer& params) {
nvmap.UnpinHandle(mapping->handle);
mapping_map.erase(params.offset);
- } catch (const std::out_of_range&) {
- LOG_WARNING(Service_NVDRV, "Couldn't find region to unmap at 0x{:X}", params.offset);
+ map_buffer_offsets.erase(params.offset);
}
-
return NvResult::Success;
}
diff --git a/src/core/hle/service/nvdrv/devices/nvhost_as_gpu.h b/src/core/hle/service/nvdrv/devices/nvhost_as_gpu.h
index 7d0a999888..cad6457293 100644
--- a/src/core/hle/service/nvdrv/devices/nvhost_as_gpu.h
+++ b/src/core/hle/service/nvdrv/devices/nvhost_as_gpu.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: 2021 yuzu Emulator Project
// SPDX-FileCopyrightText: 2021 Skyline Team and Contributors
// SPDX-License-Identifier: GPL-3.0-or-later
@@ -10,6 +13,7 @@
#include <memory>
#include <mutex>
#include <optional>
+#include <unordered_set>
#include <vector>
#include "common/address_space.h"
@@ -109,6 +113,8 @@ private:
};
static_assert(sizeof(IoctlRemapEntry) == 20, "IoctlRemapEntry is incorrect size");
+ std::unordered_set<s64_le> map_buffer_offsets{};
+
struct IoctlMapBufferEx {
MappingFlags flags{}; // bit0: fixed_offset, bit2: cacheable
u32_le kind{}; // -1 is default