|
|
|
@ -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; |
|
|
|
} |
|
|
|
|