AMD missing VkFullScreenExclusiveEXT functionality

I’m still very new to Vulkan, and only just starting to navigate what’s possible and how.

I’m trying to explore usage of vkAcquireFullScreenExclusiveModeEXT
Outside of what’s necessary to actually use this functionality, it seems the endpoints themselves don’t exist in AMD’s drivers.

Linking against vulkan-1.lib at compile time results in

error LNK2019: unresolved external symbol vkGetPhysicalDeviceSurfacePresentModes2EXT referenced in function "private: struct VulkanWrapper::SwapChainSupportDetails __cdecl VulkanWrapper::querySwapChainSupport(struct VkPhysicalDevice_T *)" (?querySwapChainSupport@VulkanWrapper@@AEAA?AUSwapChainSupportDetails@1@PEAUVkPhysicalDevice_T@@@Z)
error LNK2019: unresolved external symbol vkAcquireFullScreenExclusiveModeEXT referenced in function "private: enum VkResult __cdecl VulkanWrapper::createSwapChain(void)" (?createSwapChain@VulkanWrapper@@AEAA?AW4VkResult@@XZ)

Further to that, when I’m linking indirectly via LoadLibrary() - I’m able to obtain a valid proc address for both of these functions using vkGetInstanceProcAddr()

Regardless of seemingly having a valid proc addres…

vkAcquireFullScreenExclusiveModeEXT fails at runtime:
Exception thrown at 0x0000000000000000 in Offworld.exe: 0xC0000005: Access violation executing location 0x0000000000000000.

I can confirm I have a valid device handle and swapchain created, but that fact that I’m unable to link against these functions at compile time is a bit of a red flag.

Note that the Vulkan Configuration Tool reports:
image

Vulkan Instance Version: 1.2.131
apiVersion = 4202627 (1.2.131)
driverVersion = 8388735 (0x80007f)
vendorID = 0x1002
deviceID = 0x67df
deviceType = PHYSICAL_DEVICE_TYPE_DISCRETE_GPU
deviceName = Radeon RX 580 Series

Is this an issue with AMD drivers generally or am I doing something ill-advised?

Why would you be able to? It’s an extension; you have to load them dynamically. Or use a loader library to do it for you.

In any case, VK_EXT_full_screen_exclusive is a device extension, so you probably shouldn’t be using vkGetInstanceProcAddr to query the function pointers for it.

That’s irrelevant. Unless you created the device with that extension explicitly in the create command’s extension list, it is unavailable to you.

Thanks Alfonse.
I hadn’t grasped that extensions wouldn’t be available at link time.

I think I was thrown by vkGetInstanceProcAddr seeming to return a valid pointer led me to believe I was on the right path…

I had tried vkGetDeviceProcAddr and didn’t seem to be having any luck.
It turns out that while I was querying for support of VK_EXT_full_screen_exclusive, I had fallen short of actually requesting it.

Thanks for setting me straight.
Now to understand when it’s useful/usable.