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:
parent
c267aea29b
commit
0b1842294f
|
@ -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)};
|
||||||
|
|
||||||
|
|
|
@ -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,
|
||||||
|
|
Loading…
Reference in New Issue