AuxiliaryBufferEffect.cs 3.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. using Ryujinx.Audio.Renderer.Common;
  2. using Ryujinx.Audio.Renderer.Dsp.State;
  3. using Ryujinx.Audio.Renderer.Parameter;
  4. using Ryujinx.Audio.Renderer.Parameter.Effect;
  5. using Ryujinx.Audio.Renderer.Server.MemoryPool;
  6. using System.Diagnostics;
  7. using System.Runtime.CompilerServices;
  8. using System.Runtime.InteropServices;
  9. using static Ryujinx.Audio.Renderer.Dsp.State.AuxiliaryBufferHeader;
  10. using DspAddress = System.UInt64;
  11. namespace Ryujinx.Audio.Renderer.Server.Effect
  12. {
  13. /// <summary>
  14. /// Server state for an auxiliary buffer effect.
  15. /// </summary>
  16. public class AuxiliaryBufferEffect : BaseEffect
  17. {
  18. /// <summary>
  19. /// The auxiliary buffer parameter.
  20. /// </summary>
  21. public AuxiliaryBufferParameter Parameter;
  22. /// <summary>
  23. /// Auxiliary buffer state.
  24. /// </summary>
  25. public AuxiliaryBufferAddresses State;
  26. public override EffectType TargetEffectType => EffectType.AuxiliaryBuffer;
  27. public override DspAddress GetWorkBuffer(int index)
  28. {
  29. return WorkBuffers[index].GetReference(true);
  30. }
  31. public override void Update(out BehaviourParameter.ErrorInfo updateErrorInfo, ref EffectInParameterVersion1 parameter, PoolMapper mapper)
  32. {
  33. Update(out updateErrorInfo, ref parameter, mapper);
  34. }
  35. public override void Update(out BehaviourParameter.ErrorInfo updateErrorInfo, ref EffectInParameterVersion2 parameter, PoolMapper mapper)
  36. {
  37. Update(out updateErrorInfo, ref parameter, mapper);
  38. }
  39. public void Update<T>(out BehaviourParameter.ErrorInfo updateErrorInfo, ref T parameter, PoolMapper mapper) where T : unmanaged, IEffectInParameter
  40. {
  41. Debug.Assert(IsTypeValid(ref parameter));
  42. UpdateParameterBase(ref parameter);
  43. Parameter = MemoryMarshal.Cast<byte, AuxiliaryBufferParameter>(parameter.SpecificData)[0];
  44. IsEnabled = parameter.IsEnabled;
  45. updateErrorInfo = new BehaviourParameter.ErrorInfo();
  46. if (BufferUnmapped || parameter.IsNew)
  47. {
  48. ulong bufferSize = (ulong)Unsafe.SizeOf<int>() * Parameter.BufferStorageSize + (ulong)Unsafe.SizeOf<AuxiliaryBufferHeader>();
  49. bool sendBufferUnmapped = !mapper.TryAttachBuffer(out updateErrorInfo, ref WorkBuffers[0], Parameter.SendBufferInfoAddress, bufferSize);
  50. bool returnBufferUnmapped = !mapper.TryAttachBuffer(out updateErrorInfo, ref WorkBuffers[1], Parameter.ReturnBufferInfoAddress, bufferSize);
  51. BufferUnmapped = sendBufferUnmapped && returnBufferUnmapped;
  52. if (!BufferUnmapped)
  53. {
  54. DspAddress sendDspAddress = WorkBuffers[0].GetReference(false);
  55. DspAddress returnDspAddress = WorkBuffers[1].GetReference(false);
  56. State.SendBufferInfo = sendDspAddress + (uint)Unsafe.SizeOf<AuxiliaryBufferInfo>();
  57. State.SendBufferInfoBase = sendDspAddress + (uint)Unsafe.SizeOf<AuxiliaryBufferHeader>();
  58. State.ReturnBufferInfo = returnDspAddress + (uint)Unsafe.SizeOf<AuxiliaryBufferInfo>();
  59. State.ReturnBufferInfoBase = returnDspAddress + (uint)Unsafe.SizeOf<AuxiliaryBufferHeader>();
  60. }
  61. }
  62. }
  63. public override void UpdateForCommandGeneration()
  64. {
  65. UpdateUsageStateForCommandGeneration();
  66. }
  67. }
  68. }