/// <summary> /// Launches Inline-to-Memory engine DMA copy. /// </summary> /// <param name="state">Current GPU state</param> /// <param name="argument">Method call argument</param> public void LaunchDma(GpuState state, int argument) { _params = state.Get <Inline2MemoryParams>(MethodOffset.I2mParams); _isLinear = (argument & 1) != 0; _offset = 0; _size = _params.LineLengthIn * _params.LineCount; int count = BitUtils.DivRoundUp(_size, 4); if (_buffer == null || _buffer.Length < count) { _buffer = new int[count]; } ulong dstBaseAddress = _context.MemoryManager.Translate(_params.DstAddress.Pack()); _context.Methods.TextureManager.Flush(dstBaseAddress, (ulong)_size); _finished = false; }
/// <summary> /// Launches Inline-to-Memory engine DMA copy. /// </summary> /// <param name="state">Current GPU state</param> /// <param name="argument">Method call argument</param> public void LaunchDma(GpuState state, int argument) { _params = state.Get <Inline2MemoryParams>(MethodOffset.I2mParams); _isLinear = (argument & 1) != 0; _offset = 0; _size = _params.LineLengthIn * _params.LineCount; int count = BitUtils.DivRoundUp(_size, 4); if (_buffer == null || _buffer.Length < count) { _buffer = new int[count]; } ulong dstBaseAddress = _context.MemoryManager.Translate(_params.DstAddress.Pack()); // Trigger read tracking, to flush any managed resources in the destination region. _context.PhysicalMemory.GetSpan(dstBaseAddress, _size, true); _finished = false; }