Nabla
Vulkan, OptiX and CUDA Interoperation Modular Rendering Library and Framework for PC/Linux/Android
Install / Use
/learn @Devsh-Graphics-Programming/NablaREADME
Table of Contents
- Showcase
- Features
- The Nabla Core Profile
- Physical Device Selection and Filtering
- SPIR-V and Vulkan as First-Class Citizens
- Integration of Renderdoc
- Nabla Event Handler: Seamless GPU-CPU Synchronization
- GPU Object Lifecycle Tracking
- HLSL2021 Standard Template Library
- Full Embrace of Buffer Device Address and Descriptor Indexing
- Minimally Invasive Design
- Designed for Interoperation
- Cancellable Future-based Async I/O
- Data Transfer Utilities
- Virtual File System
- Asset System
- Asset Converter (CPU to GPU)
- Unit-Tested BxDFs for Physically Based Rendering
- Property Pools (GPU Entity Component System)
- SPIR-V Introspection and Layout Creation
- Nabla Extensions
- Coming Soon
- Need Our Expertise?
- 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
