/ src / Ryujinx.Graphics.Gpu / Memory / MultiRangeWritableBlock.cs
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  }