VulkanSurface.cs 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. using System;
  2. using Avalonia;
  3. using Ryujinx.Ava.Ui.Vulkan.Surfaces;
  4. using Silk.NET.Vulkan;
  5. using Silk.NET.Vulkan.Extensions.KHR;
  6. namespace Ryujinx.Ava.Ui.Vulkan
  7. {
  8. public class VulkanSurface : IDisposable
  9. {
  10. private readonly VulkanInstance _instance;
  11. private readonly IVulkanPlatformSurface _vulkanPlatformSurface;
  12. private VulkanSurface(IVulkanPlatformSurface vulkanPlatformSurface, VulkanInstance instance)
  13. {
  14. _vulkanPlatformSurface = vulkanPlatformSurface;
  15. _instance = instance;
  16. ApiHandle = vulkanPlatformSurface.CreateSurface(instance);
  17. }
  18. internal SurfaceKHR ApiHandle { get; }
  19. internal static KhrSurface SurfaceExtension { get; private set; }
  20. internal PixelSize SurfaceSize => _vulkanPlatformSurface.SurfaceSize;
  21. public void Dispose()
  22. {
  23. SurfaceExtension.DestroySurface(_instance.InternalHandle, ApiHandle, Span<AllocationCallbacks>.Empty);
  24. _vulkanPlatformSurface.Dispose();
  25. }
  26. internal static VulkanSurface CreateSurface(VulkanInstance instance, IVulkanPlatformSurface vulkanPlatformSurface)
  27. {
  28. if (SurfaceExtension == null)
  29. {
  30. instance.Api.TryGetInstanceExtension(instance.InternalHandle, out KhrSurface extension);
  31. SurfaceExtension = extension;
  32. }
  33. return new VulkanSurface(vulkanPlatformSurface, instance);
  34. }
  35. internal bool CanSurfacePresent(VulkanPhysicalDevice physicalDevice)
  36. {
  37. SurfaceExtension.GetPhysicalDeviceSurfaceSupport(physicalDevice.InternalHandle, physicalDevice.QueueFamilyIndex, ApiHandle, out var isSupported);
  38. return isSupported;
  39. }
  40. internal SurfaceFormatKHR GetSurfaceFormat(VulkanPhysicalDevice physicalDevice)
  41. {
  42. Span<uint> surfaceFormatsCount = stackalloc uint[1];
  43. SurfaceExtension.GetPhysicalDeviceSurfaceFormats(physicalDevice.InternalHandle, ApiHandle, surfaceFormatsCount, Span<SurfaceFormatKHR>.Empty);
  44. Span<SurfaceFormatKHR> surfaceFormats = stackalloc SurfaceFormatKHR[(int)surfaceFormatsCount[0]];
  45. SurfaceExtension.GetPhysicalDeviceSurfaceFormats(physicalDevice.InternalHandle, ApiHandle, surfaceFormatsCount, surfaceFormats);
  46. if (surfaceFormats.Length == 1 && surfaceFormats[0].Format == Format.Undefined)
  47. {
  48. return new SurfaceFormatKHR(Format.B8G8R8A8Unorm, ColorSpaceKHR.ColorspaceSrgbNonlinearKhr);
  49. }
  50. foreach (var format in surfaceFormats)
  51. {
  52. if (format.Format == Format.B8G8R8A8Unorm && format.ColorSpace == ColorSpaceKHR.ColorspaceSrgbNonlinearKhr)
  53. {
  54. return format;
  55. }
  56. }
  57. return surfaceFormats[0];
  58. }
  59. }
  60. }