[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