aboutsummaryrefslogtreecommitdiffstatsci
diff options
context:
space:
mode:
-rw-r--r--vulkan/ExtensionMethods.cs2
-rw-r--r--vulkan/Utils.cs10
-rw-r--r--vulkan/VulkanExtensionMethods.cs60
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
+ }
+}