Open-source project
Ipotrick/Daxa avatar
Ipotrick/Daxa

Daxa: a Vulkan abstraction that assumes a modern GPU

Daxa is a convenient, simple and modern gpu api built on vulkan

617 stars53 forksC++MIT

At a glance

What is it?
Daxa is a C++ GPU abstraction built on Vulkan for NVIDIA Turing and later, AMD RDNA3 and later, and Intel Arc hardware, built around bindless resource access, a shader build system and a TaskGraph rendering framework. The trade is explicit, since anything older than those generations is out of scope.
Who is it for?
Adopt Daxa if you are building a renderer or GPU tool for NVIDIA Turing or newer, AMD RDNA3 or newer, or Intel Arc hardware, and you want bindless resources and a graph based renderer without hand managing descriptors. Skip it if you need to run on older hardware, since the abstraction is explicitly purpose-built for modern cards, and treat the missing install instructions as a signal to read the hosted documentation first.
Can I use it commercially?
Yes. MIT is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
Is it still maintained?
Yes. The repository last received commits 14 days ago.
What is it written in?
Mainly C++, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on October 22, 2026, and from our analysis. They are not legal advice.

Editorial analysis

The hardware floor is the first design decision

Daxa is described as a Vulkan-powered GPU abstraction purpose-built for modern graphics cards, and the README names the generations explicitly: NVIDIA from Turing onwards, AMD from RDNA3 onwards, and Intel from Arc onwards. The first bullet in the feature list is a strong modern GPU focus with no legacy hardware compromises, and the README explains the philosophy: the simplifications and abstractions are done specifically to remove all those API details that no longer matter on modern hardware. That is a narrower product than a general Vulkan wrapper, and it is the decision that everything else follows from. A library that supports a decade of hardware has to keep descriptor management, binding models and compatibility paths that a modern card does not need. Daxa removes them, which means it also removes the option of running on a pre-Turing card. If your target hardware is older than the stated floor, there is no configuration that changes this.

Bindless everywhere, on the host and in the shader

The first of the three things the README says makes Daxa unique is a full descriptor and binding abstraction, with full bindless in shaders and on the host side. Buffers, images, samplers and acceleration structures are all accessed exclusively via IDs or pointers, with no descriptor management and no bindings. The performance argument is that this is very efficient on modern hardware, and the practical argument is that it dramatically simplifies code because it removes one of the largest and most headache-inducing parts of modern graphics APIs. It is worth being precise about what this saves you, because the word descriptor covers a lot. In a conventional Vulkan renderer you allocate a descriptor set, bind buffers and images to slots, maintain the set layout alongside the shader's expectations, and rebuild it when anything changes. Under a bindless model the shader indexes a buffer or image by an integer handle and the runtime resolves it. Acceleration structures being in the same scheme as everything else is what makes ray tracing and mesh shaders fit naturally rather than being a special case bolted on.

The shader build system and the host-shared include file

The second area is shader utilities and shader integration. The README lists a full shader build system with include management, shader hot loading, SPIR-V caching and more, along with Daxa GLSL and SLANG headers that allow bindless and other Daxa features to be reached from inside a shader. The most interesting piece is the daxa.inl file, which allows you to write code that is shareable between host and shader through macros. This addresses a problem every graphics project hits, where constants and layout definitions have to exist identically on both sides of the boundary and any drift produces a subtle mismatch that shows up as corrupted data rather than a compile error. A shared include keeps the two definitions in one place. Combined with hot loading and SPIR-V caching, this is the part of the feature list that will change your iteration speed most, since shader edits normally mean a full rebuild of the pipeline and a restart, and both of those are expensive in a project with hundreds of shaders.

TaskGraph is a renderer, not just a wrapper

The third differentiator is the TaskGraph, described as a full-on rendering framework for your project. The features listed are automatic synchronization between tasks, support for multiple separate TaskGraphs and queues, and an efficient precompilation model that lets you record a graph once and execute it many times, which significantly reduces CPU overhead. Inside the task callbacks there are utilities such as a linear scratch buffer allocator and automatic image view generation, plus a large set of validation checks with detailed error messages explaining the issue and potential solutions. The graph is also optimised automatically, by reordering tasks to minimise barriers, by memory-aliasing transient resources to reduce memory use, and by other means. The last two of these are the reason the graph abstraction is more than sugar. A manual render loop expresses dependencies by ordering calls, and any parallelism you add makes you responsible for the barriers. A task graph expresses them declaratively, and the runtime both inserts the barriers and finds an order with fewer of them. The cost is that you give up direct control over submission order, and a workload with unusual synchronisation requirements is where that trade can hurt.

The middleware features Vulkan leaves to you

