Example #1
0
        /// <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;
        }
Example #2
0
        /// <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;
        }