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:
sharmander 2020-12-11 00:05:53 -05:00 committed by GitHub
parent d9ec2b3a81
commit 8a6607540e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 14 additions and 11 deletions

View File

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

View File

@ -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!");

View File

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