我能夠獲得指向所有Vulkan核心函數的指針,但獲取指向Vulkan擴展函數的指針失敗。爲什麼vkGetInstanceProcAddr()對擴展函數失敗?
首先,我得到一個指向vk_icdGetInstanceProcAddr()
,有了它,我得到的指針全球福爾康功能(例如vkCreateInstance()
)。我能夠在創建實例VK_KHR_surface
和VK_KHR_win32_surface
擴展,以及它們列出由vulkaninfo.exe和vkEnumerateInstanceExtensionProperties()
作爲支持。在創建Vulkan實例後,我得到了指向所有實例函數的指針,其中包含vk_icdGetInstanceProcAddr()
和實例句柄。但是,例如,在嘗試獲取指向vkCreateWin32SurfaceKHR()
的指針時,將返回空指針。與vkDestroySurfaceKHR()
相同。
我的Nvidia驅動程序安裝與福爾康API 1.0.3支持356.39。難道我做錯了什麼?
的代碼:
// Gets vk_icdGetInstanceProcAddr() from the driver DLL
vkGetInstanceProcAddr = getLibraryFunction("vk_icdGetInstanceProcAddr");
vkCreateInstance = vkGetInstanceProcAddr(nullptr, "vkCreateInstance");
const std::array<const char*, 2u> extensionNames
{
"VK_KHR_surface",
"VK_KHR_win32_surface"
};
VkInstanceCreateInfo instanceInfo = VkInstanceCreateInfo();
instanceInfo.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO;
instanceInfo.enabledExtensionCount = static_cast<uint32_t>(extensionNames.size());
instanceInfo.ppEnabledExtensionNames = extensionNames.data();
VkInstance instanceHandle;
vkCreateInstance(&instanceInfo, nullptr, &instanceHandle);
// Returns a non-null pointer
vkCreateDevice = vkGetInstanceProcAddr(instanceHandle, "vkCreateDevice");
// Returns a null pointer
vkCreateWin32SurfaceKHR = vkGetInstanceProcAddr(instanceHandle, "vkCreateWin32SurfaceKHR");
你直接獲得驅動程序DLL的指針,而不是僅僅使用你已經有任何理由「*從驅動程序DLL *獲取vk_icdGetInstanceProcAddr()」? –
因爲我已經什麼都沒有了。我沒有使用任何第三方代碼或庫。 – Devenec
我認爲他們的意思是該功能在[vulkan.h(https://www.khronos.org/registry/vulkan/specs/1.0/xhtml/vkspec.html#vkGetInstanceProcAddr),你不需要查詢它的DLL。 – ashleysmithgpu