[Bf-blender-cvs] [b671b33871c] tmp-vulkan: GHOST: Vulkan: Add instance creation

Clément Foucault noreply at git.blender.org
Thu Jul 23 16:21:41 CEST 2020


Commit: b671b33871cec4f45ed10c6e8592bb0609a1cd7f
Author: Clément Foucault
Date:   Sun Jul 19 22:59:57 2020 +0200
Branches: tmp-vulkan
https://developer.blender.org/rBb671b33871cec4f45ed10c6e8592bb0609a1cd7f

GHOST: Vulkan: Add instance creation

===================================================================

M	intern/ghost/intern/GHOST_ContextVK.cpp
M	intern/ghost/intern/GHOST_ContextVK.h

===================================================================

diff --git a/intern/ghost/intern/GHOST_ContextVK.cpp b/intern/ghost/intern/GHOST_ContextVK.cpp
index 45d8651044d..a1ab5d17e00 100644
--- a/intern/ghost/intern/GHOST_ContextVK.cpp
+++ b/intern/ghost/intern/GHOST_ContextVK.cpp
@@ -33,6 +33,74 @@
 #include <cassert>
 #include <cstdio>
 #include <cstring>
+#include <iostream>
+
+using namespace std;
+
+static const char *vulkan_error_as_string(VkResult result)
+{
+#define FORMAT_ERROR(X) \
+  case X: { \
+    return "" #X; \
+  }
+
+  switch (result) {
+    FORMAT_ERROR(VK_NOT_READY);
+    FORMAT_ERROR(VK_TIMEOUT);
+    FORMAT_ERROR(VK_EVENT_SET);
+    FORMAT_ERROR(VK_EVENT_RESET);
+    FORMAT_ERROR(VK_INCOMPLETE);
+    FORMAT_ERROR(VK_ERROR_OUT_OF_HOST_MEMORY);
+    FORMAT_ERROR(VK_ERROR_OUT_OF_DEVICE_MEMORY);
+    FORMAT_ERROR(VK_ERROR_INITIALIZATION_FAILED);
+    FORMAT_ERROR(VK_ERROR_DEVICE_LOST);
+    FORMAT_ERROR(VK_ERROR_MEMORY_MAP_FAILED);
+    FORMAT_ERROR(VK_ERROR_LAYER_NOT_PRESENT);
+    FORMAT_ERROR(VK_ERROR_EXTENSION_NOT_PRESENT);
+    FORMAT_ERROR(VK_ERROR_FEATURE_NOT_PRESENT);
+    FORMAT_ERROR(VK_ERROR_INCOMPATIBLE_DRIVER);
+    FORMAT_ERROR(VK_ERROR_TOO_MANY_OBJECTS);
+    FORMAT_ERROR(VK_ERROR_FORMAT_NOT_SUPPORTED);
+    FORMAT_ERROR(VK_ERROR_FRAGMENTED_POOL);
+    FORMAT_ERROR(VK_ERROR_UNKNOWN);
+    FORMAT_ERROR(VK_ERROR_OUT_OF_POOL_MEMORY);
+    FORMAT_ERROR(VK_ERROR_INVALID_EXTERNAL_HANDLE);
+    FORMAT_ERROR(VK_ERROR_FRAGMENTATION);
+    FORMAT_ERROR(VK_ERROR_INVALID_OPAQUE_CAPTURE_ADDRESS);
+    FORMAT_ERROR(VK_ERROR_SURFACE_LOST_KHR);
+    FORMAT_ERROR(VK_ERROR_NATIVE_WINDOW_IN_USE_KHR);
+    FORMAT_ERROR(VK_SUBOPTIMAL_KHR);
+    FORMAT_ERROR(VK_ERROR_OUT_OF_DATE_KHR);
+    FORMAT_ERROR(VK_ERROR_INCOMPATIBLE_DISPLAY_KHR);
+    FORMAT_ERROR(VK_ERROR_VALIDATION_FAILED_EXT);
+    FORMAT_ERROR(VK_ERROR_INVALID_SHADER_NV);
+    FORMAT_ERROR(VK_ERROR_INCOMPATIBLE_VERSION_KHR);
+    FORMAT_ERROR(VK_ERROR_INVALID_DRM_FORMAT_MODIFIER_PLANE_LAYOUT_EXT);
+    FORMAT_ERROR(VK_ERROR_NOT_PERMITTED_EXT);
+    FORMAT_ERROR(VK_ERROR_FULL_SCREEN_EXCLUSIVE_MODE_LOST_EXT);
+    FORMAT_ERROR(VK_THREAD_IDLE_KHR);
+    FORMAT_ERROR(VK_THREAD_DONE_KHR);
+    FORMAT_ERROR(VK_OPERATION_DEFERRED_KHR);
+    FORMAT_ERROR(VK_OPERATION_NOT_DEFERRED_KHR);
+    FORMAT_ERROR(VK_PIPELINE_COMPILE_REQUIRED_EXT);
+    default:
+      return "Unknown Error";
+  }
+}
+
+#define __STR(A) "" #A
+#define VK_CHECK(__expression) \
+  do { \
+    VkResult r = (__expression); \
+    if (r != VK_SUCCESS) { \
+      fprintf(stderr, \
+              "Vulkan Error : %s:%d : %s failled with %s\n", \
+              __FILE__, \
+              __LINE__, \
+              __STR(__expression), \
+              vulkan_error_as_string(r)); \
+    } \
+  } while (0)
 
 GHOST_ContextVK::GHOST_ContextVK(bool stereoVisual) : GHOST_Context(stereoVisual)
 {
@@ -58,12 +126,72 @@ GHOST_TSuccess GHOST_ContextVK::releaseDrawingContext()
   return GHOST_kSuccess;
 }
 
