* dotnet format style --severity info Some changes were manually reverted. * dotnet format analyzers --serverity info Some changes have been minimally adapted. * Restore a few unused methods and variables * Silence dotnet format IDE0060 warnings * Silence dotnet format IDE0052 warnings * Address or silence dotnet format IDE1006 warnings * Address dotnet format CA1816 warnings * Address or silence dotnet format CA2208 warnings * Address or silence dotnet format CA1806 and a few CA1854 warnings * Address dotnet format CA2211 warnings * Address dotnet format CA1822 warnings * Address or silence dotnet format CA1069 warnings * Make dotnet format succeed in style mode * Address or silence dotnet format CA2211 warnings * Address review comments * Address dotnet format CA2208 warnings properly * Make ProcessResult readonly * Address most dotnet format whitespace warnings * Apply dotnet format whitespace formatting A few of them have been manually reverted and the corresponding warning was silenced * Add previously silenced warnings back I have no clue how these disappeared * Revert formatting changes for while and for-loops * Format if-blocks correctly * Run dotnet format style after rebase * Run dotnet format whitespace after rebase * Run dotnet format style after rebase * Run dotnet format analyzers after rebase * Run dotnet format after rebase and remove unused usings - analyzers - style - whitespace * Disable 'prefer switch expression' rule * Add comments to disabled warnings * Fix a few disabled warnings * Fix naming rule violation, Convert shader properties to auto-property and convert values to const * Simplify properties and array initialization, Use const when possible, Remove trailing commas * Start working on disabled warnings * Fix and silence a few dotnet-format warnings again * Run dotnet format after rebase * Use using declaration instead of block syntax * Address IDE0251 warnings * Address a few disabled IDE0060 warnings * Silence IDE0060 in .editorconfig * Revert "Simplify properties and array initialization, Use const when possible, Remove trailing commas" This reverts commit 9462e4136c0a2100dc28b20cf9542e06790aa67e. * dotnet format whitespace after rebase * First dotnet format pass * Fix naming rule violations * Fix typo * Add trailing commas, use targeted new and use array initializer * Fix build issues * Fix remaining build issues * Remove SuppressMessage for CA1069 where possible * Address dotnet format issues * Address formatting issues Co-authored-by: Ac_K <acoustik666@gmail.com> * Add GetHashCode implementation for RenderingSurfaceInfo * Explicitly silence CA1822 for every affected method in Syscall * Address formatting issues in Demangler.cs * Address review feedback Co-authored-by: Ac_K <acoustik666@gmail.com> * Revert marking service methods as static * Next dotnet format pass * Address review feedback --------- Co-authored-by: Ac_K <acoustik666@gmail.com>
243 lines
9.1 KiB
C#
243 lines
9.1 KiB
C#
using Ryujinx.Common.Logging;
|
|
using Ryujinx.HLE.HOS.Kernel.Threading;
|
|
using Ryujinx.HLE.HOS.Services.Nv.NvDrvServices.NvHostCtrlGpu.Types;
|
|
using Ryujinx.Horizon.Common;
|
|
using Ryujinx.Memory;
|
|
using System;
|
|
using System.Diagnostics;
|
|
|
|
namespace Ryujinx.HLE.HOS.Services.Nv.NvDrvServices.NvHostCtrlGpu
|
|
{
|
|
class NvHostCtrlGpuDeviceFile : NvDeviceFile
|
|
{
|
|
private static readonly Stopwatch _pTimer = new();
|
|
private static readonly double _ticksToNs = (1.0 / Stopwatch.Frequency) * 1_000_000_000;
|
|
|
|
private readonly KEvent _errorEvent;
|
|
private readonly KEvent _unknownEvent;
|
|
|
|
public NvHostCtrlGpuDeviceFile(ServiceCtx context, IVirtualMemoryManager memory, ulong owner) : base(context, owner)
|
|
{
|
|
_errorEvent = new KEvent(context.Device.System.KernelContext);
|
|
_unknownEvent = new KEvent(context.Device.System.KernelContext);
|
|
}
|
|
|
|
static NvHostCtrlGpuDeviceFile()
|
|
{
|
|
_pTimer.Start();
|
|
}
|
|
|
|
public override NvInternalResult Ioctl(NvIoctl command, Span<byte> arguments)
|
|
{
|
|
NvInternalResult result = NvInternalResult.NotImplemented;
|
|
|
|
if (command.Type == NvIoctl.NvGpuMagic)
|
|
{
|
|
switch (command.Number)
|
|
{
|
|
case 0x01:
|
|
result = CallIoctlMethod<ZcullGetCtxSizeArguments>(ZcullGetCtxSize, arguments);
|
|
break;
|
|
case 0x02:
|
|
result = CallIoctlMethod<ZcullGetInfoArguments>(ZcullGetInfo, arguments);
|
|
break;
|
|
case 0x03:
|
|
result = CallIoctlMethod<ZbcSetTableArguments>(ZbcSetTable, arguments);
|
|
break;
|
|
case 0x05:
|
|
result = CallIoctlMethod<GetCharacteristicsArguments>(GetCharacteristics, arguments);
|
|
break;
|
|
case 0x06:
|
|
result = CallIoctlMethod<GetTpcMasksArguments>(GetTpcMasks, arguments);
|
|
break;
|
|
case 0x14:
|
|
result = CallIoctlMethod<GetActiveSlotMaskArguments>(GetActiveSlotMask, arguments);
|
|
break;
|
|
case 0x1c:
|
|
result = CallIoctlMethod<GetGpuTimeArguments>(GetGpuTime, arguments);
|
|
break;
|
|
}
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
public override NvInternalResult Ioctl3(NvIoctl command, Span<byte> arguments, Span<byte> inlineOutBuffer)
|
|
{
|
|
NvInternalResult result = NvInternalResult.NotImplemented;
|
|
|
|
if (command.Type == NvIoctl.NvGpuMagic)
|
|
{
|
|
switch (command.Number)
|
|
{
|
|
case 0x05:
|
|
result = CallIoctlMethod<GetCharacteristicsArguments, GpuCharacteristics>(GetCharacteristics, arguments, inlineOutBuffer);
|
|
break;
|
|
case 0x06:
|
|
result = CallIoctlMethod<GetTpcMasksArguments, int>(GetTpcMasks, arguments, inlineOutBuffer);
|
|
break;
|
|
}
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
public override NvInternalResult QueryEvent(out int eventHandle, uint eventId)
|
|
{
|
|
// TODO: accurately represent and implement those events.
|
|
KEvent targetEvent = null;
|
|
|
|
switch (eventId)
|
|
{
|
|
case 0x1:
|
|
targetEvent = _errorEvent;
|
|
break;
|
|
case 0x2:
|
|
targetEvent = _unknownEvent;
|
|
break;
|
|
}
|
|
|
|
if (targetEvent != null)
|
|
{
|
|
if (Context.Process.HandleTable.GenerateHandle(targetEvent.ReadableEvent, out eventHandle) != Result.Success)
|
|
{
|
|
throw new InvalidOperationException("Out of handles!");
|
|
}
|
|
}
|
|
else
|
|
{
|
|
eventHandle = 0;
|
|
|
|
return NvInternalResult.InvalidInput;
|
|
}
|
|
|
|
return NvInternalResult.Success;
|
|
}
|
|
|
|
public override void Close() { }
|
|
|
|
private NvInternalResult ZcullGetCtxSize(ref ZcullGetCtxSizeArguments arguments)
|
|
{
|
|
arguments.Size = 1;
|
|
|
|
return NvInternalResult.Success;
|
|
}
|
|
|
|
private NvInternalResult ZcullGetInfo(ref ZcullGetInfoArguments arguments)
|
|
{
|
|
#pragma warning disable IDE0055 // Disable formatting
|
|
arguments.WidthAlignPixels = 0x20;
|
|
arguments.HeightAlignPixels = 0x20;
|
|
arguments.PixelSquaresByAliquots = 0x400;
|
|
arguments.AliquotTotal = 0x800;
|
|
arguments.RegionByteMultiplier = 0x20;
|
|
arguments.RegionHeaderSize = 0x20;
|
|
arguments.SubregionHeaderSize = 0xc0;
|
|
arguments.SubregionWidthAlignPixels = 0x20;
|
|
arguments.SubregionHeightAlignPixels = 0x40;
|
|
arguments.SubregionCount = 0x10;
|
|
#pragma warning restore IDE0055
|
|
|
|
return NvInternalResult.Success;
|
|
}
|
|
|
|
private NvInternalResult ZbcSetTable(ref ZbcSetTableArguments arguments)
|
|
{
|
|
Logger.Stub?.PrintStub(LogClass.ServiceNv);
|
|
|
|
return NvInternalResult.Success;
|
|
}
|
|
|
|
private NvInternalResult GetCharacteristics(ref GetCharacteristicsArguments arguments)
|
|
{
|
|
return GetCharacteristics(ref arguments, ref arguments.Characteristics);
|
|
}
|
|
|
|
private NvInternalResult GetCharacteristics(ref GetCharacteristicsArguments arguments, ref GpuCharacteristics characteristics)
|
|
{
|
|
arguments.Header.BufferSize = 0xa0;
|
|
|
|
#pragma warning disable IDE0055 // Disable formatting
|
|
characteristics.Arch = 0x120;
|
|
characteristics.Impl = 0xb;
|
|
characteristics.Rev = 0xa1;
|
|
characteristics.NumGpc = 0x1;
|
|
characteristics.L2CacheSize = 0x40000;
|
|
characteristics.OnBoardVideoMemorySize = 0x0;
|
|
characteristics.NumTpcPerGpc = 0x2;
|
|
characteristics.BusType = 0x20;
|
|
characteristics.BigPageSize = 0x20000;
|
|
characteristics.CompressionPageSize = 0x20000;
|
|
characteristics.PdeCoverageBitCount = 0x1b;
|
|
characteristics.AvailableBigPageSizes = 0x30000;
|
|
characteristics.GpcMask = 0x1;
|
|
characteristics.SmArchSmVersion = 0x503;
|
|
characteristics.SmArchSpaVersion = 0x503;
|
|
characteristics.SmArchWarpCount = 0x80;
|
|
characteristics.GpuVaBitCount = 0x28;
|
|
characteristics.Reserved = 0x0;
|
|
characteristics.Flags = 0x55;
|
|
characteristics.TwodClass = 0x902d;
|
|
characteristics.ThreedClass = 0xb197;
|
|
characteristics.ComputeClass = 0xb1c0;
|
|
characteristics.GpfifoClass = 0xb06f;
|
|
characteristics.InlineToMemoryClass = 0xa140;
|
|
characteristics.DmaCopyClass = 0xb0b5;
|
|
characteristics.MaxFbpsCount = 0x1;
|
|
characteristics.FbpEnMask = 0x0;
|
|
characteristics.MaxLtcPerFbp = 0x2;
|
|
characteristics.MaxLtsPerLtc = 0x1;
|
|
characteristics.MaxTexPerTpc = 0x0;
|
|
characteristics.MaxGpcCount = 0x1;
|
|
characteristics.RopL2EnMask0 = 0x21d70;
|
|
characteristics.RopL2EnMask1 = 0x0;
|
|
characteristics.ChipName = 0x6230326d67;
|
|
characteristics.GrCompbitStoreBaseHw = 0x0;
|
|
#pragma warning restore IDE0055
|
|
|
|
arguments.Characteristics = characteristics;
|
|
|
|
return NvInternalResult.Success;
|
|
}
|
|
|
|
private NvInternalResult GetTpcMasks(ref GetTpcMasksArguments arguments)
|
|
{
|
|
return GetTpcMasks(ref arguments, ref arguments.TpcMask);
|
|
}
|
|
|
|
private NvInternalResult GetTpcMasks(ref GetTpcMasksArguments arguments, ref int tpcMask)
|
|
{
|
|
if (arguments.MaskBufferSize != 0)
|
|
{
|
|
tpcMask = 3;
|
|
arguments.TpcMask = tpcMask;
|
|
}
|
|
|
|
return NvInternalResult.Success;
|
|
}
|
|
|
|
private NvInternalResult GetActiveSlotMask(ref GetActiveSlotMaskArguments arguments)
|
|
{
|
|
Logger.Stub?.PrintStub(LogClass.ServiceNv);
|
|
|
|
arguments.Slot = 0x07;
|
|
arguments.Mask = 0x01;
|
|
|
|
return NvInternalResult.Success;
|
|
}
|
|
|
|
private NvInternalResult GetGpuTime(ref GetGpuTimeArguments arguments)
|
|
{
|
|
arguments.Timestamp = GetPTimerNanoSeconds();
|
|
|
|
return NvInternalResult.Success;
|
|
}
|
|
|
|
private static ulong GetPTimerNanoSeconds()
|
|
{
|
|
double ticks = _pTimer.ElapsedTicks;
|
|
|
|
return (ulong)(ticks * _ticksToNs) & 0xff_ffff_ffff_ffff;
|
|
}
|
|
}
|
|
}
|