forked from Mirror/Ryujinx
GPU: Improve unnecessary return value in Map function. (#1799)
* Implement VFNMA.F<32/64> * Update PTC Version * Update Implementation & Renames & Correct Order * Add Logging * Additional logging * Add additional check to restart loop from beginning if address goes beyond maximum allowed. * Additional Check that the total range required doesn't exceed capacity of allocator addresses. * Improve logging * Ensure hex output * Update Ryujinx.HLE/HOS/Services/Nv/NvMemoryAllocator.cs Co-authored-by: gdkchan <gab.dark.100@gmail.com> * Remove extra page at end * Remove unnecessary return val in Map function. * Remove incorrect description Co-authored-by: gdkchan <gab.dark.100@gmail.com>
This commit is contained in:
parent
d9ec2b3a81
commit
8a6607540e
3 changed files with 14 additions and 11 deletions
|
@ -115,8 +115,7 @@ namespace Ryujinx.Graphics.Gpu.Memory
|
||||||
/// <param name="pa">CPU virtual address to map into</param>
|
/// <param name="pa">CPU virtual address to map into</param>
|
||||||
/// <param name="va">GPU virtual address to be mapped</param>
|
/// <param name="va">GPU virtual address to be mapped</param>
|
||||||
/// <param name="size">Size in bytes of the mapping</param>
|
/// <param name="size">Size in bytes of the mapping</param>
|
||||||
/// <returns>GPU virtual address of the mapping</returns>
|
public void Map(ulong pa, ulong va, ulong size)
|
||||||
public ulong Map(ulong pa, ulong va, ulong size)
|
|
||||||
{
|
{
|
||||||
lock (_pageTable)
|
lock (_pageTable)
|
||||||
{
|
{
|
||||||
|
@ -127,8 +126,6 @@ namespace Ryujinx.Graphics.Gpu.Memory
|
||||||
SetPte(va + offset, pa + offset);
|
SetPte(va + offset, pa + offset);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return va;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|
|
@ -223,8 +223,9 @@ namespace Ryujinx.HLE.HOS.Services.Nv.NvDrvServices.NvHostAsGpu
|
||||||
long virtualAddress = arguments.Offset + arguments.BufferOffset;
|
long virtualAddress = arguments.Offset + arguments.BufferOffset;
|
||||||
|
|
||||||
physicalAddress += arguments.BufferOffset;
|
physicalAddress += arguments.BufferOffset;
|
||||||
|
addressSpaceContext.Gmm.Map((ulong)physicalAddress, (ulong)virtualAddress, (ulong)arguments.MappingSize);
|
||||||
|
|
||||||
if ((long)addressSpaceContext.Gmm.Map((ulong)physicalAddress, (ulong)virtualAddress, (ulong)arguments.MappingSize) < 0)
|
if (virtualAddress < 0)
|
||||||
{
|
{
|
||||||
string message = string.Format(mapErrorMsg, virtualAddress, arguments.MappingSize, pageSize);
|
string message = string.Format(mapErrorMsg, virtualAddress, arguments.MappingSize, pageSize);
|
||||||
|
|
||||||
|
@ -265,7 +266,7 @@ namespace Ryujinx.HLE.HOS.Services.Nv.NvDrvServices.NvHostAsGpu
|
||||||
{
|
{
|
||||||
if (addressSpaceContext.ValidateFixedBuffer(arguments.Offset, size, pageSize))
|
if (addressSpaceContext.ValidateFixedBuffer(arguments.Offset, size, pageSize))
|
||||||
{
|
{
|
||||||
arguments.Offset = (long)addressSpaceContext.Gmm.Map((ulong)physicalAddress, (ulong)arguments.Offset, (ulong)size);
|
addressSpaceContext.Gmm.Map((ulong)physicalAddress, (ulong)arguments.Offset, (ulong)size);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -283,7 +284,9 @@ namespace Ryujinx.HLE.HOS.Services.Nv.NvDrvServices.NvHostAsGpu
|
||||||
{
|
{
|
||||||
_memoryAllocator.AllocateRange(va, (ulong)size, freeAddressStartPosition);
|
_memoryAllocator.AllocateRange(va, (ulong)size, freeAddressStartPosition);
|
||||||
}
|
}
|
||||||
arguments.Offset = (long)addressSpaceContext.Gmm.Map((ulong)physicalAddress, va, (ulong)size);
|
|
||||||
|
addressSpaceContext.Gmm.Map((ulong)physicalAddress, va, (ulong)size);
|
||||||
|
arguments.Offset = (long)va;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (arguments.Offset < 0)
|
if (arguments.Offset < 0)
|
||||||
|
@ -332,12 +335,14 @@ namespace Ryujinx.HLE.HOS.Services.Nv.NvDrvServices.NvHostAsGpu
|
||||||
return NvInternalResult.InvalidInput;
|
return NvInternalResult.InvalidInput;
|
||||||
}
|
}
|
||||||
|
|
||||||
long result = (long)gmm.Map(
|
long shiftedGpuOffset = (long)((ulong)arguments[index].GpuOffset << 16);
|
||||||
|
|
||||||
|
gmm.Map(
|
||||||
((ulong)arguments[index].MapOffset << 16) + (ulong)map.Address,
|
((ulong)arguments[index].MapOffset << 16) + (ulong)map.Address,
|
||||||
(ulong)arguments[index].GpuOffset << 16,
|
(ulong)shiftedGpuOffset,
|
||||||
(ulong)arguments[index].Pages << 16);
|
(ulong)arguments[index].Pages << 16);
|
||||||
|
|
||||||
if (result < 0)
|
if (shiftedGpuOffset < 0)
|
||||||
{
|
{
|
||||||
Logger.Warning?.Print(LogClass.ServiceNv,
|
Logger.Warning?.Print(LogClass.ServiceNv,
|
||||||
$"Page 0x{arguments[index].GpuOffset:x16} size 0x{arguments[index].Pages:x16} not allocated!");
|
$"Page 0x{arguments[index].GpuOffset:x16} size 0x{arguments[index].Pages:x16} not allocated!");
|
||||||
|
|
|
@ -253,7 +253,8 @@ namespace Ryujinx.HLE.HOS.Services.Nv.NvDrvServices.NvHostChannel
|
||||||
if (va != NvMemoryAllocator.PteUnmapped && va <= uint.MaxValue && (va + (uint)map.Size) <= uint.MaxValue)
|
if (va != NvMemoryAllocator.PteUnmapped && va <= uint.MaxValue && (va + (uint)map.Size) <= uint.MaxValue)
|
||||||
{
|
{
|
||||||
_memoryAllocator.AllocateRange(va, (uint)map.Size, freeAddressStartPosition);
|
_memoryAllocator.AllocateRange(va, (uint)map.Size, freeAddressStartPosition);
|
||||||
map.DmaMapAddress = (long)gmm.Map((ulong)map.Address, va, (uint)map.Size);
|
gmm.Map((ulong)map.Address, va, (uint)map.Size);
|
||||||
|
map.DmaMapAddress = (long)va;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
Reference in a new issue