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);
        }
Пример #3
0
        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);
        }
Пример #4
0
        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);
        }
Пример #5
0
 private NvInternalResult SubmitGpfifoEx(ref SubmitGpfifoArguments arguments, Span <ulong> inlineData)
 {
     return(SubmitGpfifo(ref arguments, inlineData));
 }