MemoryAccessor.cs 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. using System;
  2. using System.Runtime.InteropServices;
  3. namespace Ryujinx.Graphics.Gpu.Memory
  4. {
  5. class MemoryAccessor
  6. {
  7. private GpuContext _context;
  8. public MemoryAccessor(GpuContext context)
  9. {
  10. _context = context;
  11. }
  12. public Span<byte> Read(ulong gpuVa, ulong maxSize)
  13. {
  14. ulong processVa = _context.MemoryManager.Translate(gpuVa);
  15. ulong size = Math.Min(_context.MemoryManager.GetSubSize(gpuVa), maxSize);
  16. return _context.PhysicalMemory.Read(processVa, size);
  17. }
  18. public T Read<T>(ulong gpuVa) where T : struct
  19. {
  20. ulong processVa = _context.MemoryManager.Translate(gpuVa);
  21. ulong size = (uint)Marshal.SizeOf<T>();
  22. return MemoryMarshal.Cast<byte, T>(_context.PhysicalMemory.Read(processVa, size))[0];
  23. }
  24. public int ReadInt32(ulong gpuVa)
  25. {
  26. ulong processVa = _context.MemoryManager.Translate(gpuVa);
  27. return BitConverter.ToInt32(_context.PhysicalMemory.Read(processVa, 4));
  28. }
  29. public void Write(ulong gpuVa, int value)
  30. {
  31. ulong processVa = _context.MemoryManager.Translate(gpuVa);
  32. _context.PhysicalMemory.Write(processVa, BitConverter.GetBytes(value));
  33. }
  34. public void Write(ulong gpuVa, Span<byte> data)
  35. {
  36. ulong processVa = _context.MemoryManager.Translate(gpuVa);
  37. _context.PhysicalMemory.Write(processVa, data);
  38. }
  39. }
  40. }