Anvil Vulkan Framework

SDKs & Libraries

Vulkan_White_500px_Mar16

Anvil is a cross-platform, open-source, MIT-licensed wrapper library for Vulkan™, developed by AMD engineers. It has been designed with the goal of reducing the amount of time that developers need to spend in order to write a working Vulkan application from scratch. As such, not only does the library provide the usual C++ wrappers one would expect, but also includes extra features, as described below:

  • A memory allocator which allocates as little memory as necessary for the specified list of memory regions, miptails, objects or subresources from one or more memory heaps, depending on platform’s capabilities.
  • Automatic object lifetime management, thanks to auto pointers being used across the library.
  • Descriptor sets and descriptor set layouts are automatically generated from user-created descriptor set groups.
  • Helper routines for FP16<->FP32 conversion.
  • Integrated validation support. Validation can be enabled by changing a single argument value at Vulkan instance creation time.
  • Integration with glslang for run-time GLSL -> SPIR-V conversion. Assembly of the result blob can also be retrieved for further analysis.
  • Object tracker which can be used to detect wrapper object leaks.
  • Page tracker, useful for the purpose of tracking memory bindings, if sparse residency is used for buffers or images.
  • Windowing system integration – current support includes XCB and Windows platforms.

Debugging applications developed with Anvil is time-effective, as the wrapper instances can be configured to cache various pieces of information, which were specified by the application at object creation time. Later on, these properties can easily be checked directly from within IDE. As an example:

  • command buffer instances include a list of recorded commands;
  • logical and physical devices’ capabilities are cached in corresponding wrappers;
  • object properties, specified at creation time, are stored in wrapper instances.

Anvil comes with integrated support for AMD-specific Vulkan extensions, but works on any Vulkan implementation.

Examples

To give a better understanding of how to use Anvil, the following simple example applications are included:

DynamicBuffers

Renders smoothly scrolling sine curves using dynamic storage buffers.


MultiViewport

Renders a simple geometry to multiple viewports using a single draw call.


OcclusionQuery

Shows how to use occlusion queries by rendering two triangles, which move horizontally, and a quad underneath. The color of the latter is automatically adjusted, depending on the are of intersection of the two triangles.


OutOfOrderRasterization

Presents how to use AMD-specific VK_AMD_rasterization_order extension and the performance improvement, that a correct use of the functionality yields. The application renders a total of 10 000 rotating, randomly spread teapots. By pressing the Space key, the user can switch between a rendering pipeline with OoO functionality enabled and disabled.

On platforms which do not support the extension, the example application will automatically avoid exposing the out-of-order rasterization-enabled graphics pipeline.


PushConstants

Shows how to enable blending in Anvil applications by rendering a number of rotating triangles, each being assigned a slightly different alpha value.

System requirements

  • AMD Radeon™ GCN-based GPU (HD 7000 series or newer)
    • Or other Vulkan™ compatible discrete GPU
  • Windows® 7 (SP1 with the Platform Update), Windows® 8.1, or Windows® 10
    • Or Linux (Ubuntu)
  • Visual Studio® 2013 or Visual Studio® 2015
    • Or on Linux, anything supported by CMake that has a proper C++11 compiler
  • Graphics driver with Vulkan support
    • For example, AMD Radeon Software Crimson Edition 16.5.2 or later
  • The Vulkan SDK must be installed
  • Vulkan RT must be at least 1.0.39.1 for platforms with VK_KHR_get_physical_device_properties2 extension support.

 Technical Blogs

Resources