about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2023-12-01 13:48:35 +0100
committerptitSeb <sebastien.chev@gmail.com>2023-12-01 13:48:35 +0100
commitd6f7f620fcaf156b7a3a2b5b043307456863501f (patch)
tree311c79a0bfeaec0c8b7cdc323e23197453ffe339
parent1bd928a766d2ce170437a72d8c5099fddcebbc34 (diff)
downloadbox64-d6f7f620fcaf156b7a3a2b5b043307456863501f.tar.gz
box64-d6f7f620fcaf156b7a3a2b5b043307456863501f.zip
[VULKAN] Better wrapping of vkCreateInstance
-rw-r--r--src/wrapped/wrappedvulkan.c59
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)