aboutsummaryrefslogtreecommitdiff
path: root/src/Ryujinx.Graphics.Vulkan/PipelineHelperShader.cs
diff options
context:
space:
mode:
Diffstat (limited to 'src/Ryujinx.Graphics.Vulkan/PipelineHelperShader.cs')
-rw-r--r--src/Ryujinx.Graphics.Vulkan/PipelineHelperShader.cs59
1 files changed, 59 insertions, 0 deletions
diff --git a/src/Ryujinx.Graphics.Vulkan/PipelineHelperShader.cs b/src/Ryujinx.Graphics.Vulkan/PipelineHelperShader.cs
new file mode 100644
index 00000000..b31b72a1
--- /dev/null
+++ b/src/Ryujinx.Graphics.Vulkan/PipelineHelperShader.cs
@@ -0,0 +1,59 @@
+using Silk.NET.Vulkan;
+using VkFormat = Silk.NET.Vulkan.Format;
+
+namespace Ryujinx.Graphics.Vulkan
+{
+ class PipelineHelperShader : PipelineBase
+ {
+ public PipelineHelperShader(VulkanRenderer gd, Device device) : base(gd, device)
+ {
+ }
+
+ public void SetRenderTarget(Auto<DisposableImageView> view, uint width, uint height, bool isDepthStencil, VkFormat format)
+ {
+ SetRenderTarget(view, width, height, 1u, isDepthStencil, format);
+ }
+
+ public void SetRenderTarget(Auto<DisposableImageView> view, uint width, uint height, uint samples, bool isDepthStencil, VkFormat format)
+ {
+ CreateFramebuffer(view, width, height, samples, isDepthStencil, format);
+ CreateRenderPass();
+ SignalStateChange();
+ }
+
+ private void CreateFramebuffer(Auto<DisposableImageView> view, uint width, uint height, uint samples, bool isDepthStencil, VkFormat format)
+ {
+ FramebufferParams = new FramebufferParams(Device, view, width, height, samples, isDepthStencil, format);
+ UpdatePipelineAttachmentFormats();
+ }
+
+ public void SetCommandBuffer(CommandBufferScoped cbs)
+ {
+ CommandBuffer = (Cbs = cbs).CommandBuffer;
+
+ // Restore per-command buffer state.
+
+ if (Pipeline != null)
+ {
+ Gd.Api.CmdBindPipeline(CommandBuffer, Pbp, Pipeline.Get(CurrentCommandBuffer).Value);
+ }
+
+ SignalCommandBufferChange();
+ }
+
+ public void Finish()
+ {
+ EndRenderPass();
+ }
+
+ public void Finish(VulkanRenderer gd, CommandBufferScoped cbs)
+ {
+ Finish();
+
+ if (gd.PipelineInternal.IsCommandBufferActive(cbs.CommandBuffer))
+ {
+ gd.PipelineInternal.Restore();
+ }
+ }
+ }
+}