2016-03-06 24 views
1

我能夠獲得指向所有Vulkan核心函數的指針,但獲取指向Vulkan擴展函數的指針失敗。爲什麼vkGetInstanceProcAddr()對擴展函數失敗?

首先,我得到一個指向vk_icdGetInstanceProcAddr(),有了它,我得到的指針全球福爾康功能(例如vkCreateInstance())。我能夠在創建實例VK_KHR_surfaceVK_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"); 
+0

你直接獲得驅動程序DLL的指針,而不是僅僅使用你已經有任何理由「*從驅動程序DLL *獲取vk_icdGetInstanceProcAddr()」? –

+0

因爲我已經什麼都沒有了。我沒有使用任何第三方代碼或庫。 – Devenec

+0

我認爲他們的意思是該功能在[vulkan.h(https://www.khronos.org/registry/vulkan/specs/1.0/xhtml/vkspec.html#vkGetInstanceProcAddr),你不需要查詢它的DLL。 – ashleysmithgpu

回答