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);
#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));
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);
}
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)
#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
}
#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.
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,
{
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);