| 44 | #endif |
| 45 | |
| 46 | U32 createVulkanPtr(KMemory* memory, void* value, BoxedVulkanInfo* info) { |
| 47 | KProcessPtr process = KThread::currentThread()->process; |
| 48 | BOXEDWINE_CRITICAL_SECTION_WITH_MUTEX(process->freeVulkanPtrMutex); |
| 49 | U32 result = 0; |
| 50 | |
| 51 | if (value == nullptr) { |
| 52 | return 0; |
| 53 | } |
| 54 | if (process->vulkanPtrMap.get(value, result)) { |
| 55 | return result; |
| 56 | } |
| 57 | if (!process->vulkanFreePtrAddress) { |
| 58 | KThread* thread = KThread::currentThread(); |
| 59 | U32 address = thread->memory->mmap(thread, 0, K_PAGE_SIZE, K_PROT_READ | K_PROT_WRITE, K_MAP_ANONYMOUS | K_MAP_PRIVATE | K_MAP_BOXEDWINE, -1, 0); |
| 60 | for (U32 i = 0; i < K_PAGE_SIZE; i += 16) { |
| 61 | memory->writed(address + i, process->vulkanFreePtrAddress); |
| 62 | process->vulkanFreePtrAddress = address + i; |
| 63 | } |
| 64 | } |
| 65 | result = process->vulkanFreePtrAddress; |
| 66 | process->vulkanFreePtrAddress = memory->readd(process->vulkanFreePtrAddress); |
| 67 | memory->writeq(result, (U64)value); |
| 68 | |
| 69 | if (!info) { |
| 70 | info = new BoxedVulkanInfo(); |
| 71 | if (!pvkGetInstanceProcAddr) { |
| 72 | pvkGetInstanceProcAddr = (PFN_vkGetInstanceProcAddr)SDL_Vulkan_GetVkGetInstanceProcAddr(); |
| 73 | } |
| 74 | #undef VKFUNC |
| 75 | #undef VKFUNC_INSTANCE |
| 76 | #define VKFUNC_INSTANCE(f) info->pvk##f = (PFN_vk##f)pvkGetInstanceProcAddr((VkInstance)value, "vk"#f); if (!info->pvk##f) {kwarn("Boxedwine: Failed to load vk"#f);} else {info->functionAddressByName[B("vk"#f)]=1;} |
| 77 | #define VKFUNC(f) |
| 78 | #include "vkfuncs.h" |
| 79 | info->instance = (VkInstance)value; |
| 80 | |
| 81 | #ifdef _DEBUG1 |
| 82 | KNativeSystem::getScreen()->showWindow(true); |
| 83 | PFN_vkCreateDebugUtilsMessengerEXT debugFunc = (PFN_vkCreateDebugUtilsMessengerEXT)pvkGetInstanceProcAddr((VkInstance)value, "vkCreateDebugUtilsMessengerEXT"); |
| 84 | VkDebugUtilsMessengerCreateInfoEXT createInfo; |
| 85 | memset(&createInfo, 0, sizeof(VkDebugUtilsMessengerCreateInfoEXT)); |
| 86 | createInfo.sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT; |
| 87 | createInfo.messageSeverity = VK_DEBUG_UTILS_MESSAGE_SEVERITY_VERBOSE_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT; |
| 88 | createInfo.messageType = VK_DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT; |
| 89 | createInfo.pfnUserCallback = debugCallback; |
| 90 | createInfo.pUserData = nullptr; |
| 91 | |
| 92 | if (debugFunc) { |
| 93 | debugFunc(info->instance, &createInfo, nullptr, &info->debugMessenger); |
| 94 | } else { |
| 95 | klog("Vulkan debug function not found"); |
| 96 | } |
| 97 | #endif |
| 98 | } |
| 99 | memory->writeq(result + 8, (U64)info); |
| 100 | vulkanPtrCount++; |
| 101 | vulkanPtrHighMark = std::max(vulkanPtrHighMark, vulkanPtrCount); |
| 102 | process->vulkanPtrMap.set(value, result); |
| 103 | return result; |
no test coverage detected