No Description
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

RenderTargetBufferSystem.cs 3.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Runtime.CompilerServices;
  5. using System.Text;
  6. using System.Threading.Tasks;
  7. namespace UnityEngine.Rendering.Universal.Internal
  8. {
  9. internal sealed class RenderTargetBufferSystem
  10. {
  11. struct SwapBuffer
  12. {
  13. public RTHandle rtMSAA;
  14. public RTHandle rtResolve;
  15. public string name;
  16. public int msaa;
  17. }
  18. SwapBuffer m_A, m_B;
  19. static bool m_AisBackBuffer = true;
  20. static RenderTextureDescriptor m_Desc;
  21. FilterMode m_FilterMode;
  22. bool m_AllowMSAA = true;
  23. ref SwapBuffer backBuffer { get { return ref m_AisBackBuffer ? ref m_A : ref m_B; } }
  24. ref SwapBuffer frontBuffer { get { return ref m_AisBackBuffer ? ref m_B : ref m_A; } }
  25. public RenderTargetBufferSystem(string name)
  26. {
  27. m_A.name = name + "A";
  28. m_B.name = name + "B";
  29. }
  30. public void Dispose()
  31. {
  32. m_A.rtMSAA?.Release();
  33. m_B.rtMSAA?.Release();
  34. m_A.rtResolve?.Release();
  35. m_B.rtResolve?.Release();
  36. }
  37. public RTHandle PeekBackBuffer()
  38. {
  39. return (m_AllowMSAA && backBuffer.msaa > 1) ? backBuffer.rtMSAA : backBuffer.rtResolve;
  40. }
  41. public RTHandle GetBackBuffer(CommandBuffer cmd)
  42. {
  43. ReAllocate(cmd);
  44. return PeekBackBuffer();
  45. }
  46. public RTHandle GetFrontBuffer(CommandBuffer cmd)
  47. {
  48. if (!m_AllowMSAA && frontBuffer.msaa > 1)
  49. frontBuffer.msaa = 1;
  50. ReAllocate(cmd);
  51. return (m_AllowMSAA && frontBuffer.msaa > 1) ? frontBuffer.rtMSAA : frontBuffer.rtResolve;
  52. }
  53. public void Swap()
  54. {
  55. m_AisBackBuffer = !m_AisBackBuffer;
  56. }
  57. void ReAllocate(CommandBuffer cmd)
  58. {
  59. var desc = m_Desc;
  60. desc.msaaSamples = m_A.msaa;
  61. if (desc.msaaSamples > 1)
  62. RenderingUtils.ReAllocateHandleIfNeeded(ref m_A.rtMSAA, desc, m_FilterMode, TextureWrapMode.Clamp, name: m_A.name);
  63. desc.msaaSamples = m_B.msaa;
  64. if (desc.msaaSamples > 1)
  65. RenderingUtils.ReAllocateHandleIfNeeded(ref m_B.rtMSAA, desc, m_FilterMode, TextureWrapMode.Clamp, name: m_B.name);
  66. desc.msaaSamples = 1;
  67. RenderingUtils.ReAllocateHandleIfNeeded(ref m_A.rtResolve, desc, m_FilterMode, TextureWrapMode.Clamp, name: m_A.name);
  68. RenderingUtils.ReAllocateHandleIfNeeded(ref m_B.rtResolve, desc, m_FilterMode, TextureWrapMode.Clamp, name: m_B.name);
  69. cmd.SetGlobalTexture(m_A.name, m_A.rtResolve);
  70. cmd.SetGlobalTexture(m_B.name, m_B.rtResolve);
  71. }
  72. public void Clear()
  73. {
  74. m_AisBackBuffer = true;
  75. m_AllowMSAA = m_A.msaa > 1 || m_B.msaa > 1;
  76. }
  77. public void SetCameraSettings(RenderTextureDescriptor desc, FilterMode filterMode)
  78. {
  79. desc.depthBufferBits = 0;
  80. m_Desc = desc;
  81. m_FilterMode = filterMode;
  82. m_A.msaa = m_Desc.msaaSamples;
  83. m_B.msaa = m_Desc.msaaSamples;
  84. if (m_Desc.msaaSamples > 1)
  85. EnableMSAA(true);
  86. }
  87. public RTHandle GetBufferA()
  88. {
  89. return (m_AllowMSAA && m_A.msaa > 1) ? m_A.rtMSAA : m_A.rtResolve;
  90. }
  91. public void EnableMSAA(bool enable)
  92. {
  93. m_AllowMSAA = enable;
  94. if (enable)
  95. {
  96. m_A.msaa = m_Desc.msaaSamples;
  97. m_B.msaa = m_Desc.msaaSamples;
  98. }
  99. }
  100. }
  101. }