stride3d/stride · critical · NotSupportedException
Vulkan: Dynamic rendering and synchronization2 are not suppo
Error message
Vulkan: Dynamic rendering and synchronization2 are not supported by this device, but are required by Stride.
What it means
Stride's Vulkan backend is built entirely on Vulkan 1.3 features: it renders with vkCmdBeginRendering (dynamic rendering) and submits work with vkQueueSubmit2 (synchronization2), creating no legacy render pass objects. During GraphicsDevice initialization it checks the queried Vulkan 1.3 feature struct and throws NotSupportedException if either feature is not reported as supported, because the backend has no fallback path. The device simply cannot run Stride's Vulkan renderer as implemented.
Solutions
- Update the GPU driver to the latest vendor version so Vulkan 1.3 with dynamicRendering and synchronization2 is supported.
- Switch to a GPU that supports Vulkan 1.3 (check with vulkaninfo: 'Vulkan API version' >= 1.3).
- Select a different GraphicsBackend (e.g. Direct3D 11/12 on Windows) in GraphicsDeviceManager/ GameSettings instead of Vulkan.
- If on a virtual/remote environment, pass through a real GPU (GPU passthrough / hardware acceleration) rather than a software Vulkan ICD.
Example fix
// before
graphicsDeviceManager.GraphicsBackend = GraphicsBackend.Vulkan;
// after (fallback on unsupported device)
graphicsDeviceManager.GraphicsBackend =
Platform.Type == PlatformType.Windows ? GraphicsBackend.Direct3D11 : GraphicsBackend.Vulkan; Defensive patterns
Strategy: validation
Validate before calling
// before creating the device, probe Vulkan 1.3 features (pseudo-API)
var props = VkPhysicalDeviceVulkan13Features from chosen physical device;
if (!props.dynamicRendering || !props.synchronization2)
throw new NotSupportedException("Vulkan 1.3 dynamicRendering/synchronization2 required"); Type guard
bool SupportsVulkan13Features(PhysicalDevice d) => d.ApiVersion >= VkVersion.Version_1_3 && d.Vulkan13Features.dynamicRendering && d.Vulkan13Features.synchronization2;
Try / catch
try { device = GraphicsDevice.New(adapter, deviceDesc); }
catch (NotSupportedException ex) when (ex.Message.Contains("Dynamic rendering")) { log.Warn(ex.Message); device = CreateFallbackDevice(GraphicsBackend.Direct3D11); } Prevention
- Check vulkaninfo output for Vulkan 1.3 support before shipping to a machine
- Keep GPU drivers updated on target hardware
- Offer a configurable GraphicsBackend with a non-Vulkan fallback
- Test on software/virtualized Vulkan early to detect capability gaps
When it happens
Trigger: Creating a GraphicsDevice with GraphicsBackend.Vulkan on a physical device whose VkPhysicalDeviceVulkan13Features reports dynamicRendering == VK_FALSE or synchronization2 == VK_FALSE (checked in GraphicsDevice.Vulkan.cs before enabling the features).
Common situations: Old GPUs or drivers that only support Vulkan 1.0-1.2 without the dynamic_rendering/synchronization2 extensions promoted in 1.3; virtualized or software Vulkan implementations (lavapipe, SwiftShader, ANGLE) exposing limited feature sets; outdated GPU drivers on Linux/Windows; running on integrated graphics from before ~2021.
Related errors
- Required extension {Encoding.UTF8.GetString(VK_KHR_SURFACE_E
- argumentsBuffer
- Vulkan: Failed to find GPUs with Vulkan support
- Failed to create vulkan instance: {result}
- Required Vulkan extension {extensionName} is not supported b
AI-assisted analysis of stride3d/stride@96fad776d2 (2026-09-14).
Data as JSON: /api/errors/644f5d9f4d034b52.
Report an issue: GitHub.
Appendix: source
Thrown at sources/engine/Stride.Graphics/Vulkan/GraphicsDevice.Vulkan.cs:576
var portabilitySubsetFeatures = new VkPhysicalDevicePortabilitySubsetFeaturesKHR
{
sType = VkStructureType.PhysicalDevicePortabilitySubsetFeaturesKHR,
pNext = &supportedVulkan11Features,
};
var physicalDeviceFeatures2 = new VkPhysicalDeviceFeatures2
{
sType = VkStructureType.PhysicalDeviceFeatures2,
pNext = isPortabilitySubsetDevice ? (void*)&portabilitySubsetFeatures : &supportedVulkan11Features,
};
NativeInstanceApi.vkGetPhysicalDeviceFeatures2(NativePhysicalDevice, &physicalDeviceFeatures2);
if (!supportedVulkan12Features.timelineSemaphore)
throw new InvalidOperationException("Vulkan: Timeline semaphores are not supported by this device, but are required by Stride.");
// Dynamic rendering is required: the backend renders with vkCmdBeginRendering and
// creates no render pass objects. Synchronization2 is required for vkQueueSubmit2.
if (!supportedVulkan13Features.dynamicRendering || !supportedVulkan13Features.synchronization2)
throw new NotSupportedException("Vulkan: Dynamic rendering and synchronization2 are not supported by this device, but are required by Stride.");
var enabledVulkan13Features = new VkPhysicalDeviceVulkan13Features
{
sType = VkStructureType.PhysicalDeviceVulkan13Features,
dynamicRendering = VkBool32.True,
synchronization2 = VkBool32.True,
};
var enabledVulkan12Features = new VkPhysicalDeviceVulkan12Features
{
sType = VkStructureType.PhysicalDeviceVulkan12Features,
pNext = &enabledVulkan13Features,
timelineSemaphore = VkBool32.True,
uniformBufferStandardLayout = VkBool32.True,
// FP16 in shaders (SPIR-V Float16 capability) — required by some HLSL→SPIR-V output.
shaderFloat16 = supportedVulkan12Features.shaderFloat16,
};
var enabledVulkan11Features = new VkPhysicalDeviceVulkan11Features
{View on GitHub (pinned to 96fad776d2)