Explorar el Código

Merge pull request #1787 from bunnei/fix-gpu-mm

memory_manager: Do not allow 0 to be a valid GPUVAddr.
bunnei hace 7 años
padre
commit
7d544c1b9d
Se han modificado 2 ficheros con 9 adiciones y 1 borrados
  1. 7 0
      src/video_core/memory_manager.cpp
  2. 2 1
      src/video_core/memory_manager.h

+ 7 - 0
src/video_core/memory_manager.cpp

@@ -9,6 +9,13 @@
 
 
 namespace Tegra {
 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) {
 GPUVAddr MemoryManager::AllocateSpace(u64 size, u64 align) {
     const std::optional<GPUVAddr> gpu_addr{FindFreeBlock(0, size, align, PageStatus::Unmapped)};
     const std::optional<GPUVAddr> gpu_addr{FindFreeBlock(0, size, align, PageStatus::Unmapped)};
 
 

+ 2 - 1
src/video_core/memory_manager.h

@@ -18,7 +18,7 @@ using GPUVAddr = u64;
 
 
 class MemoryManager final {
 class MemoryManager final {
 public:
 public:
-    MemoryManager() = default;
+    MemoryManager();
 
 
     GPUVAddr AllocateSpace(u64 size, u64 align);
     GPUVAddr AllocateSpace(u64 size, u64 align);
     GPUVAddr AllocateSpace(GPUVAddr gpu_addr, u64 size, u64 align);
     GPUVAddr AllocateSpace(GPUVAddr gpu_addr, u64 size, u64 align);
@@ -37,6 +37,7 @@ private:
     enum class PageStatus : u64 {
     enum class PageStatus : u64 {
         Unmapped = 0xFFFFFFFFFFFFFFFFULL,
         Unmapped = 0xFFFFFFFFFFFFFFFFULL,
         Allocated = 0xFFFFFFFFFFFFFFFEULL,
         Allocated = 0xFFFFFFFFFFFFFFFEULL,
+        Reserved = 0xFFFFFFFFFFFFFFFDULL,
     };
     };
 
 
     std::optional<GPUVAddr> FindFreeBlock(GPUVAddr region_start, u64 size, u64 align,
     std::optional<GPUVAddr> FindFreeBlock(GPUVAddr region_start, u64 size, u64 align,