RendererHost.axaml.cs 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. using Avalonia;
  2. using Avalonia.Controls;
  3. using Ryujinx.Common.Configuration;
  4. using Ryujinx.Ui.Common.Configuration;
  5. using Silk.NET.Vulkan;
  6. using System;
  7. namespace Ryujinx.Ava.UI.Renderer
  8. {
  9. public partial class RendererHost : UserControl, IDisposable
  10. {
  11. public EmbeddedWindow EmbeddedWindow;
  12. public event EventHandler<EventArgs> WindowCreated;
  13. public event Action<object, Size> SizeChanged;
  14. public RendererHost()
  15. {
  16. InitializeComponent();
  17. Dispose();
  18. if (ConfigurationState.Instance.Graphics.GraphicsBackend.Value == GraphicsBackend.OpenGl)
  19. {
  20. EmbeddedWindow = new EmbeddedWindowOpenGL();
  21. }
  22. else
  23. {
  24. EmbeddedWindow = new EmbeddedWindowVulkan();
  25. }
  26. Initialize();
  27. }
  28. private void Initialize()
  29. {
  30. EmbeddedWindow.WindowCreated += CurrentWindow_WindowCreated;
  31. EmbeddedWindow.SizeChanged += CurrentWindow_SizeChanged;
  32. Content = EmbeddedWindow;
  33. }
  34. public void Dispose()
  35. {
  36. if (EmbeddedWindow != null)
  37. {
  38. EmbeddedWindow.WindowCreated -= CurrentWindow_WindowCreated;
  39. EmbeddedWindow.SizeChanged -= CurrentWindow_SizeChanged;
  40. }
  41. }
  42. protected override void OnDetachedFromVisualTree(VisualTreeAttachmentEventArgs e)
  43. {
  44. base.OnDetachedFromVisualTree(e);
  45. Dispose();
  46. }
  47. private void CurrentWindow_SizeChanged(object sender, Size e)
  48. {
  49. SizeChanged?.Invoke(sender, e);
  50. }
  51. private void CurrentWindow_WindowCreated(object sender, IntPtr e)
  52. {
  53. WindowCreated?.Invoke(this, EventArgs.Empty);
  54. }
  55. }
  56. }