Fix errors such as GL_FRAMEBUFFER_UNDEFINED and GL_INVALID_FRAMEBUFFER_OPERATION for OpenGL
functions when the default framebuffer 0 is bound on macOS.
These errors happen because the NSOpenGLContext doesn't have a view bound at the time of an
OpenGL call. The view could not be set for the NSOpenGLContext because the window or view can
still be invisible. Setting an invisible view for the NSOpenGLContext can generate invalid
drawable messages as 682ed910 has shown. Thus setting the view could be deferred because
the NSOpenGLContext needs a visible view.
However, right after the window becomes visible, an OpenGL function that involves the default
framebuffer can be called. And when the view is still not set at the time of the OpenGL call,
errors such as GL_FRAMEBUFFER_UNDEFINED and GL_INVALID_FRAMEBUFFER_OPERATION could happen and
result in rendering errors such as black screen. So we need to set the view for the NSOpenGLContext
as soon as the view becomes visible.
It's possible that the window and view are still invisible when OpenGL functions involving the
default framebuffer get called. In such cases, I think errors like GL_FRAMEBUFFER_UNDEFINED are
justified on macOS.
Fix Active Trader Pro black screen at launch on macOS. The application creates a d3d9 device with
an invisible window. And then it shows the window before calling d3d9_swapchain_Present(). So all
the [NSOpenGLContext setView] opportunities are missed and no view is set. Then when glBlitFramebuffer()
gets called, GL_FRAMEBUFFER_UNDEFINED happens and so nothing is rendered. The application only
renders one frame before login so the window remains black.
--
https://gitlab.winehq.org/wine/wine/-/merge_requests/5487
This introduces a custom `VkPresentSurfacesInfoWine` struct to the driver queue present. It could very well be a separate vkQueuePresent parameter, now that the driver interface is manually written.
For now it provides the swapchains HWND, for vulkan_surface_presented, which is mostly just for winewayland purposes. Later I intend to change it to pass win32u surfaces wrappers.
--
v4: winevulkan: Remove now unnecessary vkCreateSwapchainKHR driver entry.
winevulkan: Remove now unnecessary vkDestroySwapchain driver entry.
win32u: Move vkQueuePresent implementation out of the user drivers.
winewayland: Remove now unnecessary swapchain wrapper.
winewayland: Remove now unnecessary swapchain extents checks.
win32u: Introduce a new vulkan_surface_presented driver entry.
winevulkan: Pass surface info for each vkQueuePresent swapchain to win32u.
https://gitlab.winehq.org/wine/wine/-/merge_requests/5482
On Mon Apr 22 12:40:26 2024 +0000, Zhiyi Zhang wrote:
> What is this fake source supposed to do now? Virtual desktop has its own
> virtual source.
Was it ever related to virtual desktop mode? I don't know what it was for, I'm fine dropping it altogether.
--
https://gitlab.winehq.org/wine/wine/-/merge_requests/5422#note_67597
Calling write_current_mode() in add_gpu seems weird. Not to mention write_current_mode() actually writes the current mode for the last source. write_current_mode() is also called at multiple places. It just seems that it should be called at one appropriate place and that's it.
Also, why is this patch necessary?
--
https://gitlab.winehq.org/wine/wine/-/merge_requests/5422#note_67593
'add_physical_source' here just doesn't look consistent with other functions in device_manager. Maybe add a "BOOL is_physical" or something in struct device_manager_ctx so that when both is_physical and is_virtual_desktop() are TRUE we report sources as detached. Then we set is_physical to FALSE and start adding sources for the virtual desktop. Use your best judgment.
--
https://gitlab.winehq.org/wine/wine/-/merge_requests/5422#note_67592