Browse Source

Improve instance creation, remove debugging from release

Kajetan Johannes Hammerle 3 months ago
parent
commit
0308267b71
2 changed files with 47 additions and 17 deletions
  1. 1 1
      CMakeLists.txt
  2. 46 16
      src/VulkanWrapper.c

+ 1 - 1
CMakeLists.txt

@@ -25,7 +25,7 @@ if("${CMAKE_BUILD_TYPE}" STREQUAL "Release")
     set(LOG_LEVEL 2)
     set(DEFINITIONS CHECK_MEMORY)
 else()
-    set(DEFINITIONS ERROR_SIMULATOR CHECK_MEMORY)
+    set(DEFINITIONS ERROR_SIMULATOR CHECK_MEMORY DEBUG_VULKAN)
     if(CMAKE_C_COMPILER_ID STREQUAL "GNU")
         set(COMPILE_OPTIONS --coverage)
         set(LINK_OPTIONS gcov)

+ 46 - 16
src/VulkanWrapper.c

@@ -21,8 +21,10 @@ typedef struct {
     // basic setup
     VkInstance instance;
     VkSurfaceKHR surface;
+#ifdef DEBUG_VULKAN
     VkDebugUtilsMessengerEXT debugMessenger;
     VkDebugReportCallbackEXT debugReportCallback;
+#endif
     // render setup
     u32 graphicsFamily;
     VkPhysicalDevice physicalDevice;
@@ -57,9 +59,7 @@ static const char* getVulkanErrorString(VkResult r) {
     do {                                                                     \
         VkResult vkResult = (a);                                             \
         if(vkResult != VK_SUCCESS) {                                         \
-            printf(                                                          \
-                "Vulkan error at [%s:%d]: %s\n", getShortFileName(__FILE__), \
-                __LINE__, getVulkanErrorString(vkResult));                   \
+            LOG_ERROR("Vulkan error: %s\n", getVulkanErrorString(vkResult)); \
             return true;                                                     \
         }                                                                    \
     } while(false)
@@ -70,32 +70,50 @@ static PFN_vkVoidFunction getVulkanFunction(const char* name) {
 
 #define GET_VULKAN_FUNCTION(name) ((PFN_##name)getVulkanFunction(#name))
 
-static int64_t someData[] = {10'000, 2,           3,   4,          5,
-                             6,      0xFFFF'FFFF, 'a', 0b1000'0001};
-
 static bool initInstance() {
-    (void)someData; //    gusi
-    VkApplicationInfo i = {
+    u32 baseCount = 0;
+    const char** baseExtensions = glfwGetRequiredInstanceExtensions(&baseCount);
+    if(baseExtensions == nullptr) {
+        LOG_ERROR("Could not get required extensions from GLFW");
+        return true;
+    }
+#ifdef DEBUG_VULKAN
+    u32 count = baseCount + 2;
+    const char* extensions[32];
+    if(count > ARRAY_LENGTH(extensions)) {
+        LOG_ERROR("Extension buffer is too small");
+        return true;
+    }
+    for(u32 i = 0; i < baseCount; i++) {
+        extensions[i] = baseExtensions[i];
+    }
+    extensions[baseCount] = VK_EXT_DEBUG_UTILS_EXTENSION_NAME;
+    extensions[baseCount + 1] = VK_EXT_DEBUG_REPORT_EXTENSION_NAME;
+#else
+    u32 count = baseCount;
+    const char** extensions = baseExtensions;
+#endif
+    VkApplicationInfo appInfo = {
         .sType = VK_STRUCTURE_TYPE_APPLICATION_INFO,
         .pApplicationName = "Vulkan",
         .applicationVersion = VK_MAKE_VERSION(1, 0, 0),
         .pEngineName = "Kajetan",
         .engineVersion = VK_MAKE_VERSION(0, 0, 1),
         .apiVersion = VK_API_VERSION_1_1};
-    VkInstanceCreateInfo ci = {
+    VkInstanceCreateInfo info = {
         .sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO,
-        .pApplicationInfo = &i,
+        .pApplicationInfo = &appInfo,
+#ifdef DEBUG_VULKAN
         .enabledLayerCount = 1,
         .ppEnabledLayerNames = (const char*[]){"VK_LAYER_KHRONOS_validation"},
-        .enabledExtensionCount = 4,
-        .ppEnabledExtensionNames =
-            (const char*[]){"VK_KHR_surface", "VK_KHR_wayland_surface",
-                            VK_EXT_DEBUG_UTILS_EXTENSION_NAME,
-                            VK_EXT_DEBUG_REPORT_EXTENSION_NAME}};
-    VK_ASSERT(vkCreateInstance(&ci, nullptr, &vk.instance));
+#endif
+        .enabledExtensionCount = count,
+        .ppEnabledExtensionNames = extensions};
+    VK_ASSERT(vkCreateInstance(&info, nullptr, &vk.instance));
     return false;
 }
 
+#ifdef DEBUG_VULKAN
 static VKAPI_ATTR VkBool32 onVulkanDebugMessenger VKAPI_CALL(
     VkDebugUtilsMessageSeverityFlagBitsEXT, VkDebugUtilsMessageTypeFlagsEXT,
     const VkDebugUtilsMessengerCallbackDataEXT* data, void*) {
@@ -165,6 +183,18 @@ static void destroyDebugReportCallback() {
     }
     f(vk.instance, vk.debugReportCallback, nullptr);
 }
+#else
+static bool initDebugging() {
+    (void)getVulkanFunction;
+    return false;
+}
+
+static void destroyDebugMessenger() {
+}
+
+static void destroyDebugReportCallback() {
+}
+#endif
 
 static bool choosePhysicalDevice(VkPhysicalDevice* devices, u32 amount) {
     VK_ASSERT(vkEnumeratePhysicalDevices(vk.instance, &amount, devices));