[metacity] vulkan: enumerate instance layers and extensions



commit a9ae64c1bbafdb0042b70cabc9a3bcf1d529b89d
Author: Alberts Muktupāvels <alberts muktupavels gmail com>
Date:   Fri Mar 10 17:16:30 2017 +0200

    vulkan: enumerate instance layers and extensions

 src/compositor/meta-compositor-vulkan.c |  117 +++++++++++++++++++++++++++++++
 src/core/util.c                         |    5 +-
 src/include/util.h                      |    3 +-
 3 files changed, 123 insertions(+), 2 deletions(-)
---
diff --git a/src/compositor/meta-compositor-vulkan.c b/src/compositor/meta-compositor-vulkan.c
index 69165b2..4108242 100644
--- a/src/compositor/meta-compositor-vulkan.c
+++ b/src/compositor/meta-compositor-vulkan.c
@@ -17,7 +17,13 @@
 
 #include "config.h"
 
+#ifdef HAVE_VULKAN
+#define VK_USE_PLATFORM_XLIB_KHR
+#include <vulkan/vulkan.h>
+#endif
+
 #include "meta-compositor-vulkan.h"
+#include "util.h"
 
 struct _MetaCompositorVulkan
 {
@@ -26,11 +32,122 @@ struct _MetaCompositorVulkan
 
 G_DEFINE_TYPE (MetaCompositorVulkan, meta_compositor_vulkan, META_TYPE_COMPOSITOR)
 
+#ifdef HAVE_VULKAN
+static void
+enumerate_instance_layers (MetaCompositorVulkan *vulkan)
+{
+  uint32_t n_layers;
+  VkLayerProperties *layers;
+  VkResult result;
+  uint32_t i;
+
+  if (!meta_check_debug_flags (META_DEBUG_VULKAN))
+    return;
+
+  result = vkEnumerateInstanceLayerProperties (&n_layers, NULL);
+
+  if (result != VK_SUCCESS)
+    {
+      meta_topic (META_DEBUG_VULKAN,
+                  "Failed to enumerate instance layer properties\n");
+
+      return;
+    }
+
+  layers = g_new0 (VkLayerProperties, n_layers);
+  result = vkEnumerateInstanceLayerProperties (&n_layers, layers);
+
+  if (result != VK_SUCCESS)
+    {
+      meta_topic (META_DEBUG_VULKAN,
+                  "Failed to enumerate instance layer properties\n");
+
+      g_free (layers);
+      return;
+    }
+
+  meta_topic (META_DEBUG_VULKAN, "Available instance layers:\n");
+  meta_push_no_msg_prefix ();
+
+  for (i = 0; i < n_layers; i++)
+    {
+      meta_topic (META_DEBUG_VULKAN, "  %s v%u.%u.%u (%s)\n",
+                  layers[i].layerName,
+                  VK_VERSION_MAJOR (layers[i].specVersion),
+                  VK_VERSION_MINOR (layers[i].specVersion),
+                  VK_VERSION_PATCH (layers[i].specVersion),
+                  layers[i].description);
+    }
+
+  meta_pop_no_msg_prefix ();
+
+  g_free (layers);
+}
+
+static void
+enumerate_instance_extensions (MetaCompositorVulkan *vulkan)
+{
+  uint32_t n_extensions;
+  VkExtensionProperties *extensions;
+  VkResult result;
+  uint32_t i;
+
+  if (!meta_check_debug_flags (META_DEBUG_VULKAN))
+    return;
+
+  result = vkEnumerateInstanceExtensionProperties (NULL, &n_extensions, NULL);
+
+  if (result != VK_SUCCESS)
+    {
+      meta_topic (META_DEBUG_VULKAN,
+                  "Failed to enumerate instance extension properties\n");
+
+      return;
+    }
+
+  extensions = g_new0 (VkExtensionProperties, n_extensions);
+  result = vkEnumerateInstanceExtensionProperties (NULL, &n_extensions,
+                                                   extensions);
+
+  if (result != VK_SUCCESS)
+    {
+      meta_topic (META_DEBUG_VULKAN,
+                  "Failed to enumerate instance extension properties\n");
+
+      g_free (extensions);
+      return;
+    }
+
+  meta_topic (META_DEBUG_VULKAN, "Available instance extensions:\n");
+  meta_push_no_msg_prefix ();
+
+  for (i = 0; i < n_extensions; i++)
+    {
+      meta_topic (META_DEBUG_VULKAN, "  %s v%u.%u.%u\n",
+                  extensions[i].extensionName,
+                  VK_VERSION_MAJOR (extensions[i].specVersion),
+                  VK_VERSION_MINOR (extensions[i].specVersion),
+                  VK_VERSION_PATCH (extensions[i].specVersion));
+    }
+
+  meta_pop_no_msg_prefix ();
+
+  g_free (extensions);
+}
+#endif
+
 static gboolean
 meta_compositor_vulkan_manage (MetaCompositor  *compositor,
                                GError         **error)
 {
 #ifdef HAVE_VULKAN
+  MetaCompositorVulkan *vulkan;
+
+  vulkan = META_COMPOSITOR_VULKAN (compositor);
+
+  enumerate_instance_layers (vulkan);
+  enumerate_instance_extensions (vulkan);
+
   g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED, "Not implemented");
 
   return FALSE;
diff --git a/src/core/util.c b/src/core/util.c
index 790cda0..b2e4deb 100644
--- a/src/core/util.c
+++ b/src/core/util.c
@@ -55,7 +55,8 @@ static const GDebugKey debug_keys[] = {
   { "resizing", META_DEBUG_RESIZING },
   { "shapes", META_DEBUG_SHAPES },
   { "edge-resistance", META_DEBUG_EDGE_RESISTANCE },
-  { "verbose", META_DEBUG_VERBOSE }
+  { "verbose", META_DEBUG_VERBOSE },
+  { "vulkan", META_DEBUG_VULKAN }
 };
 
 static guint debug_flags = 0;
@@ -281,6 +282,8 @@ topic_name (MetaDebugFlags topic)
       return "EDGE_RESISTANCE";
     case META_DEBUG_VERBOSE:
       return "VERBOSE";
+    case META_DEBUG_VULKAN:
+      return "VULKAN";
     default:
       break;
     }
diff --git a/src/include/util.h b/src/include/util.h
index 0090177..2fdd038 100644
--- a/src/include/util.h
+++ b/src/include/util.h
@@ -48,7 +48,8 @@ typedef enum
   META_DEBUG_RESIZING = 1 << 16,
   META_DEBUG_SHAPES = 1 << 17,
   META_DEBUG_EDGE_RESISTANCE = 1 << 18,
-  META_DEBUG_VERBOSE = 1 << 19
+  META_DEBUG_VERBOSE = 1 << 19,
+  META_DEBUG_VULKAN = 1 << 20
 } MetaDebugFlags;
 
 void meta_init_debug (void);


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]