/// <summary> /// Gets a writable region from GPU mapped memory. /// </summary> /// <param name="range">Range</param> /// <param name="tracked">True if write tracking is triggered on the span</param> /// <returns>A writable region with the data at the specified memory location</returns> public WritableRegion GetWritableRegion(MultiRange range, bool tracked = false) { if (range.Count == 1) { MemoryRange subrange = range.GetSubRange(0); return(GetWritableRegion(subrange.Address, (int)subrange.Size, tracked)); } else { Memory <byte> memory = new byte[range.GetSize()]; int offset = 0; for (int i = 0; i < range.Count; i++) { var currentRange = range.GetSubRange(i); int size = (int)currentRange.Size; if (currentRange.Address != MemoryManager.PteUnmapped) { GetSpan(currentRange.Address, size).CopyTo(memory.Span.Slice(offset, size)); } offset += size; } return(new WritableRegion(new MultiRangeWritableBlock(range, this), 0, memory, tracked)); } }
/// <summary> /// Gets a span of data from the application process. /// </summary> /// <param name="range">Ranges of physical memory where the data is located</param> /// <param name="tracked">True if read tracking is triggered on the span</param> /// <returns>A read only span of the data at the specified memory location</returns> public ReadOnlySpan <byte> GetSpan(MultiRange range, bool tracked = false) { if (range.Count == 1) { var singleRange = range.GetSubRange(0); if (singleRange.Address != MemoryManager.PteUnmapped) { return(_cpuMemory.GetSpan(singleRange.Address, (int)singleRange.Size, tracked)); } } Span <byte> data = new byte[range.GetSize()]; int offset = 0; for (int i = 0; i < range.Count; i++) { var currentRange = range.GetSubRange(i); int size = (int)currentRange.Size; if (currentRange.Address != MemoryManager.PteUnmapped) { _cpuMemory.GetSpan(currentRange.Address, size, tracked).CopyTo(data.Slice(offset, size)); } offset += size; } return(data); }