aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.Ava/Ui/Backend/Vulkan/VulkanSurfaceRenderingSession.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Ryujinx.Ava/Ui/Backend/Vulkan/VulkanSurfaceRenderingSession.cs')
-rw-r--r--Ryujinx.Ava/Ui/Backend/Vulkan/VulkanSurfaceRenderingSession.cs48
1 files changed, 48 insertions, 0 deletions
diff --git a/Ryujinx.Ava/Ui/Backend/Vulkan/VulkanSurfaceRenderingSession.cs b/Ryujinx.Ava/Ui/Backend/Vulkan/VulkanSurfaceRenderingSession.cs
new file mode 100644
index 00000000..8833ede5
--- /dev/null
+++ b/Ryujinx.Ava/Ui/Backend/Vulkan/VulkanSurfaceRenderingSession.cs
@@ -0,0 +1,48 @@
+using System;
+using Avalonia;
+using Ryujinx.Ava.Ui.Vulkan.Surfaces;
+using Silk.NET.Vulkan;
+
+namespace Ryujinx.Ava.Ui.Vulkan
+{
+ internal class VulkanSurfaceRenderingSession : IDisposable
+ {
+ private readonly VulkanDevice _device;
+ private readonly VulkanSurfaceRenderTarget _renderTarget;
+ private VulkanCommandBufferPool.VulkanCommandBuffer _commandBuffer;
+
+ public VulkanSurfaceRenderingSession(VulkanDisplay display, VulkanDevice device,
+ VulkanSurfaceRenderTarget renderTarget, float scaling)
+ {
+ Display = display;
+ _device = device;
+ _renderTarget = renderTarget;
+ Scaling = scaling;
+ Begin();
+ }
+
+ public VulkanDisplay Display { get; }
+
+ public PixelSize Size => _renderTarget.Size;
+ public Vk Api => _device.Api;
+
+ public float Scaling { get; }
+
+ private void Begin()
+ {
+ if (!Display.EnsureSwapchainAvailable())
+ {
+ _renderTarget.Invalidate();
+ }
+ }
+
+ public void Dispose()
+ {
+ _commandBuffer = Display.StartPresentation(_renderTarget);
+
+ Display.BlitImageToCurrentImage(_renderTarget, _commandBuffer.InternalHandle);
+
+ Display.EndPresentation(_commandBuffer);
+ }
+ }
+}