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

  1. Update the GPU driver to one supporting Vulkan 1.2+ (or install recent mesa/Lavapipe)
  2. Check device apiVersion via vulkaninfo and compare against the harness's 1.2 requirement
  3. Lower the SPIR-V target version of the test shaders so a 1.1 device suffices (library-level change)
  4. 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

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


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)