SkillAgentSearch skills...

Nabla

Vulkan, OptiX and CUDA Interoperation Modular Rendering Library and Framework for PC/Linux/Android

Install / Use

/learn @Devsh-Graphics-Programming/Nabla

README

<div align="center"> <img alt="Click to see the source" height="200" src="nabla-glow.svg" width="200" /> </div> <p align="center"> <a href="https://github.com/Devsh-Graphics-Programming/Nabla/actions/workflows/build-nabla.yml"> <img src="https://github.com/Devsh-Graphics-Programming/Nabla/actions/workflows/build-nabla.yml/badge.svg" alt="Build Status" /></a> <a href="https://opensource.org/licenses/Apache-2.0"> <img src="https://img.shields.io/badge/license-Apache%202.0-blue" alt="License: Apache 2.0" /></a> <a href="https://discord.gg/krsBcABm7u"> <img src="https://img.shields.io/discord/308323056592486420?label=discord&logo=discord&logoColor=white&color=7289DA" alt="Join our Discord" /></a> </p>

Table of Contents

  1. Showcase
  2. Features
  3. Coming Soon
  4. Need Our Expertise?
  5. Join Our Team

Showcase

<center> <table style="width: 100%; border-collapse: collapse; vertical-align:top;"> <!-- row 1 --> <tr> <td width="500" height="60" valign="middle"; align="center"> <a href="TODO" target="_blank">Ray Tracing</a> </td> <td width="500" height="60" valign="middle"; align="center"> <a href="TODO" target="_blank">Emulated shaderFloat64</a> </td> </tr> <tr> <td width="500" valign="middle"; style="width:50%; text-align:center; vertical-align:top; padding:2%;"> <img src="https://github.com/user-attachments/assets/a14ba3d6-338b-4814-b67a-1d680766b5b6" alt="Ray Tracing" style="width:100%;"> <img src="https://github.com/user-attachments/assets/241fdeaf-92c4-4f6e-9a80-73307b4948c6" alt="Ray Tracing" style="width:100%; height:auto;"> </td> <td width="500" valign="middle"; style="width:50%; text-align:center; vertical-align:top; padding:2%;"> <img src="https://github.com/user-attachments/assets/07f71a81-1f9f-4874-99ab-ec6b9ce6c598" alt="Emulated shaderFloat64" style="width:100%;"> </td> </tr> <!-- row 2 --> <tr> <td width="500" height="60" valign="middle"; align="center"> <a href="TODO" target="_blank">MSDF Hatches</a> </td> <td width="500" height="60" valign="middle"; align="center"> <a href="TODO" target="_blank">Porting GDI to Nabla</a> </td> </tr> <tr> <td width="500" valign="middle"; style="width:50%; text-align:bottom; vertical-align: top; valign:top; padding:2%;"> <img src="https://github.com/user-attachments/assets/99831ff2-61af-4c08-9c44-6fd0d04878cb" alt="MSDF Hatches" style="width:100%; height:auto; vertical-align:top; align:top;"> <img src="https://github.com/user-attachments/assets/095764a5-a07c-499b-a1fb-d1fcd98102f9" alt="MSDF Hatches 2" style="width:100%; height:auto; vertical-align:top; align:top;"> </td> <td width="500" valign="middle"; style="width:50%; text-align:center; vertical-align:top; padding:2%;"> <img src="https://github.com/user-attachments/assets/7941f9f0-876e-4cd8-a6e5-3c403e339c59" alt="TODODOO" style="width:100%; height:auto;"> <img src="https://github.com/user-attachments/assets/89401139-5f06-4aaf-a081-ed540976660a" alt="TODODOO 2" style="width:100%; height:auto;"> <img src="https://github.com/user-attachments/assets/d2d56b1e-8a21-4bcd-aa14-8e3e86ec22ba" alt="TODODOO 3" style="width:100%; height:auto;"> </td> </tr> <!-- row 3 --> <tr> <td width="500" height="60" valign="middle"; align="center"> <a href="TODO" target="_blank">SDF function manipulator</a> </td> <td width="500" height="60" valign="middle"; align="center"> <a href="TODO" target="_blank">Fluid 3D</a> </td> </tr> <tr> <td width="500" valign="middle"; style="width:50%; text-align:bottom; vertical-align: top; valign:top; padding:2%;"> <img src="https://github.com/user-attachments/assets/c399f07f-50ec-4fcd-8914-0433adcd6a35" alt="SDF function manipulator" style="width:100%; height:auto; vertical-align:top; align:top;"> </td> <td width="500" valign="middle"; style="width:50%; text-align:center; vertical-align:top; padding:2%;"> <img src="https://github.com/user-attachments/assets/b7705a3a-ddba-466e-95f0-125458f00349" alt="Fluid 3D" style="width:100%; height:auto;"> </td> </tr> <!-- row 4 --> <tr> <td width="500" height="60" valign="middle"; align="center"> <a href="TODO" target="_blank">Nabla Shader Compiler & Godbolt docker integration </a> </td> <td width="500" height="60" valign="middle"; align="center"> <a href="TODO" target="_blank">ImGUI render backend & extensions</a> </td> </tr> <tr> <td width="500" valign="middle"; style="width:50%; text-align:bottom; vertical-align: top; valign:top; padding:2%;"> <img src="https://github.com/user-attachments/assets/140818df-9238-459a-853e-7594b2ad222b" alt="NSC Docker" style="width:100%; height:auto; vertical-align:top; align:top;"> </td> <td width="500" valign="middle"; style="width:50%; text-align:center; vertical-align:top; padding:2%;"> <img src="https://github.com/user-attachments/assets/86452841-556b-43ed-ad95-ef45452b51d5" alt="ImGUI render backend and extensions" style="width:100%; height:auto;"> </td> </tr> </table> </center>

