private NvInternalResult SubmitGpfifo(Span <byte> arguments) { int headerSize = Unsafe.SizeOf <SubmitGpfifoArguments>(); SubmitGpfifoArguments gpfifoSubmissionHeader = MemoryMarshal.Cast <byte, SubmitGpfifoArguments>(arguments)[0]; Span <ulong> gpfifoEntries = MemoryMarshal.Cast <byte, ulong>(arguments.Slice(headerSize)).Slice(0, gpfifoSubmissionHeader.NumEntries); return(SubmitGpfifo(ref gpfifoSubmissionHeader, gpfifoEntries)); }
protected NvInternalResult SubmitGpfifo(ref SubmitGpfifoArguments header, Span <ulong> entries) { foreach (ulong entry in entries) { _gpu.DmaPusher.Push(entry); } header.Fence.Id = 0; header.Fence.Value = 0; return(NvInternalResult.Success); }
protected NvInternalResult SubmitGpfifo(ref SubmitGpfifoArguments header, Span <long> entries) { NvGpuVmm vmm = NvHostAsGpuDeviceFile.GetAddressSpaceContext(Owner).Vmm; foreach (long entry in entries) { _gpu.Pusher.Push(vmm, entry); } header.Fence.Id = 0; header.Fence.Value = 0; return(NvInternalResult.Success); }
protected NvInternalResult SubmitGpfifo(ref SubmitGpfifoArguments header, Span <ulong> entries) { if (header.Flags.HasFlag(SubmitGpfifoFlags.FenceWait) && header.Flags.HasFlag(SubmitGpfifoFlags.IncrementWithValue)) { return(NvInternalResult.InvalidInput); } if (header.Flags.HasFlag(SubmitGpfifoFlags.FenceWait) && !_device.System.HostSyncpoint.IsSyncpointExpired(header.Fence.Id, header.Fence.Value)) { _device.Gpu.DmaPusher.PushHostCommandBuffer(CreateWaitCommandBuffer(header.Fence)); } _device.Gpu.DmaPusher.PushEntries(entries); header.Fence.Id = _channelSyncpoint.Id; if (header.Flags.HasFlag(SubmitGpfifoFlags.FenceIncrement) || header.Flags.HasFlag(SubmitGpfifoFlags.IncrementWithValue)) { uint incrementCount = header.Flags.HasFlag(SubmitGpfifoFlags.FenceIncrement) ? 2u : 0u; if (header.Flags.HasFlag(SubmitGpfifoFlags.IncrementWithValue)) { incrementCount += header.Fence.Value; } header.Fence.Value = _device.System.HostSyncpoint.IncrementSyncpointMaxExt(header.Fence.Id, (int)incrementCount); } else { header.Fence.Value = _device.System.HostSyncpoint.ReadSyncpointMaxValue(header.Fence.Id); } if (header.Flags.HasFlag(SubmitGpfifoFlags.FenceIncrement)) { _device.Gpu.DmaPusher.PushHostCommandBuffer(CreateIncrementCommandBuffer(ref header.Fence, header.Flags)); } header.Flags = SubmitGpfifoFlags.None; _device.Gpu.DmaPusher.SignalNewEntries(); return(NvInternalResult.Success); }
private NvInternalResult SubmitGpfifoEx(ref SubmitGpfifoArguments arguments, Span <ulong> inlineData) { return(SubmitGpfifo(ref arguments, inlineData)); }