VulkanSurface.cs 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. using Avalonia;
  2. using Ryujinx.Ava.Ui.Vulkan;
  3. using Ryujinx.Ava.Ui.Vulkan.Surfaces;
  4. using Silk.NET.Vulkan;
  5. using Silk.NET.Vulkan.Extensions.KHR;
  6. using System;
  7. namespace Ryujinx.Ava.Ui.Backend.Vulkan
  8. {
  9. internal class VulkanWindowSurface : BackendSurface, IVulkanPlatformSurface
  10. {
  11. public float Scaling => (float)Program.ActualScaleFactor;
  12. public PixelSize SurfaceSize => Size;
  13. public VulkanWindowSurface(IntPtr handle) : base(handle)
  14. {
  15. }
  16. public unsafe SurfaceKHR CreateSurface(VulkanInstance instance)
  17. {
  18. if (OperatingSystem.IsWindows())
  19. {
  20. if (instance.Api.TryGetInstanceExtension(new Instance(instance.Handle), out KhrWin32Surface surfaceExtension))
  21. {
  22. var createInfo = new Win32SurfaceCreateInfoKHR() { Hinstance = 0, Hwnd = Handle, SType = StructureType.Win32SurfaceCreateInfoKhr };
  23. surfaceExtension.CreateWin32Surface(new Instance(instance.Handle), createInfo, null, out var surface).ThrowOnError();
  24. return surface;
  25. }
  26. }
  27. else if (OperatingSystem.IsLinux())
  28. {
  29. if (instance.Api.TryGetInstanceExtension(new Instance(instance.Handle), out KhrXlibSurface surfaceExtension))
  30. {
  31. var createInfo = new XlibSurfaceCreateInfoKHR()
  32. {
  33. SType = StructureType.XlibSurfaceCreateInfoKhr,
  34. Dpy = (nint*)Display,
  35. Window = Handle
  36. };
  37. surfaceExtension.CreateXlibSurface(new Instance(instance.Handle), createInfo, null, out var surface).ThrowOnError();
  38. return surface;
  39. }
  40. }
  41. throw new PlatformNotSupportedException("The current platform does not support surface creation.");
  42. }
  43. }
  44. }