]> O.S.I.I.S - jp/vkhelpers.git/commitdiff
debug utils
authorJean-Philippe Bruyère <jp_bruyere@hotmail.com>
Wed, 22 Jan 2020 21:45:03 +0000 (22:45 +0100)
committerJean-Philippe Bruyère <jp_bruyere@hotmail.com>
Wed, 22 Jan 2020 21:45:03 +0000 (22:45 +0100)
include/vkh.h
src/vkh_app.c
src/vkh_app.h
src/vkh_device.c

index 1cabdfcc5fca403374b515a0cfa203e1ac87a1b1..44f937b92048a917d92ecadcb42237f53ff93980 100644 (file)
@@ -69,6 +69,9 @@ VkInstance          vkh_app_get_inst    (VkhApp app);
 VkPhysicalDevice    vkh_app_select_phy  (VkhApp app, VkPhysicalDeviceType preferedPhyType);
 VkhPhyInfo*         vkh_app_get_phyinfos    (VkhApp app, uint32_t* count, VkSurfaceKHR surface);
 void                vkh_app_free_phyinfos   (uint32_t count, VkhPhyInfo* infos);
+void                vkh_app_enable_debug_messenger (VkhApp app, VkDebugUtilsMessageTypeFlagsEXT typeFlags,
+                                                    VkDebugUtilsMessageSeverityFlagsEXT severityFlags,
+                                                    PFN_vkDebugUtilsMessengerCallbackEXT callback);
 
 VkPhysicalDeviceProperties          vkh_app_get_phy_properties          (VkhApp app, uint32_t phyIndex);
 
index 93b8ae8e3922ea229c2a639a99aca8af27234377..cc387abc13937394eee9ae061cfb05fba81450c4 100644 (file)
 #define ENGINE_NAME     "vkhelpers"
 #define ENGINE_VERSION  1
 
