Closed magiruuvelvet closed 3 years ago
Hi, thanks for the detailed report, however I can't see what's causing the problems. Just a quick thought: does vkcube
run without primus_vk (i.e. on the intel graphics)? That stacktrace looks particularly wired, as primus_vk is not in that stack. Could you also try VK_LOADER_DEBUG=all pvkrun vkcube
? Maybe the vulkan loader debug shows valuable information. As the application is crashing in a call to dl_close this looks particularly strange.
Regarding debugging Steam applications: You can run most steam applications directly, if you set the environment right. Mostly they just require SteamAppId
to be set to the AppId of the game you are trying to run (i.e. SteamAppId=<appid> pvkrun ./some_steam_game_executable
).
Yes the vkcube
sample works fine on Intel. This is the debug output. libnv_vulkan_wrapper.so
is in the list.
For comparison this is the debug output of vkcubepp
:
I noticed VK_EXT_display_surface_counter
is the last thing before it dies in the C version.
When I have some time I will try to debug the 2 steam games.
The problem with vkcube
looks like there is a problem with libdl.so
.
The vulkan loader tries to load all ICDs (including libnv_vulkan_wrapper), then prints all extensions provided by them, and when it tries to unload (dlclose) the libraries, one such dlclose call seems to fail. Could you also post pvkrun env LD_DEBUG=libs vkcube
, so we can see what libraries are loaded when and see if we can spot any irregularities there?
vkcubepp
vkcube
I get a fatal error on GLX_nvidia
, but the C++ demo continues normally and works. The C version stops there. In terms of loaded libraries I see nothing suspicious. Really strange.
From the log, I see that you are using the non-GLVND-variant of the nvidia driver, but are using libGLX_nvidia.so
as the vulkan icd (which is loaded by nv_vulkan_wrapper
):
1043386: calling init: /usr/lib64/opengl/nvidia/lib/libGL.so.1
Could you try the experiment with either the GLVND-variant of the nvidia driver, or point nv_vulkan_wrapper to /usr/lib64/opengl/nvidia/lib/libGL.so.1
instead of /usr/lib/opengl/nvidia/lib/libGLX_nvidia.so.0
?
I tried the /usr/lib64/opengl/nvidia/lib/libGL.so.1
variant already. This library doesn't seem to contain Vulkan on Gentoo as I get unresolved symbol errors. From other issues I figured out to use libGLX_nvidia.so
on Gentoo which actually worked. As for the GLVND topic my current setup isn't compatible with GLVND and breaks bumblebee for me. I need to retry this at some point if I can get libglvnd to work without destroying everything.
Thanks for the help so far. At least PrimusVK works for some applications. Better than nothing I guess.
That's strange, that GLVND breaks bumblebee for you. Bumblebee never had a problem on my system with powering up/down the graphics card even with GLVND. Primus was missing the nvidia libGL, but giving him libGLX_nvidia.so
instead solved the issue for me: https://salsa.debian.org/nvidia-team/primus-vk/-/blob/master/debian/pvkrun.nvidia#L5
With this launcher I am using bumblebee+primus+primus_vk with the GLVND-driver.
I have some new reports. Its still bugged but better.
It turns out when compiling PrimusVK with LLVM/clang causes undefined behavior and bugs. When compiling it with GNU/GCC more stuff works, but still not everything. I have a feeling I need to compile the entire Vulkan stuff with GCC to make this piece of software work.
What do you think?
EDIT: compiling the vulkan loader with gcc doesn't fix anything
The Vulkan-Loader has some nasty very-lowlevel pieces (e.g. this: https://github.com/KhronosGroup/Vulkan-Loader/blob/master/loader/unknown_ext_chain_gas.S#L37) that might be a problem when using a different compiler, but as you reported that didn't help much.
primus-vk itself should not depend on any c++ undefined behavior and if you spot something I am very happy to fix it. I tried just compiling primus_vk itself with clang++
and got a segfault here:
Maybe I'll find time to investigate this segfault further or can't this work (just compiling primus_vk with clang and having the rest provided by the distribution as-is)?
Just a small update: I've just test-compiled the current master primus_vk with clang++-9
and vkcube runs fine with that. I am not sure what changed, but that's just a short FYI. As for now I don't think that we have indications that primus_vk depends on undefined behavior, but probably other libraries in the graphics stack. I'd be curious if/how the current master works for you on your system, can you re-test?
Otherwise I would close this issue and ask you to reopen/create a new one when you identified any UB.
Sorry for taking so long to respond, but I have switched over to NVIDIA PRIME Render Offloading a very long time ago, so primus-vk is no longer relevant for me and NVIDIA PRIME just works™ at full performance and low resource usage with OpenGL and Vulkan in every application ever.
Problems I am experiencing with PrimusVK
vulkaninfo
segfaults halfway through (log attached)vkcube
(C version) doesn't work at all, instant segfaultvkcubepp
(C++ version) works without issues perfectly fineDuring my testing I only tested native Linux applications. I don't care about wine/proton for now.
All testing was made with 3b268b4d1fdeaebeb399acacab60652cd2a72ca8 (
preview_cleanup
branch).This is how I installed primus-vk: https://github.com/magiruuvelvet/gentoo-overlay/commit/2fde105fd31c45f5350ad5eec4b1fda3381c87cf
The package looks like this:
Logs and Backtraces
https://gist.github.com/magiruuvelvet/afacbf9eef7f221b5381352325d98741
Hardware
Software
I'm trying to wrap my mind around why random stuff works and others don't. Its an RNG game at this point. I also couldn't get Steam games to work at all. They segfault just like
vkcube
does. Also that vulkaninfo segfaults halfway trough and not instantly seems strange to me.The only thing working reliably is RPCS3 right now. I don't have many games or emulators to test which also supports Vulkan. I have 2 AAA native Linux games which are Vulkan exclusive (devs didn't gave a shit about OpenGL) to do further testing once I figure out how to get a backtrace from those (Steam DRM is a b***).
Some additional context: nvidia-xrun works perfectly fine in terms of Vulkan, but its annoying to constantly switch ttys and I would like to get PrimusVK to work reliably. I have a feeling OpenGL is vanishing away and as a Muxless Optimus Laptop owner I'm starting to get worried.
EDIT: Forgot to mention my entire system is based on LLVM, clang and lld. GNU is a second class citizen on my custom LLVM-based userland and only available as compatibility layer with symlink hacks.