doc/articles/features/using-vulkan-rendering.md
Uno Platform supports Vulkan as an optional hardware-accelerated rendering backend for the Skia renderer on Android, Linux (X11), and Windows (Win32).
Vulkan provides lower driver overhead and more efficient GPU utilization compared to OpenGL on supported hardware. When enabled, the Skia drawing operations are backed by a Vulkan graphics pipeline instead of OpenGL.
[!NOTE] Vulkan rendering is opt-in. The default rendering backend remains OpenGL (or software) on all platforms. Enabling Vulkan when it is not available on the target device will automatically fall back to the default backend.
| Platform | Vulkan Support | Minimum Requirement |
|---|---|---|
| Android | Yes | Android 7.0+ (API 24) with Vulkan-capable GPU |
| Linux (X11) | Yes | Vulkan ICD (Mesa or proprietary drivers) |
| Windows (Win32) | Yes | Vulkan runtime + compatible GPU driver |
| macOS | No | Uses Metal instead |
| WebAssembly | No | Uses WebGL instead |
On desktop platforms, the preferred way to enable Vulkan is through the platform host builder:
var host = UnoPlatformHostBuilder.Create()
.App(() => new App())
.UseX11(b => b.RenderingBackend(X11RenderingBackend.Vulkan))
.UseWin32(b => b.RenderingBackend(Win32RenderingBackend.Vulkan))
.UseLinuxFrameBuffer()
.UseMacOS()
.Build();
host.Run();
Each platform has its own rendering backend enum reflecting the backends it supports:
X11RenderingBackend (Linux):
| Value | Description |
|---|---|
Default | Auto-detect: try OpenGL, fall back to software |
Vulkan | Vulkan with fallback to OpenGL/software |
OpenGL | OpenGL via GLX |
OpenGLES | OpenGL ES via EGL |
Software | CPU-based software rendering |
Win32RenderingBackend (Windows):
| Value | Description |
|---|---|
Default | Auto-detect: try OpenGL, fall back to software |
Vulkan | Vulkan with fallback to OpenGL/software |
OpenGL | OpenGL via WGL |
Software | CPU-based software rendering |
For backwards compatibility and for platforms without a host builder (such as Android), rendering can be configured via FeatureConfiguration.Rendering:
// Android — set before ApplicationActivity.OnStart()
FeatureConfiguration.Rendering.UseVulkanOnSkiaAndroid = true;
// Linux/X11 — set before host.Build()
FeatureConfiguration.Rendering.UseVulkanOnX11 = true;
// Windows/Win32 — set before host.Build()
FeatureConfiguration.Rendering.UseVulkanOnWin32 = true;
[!NOTE] When both the builder API and the feature flags are used, the builder takes precedence if it runs after the flag is set (which is the typical case). If you set a feature flag after
Build(), the flag value wins.
Android does not use a host builder. Enable Vulkan in your Application class or app startup, before the activity is created:
FeatureConfiguration.Rendering.UseVulkanOnSkiaAndroid = true;
When Vulkan is requested but unavailable, the application automatically falls back to the next available backend:
No user intervention is required. A diagnostic log message is emitted indicating which backend was selected and why.
Enable debug logging to see which rendering backend was selected:
builder.AddFilter("Uno.UI.Runtime.Skia", LogLevel.Information);
When Vulkan is successfully initialized:
Vulkan rendering initialized: <device name>, <driver version>
When Vulkan falls back:
Vulkan rendering not available: <reason>. Falling back to OpenGL ES.
Ensure Vulkan drivers are installed:
# Debian/Ubuntu (Mesa)
sudo apt install mesa-vulkan-drivers
# Verify
vulkaninfo
Ensure your GPU driver includes Vulkan support. Most modern NVIDIA, AMD, and Intel drivers include Vulkan. You can verify with the Vulkan SDK vulkaninfo tool.
If you experience crashes with Vulkan enabled, disable it and file an issue:
// Temporarily disable Vulkan
FeatureConfiguration.Rendering.UseVulkanOnSkiaAndroid = false;
FeatureConfiguration.Rendering.UseVulkanOnX11 = false;
FeatureConfiguration.Rendering.UseVulkanOnWin32 = false;