+
+static PFN_vkDestroyDebugUtilsMessengerEXT DestroyDebugUtilsMessenger;
+
+VkBool32 debugUtilsMessengerCallback (
+    VkDebugUtilsMessageSeverityFlagBitsEXT           messageSeverity,
+    VkDebugUtilsMessageTypeFlagsEXT                  messageTypes,
+    const VkDebugUtilsMessengerCallbackDataEXT*      pCallbackData,
+    void*                                            pUserData) {
+
+    switch (messageSeverity) {
+    case VK_DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXT:
+        printf (KGRN);
+        break;
+    case VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT:
+        printf (KYEL);
+        break;
+    case VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT:
+        printf (KRED);
+        break;
+    }
+    switch (messageTypes) {
+    case VK_DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXT:
+        printf ("GEN: ");
+        break;
+    case VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT:
+        printf ("VAL: ");
+        break;
+    case VK_DEBUG_UTILS_MESSAGE_TYPE_PERFORMANCE_BIT_EXT:
+        printf ("PRF: ");
+        break;
+    }
+
+    printf (KNRM);
+    printf ("%s\n", pCallbackData->pMessage);
+
+
+    fflush(stdout);
+    return VK_FALSE;
+}
+
 VkhApp vkh_app_create (const char* app_name, uint32_t enabledLayersCount, const char* enabledLayers[], uint32_t ext_count, const char* extentions[]) {
     VkhApp app = (VkhApp)malloc(sizeof(vkh_app_t));
 
@@ -44,10 +84,17 @@ VkhApp vkh_app_create (const char* app_name, uint32_t enabledLayersCount, const
 
     VK_CHECK_RESULT(vkCreateInstance (&inst_info, NULL, &app->inst));
     app->infos = infos;
+    app->debugMessenger = VK_NULL_HANDLE;
     return app;
 }
 
 void vkh_app_destroy (VkhApp app){
+    if (app->debugMessenger != VK_NULL_HANDLE) {
+        PFN_vkDestroyDebugUtilsMessengerEXT  DestroyDebugUtilsMessenger = (PFN_vkDestroyDebugUtilsMessengerEXT)
+                vkGetInstanceProcAddr(app->inst, "vkDestroyDebugUtilsMessengerEXT");
+
+        DestroyDebugUtilsMessenger (app->inst, app->debugMessenger, VK_NULL_HANDLE);
+    }
     vkDestroyInstance (app->inst, NULL);
     free (app);
 }
@@ -73,7 +120,34 @@ void vkh_app_free_phyinfos (uint32_t count, VkhPhyInfo* infos) {
         vkh_phyinfo_destroy (infos[i]);
     free (infos);
 }
+/**
+ * @brief Add a Debug utils messenger to this  VkhApp. It will be destroyed on VkhApp end.
+ * @param VKH application pointer containing vkInstance.
+ * @param Message type flags
+ * @param Message severity flags.
+ * @param optional message callback, if null a default one which print to stdout is configured.
+ */
+void vkh_app_enable_debug_messenger (VkhApp app,
+    VkDebugUtilsMessageTypeFlagsEXT typeFlags,
+    VkDebugUtilsMessageSeverityFlagsEXT severityFlags,
+    PFN_vkDebugUtilsMessengerCallbackEXT callback){
+
+    VkDebugUtilsMessengerCreateInfoEXT info = { .sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT,
+                                                .pNext = VK_NULL_HANDLE,
+                                                .flags = 0,
+                                                .messageSeverity = severityFlags,
+                                                .messageType = typeFlags,
+                                                .pUserData = NULL };
+    if (callback == NULL)
+        info.pfnUserCallback = (PFN_vkDebugUtilsMessengerCallbackEXT)debugUtilsMessengerCallback;
+    else
+        info.pfnUserCallback = callback;
 
+    PFN_vkCreateDebugUtilsMessengerEXT  CreateDebugUtilsMessenger = (PFN_vkCreateDebugUtilsMessengerEXT)
+            vkGetInstanceProcAddr(app->inst, "vkCreateDebugUtilsMessengerEXT");
+
+    CreateDebugUtilsMessenger(app->inst, &info, VK_NULL_HANDLE, &app->debugMessenger);
+}
 
 VkPhysicalDevice vkh_app_select_phy (VkhApp app, VkPhysicalDeviceType preferedPhyType) {
     /*if (app->phyCount == 1)
index 07cc39496005489f1411bf3f61dc9bc7e3742859..76dee6c42e8a99238e5601e9e2e4cf8615d3354d 100644 (file)
@@ -28,9 +28,28 @@ extern "C" {
 
 #include "vkh.h"
 
+//console colors for debug output on stdout with debug utils or debug report
+#ifdef __unix__
+    #define KNRM  "\x1b[0m"
+    #define KRED  "\x1B[41m\x1B[37m"
+    #define KGRN  "\x1B[42m\x1B[30m"
+    #define KYEL  "\x1B[43m\x1B[30m"
+    #define KBLU  "\x1B[44m\x1B[30m"
+#else
+    #define KNRM  ""
+    #define KRED  ""
+    #define KGRN  ""
+    #define KYEL  ""
+    #define KBLU  ""
+    #define KMAG  ""
+    #define KCYN  ""
+    #define KWHT  ""
+#endif
+
 typedef struct _vkh_app_t{
     VkApplicationInfo   infos;
     VkInstance          inst;
+    VkDebugUtilsMessengerEXT debugMessenger;
 }vkh_app_t;
 #ifdef __cplusplus
 }
index 9ec36cc20982327388af2eaeb99b6405906816e7..7f508b3a1f173ba6666e440e6ccc39c1e688db57 100644 (file)
 #include "vkh_app.h"
 #include "string.h"
 
-#define KNRM  "\x1B[0m\x1B[40m"
-#define KRED  "\x1B[31m\x1B[40m"
-#define KGRN  "\x1B[32m\x1B[40m"
-#define KYEL  "\x1B[33m\x1B[40m"
-#define KBLU  "\x1B[34m\x1B[40m"
-#define KMAG  "\x1B[35m\x1B[40m"
-#define KCYN  "\x1B[36m\x1B[40m"
-#define KWHT  "\x1B[37m\x1B[40m"
-
 static VkDebugReportCallbackEXT msgCallback;
 static PFN_vkDebugMarkerSetObjectNameEXT    DebugMarkerSetObjectNameEXT;
 //I add debug markers here for convenience even if device is not part of the signature.
@@ -40,7 +31,7 @@ static PFN_vkCmdDebugMarkerBeginEXT         CmdDebugMarkerBegin;
 static PFN_vkCmdDebugMarkerEndEXT           CmdDebugMarkerEnd;
 static PFN_vkCmdDebugMarkerInsertEXT        CmdDebugMarkerInsert;
 
-VKAPI_ATTR VkBool32 VKAPI_CALL messageCallback(
+VkBool32 VKAPI_CALL messageCallback(
     VkDebugReportFlagsEXT flags,
     VkDebugReportObjectTypeEXT objType,
     uint64_t srcObject,
@@ -52,22 +43,22 @@ VKAPI_ATTR VkBool32 VKAPI_CALL messageCallback(
 {
     switch (flags) {
         case VK_DEBUG_REPORT_ERROR_BIT_EXT:
-            printf ("%sERR: %s\n",KRED, pMsg);
+            printf ("%sERR: %s%s\n",KRED, pMsg, KNRM);
             break;
         case VK_DEBUG_REPORT_DEBUG_BIT_EXT:
-            printf ("%sDBG: %s\n",KMAG, pMsg);
+            printf ("%sDBG: %s%s\n",KNRM, pMsg, KNRM);
             break;
         case VK_DEBUG_REPORT_WARNING_BIT_EXT:
-            printf ("%sWRN: %s\n",KYEL, pMsg);
+            printf ("%sWRN: %s%s\n",KYEL, pMsg, KNRM);
             break;
         case VK_DEBUG_REPORT_INFORMATION_BIT_EXT:
-            printf ("%sNFO: %s\n",KCYN, pMsg);
+            printf ("%sNFO: %s%s\n",KGRN, pMsg, KNRM);
             break;
         case VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT:
-            printf ("%sPRF: %s\n",KWHT, pMsg);
+            printf ("%sPRF: %s%s\n",KBLU, pMsg, KNRM);
             break;
         default:
-            printf ("%sMSG: %s\n",KBLU, pMsg);
+            printf ("%sMSG: %s%s\n",KBLU, pMsg, KNRM);
             break;
     }
     fflush(stdout);