diff options
author | bunnei <bunneidev@gmail.com> | 2018-11-25 05:45:00 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-11-25 05:45:00 +0100 |
commit | 7d544c1b9dd96a487daecc9b86ce957494bb9e7c (patch) | |
tree | 4feee594c2ca6145a88509c9912ef700b3e9e2da /src/video_core | |
parent | Merge pull request #1641 from DarkLordZach/sm-register-unregister (diff) | |
parent | memory_manager: Do not allow 0 to be a valid GPUVAddr. (diff) | |
download | yuzu-7d544c1b9dd96a487daecc9b86ce957494bb9e7c.tar yuzu-7d544c1b9dd96a487daecc9b86ce957494bb9e7c.tar.gz yuzu-7d544c1b9dd96a487daecc9b86ce957494bb9e7c.tar.bz2 yuzu-7d544c1b9dd96a487daecc9b86ce957494bb9e7c.tar.lz yuzu-7d544c1b9dd96a487daecc9b86ce957494bb9e7c.tar.xz yuzu-7d544c1b9dd96a487daecc9b86ce957494bb9e7c.tar.zst yuzu-7d544c1b9dd96a487daecc9b86ce957494bb9e7c.zip |
Diffstat (limited to 'src/video_core')
-rw-r--r-- | src/video_core/memory_manager.cpp | 7 | ||||
-rw-r--r-- | src/video_core/memory_manager.h | 3 |
2 files changed, 9 insertions, 1 deletions
diff --git a/src/video_core/memory_manager.cpp b/src/video_core/memory_manager.cpp index 77a20bb84..47247f097 100644 --- a/src/video_core/memory_manager.cpp +++ b/src/video_core/memory_manager.cpp @@ -9,6 +9,13 @@ namespace Tegra { +MemoryManager::MemoryManager() { + // Mark the first page as reserved, so that 0 is not a valid GPUVAddr. Otherwise, games might + // try to use 0 as a valid address, which is also used to mean nullptr. This fixes a bug with + // Undertale using 0 for a render target. + PageSlot(0) = static_cast<u64>(PageStatus::Reserved); +} + GPUVAddr MemoryManager::AllocateSpace(u64 size, u64 align) { const std::optional<GPUVAddr> gpu_addr{FindFreeBlock(0, size, align, PageStatus::Unmapped)}; diff --git a/src/video_core/memory_manager.h b/src/video_core/memory_manager.h index 4eb338aa2..fb03497ca 100644 --- a/src/video_core/memory_manager.h +++ b/src/video_core/memory_manager.h @@ -18,7 +18,7 @@ using GPUVAddr = u64; class MemoryManager final { public: - MemoryManager() = default; + MemoryManager(); GPUVAddr AllocateSpace(u64 size, u64 align); GPUVAddr AllocateSpace(GPUVAddr gpu_addr, u64 size, u64 align); @@ -37,6 +37,7 @@ private: enum class PageStatus : u64 { Unmapped = 0xFFFFFFFFFFFFFFFFULL, Allocated = 0xFFFFFFFFFFFFFFFEULL, + Reserved = 0xFFFFFFFFFFFFFFFDULL, }; std::optional<GPUVAddr> FindFreeBlock(GPUVAddr region_start, u64 size, u64 align, |