Ejemplo n.º 1
0
        public ReadOnlySpan <T> Read <T>(int size) where T : unmanaged
        {
            ReadOnlySpan <byte> data = _memory.GetSpan(Position, size);

            Position += (uint)size;

            return(MemoryMarshal.Cast <byte, T>(data));
        }
Ejemplo n.º 2
0
        private NvInternalResult Submit(Span <byte> arguments)
        {
            SubmitArguments      submitHeader   = GetSpanAndSkip <SubmitArguments>(ref arguments, 1)[0];
            Span <CommandBuffer> commandBuffers = GetSpanAndSkip <CommandBuffer>(ref arguments, submitHeader.CmdBufsCount);
            Span <Reloc>         relocs         = GetSpanAndSkip <Reloc>(ref arguments, submitHeader.RelocsCount);
            Span <uint>          relocShifts    = GetSpanAndSkip <uint>(ref arguments, submitHeader.RelocsCount);
            Span <SyncptIncr>    syncptIncrs    = GetSpanAndSkip <SyncptIncr>(ref arguments, submitHeader.SyncptIncrsCount);
            Span <SyncptIncr>    waitChecks     = GetSpanAndSkip <SyncptIncr>(ref arguments, submitHeader.SyncptIncrsCount); // ?
            Span <Fence>         fences         = GetSpanAndSkip <Fence>(ref arguments, submitHeader.FencesCount);

            lock (_device)
            {
                for (int i = 0; i < syncptIncrs.Length; i++)
                {
                    SyncptIncr syncptIncr = syncptIncrs[i];

                    uint id = syncptIncr.Id;

                    fences[i].Id     = id;
                    fences[i].Thresh = Context.Device.System.HostSyncpoint.IncrementSyncpointMax(id, syncptIncr.Incrs);
                }

                foreach (CommandBuffer commandBuffer in commandBuffers)
                {
                    NvMapHandle map = NvMapDeviceFile.GetMapFromHandle(Owner, commandBuffer.Mem);

                    var data = _memory.GetSpan(map.Address + commandBuffer.Offset, commandBuffer.WordsCount * 4);

                    _device.Host1x.Submit(MemoryMarshal.Cast <byte, int>(data));
                }
            }

            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;

            _device.Host1x.Submit(tmpCmdBuff);

            return(NvInternalResult.Success);
        }
Ejemplo n.º 3
0
        private static List <AddrInfoSerialized> DeserializeAddrInfos(IVirtualMemoryManager memory, ulong address, ulong size)
        {
            List <AddrInfoSerialized> result = new List <AddrInfoSerialized>();

            ReadOnlySpan <byte> data = memory.GetSpan(address, (int)size);

            while (!data.IsEmpty)
            {
                AddrInfoSerialized info = AddrInfoSerialized.Read(data, out data);

                if (info == null)
                {
                    break;
                }

                result.Add(info);
            }

            return(result);
        }
Ejemplo n.º 4
0
 /// <inheritdoc/>
 protected override ReadOnlySpan <byte> GetSpan(ulong va, int size)
 {
     return(_cpuMemory.GetSpan(va, size));
 }