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); }
private NvInternalResult Submit(Span <byte> arguments) { int headerSize = Unsafe.SizeOf <SubmitArguments>(); SubmitArguments submitHeader = MemoryMarshal.Cast <byte, SubmitArguments>(arguments)[0]; Span <CommandBuffer> commandBufferEntries = MemoryMarshal.Cast <byte, CommandBuffer>(arguments.Slice(headerSize)).Slice(0, submitHeader.CmdBufsCount); MemoryManager gmm = NvHostAsGpuDeviceFile.GetAddressSpaceContext(Context).Gmm; foreach (CommandBuffer commandBufferEntry in commandBufferEntries) { NvMapHandle map = NvMapDeviceFile.GetMapFromHandle(Owner, commandBufferEntry.MemoryId); int[] commandBufferData = new int[commandBufferEntry.WordsCount]; for (int offset = 0; offset < commandBufferData.Length; offset++) { commandBufferData[offset] = _memory.ReadInt32(map.Address + commandBufferEntry.Offset + offset * 4); } // TODO: Submit command to engines. } return(NvInternalResult.Success); }