diff --git a/rendering_api/vulkan/src/debugger/vulkan_debugger.c b/rendering_api/vulkan/src/debugger/vulkan_debugger.c index 4594783..e6e37d2 100644 --- a/rendering_api/vulkan/src/debugger/vulkan_debugger.c +++ b/rendering_api/vulkan/src/debugger/vulkan_debugger.c @@ -114,6 +114,9 @@ gnReturnCode gnCreateDebuggerFn(gnDebugger* debugger, gnInstance* instance, cons } } + instance->instance->instanceMessageCount = 0; + free(instance->instance->instanceMessages); + const char* layers[] = { "VK_LAYER_KHRONOS_validation" }; @@ -154,5 +157,5 @@ gnReturnCode gnCreateDebuggerFn(gnDebugger* debugger, gnInstance* instance, cons } void gnDestroyDebuggerFn(gnDebugger* debugger) { - vk_destroyDebugUtilsMessengerEXT(*debugger->debugger->instance, debugger->debugger->debugMessenger, NULL); + vk_destroyDebugUtilsMessengerEXT(debugger->instance->instance->vk_instance, debugger->debugger->debugMessenger, NULL); } diff --git a/rendering_api/vulkan/src/debugger/vulkan_debugger.h b/rendering_api/vulkan/src/debugger/vulkan_debugger.h index 8658b20..8bed69f 100644 --- a/rendering_api/vulkan/src/debugger/vulkan_debugger.h +++ b/rendering_api/vulkan/src/debugger/vulkan_debugger.h @@ -4,7 +4,6 @@ typedef struct gnPlatformDebugger_t { VkDebugUtilsMessengerEXT debugMessenger; - VkInstance* instance; } gnPlatformDebugger; #ifdef __cplusplus diff --git a/rendering_api/vulkan/src/instance/vulkan_instance.c b/rendering_api/vulkan/src/instance/vulkan_instance.c index bd890ca..a9dbd0e 100644 --- a/rendering_api/vulkan/src/instance/vulkan_instance.c +++ b/rendering_api/vulkan/src/instance/vulkan_instance.c @@ -30,18 +30,25 @@ static VKAPI_ATTR VkBool32 VKAPI_CALL vk_debuggerDebugCallback( } gnInstance* instance = (gnInstance*)pUserData; - instance->instance->instanceMessageCount++; - if (instance->instance->instanceMessageCount == 1) { - instance->instance->instanceMessages = malloc(sizeof(struct gnInstanceMessage) * instance->instance->instanceMessageCount); + + if (instance->debugger) { + instance->debugger->info.callback( + severity, type, data, instance->debugger->info.userData + ); + } else { + instance->instance->instanceMessageCount++; + if (instance->instance->instanceMessageCount == 1) { + instance->instance->instanceMessages = malloc(sizeof(struct gnInstanceMessage) * instance->instance->instanceMessageCount); + } + else { + instance->instance->instanceMessages = realloc(instance->instance->instanceMessages, sizeof(struct gnInstanceMessage) * instance->instance->instanceMessageCount); + } + instance->instance->instanceMessages[instance->instance->instanceMessageCount - 1] = (struct gnInstanceMessage){ + .data = data, + .severity = severity, + .type = type + }; } - else { - instance->instance->instanceMessages = realloc(instance->instance->instanceMessages, sizeof(struct gnInstanceMessage) * instance->instance->instanceMessageCount); - } - instance->instance->instanceMessages[instance->instance->instanceMessageCount - 1] = (struct gnInstanceMessage){ - .data = data, - .severity = severity, - .type = type - }; return VK_FALSE; } diff --git a/src/core/debugger/gryphn_debugger.c b/src/core/debugger/gryphn_debugger.c index c7217bb..79d04e8 100644 --- a/src/core/debugger/gryphn_debugger.c +++ b/src/core/debugger/gryphn_debugger.c @@ -1,15 +1,11 @@ #include "gryphn_debugger.h" -#include "core/gryphn_platform_functions.h" +#include #include "stdio.h" -gnReturnCode gnCreateDebugger(gnDebugger* debugger, gnInstance* instance, const struct gnDebuggerInfo_t info) { - if (instance->debugger != NULL) - return GN_DEBUGGER_EXISTS; +gnReturnCode gnCreateDebugger(gnDebugger* debugger, const struct gnDebuggerInfo_t info) { debugger->info = info; - debugger->instance = instance; - instance->debugger = debugger; - return instance->functions->_gnCreateDebugger(debugger, instance, info); + return GN_SUCCESS; } void gnDestroyDebugger(gnDebugger* debugger) { - debugger->instance->functions->_gnDestroyDebugger(debugger); + // debugger->instance->functions->_gnDestroyDebugger(debugger); } diff --git a/src/core/debugger/gryphn_debugger.h b/src/core/debugger/gryphn_debugger.h index 35cea38..f55d51d 100644 --- a/src/core/debugger/gryphn_debugger.h +++ b/src/core/debugger/gryphn_debugger.h @@ -50,7 +50,7 @@ typedef struct gnDebugger_t { gnInstance* instance; } gnDebugger; -gnReturnCode gnCreateDebugger(gnDebugger* debugger, gnInstance* instance, const struct gnDebuggerInfo_t info); +gnReturnCode gnCreateDebugger(gnDebugger* debugger, const struct gnDebuggerInfo_t info); void gnDestroyDebugger(gnDebugger* debugger); static void gnDebuggerSetErrorMessage(gnDebugger* debugger, gnMessageData data) { diff --git a/src/core/instance/gryphn_instance.c b/src/core/instance/gryphn_instance.c index 46c5b3e..6aec01c 100644 --- a/src/core/instance/gryphn_instance.c +++ b/src/core/instance/gryphn_instance.c @@ -1,6 +1,7 @@ #include "gryphn_instance.h" #include "init/gryphn_init.h" #include +#include "core/debugger/gryphn_debugger.h" gnReturnCode gnCreateInstance(gnInstance* instance, struct gnInstanceInfo_t info) { if (!gnIsAPISupported(info.renderingAPI)) return GN_UNSUPPORTED_RENDERING_API; @@ -11,6 +12,31 @@ gnReturnCode gnCreateInstance(gnInstance* instance, struct gnInstanceInfo_t info gnLoadFunctions(instance->dynamicLib, instance->functions); return instance->functions->_gnCreateInstance(instance, info); } + +void gnInstanceAttachDebugger(gnInstance *instance, struct gnDebugger_t *debugger) { + if (instance->debugger != NULL) { + gnDebuggerSetErrorMessage(debugger, (gnMessageData){ + .message = gnCreateString("Debugger already attached to instance") + }); + } + instance->debugger = debugger; + debugger->instance = instance; + gnReturnCode debuggerInfo = instance->functions->_gnCreateDebugger(debugger, instance, debugger->info); + if (debuggerInfo != GN_SUCCESS) { + gnDebuggerSetErrorMessage(debugger, (gnMessageData){ + .message = gnCreateString("Failed to attach debugger to instance") + }); + } +} + +#include "stdio.h" void gnDestroyInstance(gnInstance* instance) { + if (instance->debugger) { + instance->functions->_gnDestroyDebugger(instance->debugger); + } instance->functions->_gnDestroyInstance(instance); } + +void gnInstanceReleaseDebugger(gnInstance* instance) { + instance->debugger = NULL; +} diff --git a/src/core/instance/gryphn_instance.h b/src/core/instance/gryphn_instance.h index cbd3871..893b131 100644 --- a/src/core/instance/gryphn_instance.h +++ b/src/core/instance/gryphn_instance.h @@ -28,4 +28,6 @@ typedef struct gnInstance_t { } gnInstance; gnReturnCode gnCreateInstance(gnInstance* instance, struct gnInstanceInfo_t info); +void gnInstanceAttachDebugger(gnInstance* istance, struct gnDebugger_t* debugger); +void gnInstanceReleaseDebugger(gnInstance* instance); void gnDestroyInstance(gnInstance* instance);