diff options
| author | Jean-Philippe Bruyère <jp_bruyere@hotmail.com> | 2021-12-08 22:22:54 +0100 |
|---|---|---|
| committer | Jean-Philippe Bruyère <jp_bruyere@hotmail.com> | 2021-12-08 22:22:54 +0100 |
| commit | b8051560dbadef834062037283f1d8de32522296 (patch) | |
| tree | 8f4fd29be7dfe7c20a3d016599e07a35325a63d4 | |
| parent | fe6cb8a976b328b87ec66357c97614f67865e1d7 (diff) | |
ext methodsv0.4.0-betaauto_set_struct_type_stype
| -rw-r--r-- | vulkan/ExtensionMethods.cs | 2 | ||||
| -rw-r--r-- | vulkan/Utils.cs | 10 | ||||
| -rw-r--r-- | vulkan/VulkanExtensionMethods.cs | 60 |
3 files changed, 71 insertions, 1 deletions
diff --git a/vulkan/ExtensionMethods.cs b/vulkan/ExtensionMethods.cs index c40e56d..292cd71 100644 --- a/vulkan/ExtensionMethods.cs +++ b/vulkan/ExtensionMethods.cs @@ -10,7 +10,7 @@ using System.Runtime.InteropServices; using static Vulkan.Vk; namespace Vulkan { - public static class ExtensionMethods { + public static partial class ExtensionMethods { #region pinning /// <summary> /// list of pinned GCHandles used to pass value from managed to unmanaged code. diff --git a/vulkan/Utils.cs b/vulkan/Utils.cs index bf629ed..9744b5f 100644 --- a/vulkan/Utils.cs +++ b/vulkan/Utils.cs @@ -16,6 +16,16 @@ namespace Vulkan { if (result != VkResult.Success) throw new InvalidOperationException ($"[{sourceFilePath}:{sourceLineNumber}->{caller}]{msg}: {result}"); } + public static VkExtensionProperties[] GetAvailableInstanceExtensions (string layerName = null) { + using (Utf8StringPointer pLayerName = layerName) { + CheckResult (vkEnumerateInstanceExtensionProperties (pLayerName, out uint pCount, IntPtr.Zero)); + VkExtensionProperties[] tmp = new VkExtensionProperties[pCount]; + CheckResult (vkEnumerateInstanceExtensionProperties (pLayerName, out pCount, tmp.Pin())); + tmp.Unpin(); + return tmp; + } + } + public static bool TryGetPhysicalDevice (VkInstance inst, VkPhysicalDeviceType deviceType, out VkPhysicalDevice phy) { CheckResult (vkEnumeratePhysicalDevices (inst, out uint phyCount, IntPtr.Zero)); diff --git a/vulkan/VulkanExtensionMethods.cs b/vulkan/VulkanExtensionMethods.cs new file mode 100644 index 0000000..d94b09a --- /dev/null +++ b/vulkan/VulkanExtensionMethods.cs @@ -0,0 +1,60 @@ +// Copyright (c) 2019-2021 Jean-Philippe Bruyère <jp_bruyere@hotmail.com> +// +// This code is licensed under the MIT license (MIT) (http://opensource.org/licenses/MIT) +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Runtime.InteropServices; + +using static Vulkan.Vk; +using static Vulkan.Utils; + +namespace Vulkan { + public static class VulkanExtensionMethods { + #region instance + public static bool TryGetPhysicalDevice (this VkInstance inst, VkPhysicalDeviceType deviceType, out VkPhysicalDevice phy) { + CheckResult (vkEnumeratePhysicalDevices (inst, out uint phyCount, IntPtr.Zero)); + + VkPhysicalDevice[] phys = new VkPhysicalDevice[phyCount]; + + CheckResult (vkEnumeratePhysicalDevices (inst, out phyCount, phys.Pin())); + + for (int i = 0; i < phys.Length; i++) + { + phy = phys[i]; + vkGetPhysicalDeviceProperties (phy, out VkPhysicalDeviceProperties props); + if (props.deviceType == deviceType) + return true; + } + phy = default; + return false; + } + #endregion + #region Physical device + public static VkQueueFamilyProperties[] GetQueueFamilyProperties (this VkPhysicalDevice phy) { + vkGetPhysicalDeviceQueueFamilyProperties (phy, out uint queueFamilyCount, IntPtr.Zero); + VkQueueFamilyProperties[] qFamProps = new VkQueueFamilyProperties[queueFamilyCount]; + vkGetPhysicalDeviceQueueFamilyProperties (phy, out queueFamilyCount, qFamProps.Pin()); + qFamProps.Unpin(); + return qFamProps; + } + public static VkSurfaceFormatKHR [] GetSurfaceFormats (this VkPhysicalDevice phy, VkSurfaceKHR surf) + { + vkGetPhysicalDeviceSurfaceFormatsKHR (phy, surf, out uint count, IntPtr.Zero); + VkSurfaceFormatKHR [] formats = new VkSurfaceFormatKHR [count]; + vkGetPhysicalDeviceSurfaceFormatsKHR (phy, surf, out count, formats.Pin ()); + formats.Unpin (); + return formats; + } + public static VkPresentModeKHR[] GetSurfacePresentModes (this VkPhysicalDevice phy, VkSurfaceKHR surf) { + vkGetPhysicalDeviceSurfacePresentModesKHR (phy, surf, out uint count, IntPtr.Zero); + VkPresentModeKHR[] modes = new VkPresentModeKHR[count]; + vkGetPhysicalDeviceSurfacePresentModesKHR (phy, surf, out count, modes.Pin ()); + modes.Unpin (); + return modes; + + } + #endregion + } +} |