From 521661451e89d75129376da167734748eaa528c5 Mon Sep 17 00:00:00 2001 From: ReinUsesLisp Date: Mon, 30 Jul 2018 03:50:23 -0300 Subject: [PATCH] Add Xlib support --- OpenTK.sln | 6 ----- src/OpenTK/Configuration.cs | 11 +++++--- src/OpenTK/Graphics/Vulkan/Commands.cs | 18 +++++++++++-- .../{FixedUtf8String.cs => NativeString.cs} | 12 ++++----- src/OpenTK/Graphics/Vulkan/Strings.cs | 14 ---------- src/OpenTK/Graphics/Vulkan/VulkanStrings.cs | 14 ++++++++++ .../Vulkan/{Version.cs => VulkanVersion.cs} | 6 ++--- src/OpenTK/NativeWindow.cs | 27 ++++++++++++++++--- src/OpenTK/OpenTK.Standard.csproj | 12 +++++---- src/OpenTK/Platform/Factory.cs | 3 ++- src/OpenTK/Platform/X11/Structs.cs | 6 ++--- 11 files changed, 82 insertions(+), 47 deletions(-) rename src/OpenTK/Graphics/Vulkan/{FixedUtf8String.cs => NativeString.cs} (69%) delete mode 100644 src/OpenTK/Graphics/Vulkan/Strings.cs create mode 100644 src/OpenTK/Graphics/Vulkan/VulkanStrings.cs rename src/OpenTK/Graphics/Vulkan/{Version.cs => VulkanVersion.cs} (69%) diff --git a/OpenTK.sln b/OpenTK.sln index 92581fa3..2ecf3a21 100644 --- a/OpenTK.sln +++ b/OpenTK.sln @@ -41,8 +41,6 @@ Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "OpenTK.Tests.Generators", " EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "OpenTK.Standard", "src\OpenTK\OpenTK.Standard.csproj", "{67F02FD3-8F7F-4D89-8551-359993271CA3}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "VkTest", "VkTest\VkTest.csproj", "{B0F33C2F-B9BD-4E55-85E3-6C1760D39DE9}" -EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "vk.generator", "src\vk.generator\vk.generator.csproj", "{3766DF33-E28B-402D-9EE1-975C2AFB5EAF}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "vk.rewrite", "src\vk.rewrite\vk.rewrite.csproj", "{3E9B1C4D-BCB4-418A-A94E-DD164A19C6A2}" @@ -97,10 +95,6 @@ Global {67F02FD3-8F7F-4D89-8551-359993271CA3}.Debug|Any CPU.Build.0 = Debug|Any CPU {67F02FD3-8F7F-4D89-8551-359993271CA3}.Release|Any CPU.ActiveCfg = Release|Any CPU {67F02FD3-8F7F-4D89-8551-359993271CA3}.Release|Any CPU.Build.0 = Release|Any CPU - {B0F33C2F-B9BD-4E55-85E3-6C1760D39DE9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {B0F33C2F-B9BD-4E55-85E3-6C1760D39DE9}.Debug|Any CPU.Build.0 = Debug|Any CPU - {B0F33C2F-B9BD-4E55-85E3-6C1760D39DE9}.Release|Any CPU.ActiveCfg = Release|Any CPU - {B0F33C2F-B9BD-4E55-85E3-6C1760D39DE9}.Release|Any CPU.Build.0 = Release|Any CPU {3766DF33-E28B-402D-9EE1-975C2AFB5EAF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {3766DF33-E28B-402D-9EE1-975C2AFB5EAF}.Debug|Any CPU.Build.0 = Debug|Any CPU {3766DF33-E28B-402D-9EE1-975C2AFB5EAF}.Release|Any CPU.ActiveCfg = Release|Any CPU diff --git a/src/OpenTK/Configuration.cs b/src/OpenTK/Configuration.cs index 8fedf6a7..09f643f7 100644 --- a/src/OpenTK/Configuration.cs +++ b/src/OpenTK/Configuration.cs @@ -164,7 +164,7 @@ namespace OpenTK return t != null; } - #if SDL2 +#if SDL2 private static bool DetectSdl2() { bool supported = false; @@ -221,7 +221,12 @@ namespace OpenTK return supported; } - #endif +#else + private static bool DetectSdl2() + { + return false; + } +#endif private static void DetectUnix(out bool unix, out bool linux, out bool macos) { @@ -298,7 +303,7 @@ namespace OpenTK initialized = true; #endif - Debug.Print("Detected configuration: {0} / {1}", + Debug.Print("Detected configuration: {0} / {1}", RunningOnWindows ? "Windows" : RunningOnLinux ? "Linux" : RunningOnMacOS ? "MacOS" : runningOnUnix ? "Unix" : RunningOnX11 ? "X11" : "Unknown Platform", RunningOnMono ? "Mono" : ".Net"); diff --git a/src/OpenTK/Graphics/Vulkan/Commands.cs b/src/OpenTK/Graphics/Vulkan/Commands.cs index d1b4c285..8a741f42 100644 --- a/src/OpenTK/Graphics/Vulkan/Commands.cs +++ b/src/OpenTK/Graphics/Vulkan/Commands.cs @@ -9,12 +9,26 @@ namespace OpenTK.Graphics.Vulkan { private static NativeLibrary s_nativeLib; - static VK() + static public void LoadFunctions() { - s_nativeLib = LoadNativeLibrary(); + if (s_nativeLib == null) + { + s_nativeLib = LoadNativeLibrary(); + } + LoadFunctionPointers(); } + public static IntPtr LoadFunctionPointer(string functionName) + { + if (s_nativeLib == null) + { + s_nativeLib = LoadNativeLibrary(); + } + + return s_nativeLib.LoadFunctionPointer(functionName); + } + private static NativeLibrary LoadNativeLibrary() { return NativeLibrary.Load(GetVulkanName()); diff --git a/src/OpenTK/Graphics/Vulkan/FixedUtf8String.cs b/src/OpenTK/Graphics/Vulkan/NativeString.cs similarity index 69% rename from src/OpenTK/Graphics/Vulkan/FixedUtf8String.cs rename to src/OpenTK/Graphics/Vulkan/NativeString.cs index ece69490..394da3a2 100644 --- a/src/OpenTK/Graphics/Vulkan/FixedUtf8String.cs +++ b/src/OpenTK/Graphics/Vulkan/NativeString.cs @@ -4,14 +4,14 @@ using System.Text; namespace OpenTK.Graphics.Vulkan { - public unsafe class FixedUtf8String : IDisposable + public unsafe class NativeString : IDisposable { private GCHandle _handle; private uint _numBytes; public byte* StringPtr => (byte*)_handle.AddrOfPinnedObject().ToPointer(); - public FixedUtf8String(string s) + public NativeString(string s) { if (s == null) { @@ -46,9 +46,9 @@ namespace OpenTK.Graphics.Vulkan _handle.Free(); } - public static implicit operator byte* (FixedUtf8String utf8String) => utf8String.StringPtr; - public static implicit operator IntPtr (FixedUtf8String utf8String) => new IntPtr(utf8String.StringPtr); - public static implicit operator FixedUtf8String(string s) => new FixedUtf8String(s); - public static implicit operator string(FixedUtf8String utf8String) => utf8String.GetString(); + public static implicit operator byte* (NativeString utf8String) => utf8String.StringPtr; + public static implicit operator IntPtr (NativeString utf8String) => new IntPtr(utf8String.StringPtr); + public static implicit operator NativeString(string s) => new NativeString(s); + public static implicit operator string(NativeString utf8String) => utf8String.GetString(); } } \ No newline at end of file diff --git a/src/OpenTK/Graphics/Vulkan/Strings.cs b/src/OpenTK/Graphics/Vulkan/Strings.cs deleted file mode 100644 index 3f0c3e80..00000000 --- a/src/OpenTK/Graphics/Vulkan/Strings.cs +++ /dev/null @@ -1,14 +0,0 @@ -namespace OpenTK.Graphics.Vulkan -{ - public static class Strings - { - public static FixedUtf8String VK_KHR_SURFACE_EXTENSION_NAME = "VK_KHR_surface"; - public static FixedUtf8String VK_KHR_WIN32_SURFACE_EXTENSION_NAME = "VK_KHR_win32_surface"; - public static FixedUtf8String VK_KHR_XCB_SURFACE_EXTENSION_NAME = "VK_KHR_xcb_surface"; - public static FixedUtf8String VK_KHR_XLIB_SURFACE_EXTENSION_NAME = "VK_KHR_xlib_surface"; - public static FixedUtf8String VK_KHR_SWAPCHAIN_EXTENSION_NAME = "VK_KHR_swapchain"; - public static FixedUtf8String VK_EXT_DEBUG_REPORT_EXTENSION_NAME = "VK_EXT_debug_report"; - public static FixedUtf8String StandardValidationLayeName = "VK_LAYER_LUNARG_standard_validation"; - public static FixedUtf8String main = "main"; - } -} diff --git a/src/OpenTK/Graphics/Vulkan/VulkanStrings.cs b/src/OpenTK/Graphics/Vulkan/VulkanStrings.cs new file mode 100644 index 00000000..267263ed --- /dev/null +++ b/src/OpenTK/Graphics/Vulkan/VulkanStrings.cs @@ -0,0 +1,14 @@ +namespace OpenTK.Graphics.Vulkan +{ + public static class VulkanStrings + { + public static NativeString VK_KHR_SURFACE_EXTENSION_NAME = "VK_KHR_surface"; + public static NativeString VK_KHR_WIN32_SURFACE_EXTENSION_NAME = "VK_KHR_win32_surface"; + public static NativeString VK_KHR_XCB_SURFACE_EXTENSION_NAME = "VK_KHR_xcb_surface"; + public static NativeString VK_KHR_XLIB_SURFACE_EXTENSION_NAME = "VK_KHR_xlib_surface"; + public static NativeString VK_KHR_SWAPCHAIN_EXTENSION_NAME = "VK_KHR_swapchain"; + public static NativeString VK_EXT_DEBUG_REPORT_EXTENSION_NAME = "VK_EXT_debug_report"; + public static NativeString StandardValidationLayerName = "VK_LAYER_LUNARG_standard_validation"; + public static NativeString main = "main"; + } +} diff --git a/src/OpenTK/Graphics/Vulkan/Version.cs b/src/OpenTK/Graphics/Vulkan/VulkanVersion.cs similarity index 69% rename from src/OpenTK/Graphics/Vulkan/Version.cs rename to src/OpenTK/Graphics/Vulkan/VulkanVersion.cs index eefc8251..c6658e42 100644 --- a/src/OpenTK/Graphics/Vulkan/Version.cs +++ b/src/OpenTK/Graphics/Vulkan/VulkanVersion.cs @@ -1,10 +1,10 @@ namespace OpenTK.Graphics.Vulkan { - public struct Version + public struct VulkanVersion { private readonly uint value; - public Version(uint major, uint minor, uint patch) + public VulkanVersion(uint major, uint minor, uint patch) { value = major << 22 | minor << 12 | patch; } @@ -15,7 +15,7 @@ public uint Patch => (value >> 22) & 0xfff; - public static implicit operator uint(Version version) + public static implicit operator uint(VulkanVersion version) { return version.value; } diff --git a/src/OpenTK/NativeWindow.cs b/src/OpenTK/NativeWindow.cs index 3cd49439..d07f845a 100644 --- a/src/OpenTK/NativeWindow.cs +++ b/src/OpenTK/NativeWindow.cs @@ -50,7 +50,7 @@ namespace OpenTK private bool events; private bool previous_cursor_visible = true; - public VkResult CreateVulkanSurface(VkInstance instance, out VkSurfaceKHR surface) + public unsafe VkResult CreateVulkanSurface(VkInstance instance, out VkSurfaceKHR surface) { IPlatformFactory factory = Factory.Default; @@ -62,9 +62,24 @@ namespace OpenTK return VK.CreateWin32SurfaceKHR(instance, ref createInfo, IntPtr.Zero, out surface); } + else if (implementation is Platform.X11.X11GLNative x11) + { + Platform.X11.X11WindowInfo info = x11.WindowInfo as Platform.X11.X11WindowInfo; + + Graphics.Vulkan.Xlib.Window window = new Graphics.Vulkan.Xlib.Window(); + window.Value = info.WindowHandle; + + VkXlibSurfaceCreateInfoKHR createInfo = VkXlibSurfaceCreateInfoKHR.New(); + createInfo.dpy = (Graphics.Vulkan.Xlib.Display*)info.Display; + createInfo.window = window; + + return VK.CreateXlibSurfaceKHR(instance, &createInfo, IntPtr.Zero, out surface); + } else { - throw new NotImplementedException(); + //If someone knows how to create a MoltenVK surface, please add it here + + throw new NotImplementedException(implementation.ToString()); } } @@ -72,11 +87,15 @@ namespace OpenTK { if (implementation is Platform.Windows.WinGLNative win) { - return new IntPtr[] { Strings.VK_KHR_WIN32_SURFACE_EXTENSION_NAME }; + return new IntPtr[] { VulkanStrings.VK_KHR_WIN32_SURFACE_EXTENSION_NAME }; + } + else if (implementation is Platform.X11.X11GLNative x11) + { + return new IntPtr[] { VulkanStrings.VK_KHR_XLIB_SURFACE_EXTENSION_NAME }; } else { - throw new NotImplementedException(); + throw new NotImplementedException(implementation.ToString()); } } diff --git a/src/OpenTK/OpenTK.Standard.csproj b/src/OpenTK/OpenTK.Standard.csproj index 592efbfd..3dfe6c5b 100644 --- a/src/OpenTK/OpenTK.Standard.csproj +++ b/src/OpenTK/OpenTK.Standard.csproj @@ -3,7 +3,7 @@ OpenTK netstandard2.0 OpenTK - $(DefineConstants);WIN32;CARBON;X11;SDL2;OPENGL;OPENGLES;MINIMAL + $(DefineConstants);WIN32;CARBON;X11;OPENGL;OPENGLES;MINIMAL True @@ -68,8 +68,8 @@ true - 1.0.2 - The Open Toolkit library (OpenTK) is an advanced, low-level C# wrapper for OpenGL, OpenGL ES and OpenAL. + 1.1.7 + The Open Toolkit library (OpenTK) is an advanced, low-level C# wrapper for OpenGL, OpenGL ES, OpenAL and Vulkan. It is suitable for games, scientific visualizations and projects that require 3d graphics, audio or compute functionality. Features @@ -83,7 +83,9 @@ This version can be found at https://github.com/emmauss/opentk emmaus emmaus OpenTK - https://github.com/emmauss/opentk + https://github.com/Ryujinx/Opentk + 1.1.7.0 + 1.1.7.0 @@ -120,4 +122,4 @@ This version can be found at https://github.com/emmauss/opentk - \ No newline at end of file + diff --git a/src/OpenTK/Platform/Factory.cs b/src/OpenTK/Platform/Factory.cs index 5274bcf8..a4626fe5 100644 --- a/src/OpenTK/Platform/Factory.cs +++ b/src/OpenTK/Platform/Factory.cs @@ -46,8 +46,9 @@ namespace OpenTK.Platform Toolkit.Init(); // Create regular platform backend + if (false) { } #if SDL2 - if (Configuration.RunningOnSdl2) + else if (Configuration.RunningOnSdl2) { Default = new SDL2.Sdl2Factory(); } diff --git a/src/OpenTK/Platform/X11/Structs.cs b/src/OpenTK/Platform/X11/Structs.cs index fc420295..ea190f23 100644 --- a/src/OpenTK/Platform/X11/Structs.cs +++ b/src/OpenTK/Platform/X11/Structs.cs @@ -692,10 +692,10 @@ namespace OpenTK.Platform.X11 public int backing_store; public IntPtr backing_planes; public IntPtr backing_pixel; - public bool save_under; + public int save_under; public IntPtr event_mask; public IntPtr do_not_propagate_mask; - public bool override_redirect; + public int override_redirect; public IntPtr colormap; public IntPtr cursor; } @@ -719,7 +719,7 @@ namespace OpenTK.Platform.X11 public IntPtr backing_pixel; public byte save_under; public IntPtr colormap; - public bool map_installed; + public int map_installed; public MapState map_state; public IntPtr all_event_masks; public IntPtr your_event_mask;