-GHOST_TSuccess GHOST_ContextVK::initializeDrawingContext()
+static vector<VkExtensionProperties> getExtensionsAvailable()
 {
   uint32_t extensionCount = 0;
   vkEnumerateInstanceExtensionProperties(nullptr, &extensionCount, nullptr);
 
-  printf("Vulkan extensions supported : %u\n", extensionCount);
+  vector<VkExtensionProperties> extensions(extensionCount);
+  vkEnumerateInstanceExtensionProperties(nullptr, &extensionCount, extensions.data());
+
+  return extensions;
+}
+
+static bool checkExtensionSupport(vector<VkExtensionProperties> &extensions_available,
+                                  const char *extension_name)
+{
+  for (const auto &extension : extensions_available) {
+    if (strcmp(extension_name, extension.extensionName) == 0) {
+      return true;
+    }
+  }
+  return false;
+}
+
+static bool requireExtension(vector<VkExtensionProperties> &extensions_available,
+                             vector<const char *> &extensions_enabled,
+                             const char *extension_name)
+{
+  if (checkExtensionSupport(extensions_available, extension_name)) {
+    extensions_enabled.push_back(extension_name);
+  }
+  else {
+    cout << "Error : " << extension.extensionName << " not found\n";
+  }
+}
+
+GHOST_TSuccess GHOST_ContextVK::initializeDrawingContext()
+{
+  VkApplicationInfo app_info = {
+      .sType = VK_STRUCTURE_TYPE_APPLICATION_INFO,
+      .pApplicationName = "Blender",
+      .applicationVersion = VK_MAKE_VERSION(1, 0, 0),
+      .pEngineName = "Blender",
+      .engineVersion = VK_MAKE_VERSION(1, 0, 0),
+      .apiVersion = VK_API_VERSION_1_0,
+  };
+
+  auto extensions_available = getExtensionsAvailable();
+
+  vector<const char *> extensions_enabled;
+#ifdef _WIN32
+  requireExtension(extensions_available, extensions_enabled, VK_KHR_WIN32_SURFACE_EXTENSION_NAME);
+#else
+  requireExtension(extensions_available, extensions_enabled, VK_KHR_XLIB_SURFACE_EXTENSION_NAME);
+#endif
+
+  VkInstanceCreateInfo create_info = {
+      .sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO,
+      .pApplicationInfo = &app_info,
+      .enabledLayerCount = 0,
+      .ppEnabledLayerNames = NULL,
+      .enabledExtensionCount = static_cast<uint32_t>(extensions_enabled.size()),
+      .ppEnabledExtensionNames = extensions_enabled.data(),
+  };
+
+  VK_CHECK(vkCreateInstance(&create_info, NULL, &m_instance));
+
+  vkDestroyInstance(m_instance, NULL);
 
   return GHOST_kFailure;
 }
diff --git a/intern/ghost/intern/GHOST_ContextVK.h b/intern/ghost/intern/GHOST_ContextVK.h
index 1110a8bd702..c12d6885e73 100644
--- a/intern/ghost/intern/GHOST_ContextVK.h
+++ b/intern/ghost/intern/GHOST_ContextVK.h
@@ -26,6 +26,8 @@
 
 #include "GHOST_Context.h"
 
+#include <vulkan/vulkan.h>
+
 #ifndef GHOST_OPENGL_VK_CONTEXT_FLAGS
 /* leave as convenience define for the future */
 #  define GHOST_OPENGL_VK_CONTEXT_FLAGS 0
@@ -96,6 +98,7 @@ class GHOST_ContextVK : public GHOST_Context {
   GHOST_TSuccess getSwapInterval(int &intervalOut);
 
  private:
+  VkInstance m_instance;
 };
 
 #endif  // __GHOST_CONTEXTVK_H__



More information about the Bf-blender-cvs mailing list