vulkan: Bindings to the Vulkan graphics API.

This is a package candidate release! Here you can preview how this package release will appear once published to the main package index (which can be accomplished via the 'maintain' link below). Please note that once a package has been published to the main package index it cannot be undone! Please consult the package uploading documentation for more information.

[maintain] [Publish]


[Skip to Readme]


Versions,,,,,,,,,,,,,,,,,, 3.3, 3.3.1, 3.4, 3.5, 3.6, 3.6.1, 3.6.2, 3.6.3, 3.6.4, 3.6.5, 3.6.6, 3.6.7, 3.6.8, 3.6.9, 3.6.10, 3.6.11,, 3.6.12, 3.6.13, 3.6.14, 3.6.15, 3.7, 3.8, 3.8.1, 3.8.2, 3.8.3, 3.9, 3.9.1, 3.10, 3.10.1, 3.10.2, 3.10.3, 3.10.4, 3.11,, 3.11.1, 3.11.2, 3.11.3, 3.11.4,, 3.11.5, 3.12, 3.12.1, 3.12.2, 3.13, 3.13.1, 3.13.2, 3.13.3, 3.13.4, 3.14, 3.14.1, 3.14.2
Change log
Dependencies base (<4.14), bytestring, transformers, vector, vector-sized [details]
License BSD-3-Clause
Maintainer Joe Hermaszewski <>
Category Graphics
Home page
Bug tracker
Source repo head: git clone
Uploaded by jophish at 2020-03-31T16:57:13Z



Manual Flags


Build example executables


Do not mark foreign imports as unsafe. This means that callbacks from Vulkan to Haskell will work. If you are using these then make sure this flag is enabled.

Automatic Flags

Use -f <flag> to enable a flag, or -f -<flag> to disable that flag. More info


Maintainer's Corner

For package maintainers and hackage trustees

Readme for vulkan-

[back to package description]


Slightly high level Haskell bindings to the Vulkan graphics API.

These bindings present an interface to Vulkan which looks like more idiomatic Haskell and which is much less verbose than the C API. Nevertheless, it retains access to all the functionality. If you find something you can do in the C bindings but not in these high level bindings please raise an issue.

These bindings are intended to be imported qualified and do not feature the Vk prefixes on commands, structures, members or constants.

Package structure

Types and functions are placed into modules according to the features and extensions portions of the specification. As these sections only mention functions, a best guess has to be made for types. Types and constants are drawn in transitively according to the dependencies of the functions.

It should be sufficient to import Graphics.Vulkan.CoreXX along with Graphics.Vulkan.Extensions.{whatever extensions you want}. You might want to import Graphics.Vulkan.Zero too.

Things to know

Minor things

How the C types relate to Haskell types

These bindings take advantage of the meta information present in the specification detailing the validity of structures and arguments. A few examples:

If anything is unclear please raise an issue. The marshaling to and from Haskell and C is automatically generated and I've not checked every single function. It's possible that there are some commands or structs which could be represented better in Haskell, if so please also raise an issue.

Vulkan errors

If a Vulkan command has the VkResult type as a return value, this is checked and a VulkanException is thrown if it is not a success code. If the only success code a command can return is VK_SUCCESS then this is elided from the return type. If a command can return other success codes, for instance VK_EVENT_SET then the success code is exposed.

Bracketing commands

There are certain sets commands which must be called in pairs, for instance the create and destroy commands for using resources. In order to facilitate safe use of these commands, i.e. ensure that the corresponding destroy command is always called, these bindings expose with commands, which use bracket to. These pairs of commands aren't explicit in the specification, so a list of them is maintained in the generation code, if you see something missing please open an issue (these pairs are generated in Bracket.hs). An example is withInstance which calls createInstance and destroyInstance.

At the moment only continuation passing style functions are implemented; it shouldn't be too hard to implement these functions using ResourceT or whatever other resource handling Monad though.

Dual use commands

Certain commands, such as vkEnumerateDeviceLayerProperties or vkGetDisplayModePropertiesKHR, have a dual use. If they are not given a pointer to return an array of results then they instead return the total number of possible results, otherwise they return a number of results. There is an idiom in Vulkan which involves calling this function once with a null pointer to get the total number of queryable values, allocating space for querying that many values and they calling the function again to get the values. These bindings expose commands which automatically return all the results. As an example enumeratePhysicalDevices has the type Instance -> IO (Result, Vector PhysicalDevice).

Structure chains

Most structures in Vulkan have a member called pNext which can be a pointer to another Vulkan structure containing additional information. In these high level bindings the head of any struct chain is parameterized over the rest of the items in the chain. This allows for using type inference for getting struct chain return values out of Vulkan, for example: getPhysicalDeviceFeatures2 :: (PokeChain a, PeekChain a) => PhysicalDevice -> IO (PysicalDeviceFeatures2 a); here the variable a :: [Type] represents the structures present in the chain returned from vkGetPhysicalDeviceFeatures2.

There exists a GADT SomeStruct which captures the case of an unknown tail in the struct chain. This is also used for nested chains inside structs.

Struct chains inside records are represented as nested tuples: next :: (Something, (SomethingElse, (AThirdThing, ())))


This package requires GHC 8.6 or higher due to the use of the QuantifiedConstraints language extension.

For instructions on how to regenerate the bindings see the readme in ./generate-new.


There are a couple of examples in the examples directory.


This opens a window using SDL and renders a triangle.

You'll need to build the shaders first with (cd examples/sdl-triangle && glslangValidator -V shader.*)

Make sure that SDL can find either by setting LD_LIBRARY_PATH or SDL_VULKAN_LIBRARY, this must be the same that the sdl-triangle binary was compiled against.

Exit with q, escape or the window exit button.

Current Status

All the core Vulkan 1.0, 1.1, and 1.2 functionality is here as well as all the extensions.

This is currently a 64 bit only library.