{"id":50178493,"url":"https://github.com/Devsh-Graphics-Programming/Nabla","last_synced_at":"2026-06-10T21:00:51.226Z","repository":{"id":37029212,"uuid":"189206704","full_name":"Devsh-Graphics-Programming/Nabla","owner":"Devsh-Graphics-Programming","description":"Vulkan, OptiX and CUDA Interoperation Modular Rendering Library and Framework for PC/Linux/Android","archived":false,"fork":false,"pushed_at":"2026-06-08T05:07:04.000Z","size":1987890,"stargazers_count":698,"open_issues_count":122,"forks_count":71,"subscribers_count":13,"default_branch":"master","last_synced_at":"2026-06-08T07:10:19.472Z","etag":null,"topics":["computer-graphics","cuda","cuda-opengl","gpgpu","gpu","graphics-engine","graphics-library","hlsl","optix","optix-denoiser","path-tracing","pathtracing","pbr","raytracing","rendering","shaders","spir-v","vulkan"],"latest_commit_sha":null,"homepage":"http://devsh.eu","language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Devsh-Graphics-Programming.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2019-05-29T10:48:56.000Z","updated_at":"2026-05-30T07:47:13.000Z","dependencies_parsed_at":"2024-04-02T09:51:20.526Z","dependency_job_id":"9a6543a7-203a-4fef-8ffe-62ae91a4c72a","html_url":"https://github.com/Devsh-Graphics-Programming/Nabla","commit_stats":null,"previous_names":[],"tags_count":49,"template":false,"template_full_name":null,"purl":"pkg:github/Devsh-Graphics-Programming/Nabla","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Devsh-Graphics-Programming%2FNabla","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Devsh-Graphics-Programming%2FNabla/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Devsh-Graphics-Programming%2FNabla/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Devsh-Graphics-Programming%2FNabla/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Devsh-Graphics-Programming","download_url":"https://codeload.github.com/Devsh-Graphics-Programming/Nabla/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Devsh-Graphics-Programming%2FNabla/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34170161,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-10T02:00:07.152Z","response_time":89,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["computer-graphics","cuda","cuda-opengl","gpgpu","gpu","graphics-engine","graphics-library","hlsl","optix","optix-denoiser","path-tracing","pathtracing","pbr","raytracing","rendering","shaders","spir-v","vulkan"],"created_at":"2026-05-25T06:00:22.959Z","updated_at":"2026-06-10T21:00:51.219Z","avatar_url":"https://github.com/Devsh-Graphics-Programming.png","language":"C++","funding_links":[],"categories":["Libraries"],"sub_categories":[],"readme":"\n\u003cdiv align=\"center\"\u003e\n   \u003cimg alt=\"Click to see the source\" height=\"200\" src=\"nabla-glow.svg\" width=\"200\" /\u003e\n\u003c/div\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://github.com/Devsh-Graphics-Programming/Nabla/actions/workflows/build-nabla.yml\"\u003e\n    \u003cimg src=\"https://github.com/Devsh-Graphics-Programming/Nabla/actions/workflows/build-nabla.yml/badge.svg\" alt=\"Build Status\" /\u003e\u003c/a\u003e\n  \u003ca href=\"https://opensource.org/licenses/Apache-2.0\"\u003e\n    \u003cimg src=\"https://img.shields.io/badge/license-Apache%202.0-blue\" alt=\"License: Apache 2.0\" /\u003e\u003c/a\u003e\n  \u003ca href=\"https://discord.gg/krsBcABm7u\"\u003e\n    \u003cimg src=\"https://img.shields.io/discord/308323056592486420?label=discord\u0026logo=discord\u0026logoColor=white\u0026color=7289DA\" alt=\"Join our Discord\" /\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n# Table of Contents\n\n1. [Showcase](#showcase)\n2. [Features](#features)\n   - [The Nabla Core Profile](#-the-nabla-core-profile)\n   - [Physical Device Selection and Filtering](#-physical-device-selection-and-filteration)\n   - [SPIR-V and Vulkan as First-Class Citizens](#-spir-v-and-vulkan-as-first-class-citizens)\n   - [Integration of Renderdoc](#-integration-of-renderdoc)\n   - [Nabla Event Handler: Seamless GPU-CPU Synchronization](#-nabla-event-handler-seamless-gpu-cpu-synchronization)\n   - [GPU Object Lifecycle Tracking](#-gpu-object-lifecycle-tracking)\n   - [HLSL2021 Standard Template Library](#-hlsl2021-standard-template-library)\n   - [Full Embrace of Buffer Device Address and Descriptor Indexing](#-full-embrace-of-buffer-device-address-and-descriptor-indexing)\n   - [Minimally Invasive Design](#-minimally-invasive-design)\n   - [Designed for Interoperation](#-designed-for-interoperation)\n   - [Cancellable Future-based Async I/O](#-cancellable-future-based-async-io)\n   - [Data Transfer Utilities](#-data-transfer-utilities)\n   - [Virtual File System](#-virtual-file-system)\n   - [Asset System](#-asset-system)\n   - [Asset Converter (CPU to GPU)](#-asset-converter-cpu-to-gpu)\n   - [Unit-Tested BxDFs for Physically Based Rendering](#-unit-tested-bxdfs-for-physically-based-rendering)\n   - [Property Pools (GPU Entity Component System)](#-in-progress-property-pools-gpu-entity-component-system)\n   - [SPIR-V Introspection and Layout Creation](#-spir-v-introspection-and-layout-creation)\n   - [Nabla Extensions](#-nabla-extensions)\n3. [Coming Soon](#-coming-soon)\n4. [Need Our Expertise?](#-need-our-expertise)\n5. [Join Our Team](#join-our-team)\n\n# Showcase\n\n\u003ccenter\u003e\n  \u003ctable style=\"width: 100%; border-collapse: collapse; vertical-align:top;\"\u003e\n    \u003c!-- row 1 --\u003e\n    \u003ctr\u003e\n      \u003ctd width=\"500\" height=\"60\" valign=\"middle\"; align=\"center\"\u003e\n        \u003ca href=\"TODO\" target=\"_blank\"\u003eRay Tracing\u003c/a\u003e\n      \u003c/td\u003e\n      \u003ctd width=\"500\" height=\"60\" valign=\"middle\"; align=\"center\"\u003e\n        \u003ca href=\"TODO\" target=\"_blank\"\u003eEmulated shaderFloat64\u003c/a\u003e\n      \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd width=\"500\" valign=\"middle\"; style=\"width:50%; text-align:center; vertical-align:top; padding:2%;\"\u003e\n          \u003cimg src=\"https://github.com/user-attachments/assets/a14ba3d6-338b-4814-b67a-1d680766b5b6\" alt=\"Ray Tracing\" style=\"width:100%;\"\u003e\n          \u003cimg src=\"https://github.com/user-attachments/assets/241fdeaf-92c4-4f6e-9a80-73307b4948c6\" alt=\"Ray Tracing\" style=\"width:100%; height:auto;\"\u003e\n      \u003c/td\u003e\n      \u003ctd width=\"500\" valign=\"middle\"; style=\"width:50%; text-align:center; vertical-align:top; padding:2%;\"\u003e\n          \u003cimg src=\"https://github.com/user-attachments/assets/07f71a81-1f9f-4874-99ab-ec6b9ce6c598\" alt=\"Emulated shaderFloat64\" style=\"width:100%;\"\u003e\n      \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003c!-- row 2 --\u003e\n    \u003ctr\u003e\n      \u003ctd width=\"500\" height=\"60\" valign=\"middle\"; align=\"center\"\u003e\n        \u003ca href=\"TODO\" target=\"_blank\"\u003eMSDF Hatches\u003c/a\u003e\n      \u003c/td\u003e\n      \u003ctd width=\"500\" height=\"60\" valign=\"middle\"; align=\"center\"\u003e\n        \u003ca href=\"TODO\" target=\"_blank\"\u003ePorting GDI to Nabla\u003c/a\u003e\n      \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd width=\"500\" valign=\"middle\"; style=\"width:50%; text-align:bottom; vertical-align: top; valign:top; padding:2%;\"\u003e\n          \u003cimg 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;\"\u003e\n          \u003cimg 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;\"\u003e\n      \u003c/td\u003e\n      \u003ctd width=\"500\" valign=\"middle\"; style=\"width:50%; text-align:center; vertical-align:top; padding:2%;\"\u003e\n          \u003cimg src=\"https://github.com/user-attachments/assets/7941f9f0-876e-4cd8-a6e5-3c403e339c59\" alt=\"TODODOO\" style=\"width:100%; height:auto;\"\u003e\n          \u003cimg src=\"https://github.com/user-attachments/assets/89401139-5f06-4aaf-a081-ed540976660a\" alt=\"TODODOO 2\" style=\"width:100%; height:auto;\"\u003e\n          \u003cimg src=\"https://github.com/user-attachments/assets/d2d56b1e-8a21-4bcd-aa14-8e3e86ec22ba\" alt=\"TODODOO 3\" style=\"width:100%; height:auto;\"\u003e\n      \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003c!-- row 3 --\u003e\n    \u003ctr\u003e\n      \u003ctd width=\"500\" height=\"60\" valign=\"middle\"; align=\"center\"\u003e\n        \u003ca href=\"TODO\" target=\"_blank\"\u003eSDF function manipulator\u003c/a\u003e\n      \u003c/td\u003e\n      \u003ctd width=\"500\" height=\"60\" valign=\"middle\"; align=\"center\"\u003e\n        \u003ca href=\"TODO\" target=\"_blank\"\u003eFluid 3D\u003c/a\u003e\n      \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd width=\"500\" valign=\"middle\"; style=\"width:50%; text-align:bottom; vertical-align: top; valign:top; padding:2%;\"\u003e\n          \u003cimg 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;\"\u003e\n      \u003c/td\u003e\n      \u003ctd width=\"500\" valign=\"middle\"; style=\"width:50%; text-align:center; vertical-align:top; padding:2%;\"\u003e\n          \u003cimg src=\"https://github.com/user-attachments/assets/b7705a3a-ddba-466e-95f0-125458f00349\" alt=\"Fluid 3D\" style=\"width:100%; height:auto;\"\u003e\n      \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003c!-- row 4 --\u003e\n    \u003ctr\u003e\n      \u003ctd width=\"500\" height=\"60\" valign=\"middle\"; align=\"center\"\u003e        \n        \u003ca href=\"TODO\" target=\"_blank\"\u003eNabla Shader Compiler \u0026 Godbolt docker integration \u003c/a\u003e\n      \u003c/td\u003e\n      \u003ctd width=\"500\" height=\"60\" valign=\"middle\"; align=\"center\"\u003e\n        \u003ca href=\"TODO\" target=\"_blank\"\u003eImGUI render backend \u0026 extensions\u003c/a\u003e\n      \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd width=\"500\" valign=\"middle\"; style=\"width:50%; text-align:bottom; vertical-align: top; valign:top; padding:2%;\"\u003e\n          \u003cimg 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;\"\u003e\n      \u003c/td\u003e\n      \u003ctd width=\"500\" valign=\"middle\"; style=\"width:50%; text-align:center; vertical-align:top; padding:2%;\"\u003e\n          \u003cimg src=\"https://github.com/user-attachments/assets/86452841-556b-43ed-ad95-ef45452b51d5\" alt=\"ImGUI render backend and extensions\" style=\"width:100%; height:auto;\"\u003e\n      \u003c/td\u003e\n    \u003c/tr\u003e\n  \u003c/table\u003e\n\u003c/center\u003e\n\n# Features\n\n### 🧩 **The Nabla Core Profile**\n\nNabla exposes [a curated set of Vulkan extensions and features](https://github.com/Devsh-Graphics-Programming/Nabla/blob/master/src/nbl/video/vulkan/profiles/NablaCore.json) compatible across the GPUs we aim to support on Windows, Linux, (coming soon MacOS, iOS as well as Android)\n\nVulkan evolves fast—just when you think you've figured out [sync](https://github.com/KhronosGroup/Vulkan-Docs/wiki/Synchronization-Examples-(Legacy-synchronization-APIs)), you realize there's [sync2](https://registry.khronos.org/vulkan/specs/latest/man/html/VK_KHR_synchronization2.html). Keeping up with new extensions, best practices, and hardware quirks is exhausting.\nInstead of digging through [gpuinfo.org](gpuinfo.org) or [Vulkan specs](https://registry.khronos.org/vulkan/specs/latest/html/vkspec.html), 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:\n  - mastering a feature\n  - finding out about a new feature\n  - assesing whether obsoletes or just adds the one you've just mastered\n  - working if the feature is ubiquitous on the devices you target\n  - rewriting what you've just polished\n\n### 🧩 **Physical Device Selection and Filteration**\n\nNabla allows you to select the best GPU for your compute or graphics workload.\n\n```c++\nvoid filterDevices(core::set\u003cvideo::IPhysicalDevice*\u003e\u0026 physicalDevices)\n{\n  nbl::video::SPhysicalDeviceFilter deviceFilter = {};\n  deviceFilter.minApiVersion = { 1,3,0 };\n  deviceFilter.minConformanceVersion = {1,3,0,0};\n  deviceFilter.requiredFeatures.rayQuery = true;\n  deviceFilter(physicalDevices);\n}\n```\n\n### 🧩 **SPIR-V and Vulkan as First-Class Citizens**\n\nNabla treats **SPIR-V** and **Vulkan** as the preferred, reference standard—everything else is built around them, with all other backends adapting to them.\n\n### 🧩 **Integration of Renderdoc**\n\nBuilt-in support for capturing frames and debugging with [Renderdoc](https://renderdoc.org/).\n 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.\n\n```c++\nconst IQueue::SSubmitInfo submitInfo = {\n    .waitSemaphores = {},\n    .commandBuffers = {\u0026cmdbufInfo,1},\n    .signalSemaphores = {\u0026signalInfo,1}\n};\nm_api-\u003estartCapture(); // Start Renderdoc Capture\nqueue-\u003esubmit({\u0026submitInfo,1});\nm_api-\u003eendCapture(); // End Renderdoc Capture\n```\n\n### 🧩 **Nabla Event Handler: Seamless GPU-CPU Synchronization**\n\nNabla Event Handler's extensive usage of [Timeline Semaphores](https://www.khronos.org/blog/vulkan-timeline-semaphores) enables CPU Callbacks on GPU conditions.\n\nYou 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.\n\n```c++\n// 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\nmemory_pool-\u003edeallocate(\u0026offset,\u0026size,nextSubmit.getFutureScratchSemaphore());\n```\n\n### 🧩 **GPU Object Lifecycle Tracking**\n\nNabla uses [reference counting](https://github.com/Devsh-Graphics-Programming/Nabla/blob/ff07cd71c4e21bc51fa416ccd151b2e92efea028/include/nbl/core/decl/smart_refctd_ptr.h#L22) to track the lifecycle of GPU objects. Descriptor sets and command buffers are responsible for maintaining reference counts on the resources (e.g., buffers, textures) they use. The queue itself also tracks command buffers, ensuring that objects remain alive as long as they are pending execution. This system guarantees the correct order of deletion and makes it difficult for GPU objects to go out of scope and be destroyed before the GPU has finished using them.\n\n### 🧩 **HLSL2021 Standard Template Library**\n\n- 🔄 Reusable: Unified single-source C++/HLSL libraries eliminate code duplication with reimplementation of STL's `type_traits`, `limits`, `functional`, `tgmath`, etc.\n\n- 🐞 Shader Logic, CPU-Tested: A subset of HLSL compiles as both C++ and SPIR-V, enabling CPU-side debugging of GPU logic, ensuring correctness in complex tasks like FFT, Prefix Sum, etc. (See our examples: [1. BxDF Unit Test](https://github.com/Devsh-Graphics-Programming/Nabla-Examples-and-Tests/blob/d7f7a87fa08a56a16cd1bcc7d4d9fd48fc8c278c/66_HLSLBxDFTests/app_resources/tests.hlsl#L436), [2. Math Funcs Unit Test](https://github.com/Devsh-Graphics-Programming/Nabla-Examples-and-Tests/blob/fd92730f0f5c8a120782c928309cb10e776c25db/22_CppCompat/main.cpp#L407))\n\n- 🔮 Future-Proof: C++20 [concepts](https://en.cppreference.com/w/cpp/language/constraints) in HLSL enable safe and documented polymorphism.\n\n- 🧠 Insane: Boost Preprocessor and Template Metaprogramming in HLSL!\n\n- 🛠️ Real-World Problem Solvers: The library offers GPU-optimized solutions for tasks like Prefix Sum, Binary Search, FFT, Global Sort, and even emulated `shaderFloat64` when native GPU support is unavailable!\n\n🎤 Talks from us:\n - [Vulkanised 2024: Beyond SPIR-V: Single Source C++ and Shader Programming](https://www.youtube.com/watch?v=JCJ35dlZJb4)\n - [Vulkanised 2023: HLSL202x like its C++, building an `std::` like Library]()\n\n### 🧩 **Full Embrace of [Buffer Device Address]() and [Descriptor Indexing]()**\n\nBy utilizing Buffer Device Addresses (BDAs), Nabla enables more direct access to memory through 64-bit GPU virtual addresses. Synergized with Descriptor Indexing, this approach enhances flexibility by enabling more dynamic, scalable resource binding without relying on traditional descriptor sets.\n\n### 🧩 **Minimally Invasive Design**\n\nNo Singletons, No Main Thread—Nabla allows multiple instances of every object (including Vulkan devices) without assuming a main thread or thread-local contexts. Thread-agnostic by design, it avoids global state and explicitly passes contexts for easy multithreading.\n\nNabla's minimally invasive and flexible design with api handle acquisitions and multi-window support make it ideal for custom rendering setups and low-level GPU programming without unnecessary constraints such as assuming a main thread or a single window.\n\nEven Win32 windowing is wrapped for use across multiple threads, breaking free traditional single-thread limitations.\n\nThis allows simpler porting of legacy OpenGL and DirectX applications.\n\n\u003cp align=\"center\"\u003e\n  \u003cdiv style=\"display: flex; justify-content: center; gap: 10px;\"\u003e\n    \u003cimg src=\"https://github.com/user-attachments/assets/1add9cbd-fabc-4e97-b4a1-373ccefa3d8a\" alt=\"GDI 1\" style=\"width: 30%; height: auto;\"\u003e\n    \u003cimg src=\"https://github.com/user-attachments/assets/97efeb67-d78c-4010-a0a2-198958b3deeb\" alt=\"GDI 2\" style=\"width: 30%; height: auto;\"\u003e\n    \u003cimg src=\"https://github.com/user-attachments/assets/82009094-81e5-4146-8f1a-5bac7e13f722\" alt=\"GDI 3\" style=\"width: 30%; height: auto;\"\u003e\n  \u003c/div\u003e\n\u003c/p\u003e\n\n### 🧩 **Designed for Interoperation**\nNabla is built with interoperation in mind, supporting memory export and import between different compute and graphics APIs.\n\n### 🧩 **Cancellable Future based Async I/O**\n\nFile I/O is fully asynchronous, using [nbl::system::future_t](https://github.com/Devsh-Graphics-Programming/Nabla/blob/ff07cd71c4e21bc51fa416ccd151b2e92efea028/include/nbl/system/ISystem.h#L26), a cancellable MPSC circular buffer-based future implementation.\n\nRequests start in a **PENDING** state and can be invalidated before execution if needed. This enables efficient async file reads and GPU memory writes, ensuring non-blocking execution:\n\n```cpp\nISystem::future_t\u003csize_t\u003e bytesActuallyWritten;\nfile-\u003eread(bytesActuallyWritten, gpuMemory-\u003egetMappedPointer(), offsetInFile, 2*1024*1024*1024);\nwhile (!bytesActuallyWritten.ready()) { /* Do other work */ }\n```\n\n### 🧩 **Data Transfer Utilities**\nNabla's [Utilities](https://github.com/Devsh-Graphics-Programming/Nabla/blob/master/include/nbl/video/utilities/IUtilities.h) streamlines the process of pushing/pulling arbitrary-sized buffers and images with fixed staging memory to/from the GPU, ensuring seamless data transfers.\n The system automatically handles submission when buffer memory overflows, while [promoting unsupported formats](https://github.com/Devsh-Graphics-Programming/Nabla/tree/dac9855ab4a98d764130e41a69abdc605a91092c/include/nbl/asset/format) during upload to handle color format conversions.\nBy leveraging device-specific properties, the system respects alignment limits and ensures deterministic behavior. The user only provides initial submission info through [SIntendedSubmitInfo](https://github.com/Devsh-Graphics-Programming/Nabla/blob/ff07cd71c4e21bc51fa416ccd151b2e92efea028/include/nbl/video/utilities/SIntendedSubmitInfo.h#L18), and the utility manages subsequent submissions automatically.\n\n - Learn more:\n   - 🎤 Our Talk at Vulkanised: [Vulkanised 2023: Keeping your staging buffer fixed size! ](https://www.youtube.com/watch?v=x8v656d3pc4)\n   - 📚 Our Blog post: [Uploading Textures to GPU - The Good Way](https://erfan-ahmadi.github.io/blog/Nabla/imageupload)\n\n\n### 🧩 **Virtual File System**  \n\nNabla provides a [**unified Virtual File System**] ([system::ISystem](https://github.com/Devsh-Graphics-Programming/Nabla/blob/ff07cd71c4e21bc51fa416ccd151b2e92efea028/include/nbl/system/ISystem.h#L19)) that supports **mounting archives and folders** under different virtual paths. This enables access to both external and embedded assets while preserving **original relative paths**.  \n\nFor embedding, we provide an alternative to C++23's #embed, which allows embedding files directly into compiled binaries. Instead of relying on compiler support, we use **Python + CMake** to generate what we call **built-in resource archives**—packing files (e.g., images, shaders, `.obj`, `.mtl`, `.dds`) into DLLs as **memory-mapped [system::IFile](https://github.com/Devsh-Graphics-Programming/Nabla/blob/ff07cd71c4e21bc51fa416ccd151b2e92efea028/include/nbl/system/IFile.h#L9) objects** ensuring that dependent assets (e.g., models and their textures) **retain their correct relative paths** even when embedded.  \n\nThe embedding process:  \n1. **At build time**, Python reads an input path table (generated by CMake).  \n2. It serializes files into **constexpr arrays** with metadata (key + timestamps).  \n3. The output **C++ source + header** define a **built-in resource library**, linked into Nabla or examples.  \n\nThis approach keeps assets self-contained, making file access efficient while maintaining asset dependencies.\n\n### 🧩 **Asset System**\nThe asset system in Nabla maintains a 1:1 mapping between CPU and GPU representations, where every CPU asset has a direct GPU counterpart.\nThe system also allows for coordination between loaders—for instance, the OBJ loader can trigger the MTL loader, and the MTL loader in turn invokes image loaders, ensuring smooth asset dependency management.\n\n### 🧩 **Asset Converter (CPU to GPU)**\nThe Asset Converter transforms CPU objects (`asset::IAsset`) into GPU objects (`video::IBackendObject`) while eliminating duplicates with Merkle Trees. Instead of relying on pointer comparisons, it hashes asset contents to detect and reuse identical GPU objects.\n\n### 🧩 **Unit-Tested BxDFs for Physically Based Rendering**\nA statically polymorphic library for defining Bidirectional Scattering Distribution Functions (BxDFs) in HLSL and C++. Each BxDF is rigorously unit-tested in C++ as well as HLSL. This is part of Nabla’s HLSL-C++ compatible library.\n\nSnippet of our [BxDF Unit Test](https://github.com/Devsh-Graphics-Programming/Nabla-Examples-and-Tests/blob/d7f7a87fa08a56a16cd1bcc7d4d9fd48fc8c278c/66_HLSLBxDFTests/main.cpp#L93):\n\n```cpp\nTestJacobian\u003cbxdf::reflection::SLambertianBxDF\u003csample_t, iso_interaction, aniso_interaction, spectral_t\u003e\u003e::run(initparams, cb);\nTestJacobian\u003cbxdf::reflection::SOrenNayarBxDF\u003csample_t, iso_interaction, aniso_interaction, spectral_t\u003e\u003e::run(initparams, cb);\nTestJacobian\u003cbxdf::reflection::SBeckmannBxDF\u003csample_t, iso_cache, aniso_cache, spectral_t\u003e, false\u003e::run(initparams, cb);\nTestJacobian\u003cbxdf::reflection::SBeckmannBxDF\u003csample_t, iso_cache, aniso_cache, spectral_t\u003e, true\u003e::run(initparams, cb);\nTestJacobian\u003cbxdf::reflection::SGGXBxDF\u003csample_t, iso_cache, aniso_cache, spectral_t\u003e, false\u003e::run(initparams, cb);\nTestJacobian\u003cbxdf::reflection::SGGXBxDF\u003csample_t, iso_cache, aniso_cache, spectral_t\u003e,true\u003e::run(initparams, cb);\n\nTestJacobian\u003cbxdf::transmission::SLambertianBxDF\u003csample_t, iso_interaction, aniso_interaction, spectral_t\u003e\u003e::run(initparams, cb);\nTestJacobian\u003cbxdf::transmission::SSmoothDielectricBxDF\u003csample_t, iso_cache, aniso_cache, spectral_t\u003e\u003e::run(initparams, cb);\nTestJacobian\u003cbxdf::transmission::SSmoothDielectricBxDF\u003csample_t, iso_cache, aniso_cache, spectral_t, true\u003e\u003e::run(initparams, cb);\nTestJacobian\u003cbxdf::transmission::SBeckmannDielectricBxDF\u003csample_t, iso_cache, aniso_cache, spectral_t\u003e, false\u003e::run(initparams, cb);\nTestJacobian\u003cbxdf::transmission::SBeckmannDielectricBxDF\u003csample_t, iso_cache, aniso_cache, spectral_t\u003e, true\u003e::run(initparams, cb);\nTestJacobian\u003cbxdf::transmission::SGGXDielectricBxDF\u003csample_t, iso_cache, aniso_cache, spectral_t\u003e, false\u003e::run(initparams, cb);\nTestJacobian\u003cbxdf::transmission::SGGXDielectricBxDF\u003csample_t, iso_cache, aniso_cache, spectral_t\u003e,true\u003e::run(initparams, cb);\n```\n\n### 🔧 **In Progress: Property Pools (GPU Entity Component System)**\n*Property Pools* group related properties together in a Structure Of Arrays (SoA) manner, allowing efficient, cache-friendly access to data on the GPU. The system enables transferring properties (Components) between the CPU and GPU, with the `PropertyPoolHandler` managing scattered updates with a special compute shader. Handles are assigned for each object and remain constant as data is added or removed.\n\n### 🧩 **SPIR-V Introspection and Layout Creation**\n\nSPIR-V introspection in Nabla eliminates most of the boilerplate code required to set up descriptor and pipeline layouts, simplifying resource binding to shaders.\n\n### 🧩 **Nabla Extensions**\n- [ImGui integration](https://github.com/Devsh-Graphics-Programming/Nabla/tree/master/include/nbl/ext/ImGui) – `MultiDrawIndirect` based and draws in as little as a single drawcall.\n- [Fast Fourier Transform Extension](https://github.com/Devsh-Graphics-Programming/Nabla/tree/master/include/nbl/ext/FFT) – for image processing and all kind of frequncy-domain fun.\n- [Workgroup Prefix Sum](https://github.com/Devsh-Graphics-Programming/Nabla/tree/master/include/nbl/builtin/hlsl/workgroup) – Efficient parallel prefix sum computation.\n- [Blur](https://github.com/Devsh-Graphics-Programming/Nabla/blob/ff07cd71c4e21bc51fa416ccd151b2e92efea028/include/nbl/builtin/hlsl/prefix_sum_blur/blur.hlsl#L3) – Optimized GPU-based image blurring.\n- [Counting Sort](https://github.com/Devsh-Graphics-Programming/Nabla/blob/ff07cd71c4e21bc51fa416ccd151b2e92efea028/include/nbl/builtin/hlsl/sort/counting.hlsl) – High-performance, GPU-accelerated sorting algorithm.\n- [WIP] Autoexposure – Adaptive brightness adjustment for HDR rendering.\n- [WIP] Tonemapping\n- [WIP] GPU MPMC Queue – Multi-producer, multi-consumer GPU queue.\n- [WIP] OptiX interoperability for ray tracing.\n- [WIP] Global Scan – High-speed parallel scanning across large datasets.\n\n### 🚀 **Coming Soon**\n- Full CUDA interoperability support.\n- Scene Loaders\n- GPU-Driven Scene Graph\n- Material Compiler 2.0 for efficient scheduling of BxDF graph evaluation\n\n# 🤝 Need Our Expertise?\n\nWe specialize in:\n- High-performance computing and performance optimization\n- Path Tracing and Physically Based Rendering\n- CAD Rendering\n- Audio Programming and Digital Signal Processing\n- Porting and Optimizing legacy Renderers\n- Graphics and Compute APIs:\n  - Vulkan, D3D12, CUDA, OpenCL, WebGPU, D3D11, OpenGL\n\nWhether you're optimizing your **renderer** or **compute workloads**, looking to **port your legacy renderer**, or integrating complex **visual effects** into your product, our team can help you. As a specialized team, we're constantly learning, evolving, and discussing matters with each other. [Each member](#join-our-team) brings unique insights to the table, ensuring we approach every project from multiple angles to achieve the best possible solution.\n\nOur primary language is **C++20**, but we also work with **C#**, **Java**, **Python**, and other related technologies.\n\nIf you're already here reading this, We want to hear from you and learn more about what you're building.\n\n**Contact us** at **newclients@devsh.eu**.\n\nThe members of **Devsh Graphics Programming Sp. z O.O.** (Company Registration (KRS) #: 0000764661) are available (individually or collectively) for contracts on projects of various scopes and timescales.\n\n---\n\n# 👥 Join Our Team\n## 💼 Jobs\nIf you are:\n- a programmer with a passion for High Performance Computing, Mathematics and Computer Graphics\n- able to be in charge of your own time management and work 4-day work weeks fully remotely\n\nThen:\n1. Make something impressive using Nabla.\n2. Open a Pull Request\n3. Contact us either on discord or through the following e-mail address\n\u003cimg src=\"jobs-email.gif\" style=\"height: 1em;\"/\u003e\n\nYou may check out our [Free Task List](https://github.com/Devsh-Graphics-Programming/Nabla/blob/master/CONTRIBUTING.md#free-tasks-to-take-do-any---we-can-hire-you-) for contribution ideas\n\n## 🎓 Internships\nIn case of internships contact us with:\n- CV in English\n- A neat description of any paperwork you'll need (schools/universities). **Most importantly contact us \u003cins\u003eat least 5 weeks in advance\u003c/ins\u003e of your intenship organisation deadline!**\n\n[TODO]: also link to achievements, personal blogs, websites, linkedin and presentations of each member\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FDevsh-Graphics-Programming%2FNabla","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FDevsh-Graphics-Programming%2FNabla","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FDevsh-Graphics-Programming%2FNabla/lists"}