stride3d/stride · error · InvalidOperationException
No Vulkan 1.2+ physical device
Error message
No Vulkan 1.2+ physical device
What it means
After scoring all physical devices, PickPhysicalDevice throws when no device scored as supporting Vulkan 1.2+ (best < 0). SPIR-V 1.4 modules require a Vulkan 1.2-capable device, so the harness refuses devices limited to older API versions even though some device may exist.
Solutions
- Update the GPU driver to one supporting Vulkan 1.2+ (or install recent mesa/Lavapipe)
- Check device apiVersion via vulkaninfo and compare against the harness's 1.2 requirement
- Lower the SPIR-V target version of the test shaders so a 1.1 device suffices (library-level change)
- Skip the test when no 1.2+ device is present
Example fix
// before
renderer.RunVulkanTest();
// after
if (!FrameRenderer.Vulkan12Available)
Assert.Skip("Requires a Vulkan 1.2+ physical device");
renderer.RunVulkanTest(); Defensive patterns
Strategy: fallback
Validate before calling
api.vkGetPhysicalDeviceProperties(device, out var props); bool IsVulkan12(Device d) => (uint)props.ApiVersion >= VkVersion.Version_1_2;
Try / catch
try { EnsureSharedContext(); }
catch (InvalidOperationException ex) when (ex.Message.Contains("No Vulkan 1.2+"))
{
Assert.Skip("Requires Vulkan 1.2+ device");
} Prevention
- Update GPU drivers to Vulkan 1.2-capable versions
- Check device apiVersion via vulkaninfo in CI preflight
- Target SPIR-V 1.0-1.3 in test shaders if 1.1 devices must be supported
- Skip Vulkan tests when no 1.2+ device is found
When it happens
Trigger: Devices exist but every one reports apiVersion < 1.2 in its properties — e.g. an old GPU driver, an ICD exposing only Vulkan 1.0/1.1, or scoring logic finding no candidate.
Common situations: Older GPUs with drivers capped at Vulkan 1.1; out-of-date vendor drivers; headless CI images with only a Vulkan 1.0 ICD; running against llvmpipe builds lacking 1.2 support.
Understand the failure class
Background: "unsupported platform" / "not supported on this platform" errors: what they mean and how to fix them — this error's family across 47 libraries.
Related errors
- No graphics+compute queue family
- No Vulkan physical device
- AHardwareBuffer import requires…
- argumentsBuffer
- Bound render targets
AI-assisted analysis of stride3d/stride@96fad776d2 (2026-09-14).
Data as JSON: /api/errors/6b646d8a2990591a.
Report an issue: GitHub.
Appendix: source
Thrown at sources/shaders/Stride.Shaders.Tests/FrameRenderer.Vulkan.cs:176
if (properties.apiVersion < VkVersion.Version_1_2)
continue;
var isCpu = properties.deviceType == VkPhysicalDeviceType.Cpu;
var score = softwareRendering
? (isCpu ? 3 : 0)
: properties.deviceType switch
{
VkPhysicalDeviceType.DiscreteGpu => 3,
VkPhysicalDeviceType.IntegratedGpu => 2,
_ => 1,
};
if (score > bestScore)
{
bestScore = score;
best = i;
}
}
if (best < 0)
throw new InvalidOperationException("No Vulkan 1.2+ physical device");
if (softwareRendering && bestScore < 3)
throw new InvalidOperationException("Software rendering requested but no CPU Vulkan device (Lavapipe) found");
physicalDevice = devices[best];
}
private static void CreateDevice()
{
uint familyCount = 0;
instanceApi.vkGetPhysicalDeviceQueueFamilyProperties(physicalDevice, &familyCount, null);
var families = new VkQueueFamilyProperties[familyCount];
fixed (VkQueueFamilyProperties* familiesPtr = families)
instanceApi.vkGetPhysicalDeviceQueueFamilyProperties(physicalDevice, &familyCount, familiesPtr);
queueFamily = uint.MaxValue;
for (uint i = 0; i < familyCount; i++)
{
if ((families[i].queueFlags & (VkQueueFlags.Graphics | VkQueueFlags.Compute)) == (VkQueueFlags.Graphics | VkQueueFlags.Compute))
{
queueFamily = i;View on GitHub (pinned to 96fad776d2)