diff options
| author | SDK-Chan <sdkchan@eden-emu.dev> | 2025-08-14 14:30:09 +0200 |
|---|---|---|
| committer | crueter <crueter@eden-emu.dev> | 2025-08-14 14:30:09 +0200 |
| commit | c36cc0d3ee14bc35cf1aa5d38b3f4fe23da8ff9f (patch) | |
| tree | cffffbcb574f68d7a0429368e735f7fa9911ae00 /src | |
| parent | 444b9f361eeb71d06025597d0e0ab2de2c94a4be (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')
| -rw-r--r-- | src/core/hle/service/nvdrv/devices/nvhost_as_gpu.cpp | 23 | ||||
| -rw-r--r-- | src/core/hle/service/nvdrv/devices/nvhost_as_gpu.h | 6 |
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 |
