VulkanWindow.cs 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. using Ryujinx.Common.Configuration;
  2. using Ryujinx.Common.Logging;
  3. using Ryujinx.Input.HLE;
  4. using System;
  5. using System.Runtime.InteropServices;
  6. using static SDL2.SDL;
  7. namespace Ryujinx.Headless.SDL2.Vulkan
  8. {
  9. class VulkanWindow : WindowBase
  10. {
  11. private GraphicsDebugLevel _glLogLevel;
  12. public VulkanWindow(InputManager inputManager, GraphicsDebugLevel glLogLevel, AspectRatio aspectRatio, bool enableMouse) : base(inputManager, glLogLevel, aspectRatio, enableMouse)
  13. {
  14. _glLogLevel = glLogLevel;
  15. }
  16. public override SDL_WindowFlags GetWindowFlags() => SDL_WindowFlags.SDL_WINDOW_VULKAN;
  17. protected override void InitializeWindowRenderer() { }
  18. protected override void InitializeRenderer()
  19. {
  20. Renderer?.Window.SetSize(DefaultWidth, DefaultHeight);
  21. MouseDriver.SetClientSize(DefaultWidth, DefaultHeight);
  22. }
  23. public unsafe IntPtr CreateWindowSurface(IntPtr instance)
  24. {
  25. if (SDL_Vulkan_CreateSurface(WindowHandle, instance, out ulong surfaceHandle) == SDL_bool.SDL_FALSE)
  26. {
  27. string errorMessage = $"SDL_Vulkan_CreateSurface failed with error \"{SDL_GetError()}\"";
  28. Logger.Error?.Print(LogClass.Application, errorMessage);
  29. throw new Exception(errorMessage);
  30. }
  31. return (IntPtr)surfaceHandle;
  32. }
  33. public unsafe string[] GetRequiredInstanceExtensions()
  34. {
  35. if (SDL_Vulkan_GetInstanceExtensions(WindowHandle, out uint extensionsCount, IntPtr.Zero) == SDL_bool.SDL_TRUE)
  36. {
  37. IntPtr[] rawExtensions = new IntPtr[(int)extensionsCount];
  38. string[] extensions = new string[(int)extensionsCount];
  39. fixed (IntPtr* rawExtensionsPtr = rawExtensions)
  40. {
  41. if (SDL_Vulkan_GetInstanceExtensions(WindowHandle, out extensionsCount, (IntPtr)rawExtensionsPtr) == SDL_bool.SDL_TRUE)
  42. {
  43. for (int i = 0; i < extensions.Length; i++)
  44. {
  45. extensions[i] = Marshal.PtrToStringUTF8(rawExtensions[i]);
  46. }
  47. return extensions;
  48. }
  49. }
  50. }
  51. string errorMessage = $"SDL_Vulkan_GetInstanceExtensions failed with error \"{SDL_GetError()}\"";
  52. Logger.Error?.Print(LogClass.Application, errorMessage);
  53. throw new Exception(errorMessage);
  54. }
  55. protected override void FinalizeWindowRenderer()
  56. {
  57. Device.DisposeGpu();
  58. }
  59. protected override void SwapBuffers() { }
  60. }
  61. }