MultiRangeWritableBlock.cs
1 using Ryujinx.Memory; 2 using Ryujinx.Memory.Range; 3 using System; 4 5 namespace Ryujinx.Graphics.Gpu.Memory 6 { 7 /// <summary> 8 /// A writable block that targets a given MultiRange within a PhysicalMemory instance. 9 /// </summary> 10 internal class MultiRangeWritableBlock : IWritableBlock 11 { 12 private readonly MultiRange _range; 13 private readonly PhysicalMemory _physicalMemory; 14 15 /// <summary> 16 /// Creates a new MultiRangeWritableBlock. 17 /// </summary> 18 /// <param name="range">The MultiRange to write to</param> 19 /// <param name="physicalMemory">The PhysicalMemory the given MultiRange addresses</param> 20 public MultiRangeWritableBlock(MultiRange range, PhysicalMemory physicalMemory) 21 { 22 _range = range; 23 _physicalMemory = physicalMemory; 24 } 25 26 /// <summary> 27 /// Write data to the MultiRange. 28 /// </summary> 29 /// <param name="va">Offset address</param> 30 /// <param name="data">Data to write</param> 31 /// <exception cref="ArgumentException">Throw when a non-zero offset is given</exception> 32 public void Write(ulong va, ReadOnlySpan<byte> data) 33 { 34 if (va != 0) 35 { 36 throw new ArgumentException($"{nameof(va)} cannot be non-zero for {nameof(MultiRangeWritableBlock)}."); 37 } 38 39 _physicalMemory.Write(_range, data); 40 } 41 42 /// <summary> 43 /// Write data to the MultiRange, without tracking. 44 /// </summary> 45 /// <param name="va">Offset address</param> 46 /// <param name="data">Data to write</param> 47 /// <exception cref="ArgumentException">Throw when a non-zero offset is given</exception> 48 public void WriteUntracked(ulong va, ReadOnlySpan<byte> data) 49 { 50 if (va != 0) 51 { 52 throw new ArgumentException($"{nameof(va)} cannot be non-zero for {nameof(MultiRangeWritableBlock)}."); 53 } 54 55 _physicalMemory.WriteUntracked(_range, data); 56 } 57 } 58 }