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);
        }