Alongside the three headline areas, the README lists what it calls commonly supported Vulkan-middleware features. There is automatic deferring of resource destruction until after GPU execution, which removes the class of bug where you free something the GPU is still reading. There is an internal GPU memory allocator, default parameters for object construction so objects are created with fewer arguments, and swapchain synchronisation and frame-in-flight handling. The library is thread safe, exposes access to modern features such as ray tracing, mesh shaders and multiple queues, and ships utility classes including a ring buffer for staging memory and Dear ImGui integration. Taken together, these are the pieces that a from-scratch Vulkan project spends its first weeks writing. A project that only needs the abstractions would have to build all of this itself, and a project that needs full control of Vulkan would find the abstraction layer in the way. That is the boundary of the library, and it is stated rather than hidden.

Getting started means the hosted documentation, not the repository

The getting started section points to docs.daxa.dev, where a tutorial and a wiki with detailed information about the API are hosted, and the README links both the tutorial and the wiki. There is no build command, no install snippet and no package manager entry in the README, which is worth flagging because it is not the usual pattern for a C++ library. What the repository does show is its shape. The top level holds CMakeLists.txt, CMakePresets.json and a cmake/ directory, along with include/ and src/ for the library, tests/ for a collection of example projects the README points to, a misc/ directory, and configuration files for clang-format and clang-tidy. So the build is CMake driven with presets, and the examples live with the tests. The examples are the practical place to start, because a TaskGraph based renderer is learned by reading a working graph rather than by reading an API listing, and the README explicitly frames the repository as a collection of example projects located in the tests folder. The Discord server is offered for people working on a renderer, a tool or a small experiment.

The release cadence, the licence and the cost of a Vulkan abstraction

The release history is regular and the project is not abandoned. The tags are 3.6 on 2026-05-03, 3.5 on 2026-02-05 and 3.4 on 2026-01-04, so roughly every three to four months through the first half of 2026, and the last push was on 2026-10-08 with the repository not archived. The licence is MIT, which for a graphics library matters more than it does for a web tool, because engine code is usually embedded in something you ship, and a permissive licence avoids the copyleft question entirely. The real cost of the abstraction is not licensing but the dependency. Daxa is not a self-contained library, it is a layer over Vulkan, so it inherits the platform's driver quirks, its extension negotiation, its memory model and its update cadence, and you still need a Vulkan driver and a working loader on the target machine. A second cost is the learning curve of the abstraction itself, since a bindless model and a task graph are unfamiliar shapes for most people arriving from an OpenGL or a conventional Vulkan background. The alternative approaches are the direct one, where you write Vulkan yourself and keep full control and full responsibility, and the middle one, where you use a more conventional wrapper that supports older hardware and keeps a familiar descriptor model. Daxa is the fast lane for modern hardware and modern architecture, and it is honest about that.

Editorial conclusion

Adopt Daxa if you are building a renderer or GPU tool for NVIDIA Turing or newer, AMD RDNA3 or newer, or Intel Arc hardware, and you want bindless resources and a graph based renderer without hand managing descriptors. Skip it if you need to run on older hardware, since the abstraction is explicitly purpose-built for modern cards, and treat the missing install instructions as a signal to read the hosted documentation first. Verify first that your target GPU falls inside the stated generation floor, that the Vulkan driver on the machine is current enough for the features you intend to use, and that you are comfortable with a task graph model before you adopt it over a straightforward render loop.

Frequently asked questions

What hardware does Daxa support?

Daxa is purpose-built for modern graphics cards, specifically NVIDIA from Turing onwards, AMD from RDNA3 onwards and Intel from Arc onwards. The README describes the focus as having no legacy hardware compromises, so older cards are out of scope.

What is bindless in Daxa and why does it matter?

Buffers, images, samplers and acceleration structures are all accessed exclusively via IDs or pointers, with no descriptor management and no bindings. The README calls this very efficient on modern hardware and says it dramatically simplifies code by removing one of the largest and most headache-inducing parts of modern graphics APIs.

How do I start learning Daxa?

The README points to docs.daxa.dev for a tutorial and a wiki covering the API in detail, and says the repository includes a collection of example projects in the tests folder. The build is CMake based, with CMakeLists.txt, CMakePresets.json and a cmake directory at the top level of the tree.

Official sources

  1. Ipotrick/Daxa on GitHub
  2. Issues
  3. License: MIT
  4. README
  5. Releases
Add this badge to your README

If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.

Add this badge to your README

markdown
[![Hysen Labs](https://hysenlabs.com/badge/ipotrick-daxa.svg)](https://hysenlabs.com/projects/ipotrick-daxa)

Was this useful?