mirror of
https://github.com/Ryujinx/Ryujinx.git
synced 2024-12-04 19:32:01 +00:00
Fixup channel submit IOCTL syncpoint parameters (#2774)
* Fixup channel submit IOCTL syncpoint parameters The current arguments worked by happenstance as games only ever submit one syncpoint and request one fence back, if a game were to do something other than this then the arguments would've been parsed entirely wrong. * Address feedback
This commit is contained in:
parent
85d8d1d7ca
commit
8c4e4ab3b3
2 changed files with 10 additions and 24 deletions
|
@ -143,13 +143,12 @@ namespace Ryujinx.HLE.HOS.Services.Nv.NvDrvServices.NvHostChannel
|
||||||
|
|
||||||
private NvInternalResult Submit(Span<byte> arguments)
|
private NvInternalResult Submit(Span<byte> arguments)
|
||||||
{
|
{
|
||||||
SubmitArguments submitHeader = GetSpanAndSkip<SubmitArguments>(ref arguments, 1)[0];
|
SubmitArguments submitHeader = GetSpanAndSkip<SubmitArguments>(ref arguments, 1)[0];
|
||||||
Span<CommandBuffer> commandBuffers = GetSpanAndSkip<CommandBuffer>(ref arguments, submitHeader.CmdBufsCount);
|
Span<CommandBuffer> commandBuffers = GetSpanAndSkip<CommandBuffer>(ref arguments, submitHeader.CmdBufsCount);
|
||||||
Span<Reloc> relocs = GetSpanAndSkip<Reloc>(ref arguments, submitHeader.RelocsCount);
|
Span<Reloc> relocs = GetSpanAndSkip<Reloc>(ref arguments, submitHeader.RelocsCount);
|
||||||
Span<uint> relocShifts = GetSpanAndSkip<uint>(ref arguments, submitHeader.RelocsCount);
|
Span<uint> relocShifts = GetSpanAndSkip<uint>(ref arguments, submitHeader.RelocsCount);
|
||||||
Span<SyncptIncr> syncptIncrs = GetSpanAndSkip<SyncptIncr>(ref arguments, submitHeader.SyncptIncrsCount);
|
Span<SyncptIncr> syncptIncrs = GetSpanAndSkip<SyncptIncr>(ref arguments, submitHeader.SyncptIncrsCount);
|
||||||
Span<SyncptIncr> waitChecks = GetSpanAndSkip<SyncptIncr>(ref arguments, submitHeader.SyncptIncrsCount); // ?
|
Span<uint> fenceThresholds = GetSpanAndSkip<uint>(ref arguments, submitHeader.FencesCount);
|
||||||
Span<Fence> fences = GetSpanAndSkip<Fence>(ref arguments, submitHeader.FencesCount);
|
|
||||||
|
|
||||||
lock (_device)
|
lock (_device)
|
||||||
{
|
{
|
||||||
|
@ -159,8 +158,7 @@ namespace Ryujinx.HLE.HOS.Services.Nv.NvDrvServices.NvHostChannel
|
||||||
|
|
||||||
uint id = syncptIncr.Id;
|
uint id = syncptIncr.Id;
|
||||||
|
|
||||||
fences[i].Id = id;
|
fenceThresholds[i] = Context.Device.System.HostSyncpoint.IncrementSyncpointMax(id, syncptIncr.Incrs);
|
||||||
fences[i].Thresh = Context.Device.System.HostSyncpoint.IncrementSyncpointMax(id, syncptIncr.Incrs);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach (CommandBuffer commandBuffer in commandBuffers)
|
foreach (CommandBuffer commandBuffer in commandBuffers)
|
||||||
|
@ -173,14 +171,6 @@ namespace Ryujinx.HLE.HOS.Services.Nv.NvDrvServices.NvHostChannel
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fences[0].Thresh = Context.Device.System.HostSyncpoint.IncrementSyncpointMax(fences[0].Id, 1);
|
|
||||||
|
|
||||||
Span<int> tmpCmdBuff = stackalloc int[1];
|
|
||||||
|
|
||||||
tmpCmdBuff[0] = (4 << 28) | (int)fences[0].Id;
|
|
||||||
|
|
||||||
_host1xContext.Host1x.Submit(tmpCmdBuff, _contextId);
|
|
||||||
|
|
||||||
return NvInternalResult.Success;
|
return NvInternalResult.Success;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -24,13 +24,9 @@ namespace Ryujinx.HLE.HOS.Services.Nv.NvDrvServices.NvHostChannel.Types
|
||||||
{
|
{
|
||||||
public uint Id;
|
public uint Id;
|
||||||
public uint Incrs;
|
public uint Incrs;
|
||||||
}
|
public uint Reserved1;
|
||||||
|
public uint Reserved2;
|
||||||
[StructLayout(LayoutKind.Sequential)]
|
public uint Reserved3;
|
||||||
struct Fence
|
|
||||||
{
|
|
||||||
public uint Id;
|
|
||||||
public uint Thresh;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
[StructLayout(LayoutKind.Sequential)]
|
[StructLayout(LayoutKind.Sequential)]
|
||||||
|
|
Loading…
Reference in a new issue