Browse Source

Release opaque-only input RT as soon as we're done with it.

This saves on aliasable memory used throughout the FSR2 process, and makes the extra cleanup pass afterward unnecessary.
mac-autoexp
Nico de Poel 3 years ago
parent
commit
44c5f2847d
  1. 41
      Assets/Scripts/Fsr2Controller.cs

41
Assets/Scripts/Fsr2Controller.cs

@ -41,9 +41,8 @@ namespace FidelityFX
private bool _prevGenReactiveMask;
private CommandBuffer _dispatchCommandBuffer;
private CommandBuffer _opaqueOnlyCommandBuffer;
private CommandBuffer _opaqueInputCommandBuffer;
private CommandBuffer _inputsCommandBuffer;
private CommandBuffer _cleanupCommandBuffer;
private void OnEnable()
{
@ -64,23 +63,19 @@ namespace FidelityFX
_dispatchCommandBuffer = new CommandBuffer { name = "FSR2 Dispatch" };
// Create command buffers to bind the camera's output at the right moments in the render loop
_opaqueOnlyCommandBuffer = new CommandBuffer { name = "FSR2 Opaque Input" };
_opaqueOnlyCommandBuffer.GetTemporaryRT(Fsr2Pipeline.SrvOpaqueOnly, _renderSize.x, _renderSize.y, 0, default, RenderTextureFormat.ARGBHalf);
_opaqueOnlyCommandBuffer.Blit(BuiltinRenderTextureType.CameraTarget, Fsr2Pipeline.SrvOpaqueOnly);
_opaqueInputCommandBuffer = new CommandBuffer { name = "FSR2 Opaque Input" };
_opaqueInputCommandBuffer.GetTemporaryRT(Fsr2Pipeline.SrvOpaqueOnly, _renderSize.x, _renderSize.y, 0, default, RenderTextureFormat.ARGBHalf);
_opaqueInputCommandBuffer.Blit(BuiltinRenderTextureType.CameraTarget, Fsr2Pipeline.SrvOpaqueOnly);
_inputsCommandBuffer = new CommandBuffer { name = "FSR2 Inputs" };
_inputsCommandBuffer.SetGlobalTexture(Fsr2Pipeline.SrvInputColor, BuiltinRenderTextureType.CameraTarget, RenderTextureSubElement.Color);
_inputsCommandBuffer.SetGlobalTexture(Fsr2Pipeline.SrvInputDepth, BuiltinRenderTextureType.CameraTarget, RenderTextureSubElement.Depth);
_inputsCommandBuffer.SetGlobalTexture(Fsr2Pipeline.SrvInputMotionVectors, BuiltinRenderTextureType.MotionVectors);
_renderCamera.AddCommandBuffer(CameraEvent.BeforeImageEffects, _inputsCommandBuffer);
_cleanupCommandBuffer = new CommandBuffer { name = "FSR2 Cleanup" };
_cleanupCommandBuffer.ReleaseTemporaryRT(Fsr2Pipeline.SrvOpaqueOnly);
if (generateReactiveMask)
{
_renderCamera.AddCommandBuffer(CameraEvent.BeforeForwardAlpha, _opaqueOnlyCommandBuffer);
_renderCamera.AddCommandBuffer(CameraEvent.AfterImageEffects, _cleanupCommandBuffer);
_renderCamera.AddCommandBuffer(CameraEvent.BeforeForwardAlpha, _opaqueInputCommandBuffer);
}
// Apply a mipmap bias so that textures retain their original sharpness
@ -97,11 +92,11 @@ namespace FidelityFX
float biasOffset = Fsr2.GetMipmapBiasOffset(_renderSize.x, _prevDisplaySize.x);
Fsr2.GlobalCallbacks.ApplyMipmapBias(-biasOffset);
if (_opaqueOnlyCommandBuffer != null)
if (_opaqueInputCommandBuffer != null)
{
_renderCamera.RemoveCommandBuffer(CameraEvent.BeforeForwardAlpha, _opaqueOnlyCommandBuffer);
_opaqueOnlyCommandBuffer.Release();
_opaqueOnlyCommandBuffer = null;
_renderCamera.RemoveCommandBuffer(CameraEvent.BeforeForwardAlpha, _opaqueInputCommandBuffer);
_opaqueInputCommandBuffer.Release();
_opaqueInputCommandBuffer = null;
}
if (_inputsCommandBuffer != null)
@ -111,13 +106,6 @@ namespace FidelityFX
_inputsCommandBuffer = null;
}
if (_cleanupCommandBuffer != null)
{
_renderCamera.RemoveCommandBuffer(CameraEvent.AfterImageEffects, _cleanupCommandBuffer);
_cleanupCommandBuffer.Release();
_cleanupCommandBuffer = null;
}
if (_dispatchCommandBuffer != null)
{
_dispatchCommandBuffer.Release();
@ -145,15 +133,9 @@ namespace FidelityFX
if (generateReactiveMask != _prevGenReactiveMask)
{
if (generateReactiveMask)
{
_renderCamera.AddCommandBuffer(CameraEvent.BeforeForwardAlpha, _opaqueOnlyCommandBuffer);
_renderCamera.AddCommandBuffer(CameraEvent.AfterImageEffects, _cleanupCommandBuffer);
}
_renderCamera.AddCommandBuffer(CameraEvent.BeforeForwardAlpha, _opaqueInputCommandBuffer);
else
{
_renderCamera.RemoveCommandBuffer(CameraEvent.BeforeForwardAlpha, _opaqueOnlyCommandBuffer);
_renderCamera.RemoveCommandBuffer(CameraEvent.AfterImageEffects, _cleanupCommandBuffer);
}
_renderCamera.RemoveCommandBuffer(CameraEvent.BeforeForwardAlpha, _opaqueInputCommandBuffer);
_prevGenReactiveMask = generateReactiveMask;
}
@ -219,6 +201,7 @@ namespace FidelityFX
_genReactiveDescription.RenderSize = _renderSize;
_dispatchCommandBuffer.GetTemporaryRT(Fsr2Pipeline.UavAutoReactive, _renderSize.x, _renderSize.y, 0, default, GraphicsFormat.R8_UNorm, 1, true);
_context.GenerateReactiveMask(_genReactiveDescription, _dispatchCommandBuffer);
_dispatchCommandBuffer.ReleaseTemporaryRT(Fsr2Pipeline.SrvOpaqueOnly);
_dispatchDescription.Reactive = Fsr2Pipeline.UavAutoReactive;
}

Loading…
Cancel
Save