3
0
Fork 0
forked from suyu/suyu

memory_manager: Do not allow 0 to be a valid GPUVAddr.

- Fixes a bug with Undertale using 0 for a render target.
This commit is contained in:
bunnei 2018-11-23 12:58:55 -05:00
parent c267aea29b
commit 0b1842294f
2 changed files with 9 additions and 1 deletions

View file

@ -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)};

View file

@ -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,