[Windows] Driver Developers Please Add Option For Disabling Fullscreen Exclusive

TL;DR: when creating a fullscreen window, the driver automatically makes the window “exclusive”. There should be an option to disable this. If anybody knows where one can directly contact AMD/Nvidia driver developers about this I would appreciate the help.

This post is regarding the Windows implementation of Vulkan. I have Windows 10 64-bit with an AMD Radeon RX 460 with latest drivers, but I suspect that this applies to Nvidia cards as well as I explain below.

When a program creates a fullscreen window (i.e. a window with the same size of the screen, with a window style including WS_POPUP) along with a Vulkan context and begins to present swapchains, the driver puts the window into “exclusive” mode. When in “exclusive” mode, certain useful overlays from other programs won’t get displayed. For instance, when pressing the volume control keys on my keyboard, the overlay for the volume won’t get displayed. Skype notifications won’t appear. “Always on Top” windows won’t appear. Also, there is a noticeable flicker when switching to and from other windows, as shown by this video.

I understand that this is a measure to increase performance, as the driver only has to be concerned with blitting a single surface. However, performance isn’t always the number one priority for everyone in all cases, and as such there should be an option to enable/disable this, perhaps in the same manner as other options in software control panels like this. It would be so convenient just to have a little button there to enable/disable “Exclusive Fullscreen”.

I suspect that this also applies to Nvidia cards as well, judging from this post.

Little nitpicky stuff like this is probably not on the priority list of big corporations. Still, I cannot imagine that this option would be too complicated to add, and perhaps contacting just the right person could make this a reality. If somebody knows how to contact people involved with Vulkan driver development, I would greatly appreciate if you could forward this message to them.

To reproduce this problem, one can download mpv player, and run the command:

./mpv.exe --fs --gpu-api=vulkan path_to_a_video

and you should experience the same thing if you have the latest drivers. Changing the “–gpu-api” to “opengl” or “d3d11”, even in fullscreen mode, does not exhibit the “exclusive” behavior for me. The same thing occurs in the popular online game “DotA 2” in Vulkan mode.

TMK it has nothing to do with Vulkan (unless there is some kind of bug – either in drivers or the app).
All of that is done through Win32 (resp. GLFW as in your video).

Either you do temporary fullscreen (for some reason called “exclusive” among general populace) using ChangeDisplaySettings and CDS_FULLSCREEN. You can choose your resolution, but obviously you need a mode switch (which for some reason still takes forever and causes artifacts even in 21 century).

Or (for so called “borderless fullscreen”) you simply resize the window to the current resolution and change the window style to remove borders and title bar (just by using Win32 API only too).

Maybe related: Vulkan + GLFW Fullscreen mode have “blink” when exit or switch to desktop - Vulkan - Khronos Forums . Anyway (shameless self-promotion) I link an app there that (assumably) does not blink on switch to fullscreen.

I understand that this is a measure to increase performance, as the driver only has to be concerned with blitting a single surface.

Again, TMK not a driver’s job. Sounds like OS compositor stuff. Either way, it would have to be quite dumb if it does not clip obscured windows.

That being said, it would be so nice to have a switch in the GPU setting overriding the app behavior (similar to the VSync setting). I am not sure it is even implementable though, but can’t hurt to ask.

Thanks for the reply.

I have not tried your linked program (BTW link should be GitHub - krOoze/Hello_Triangle: Hello World like demo for Vulkan API , the link provided just redirects to github.com), but I indeed already tried the “borderless fullscreen” in GLFW according to the GLFW docs. It does not blink as much as ChangeDisplaySettings, but there is still a slight blink.

But the real issue is that overlays are not being displayed. When I press the volume controls on my keyboard, I do not see the volume overlay. I do not see Skype notifications. These things are sometimes desirable to some people in some cases, even when playing fullscreen games.

D3D11 provides the option for non-exclusive fullscreen right in the API, but Vulkan does not. There should be some mechanism, through the API or through extertnal means (like a software control panel) to enable/disable this behavior.

When I’m playing a game, or maybe even watching a video, I do not want to see the taskbar. Currently the only recommended way to hide the taskbar is to create a fullscreen window. And that forces this “exclusive” behavior. Which I do not want.

You mean DXGI? (Same walled garden, but for the sake of nitpickery, that is a different API.)
Anyway Vulkan is rendering API. It does not care that much about windows, and their states.
And yeah AIS, it would be nice to have it in control panel. E.g. would be nice to force old games into borderless. That is if it is even feasible to implement such feature reasonably. I mean if app wants temporary fullscreen, and you instead force it to borderless, there are some serious compatibility implications.

Should not IMO. AIS seems like a bug somewhere.
I have been able to reproduce it with GLFW. Seems like the fullscreen window is simply on higher z-level than the Windows 10 Notification (e.g. Skype) popups.
Radeon ReLive overlay seems to work for me though…

PS: I tried for fun to record it at 60 fps to see what is going on. Borderless seem to work fine (no mode switch), but I find the behavior bit dumb. It goes like this on switch into fullscreen:

  1. Normal windowed window
  2. Changes border and title to different style (possibly “unresponsive” style?) for one frame
  3. Removes border and title (but remains small window) for another five frames
  4. Makes it full screen

Which definitely accounts for the blink.

Weirdly, switching back is immediate. One frame there is fullscreen, seconnd frame it is windowed. :doh:

I need to play with this some more… maybe try raw Win32 API instead GLFW.

The blink isn’t too much of an issue for me, it’s the fact that I can’t see overlays from other programs.

I’ve also tried raw win32 to no avail. It boils down to calling CreateWindow with the same size as the screen and a style including WS_POPUP.