diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2023-12-01 13:48:35 +0100 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2023-12-01 13:48:35 +0100 |
| commit | d6f7f620fcaf156b7a3a2b5b043307456863501f (patch) | |
| tree | 311c79a0bfeaec0c8b7cdc323e23197453ffe339 | |
| parent | 1bd928a766d2ce170437a72d8c5099fddcebbc34 (diff) | |
| download | box64-d6f7f620fcaf156b7a3a2b5b043307456863501f.tar.gz box64-d6f7f620fcaf156b7a3a2b5b043307456863501f.zip | |
[VULKAN] Better wrapping of vkCreateInstance
| -rw-r--r-- | src/wrapped/wrappedvulkan.c | 59 |
1 files changed, 50 insertions, 9 deletions
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) |