Vixen
dd8b0a81
csharp
public sealed class GpuDenyList

The adapters a backend is known to be broken on, keyed on GPU and driver version.

Read the guide page for this →

Remarks

What doc 10 § Android asks for by name: "the device-capability database (a curated deny-list keyed on GPU/driver version, shipped as content and updatable)". Android driver fragmentation is the reason — a device reports Vulkan, passes every capability query the engine knows how to ask, and then fails on a specific extension in a specific driver branch. There is no query for "this driver lies"; there is only a list somebody wrote down.

⚠ It refuses an adapter, not a feature. A denied adapter is one the backend must not be selected on at all, which is what makes it fall through to the next entry in the head's preference list — Vulkan denied, so OpenGL, so Null. A capability that a device reports and does not have is a different problem with a different answer: GraphicsDeviceFeatures is where a renderer asks, and a deny-list that cleared a bit there would be lying in the other direction.

⚠ Empty denies nothing, and that is the state every machine is in until content says otherwise. The failure mode this whole type has to avoid is a deny-list that refuses a device nobody meant to refuse, because the symptom is a black screen on hardware that works — so Parse reports a malformed line rather than dropping it, and refuses a rule that matches every adapter and every driver.

The format is one rule per line, three fields separated by |, with # starting a comment:

# adapter | driver version | reason Mali-G72 | * | VK_KHR_dynamic_rendering is advertised and unimplemented Adreno | 512.502 | crashes in vkCreateSwapchainKHR on rotation

⚠ What is not here is where the file comes from. Doc 10 wants it shipped as content and updatable, so a game can be fixed on a device the build predates; loading it is the head's job and is owed. Until then a head builds one in code, which is enough to make the decision reachable rather than theoretical.

Fields and properties (3)

  • public const string Any

    The wildcard, in both fields.

  • public static GpuDenyList Empty

    The list that refuses nothing, which is what a head has until content says otherwise.

  • public IReadOnlyList<GpuDenyRule> Rules

    The rules, in order.

Methods (4)

  • public GpuDenyList(IEnumerable<GpuDenyRule> rules)

    Builds a list from rules.

  • public static GpuDenyList Parse(string text)

    Reads a deny-list from its text form.

  • public bool IsDenied(IGraphicsAdapter adapter, out string? reason)

    Whether a backend must not be used on an adapter.

  • public bool IsDenied(string name, string driverVersion, out string? reason)

    The same question, for a caller that has the two strings and no adapter yet.

Used by (9)

  • AdapterSelectionVixen.Graphics.Vulkan
  • AdapterSelectionTestsVixen.Graphics.Vulkan.Tests
  • GpuDenyListTestsVixen.Graphics.Tests
  • GpuDenyRuleVixen.Graphics
  • GraphicsOptionsVixen.App.Hosting
  • VulkanAdapterVixen.Graphics.Vulkan
  • VulkanDeviceOptionsVixen.Graphics.Vulkan
  • VulkanDeviceTestsVixen.Graphics.Vulkan.Tests
  • GraphicsHostVixen.App