SamplerPool.cs 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. using System;
  2. using System.Runtime.InteropServices;
  3. namespace Ryujinx.Graphics.Gpu.Image
  4. {
  5. class SamplerPool : Pool<Sampler>
  6. {
  7. private int _sequenceNumber;
  8. public SamplerPool(GpuContext context, ulong address, int maximumId) : base(context, address, maximumId) { }
  9. public override Sampler Get(int id)
  10. {
  11. if ((uint)id >= Items.Length)
  12. {
  13. return null;
  14. }
  15. if (_sequenceNumber != Context.SequenceNumber)
  16. {
  17. _sequenceNumber = Context.SequenceNumber;
  18. SynchronizeMemory();
  19. }
  20. Sampler sampler = Items[id];
  21. if (sampler == null)
  22. {
  23. ulong address = Address + (ulong)(uint)id * DescriptorSize;
  24. Span<byte> data = Context.PhysicalMemory.Read(address, DescriptorSize);
  25. SamplerDescriptor descriptor = MemoryMarshal.Cast<byte, SamplerDescriptor>(data)[0];
  26. sampler = new Sampler(Context, descriptor);
  27. Items[id] = sampler;
  28. }
  29. return sampler;
  30. }
  31. protected override void InvalidateRangeImpl(ulong address, ulong size)
  32. {
  33. ulong endAddress = address + size;
  34. for (; address < endAddress; address += DescriptorSize)
  35. {
  36. int id = (int)((address - Address) / DescriptorSize);
  37. Sampler sampler = Items[id];
  38. if (sampler != null)
  39. {
  40. sampler.Dispose();
  41. Items[id] = null;
  42. }
  43. }
  44. }
  45. protected override void Delete(Sampler item)
  46. {
  47. item?.Dispose();
  48. }
  49. }
  50. }