Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

surface.get_current_texture blocks for the duration of fullscreen animation on macOS #5613

Open
ItsSunnyMonster opened this issue Apr 26, 2024 · 2 comments
Labels
api: metal Issues with Metal help required We need community help to make this happen. type: bug Something isn't working

Comments

@ItsSunnyMonster
Copy link

ItsSunnyMonster commented Apr 26, 2024

Description
On macOS, the surface.get_current_texture function blocks after the user clicks the fullscreen button. It does not finish until the fullscreen animation is finished. This causes the entire app to hang while the fullscreen animation is happening, which means during the fullscreen animation the background moves but the window itself does not move. (see video below)
On my laptop display (which is a 120hz retina display) after changing to fullscreen, it blocks for around 1.5 seconds again after the fullscreen animation is finished. The same does not happen when restoring from fullscreen. It also doesn't happen on my second monitor which is 60hz 1920x1080.

Repro steps
https://github.com/ItsSunnyMonster/wgpu_blocking_repro_example
This project will log an error to the console if surface.get_current_texture takes longer than 0.5 seconds.

Expected vs observed behavior
surface.get_current_texture should not block when changing to fullscreen.

Extra materials

output.mp4

Platform
OS: macOS 14.4.1
CPU: Apple M1 Pro CPU 8 cores
RAM: 16GB
GPU: Apple M1 Pro GPU 14 cores
wgpu: 0.19.4
backend: Metal

@Wumpf Wumpf added type: bug Something isn't working help required We need community help to make this happen. api: metal Issues with Metal labels Apr 27, 2024
@ItsSunnyMonster
Copy link
Author

Interestingly, I tried the same thing with the Vulkan backend on macOS, and instead of get_current_texture blocking, the queue.submit function blocks instead.

@ItsSunnyMonster
Copy link
Author

As a bit of an update on this issue, here are some more information along with some things that needs to be done:

  • This issue does not exist on the official Metal examples by apple.
  • I vaguely remember following the Vulkan tutorial at https://vulkan-tutorial.com with C++ and having a similar issue. Since Vulkan on macOS needs MoltenVK which uses Metal under the hood, it's likely that this issue also exists on MoltenVK. But this does not explain why this issue happens in wgpu when I use the Metal backend directly.
  • This probably isn't impossible to fix as I don't believe OpenGL applications have the same issue. I don't have time to make a reproducible example for OpenGL right now but Minecraft seems to fullscreen properly.

I don't know a lot about Metal, but I can take a guess that the reason why this is happening is when wgpu requests for a texture to render to during the fullscreen animation, macOS does not give it a texture until the animation is finished. But other details throw this theory off: as per my comment above, when using the Vulkan backend on macOS, queue.submit blocks instead of get_current_texture. Also, it also sometimes blocks for a second time right after the fullscreen animation finishes, as detailed on my first comment.

  • If you have a Mac, please try and reproduce this issue. I need to be sure that I am not the only person experiencing it.
  • If you know Metal, please take some guesses at what might be happening. Something is better than nothing. Namely, what might be the difference between the official Metal examples and wgpu.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
api: metal Issues with Metal help required We need community help to make this happen. type: bug Something isn't working
Projects
None yet
Development

No branches or pull requests

2 participants