Enabling Vulkan on non-vulkan gpu system for Audio Plugin

Hi All

My first post! Greetings! 1 week into Linux and I´m a mixture of “oh cool you can do that!!!” and “I´m in pain…”

the TL,DR version:
So my question is - How do I enable the automatic loading of a driver that supports software implementation (as opposed to GPU Implementation) of the Vulkan API for applications that need it?

The background:

Ultimately, I need to make a windows audio plugin work in Wine called Spitfire BBCSO Discover. Now, on Mint Cinnemon, it runs beautifully on my system. But to make it run I had to install, DXVK, a common requirement for windows plugins in Wine. But because I want a leaner setup, and want to take advantage of kernal optimisations with a locally built Wine-TKG staging package, I want to run it all in EndeavourOS.

My [https://0x0.st/Hha-.txt](https://inxi output is here. )
Running Wine TkG (staging) 8.21
The problem is that because my NVidia GPU (GeForce 210) is super old it doesn´t support Vulkan and so when running the plugin in wine it crashes out with

info:  Game: Spitfire Audio.exe
info:  DXVK: v1.7.3
info:  Built-in extension providers:
info:    Win32 WSI
info:    OpenVR
warn:  OpenVR: Failed to locate module
info:  Required Vulkan extension VK_KHR_surface not supported
err:   DxvkInstance: Failed to create instance

When I run vulkaninfo I get a message saying no supported device etc. To Be expected as I don´t have the hardware.

So how does it work in mint with the same hardware? Well I noticed that when run on my same hardware in Mint (not EndeavourOs) vulkaninfo outputs among other things:

Layers: count = 3
=================
VK_LAYER_INTEL_nullhw (INTEL NULL HW) Vulkan version 1.1.73, layer version 1:
	Layer Extensions: count = 0
	Devices: count = 1
		GPU id = 0 (llvmpipe (LLVM 15.0.7, 128 bits))
		Layer-Device Extensions: count = 0

VK_LAYER_MESA_device_select (Linux device selection layer) Vulkan version 1.3.211, layer version 1:
	Layer Extensions: count = 0
	Devices: count = 1
		GPU id = 0 (llvmpipe (LLVM 15.0.7, 128 bits))
		Layer-Device Extensions: count = 0

VK_LAYER_MESA_overlay (Mesa Overlay layer) Vulkan version 1.3.211, layer version 1:
	Layer Extensions: count = 0
	Devices: count = 1
		GPU id = 0 (llvmpipe (LLVM 15.0.7, 128 bits))
		Layer-Device Extensions: count = 0

Presentable Surfaces:
=====================
GPU id : 0 (llvmpipe (LLVM 15.0.7, 128 bits)):
	Surface types: count = 2
		VK_KHR_xcb_surface
		VK_KHR_xlib_surface
	Formats: count = 2
		SurfaceFormat[0]:
			format = FORMAT_B8G8R8A8_SRGB
			colorSpace = COLOR_SPACE_SRGB_NONLINEAR_KHR
		SurfaceFormat[1]:
			format = FORMAT_B8G8R8A8_UNORM
			colorSpace = COLOR_SPACE_SRGB_NONLINEAR_KHR
	Present Modes: count = 4
		PRESENT_MODE_IMMEDIATE_KHR
		PRESENT_MODE_MAILBOX_KHR
		PRESENT_MODE_FIFO_KHR
		PRESENT_MODE_FIFO_RELAXED_KHR
	VkSurfaceCapabilitiesKHR:
	-------------------------
		minImageCount = 3
		maxImageCount = 0
		currentExtent:
			width  = 256
			height = 256
		minImageExtent:
			width  = 256
			height = 256
		maxImageExtent:
			width  = 256
			height = 256
		maxImageArrayLayers = 1
		supportedTransforms: count = 1
			SURFACE_TRANSFORM_IDENTITY_BIT_KHR
		currentTransform = SURFACE_TRANSFORM_IDENTITY_BIT_KHR
		supportedCompositeAlpha: count = 2
			COMPOSITE_ALPHA_OPAQUE_BIT_KHR
			COMPOSITE_ALPHA_INHERIT_BIT_KHR
		supportedUsageFlags: count = 6
			IMAGE_USAGE_TRANSFER_SRC_BIT
			IMAGE_USAGE_TRANSFER_DST_BIT
			IMAGE_USAGE_SAMPLED_BIT
			IMAGE_USAGE_STORAGE_BIT
			IMAGE_USAGE_COLOR_ATTACHMENT_BIT
			IMAGE_USAGE_INPUT_ATTACHMENT_BIT
	VkSurfaceCapabilities2EXT:
	--------------------------
		supportedSurfaceCounters:
			None
	VkSurfaceProtectedCapabilitiesKHR:
	----------------------------------
		supportsProtected = false

I also notice that in Mint, nvidiafb is included as a driver for the Nvidia card as well as nouveau.

So whatever is configured in Mint is enabling a Vulkan capable driver to run on my system. LLVMPipe showing in the vulkaninfo suggests a software implementation as no GPU´s are listed. It would not be very performant, but I don´t care - it would allow a simple plugin to load which I rely on.

So my question is - How do I get the same result in EndeavourOs? How do I enable the automatic loading of a driver that supports software implementation (as opposed to GPU Implementation) of the Vulkan API for applications that need it?

This is a long post, I hope it´s OK.

Thank you

It looks like using older versions of software may help in your case,
if as you say you got it working on mint, but now you can’t with endeavor.

Debian/mint/ubuntu are using older software packages typically
than arch linux, and that can introduce problems in different scenarios. Sometimes using older packages is necessary to get programs working, especially wine programs. That’s why gui tools for working with wine emphasize installing different versions of wine, and their own unique faux-windows directories and dependencies.

Wine is especially sensitive to having exact versions of all the various software put together in it’s container it uses to get a specific app working. It’s probably the case you have a few different solutions. It might be easier for instance, to open up your system with a live disk, and make a partition for mint on it, to easily use the software you want to. You might open it up to help you troubleshoot the problem too, and figure out what made it work in that prior case.

GPU id : 0 (llvmpipe (LLVM 15.0.7, 128 bits)):

This means your using the CPU instead of the GPU to do rendering
which is typically considered a bad thing, instead of the ideal scenario, and that the driver for your GPU isn’t loaded properly or has a serious malfunction., which is why it’s not recognized whatsoever, and only llvmpipe is shown as available.

Unless you explicitly clicked the install third-party software/graphics drivers in the GUI for the mint installer or after install, you were using the nouveau driver I would assume, which is easily installable on endeavor if that’s the case.

edit: you can actually select to use LLVM pipe as your GPU through dxvk
or something, I can’t remember how you specifically select it. But you will see running vulkaninfo llvm pipe is recognized as an option similarly in endeavour. You just have to change the configuration for vulkan to use it instead of your graphics driver.

Thank you. Yes The Mint partition is using nouveau and also nvidiafb. Here is the lspci output under mint for the GPU:

01:00.0 VGA compatible controller: NVIDIA Corporation GT218 [GeForce 210] (rev a2)
	Subsystem: ASUSTeK Computer Inc. GT218 [GeForce 210]
	Kernel driver in use: nouveau
	Kernel modules: nvidiafb, nouveau

I think that may something to do with it.

In my Endeavour instance I have tried both the nouveau and NVidia 340 series driver from the AUR. The 340 driver works better for Kontakt for example and I think I will revert to using it but still no Vulkan support of course.

However your suggestion of a DXVK option to use LLVMPipe would be ideal. I will look into that now.

I think I found out why Mint works. The nouveau driver fails initializing drm during the boot according to messages from dmesg. So I suspect the older nvidiafr driver is loading as a backup and this somehow enables LLVM software rasterizing for Vulkan - which would be pretty convenient for me actually. However there must be a better way to get this working.
I can´t find anything like a feature where DXKV forces the use of LLVM which is a shame. Anyone else know anything?

Is it possible to load an additional driver at boot time to install LLVMPipe or LavaPipe to the graphics card as an extra vulkan surface? Something like that. There are a few Vulkan compatible software implementations - I just have no idea how to load them!! Ideas??

Device filter

Some applications do not provide a method to select a different GPU. In that case, DXVK can be forced to use a given device:

  • DXVK_FILTER_DEVICE_NAME="Device Name" Selects devices with a matching Vulkan device name, which can be retrieved with tools such as vulkaninfo. Matches on substrings, so “VEGA” or “AMD RADV VEGA10” is supported if the full device name is “AMD RADV VEGA10 (LLVM 9.0.0)”, for example. If the substring matches more than one device, the first device matched will be used.

This is a nice feature which I can use for when the vulkan API is available through at least one of the GPU´s on the system. So I need a way to load at least one “device” whether a real GPU (in my case impossible) or a vulkan compatible software implementation like LLVM or LavaPipe which talks vulkan.

Right now, when I run vulkaninfo there are no running instances or devices listed. It simply shows

[david@endeavourOS .wine-BBCSO]$ vulkaninfo
ERROR: [Loader Message] Code 0 : vkCreateInstance: Found no drivers!
Cannot create Vulkan instance.
This problem is often caused by a faulty installation of the Vulkan driver or attempting to use a GPU that does not support Vulkan.
ERROR at /usr/src/debug/vulkan-tools/Vulkan-Tools-1.3.269/vulkaninfo/./vulkaninfo.h:688:vkCreateInstance failed with ERROR_INCOMPATIBLE_DRIVER

which is a bummer…

Is it possible to explicitly load a LLVM or LavaPipe as a nice behaving vulkan driver in addition to nouveau, or even instead of nouveau?

Am I even on the right track?

Ok so I found a solution for people from the future just in case.

Install vulkan-swrast as per https://wiki.archlinux.org/title/Vulkan#Software_rendering. It will install a vulkan driver which vulkaninfo picks up. Also DXVK finds it. FYI I did of course have problems making it work… The problem was that when running vulkaninfo it complained about not finding a shared file in /usr/lib/libLLVM-17.so. I had libLLVM-16. Things/versions change quickly in Arch world!! This was because I had to update the LLVM package via pacman. But better still ensure you pacman -Syu for a full system update before you install the vulkan-swrast and all will be fine.

This is for development and debugging really, but for my purposes of getting a vulkan capable device on a system with no hardware vulkan capable device, it works a treat.

I didn´t need to provide any other command line environment variables for the Spitfire plugin to load and operate correctly. I am using DXVK 1.7.3 as installed from winetricks but this is old so probably upgrade to the latest using winetricks dlls dxvk or install from the git repo manually as per instructions at https://github.com/doitsujin/dxvk?tab=readme-ov-file.

Thank you LinuxGaming321 for your help and ideas. I hope this thread is useful for someone else in the same boat.

David

This topic was automatically closed 2 days after the last reply. New replies are no longer allowed.