MCPcopy Create free account
hub / github.com/danoon2/Boxedwine / createVulkanPtr

Function createVulkanPtr

source/vulkan/vulkancommon.cpp:46–104  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

44#endif
45
46U32 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;

Callers 6

vk_CreateInstanceFunction · 0.85
vk_CreateDeviceFunction · 0.85
vk_GetDeviceQueueFunction · 0.85
vk_GetDeviceQueue2Function · 0.85

Calls 10

klogFunction · 0.85
maxFunction · 0.85
mmapMethod · 0.80
writeqMethod · 0.80
getMethod · 0.45
writedMethod · 0.45
readdMethod · 0.45
showWindowMethod · 0.45
setMethod · 0.45

Tested by

no test coverage detected