aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.Graphics.Vulkan/Effects/SmaaPostProcessingEffect.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Ryujinx.Graphics.Vulkan/Effects/SmaaPostProcessingEffect.cs')
-rw-r--r--Ryujinx.Graphics.Vulkan/Effects/SmaaPostProcessingEffect.cs63
1 files changed, 19 insertions, 44 deletions
diff --git a/Ryujinx.Graphics.Vulkan/Effects/SmaaPostProcessingEffect.cs b/Ryujinx.Graphics.Vulkan/Effects/SmaaPostProcessingEffect.cs
index bf698ade..38f86bae 100644
--- a/Ryujinx.Graphics.Vulkan/Effects/SmaaPostProcessingEffect.cs
+++ b/Ryujinx.Graphics.Vulkan/Effects/SmaaPostProcessingEffect.cs
@@ -218,40 +218,10 @@ namespace Ryujinx.Graphics.Vulkan.Effects
_blendOutputTexture = _renderer.CreateTexture(info, view.ScaleFactor) as TextureView;
}
- Span<GAL.Viewport> viewports = stackalloc GAL.Viewport[1];
-
- viewports[0] = new GAL.Viewport(
- new Rectangle<float>(0, 0, view.Width, view.Height),
- ViewportSwizzle.PositiveX,
- ViewportSwizzle.PositiveY,
- ViewportSwizzle.PositiveZ,
- ViewportSwizzle.PositiveW,
- 0f,
- 1f);
-
- Span<Rectangle<int>> scissors = stackalloc Rectangle<int>[1];
+ _pipeline.SetCommandBuffer(cbs);
- scissors[0] = new Rectangle<int>(0, 0, view.Width, view.Height);
-
- _renderer.HelperShader.Clear(_renderer,
- _edgeOutputTexture.GetImageView(),
- new float[] { 0, 0, 0, 1 },
- (uint)(ColorComponentFlags.RBit | ColorComponentFlags.GBit | ColorComponentFlags.BBit | ColorComponentFlags.ABit),
- view.Width,
- view.Height,
- _edgeOutputTexture.VkFormat,
- ComponentType.UnsignedInteger,
- scissors[0]);
-
- _renderer.HelperShader.Clear(_renderer,
- _blendOutputTexture.GetImageView(),
- new float[] { 0, 0, 0, 1 },
- (uint)(ColorComponentFlags.RBit | ColorComponentFlags.GBit | ColorComponentFlags.BBit | ColorComponentFlags.ABit),
- view.Width,
- view.Height,
- _blendOutputTexture.VkFormat,
- ComponentType.UnsignedInteger,
- scissors[0]);
+ Clear(_edgeOutputTexture);
+ Clear(_blendOutputTexture);
_renderer.Pipeline.TextureBarrier();
@@ -259,7 +229,6 @@ namespace Ryujinx.Graphics.Vulkan.Effects
var dispatchY = BitUtils.DivRoundUp(view.Height, IPostProcessingEffect.LocalGroupSize);
// Edge pass
- _pipeline.SetCommandBuffer(cbs);
_pipeline.SetProgram(_edgeProgram);
_pipeline.SetTextureAndSampler(ShaderStage.Compute, 1, view, _samplerLinear);
_pipeline.Specialize(_specConstants);
@@ -271,35 +240,25 @@ namespace Ryujinx.Graphics.Vulkan.Effects
_renderer.BufferManager.SetData(bufferHandle, 0, resolutionBuffer);
var bufferRanges = new BufferRange(bufferHandle, 0, rangeSize);
_pipeline.SetUniformBuffers(stackalloc[] { new BufferAssignment(2, bufferRanges) });
- _pipeline.SetScissors(scissors);
- _pipeline.SetViewports(viewports, false);
_pipeline.SetImage(0, _edgeOutputTexture, GAL.Format.R8G8B8A8Unorm);
_pipeline.DispatchCompute(dispatchX, dispatchY, 1);
_pipeline.ComputeBarrier();
// Blend pass
- _pipeline.SetCommandBuffer(cbs);
_pipeline.SetProgram(_blendProgram);
_pipeline.Specialize(_specConstants);
_pipeline.SetTextureAndSampler(ShaderStage.Compute, 1, _edgeOutputTexture, _samplerLinear);
_pipeline.SetTextureAndSampler(ShaderStage.Compute, 3, _areaTexture, _samplerLinear);
_pipeline.SetTextureAndSampler(ShaderStage.Compute, 4, _searchTexture, _samplerLinear);
- _pipeline.SetUniformBuffers(stackalloc[] { new BufferAssignment(2, bufferRanges) });
- _pipeline.SetScissors(scissors);
- _pipeline.SetViewports(viewports, false);
_pipeline.SetImage(0, _blendOutputTexture, GAL.Format.R8G8B8A8Unorm);
_pipeline.DispatchCompute(dispatchX, dispatchY, 1);
_pipeline.ComputeBarrier();
// Neighbour pass
- _pipeline.SetCommandBuffer(cbs);
_pipeline.SetProgram(_neighbourProgram);
_pipeline.Specialize(_specConstants);
_pipeline.SetTextureAndSampler(ShaderStage.Compute, 3, _blendOutputTexture, _samplerLinear);
_pipeline.SetTextureAndSampler(ShaderStage.Compute, 1, view, _samplerLinear);
- _pipeline.SetUniformBuffers(stackalloc[] { new BufferAssignment(2, bufferRanges) });
- _pipeline.SetScissors(scissors);
- _pipeline.SetViewports(viewports, false);
_pipeline.SetImage(0, _outputTexture, GAL.Format.R8G8B8A8Unorm);
_pipeline.DispatchCompute(dispatchX, dispatchY, 1);
_pipeline.ComputeBarrier();
@@ -310,5 +269,21 @@ namespace Ryujinx.Graphics.Vulkan.Effects
return _outputTexture;
}
+
+ private void Clear(TextureView texture)
+ {
+ Span<uint> colorMasks = stackalloc uint[1];
+
+ colorMasks[0] = 0xf;
+
+ Span<Rectangle<int>> scissors = stackalloc Rectangle<int>[1];
+
+ scissors[0] = new Rectangle<int>(0, 0, texture.Width, texture.Height);
+
+ _pipeline.SetRenderTarget(texture.GetImageViewForAttachment(), (uint)texture.Width, (uint)texture.Height, false, texture.VkFormat);
+ _pipeline.SetRenderTargetColorMasks(colorMasks);
+ _pipeline.SetScissors(scissors);
+ _pipeline.ClearRenderTargetColor(0, 0, 1, new ColorF(0f, 0f, 0f, 1f));
+ }
}
} \ No newline at end of file