Features

🧩 The Nabla Core Profile

Nabla exposes a curated set of Vulkan extensions and features compatible across the GPUs we aim to support on Windows, Linux, (coming soon MacOS, iOS as well as Android)

Vulkan evolves fast—just when you think you've figured out sync, you realize there's sync2. Keeping up with new extensions, best practices, and hardware quirks is exhausting. Instead of digging through gpuinfo.org or Vulkan specs, Nabla gives you a well-thought-out set of extensions—so you can focus on what you want to achieve, not get stuck in an eternal loop of:

  • mastering a feature
  • finding out about a new feature
  • assesing whether obsoletes or just adds the one you've just mastered
  • working if the feature is ubiquitous on the devices you target
  • rewriting what you've just polished

🧩 Physical Device Selection and Filteration

Nabla allows you to select the best GPU for your compute or graphics workload.

void filterDevices(core::set<video::IPhysicalDevice*>& physicalDevices)
{
  nbl::video::SPhysicalDeviceFilter deviceFilter = {};
  deviceFilter.minApiVersion = { 1,3,0 };
  deviceFilter.minConformanceVersion = {1,3,0,0};
  deviceFilter.requiredFeatures.rayQuery = true;
  deviceFilter(physicalDevices);
}

🧩 SPIR-V and Vulkan as First-Class Citizens

Nabla treats SPIR-V and Vulkan as the preferred, reference standard—everything else is built around them, with all other backends adapting to them.

🧩 Integration of Renderdoc

Built-in support for capturing frames and debugging with Renderdoc. This is how one debugs headless or async GPU workloads that are not directly involved in producing a swapchain frame to be captured by Renderdoc.

const IQueue::SSubmitInfo submitInfo = {
    .waitSemaphores = {},
    .commandBuffers = {&cmdbufInfo,1},
    .signalSemaphores = {&signalInfo,1}
};
m_api->startCapture(); // Start Renderdoc Capture
queue->submit({&submitInfo,1});
m_api->endCapture(); // End Renderdoc Capture

🧩 Nabla Event Handler: Seamless GPU-CPU Synchronization

Nabla Event Handler's extensive usage of Timeline Semaphores enables CPU Callbacks on GPU conditions.

You can enqueue callbacks that trigger upon submission completion (workload finish), enabling amongst others, async readback of submission side effects, or deallocating an allocation after a workload is finished.

// This doesn't actually free the memory from the pool, the memory is queued up to be freed only after the `scratchSemaphore` reaches a value a future submit will signal
memory_pool->deallocate(&offse
View on GitHub
GitHub Stars678
CategoryDevelopment
Updated1d ago
Forks70

Languages

C++

Security Score

100/100

Audited on Mar 30, 2026

No findings