MultiRangeWritableBlock.cs 2.0 KB

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