One of the issues cropping up in the migration from Xorg to Wayland is the desire to capture part or all of your screen for recording and/or streaming to others - in many cases, applications designed for Xorg simply capture a black screen, with few workarounds.
However, for games and applications that can run with the Vulkan API, there's a new plugin from David Rosca (nowrep) for OBS Studio called obs-vkcapture (OBS Plugin Forum | GitHub) that aims to work around the issue and get your gameplay ingested directly, bypassing the built-in Xorg 'Window Capture'.
Bonus - it should even work under Xorg, provided you have a new build of OBS with EGL support and pass it the environment variable:OBS_USE_EGL=1
Similarly, you'll need to run your game (or other Vulkan application), one at a time (e.g. in your Steam launch options), with:OBS_VKCAPTURE=1
Now, this is a very new development (nowrep's initial commits here are barely 4 days old as of writing), but in my initial testing last night, I managed to play a 4 hour session of 7 Days to Die (using the experimental Vulkan backend), while streaming and recording it just fine. That said, I did compile and install it by hand myself, on a git master build of OBS, and it is of course still under active development, so the usual caveat holds here: Your Mileage May Vary.
Still, they're looking at potentially adding OpenGL support in the future, so this is definitely one to watch.
Personally I have always been able to capture xwayland surfaces but for some reason the frame-rate in the captured footage is terrible.It's because games today mostly run through xwayland, so it's compatible with Xcomposite.
I agree with pipewire support (already works for audio) and I think they should also make it compatible to xdg-desktop-portal in the official application.
More options is better though and at least on compositors like Sway you cannot use the xdg-desktop-portal window capture yet, so if nothing else, this can help in that use case.
More options is better though and at least on compositors like Sway you cannot use the xdg-desktop-portal window capture yet
I thought xdg-desktop-portal was already compatible with wlroots, is sway using another compositor?
Oh, Sway supports the xdg-desktop-portal just fine with xdg-desktop-portal-wlr. But they don't have a window picker, so if you want to do window capture you need to find the window ID and it's a bit of a pain and thus I wouldn't consider it usable. Fullscreen capture works just fine though.More options is better though and at least on compositors like Sway you cannot use the xdg-desktop-portal window capture yet
I thought xdg-desktop-portal was already compatible with wlroots, is sway using another compositor?
Last edited by Shmerl on 26 March 2021 at 3:23 pm UTC
Isn't Pipewire made for this? What's the status of that in OBS?
You can follow OBS Pipewire progress here
https://github.com/obsproject/obs-studio/pull/4287
You can follow OBS Pipewire progress here
I didn't get that part:
The new capture is only loaded when running on EGL, since it depends on EGL to call gs_texture_create_from_dmabuf().
Isn't EGL OpenGL specific? I thought Vulkan is using WSI for example.
Isn't EGL OpenGL specific? I thought Vulkan is using WSI for example.According to Wikipedia:
- The Wayland display server protocol uses EGL.[8] It is implemented in a way that Wayland clients will draw directly to the framebuffer using EGL.
So I think that's why EGL comes into play, here.
Cool! Ultimately we need PipeWire-support though. Personally I have always been able to capture xwayland surfaces but for some reason the frame-rate in the captured footage is terrible. When I switch to GNOME on x.org I can capture smooth 60fps footage.
Whats wrong with pipewire? you mean direct support? Cause it work fine for me with pipewire atm. If i want to capture specific game audio only i will use qjackctl and connect the needed inputs/outputs with OBS.
So I think that's why EGL comes into play, here.
I don't think Wayland is tied to EGL? Wayland is a protocol, it's not really tied to a specific implementation. It can work with WSI.
The Vulkan WSI (Window System Interface) is a set of API calls serve a similar purpose as EGL does for OpenGL ES or GLX for OpenGL. Vulkan WSI includes support for Wayland from day one: VK_USE_PLATFORM_WAYLAND_KHR. Vulkan clients can run on unmodified Wayland servers, including Weston, GENIVI LayerManager, Mutter / GNOME Shell, Enlightenment, and more. The WSI allows applications to discover the different GPUs on the system, and display the results of GPU rendering to a window system.
https://en.wikipedia.org/wiki/Wayland_(display_server_protocol)
So that's why I was asking why they are using EGL instead of let's say WSI.
Last edited by Shmerl on 26 March 2021 at 6:25 pm UTC
So I think that's why EGL comes into play, here.
I don't think Wayland is tied to EGL? Wayland is a protocol, it's not really tied to a specific implementation. It can work with WSI.
The Vulkan WSI (Window System Interface) is a set of API calls serve a similar purpose as EGL does for OpenGL ES or GLX for OpenGL. Vulkan WSI includes support for Wayland from day one: VK_USE_PLATFORM_WAYLAND_KHR. Vulkan clients can run on unmodified Wayland servers, including Weston, GENIVI LayerManager, Mutter / GNOME Shell, Enlightenment, and more. The WSI allows applications to discover the different GPUs on the system, and display the results of GPU rendering to a window system.
https://en.wikipedia.org/wiki/Wayland_(display_server_protocol)
So that's why I was asking why they are using EGL instead of let's say WSI.
I'm not a developer, so I can't say I've looked at it in any sort of depth, but my hunch is that Vulkan + WSI would be used in e.g. a game wanting to draw its Vulkan backend to Wayland, without using XWayland as a path (i.e. a Vulkan + Wayland native game), while EGL is being used for 'normal day-to-day applications', i.e. OBS, to render *its* window and preview to Wayland.
I'm guessing that OBS could totally be written to support WSI, but that means having OBS itself use Vulkan to render its UI directly, and I have a feeling it's abstracting that out through Qt for the most part, so this is a function of 'OBS supports EGL output but not necessarily Vulkan (yet)', separate from whether the game you're *inputting* is on Vulkan or not. But again, just a semi-educated guess here.
See more from me