From d6f7f620fcaf156b7a3a2b5b043307456863501f Mon Sep 17 00:00:00 2001 From: ptitSeb Date: Fri, 1 Dec 2023 13:48:35 +0100 Subject: [VULKAN] Better wrapping of vkCreateInstance --- src/wrapped/wrappedvulkan.c | 59 ++++++++++++++++++++++++++++++++++++++------- 1 file changed, 50 insertions(+), 9 deletions(-) (limited to 'src') diff --git a/src/wrapped/wrappedvulkan.c b/src/wrapped/wrappedvulkan.c index d5567ee0..a67b33fc 100644 --- a/src/wrapped/wrappedvulkan.c +++ b/src/wrapped/wrappedvulkan.c @@ -217,6 +217,19 @@ typedef struct my_VkDebugUtilsMessengerCreateInfoEXT_s { void* pUserData; } my_VkDebugUtilsMessengerCreateInfoEXT_t; +typedef struct my_VkDebugReportCallbackCreateInfoEXT_s { + int sType; + const void* pNext; + int flags; + void* pfnCallback; + void* pUserData; +} my_VkDebugReportCallbackCreateInfoEXT_t; + +typedef struct my_VkStruct_s { + int sType; + struct my_VkStruct_s* pNext; +} my_VkStruct_t; + #define SUPER() \ GO(0) \ GO(1) \ @@ -509,10 +522,46 @@ EXPORT int my_vkCreateGraphicsPipelines(x64emu_t* emu, void* device, uint64_t pi CREATE(vkCreateImage) CREATE(vkCreateImageView) +#define VK_STRUCTURE_TYPE_DEBUG_REPORT_CALLBACK_CREATE_INFO_EXT 1000011000 +#define VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT 1000128004 EXPORT int my_vkCreateInstance(x64emu_t* emu, void* pCreateInfos, my_VkAllocationCallbacks_t* pAllocator, void* pInstance) { my_VkAllocationCallbacks_t my_alloc; - return my->vkCreateInstance(pCreateInfos, find_VkAllocationCallbacks(&my_alloc, pAllocator), pInstance); + my_VkStruct_t *p = (my_VkStruct_t*)pCreateInfos; + void* old[20] = {0}; + int old_i = 0; + while(p) { + if(p->sType==VK_STRUCTURE_TYPE_DEBUG_REPORT_CALLBACK_CREATE_INFO_EXT) { + my_VkDebugReportCallbackCreateInfoEXT_t* vk = (my_VkDebugReportCallbackCreateInfoEXT_t*)p; + old[old_i] = vk->pfnCallback; + vk->pfnCallback = find_DebugReportCallbackEXT_Fct(old[old_i]); + old_i++; + } else if(p->sType==VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT) { + my_VkDebugUtilsMessengerCreateInfoEXT_t* vk = (my_VkDebugUtilsMessengerCreateInfoEXT_t*)p; + old[old_i] = vk->pfnUserCallback; + vk->pfnUserCallback = find_DebugUtilsMessengerCallback_Fct(old[old_i]); + old_i++; + } + p = p->pNext; + } + int ret = my->vkCreateInstance(pCreateInfos, find_VkAllocationCallbacks(&my_alloc, pAllocator), pInstance); + if(old_i) {// restore, just in case it's re-used? + p = (my_VkStruct_t*)pCreateInfos; + old_i = 0; + while(p) { + if(p->sType==VK_STRUCTURE_TYPE_DEBUG_REPORT_CALLBACK_CREATE_INFO_EXT) { + my_VkDebugReportCallbackCreateInfoEXT_t* vk = (my_VkDebugReportCallbackCreateInfoEXT_t*)p; + vk->pfnCallback = old[old_i]; + old_i++; + } else if(p->sType==VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT) { + my_VkDebugUtilsMessengerCreateInfoEXT_t* vk = (my_VkDebugUtilsMessengerCreateInfoEXT_t*)p; + vk->pfnUserCallback = old[old_i]; + old_i++; + } + p = p->pNext; + } + } + return ret; } CREATE(vkCreatePipelineCache) @@ -693,14 +742,6 @@ EXPORT void my_vkCmdPipelineBarrier(x64emu_t* emu, void* device, int src, int ds my->vkCmdPipelineBarrier(device, src, dst, dep, barrierCount, pBarriers, bufferCount, pBuffers, imageCount, pImages); } -typedef struct my_VkDebugReportCallbackCreateInfoEXT_s { - int sType; - void* pNext; - uint32_t flags; - void* pfnCallback; - void* pUserData; -} my_VkDebugReportCallbackCreateInfoEXT_t; - EXPORT int my_vkCreateDebugReportCallbackEXT(x64emu_t* emu, void* instance, my_VkDebugReportCallbackCreateInfoEXT_t* create, my_VkAllocationCallbacks_t* alloc, void* callback) -- cgit 1.4.1