NGX Reports DLSS RR as Unavailable on Linux

Following this post from @dlacewell I’d like to use DLSS RR in my OptiX rendering pipeline on a Linux (24.04) x86_64 system with an NVIDIA GeForce RTX 5090 (Display Driver 590.44.01, with the Open GPU Kernel Modules built from source).
I’ve downloaded the latest DLSS 310.4.0 SDK and copied libnvidia-ngx-dlssd.so.310.4.0 next to my executable so NGX can find it. However, the call to NVSDK_NGX_CUDA_GetFeatureRequirements with FeatureID set to NVSDK_NGX_Feature_RayReconstruction fails with error NVSDK_NGX_Result_FAIL_FeatureNotSupported. Here’s the minimal sample program:

#include <stdio.h>
#include <cuda.h>
#include <nvsdk_ngx.h>

int main(void) {
    CUdevice device;

    cuInit(0);
    cuDeviceGet(&device, 0);

    NVSDK_NGX_FeatureRequirement req = {0};
    NVSDK_NGX_FeatureCommonInfo commonInfo = {0};
    NVSDK_NGX_FeatureDiscoveryInfo info = {
        .SDKVersion = NVSDK_NGX_Version_API,
        .FeatureID = NVSDK_NGX_Feature_SuperSampling,
        .Identifier.IdentifierType = NVSDK_NGX_Application_Identifier_Type_Project_Id,
        .Identifier.v.ProjectDesc.ProjectId = "a0f57b54-1daf-4934-90ae-c4035c19df04",
        .Identifier.v.ProjectDesc.EngineType = NVSDK_NGX_ENGINE_TYPE_CUSTOM,
        .Identifier.v.ProjectDesc.EngineVersion = "0.1",
        .ApplicationDataPath = L"./",
        .FeatureInfo = &commonInfo
    };

    printf("0x%x %u\n", NVSDK_NGX_CUDA_GetFeatureRequirements(device, &info, &req), req.FeatureSupported);

    return 0;
}
// prints: 0xbad00001 0

Here’s how I compile it:

nvcc ngx.c -o ngx \
-I/usr/local/cuda/include \
-I$HOME/DLSS/include \
-L/usr/local/cuda/lib64 \
-L$HOME/DLSS/lib/Linux_x86_64 \
-lcuda -lnvsdk_ngx -ldl -lstdc++

According to this comment, NVSDK_NGX_Init doesn’t need to be called before calling NVSDK_NGX_CUDA_GetFeatureRequirements so I don’t get any logs even when specifying the LoggingCallback and defining __NGX_LOG_LEVEL. Following these instructions, I’ve created /usr/share/nvidia/nvidia-ngx-conf.json with this content:

{
    "file_format_version": "1.0.0",
    "ngx_models_path": "/usr/share/nvidia/ngx",
    "allow_ngx_updater": true
}

When adding a call to NVSDK_NGX_CUDA_Init_with_ProjectID I get these logs:

[NGXLoadFromPath:1751] Loading most recent 'libnvidia-ngx-dlssd.so' snippet from '.'...
[NGXLoadFromPath:1774]     Found 3 snippets:
[NGXLoadFromPath:1776]         libnvidia-ngx-dlssg.so.310.4.0
[NGXLoadFromPath:1776]         libnvidia-ngx-dlssd.so.310.4.0
[NGXLoadFromPath:1776]         libnvidia-ngx-dlss.so.310.4.0
[NGXLoadLibrary:70] Loaded library from path (/home/v/dr/libnvidia-ngx-dlssd.so.310.4.0)
[NGXValidateSnippetMetaData:1518] Validating snippet /home/v/dr/libnvidia-ngx-dlssd.so.310.4.0
[NGXValidateSnippetMetaData:1520] NGX CORE API version : 0x15, Snippet requires at least : 0x13
[NGXValidateSnippetMetaData:1524] GPU architecture : 0x1B0, Snippet expects at least : 0x140
[NGXValidateSnippetMetaData:1539] Driver support flags : 0xF(SEAMLESS_OTA|LINUX_EXTENDED_DRIVER_VERSIONS|API_SPECIFIC_POPULATE_PARAMS|REQUIRE_CMSID), Snippet required flags : 0xF(SEAMLESS_OTA|LINUX_EXTENDED_DRIVER_VERSIONS|API_SPECIFIC_POPULATE_PARAMS|REQUIRE_CMSID)
[NGXValidateSnippetMetaData:1567] Driver version : 590.44.1, Snippet expects at least : 535.101
[NGXValidateSnippetMetaData:1594] Snippet version : 310.4.0, Embedded app Id : E658703 (0)
[LaunchNGXUpdater:330] starting nvidia-ngx-updater with command line " -api update -cmsid 1 -feature dlssd -bootstrap  -gpuarch 352"
[LaunchNGXUpdater:386] successfully launched nvidia-ngx-updater!
[NGXLoadFromPath:1751] Loading most recent '160_E658703.bin' snippet from '/usr/share/nvidia/ngx/models/dlssd/versions/0/files'...
[NGXLoadFromPath:1770]     Found no snippets
[load:677] NGXLoadFromPath failed: -1160773628
[NGXSecureLoadFeature:1307] Feature dlssd failed to load (cmsid 241534723) from cache (location: /usr/share/nvidia/ngx/models/dlssd/versions/0/files, name: 160_E658703.bin)
[LaunchNGXUpdater:330] starting nvidia-ngx-updater with command line " -api update -cmsid 0 -feature dlssd -bootstrap  -gpuarch 352"
[LaunchNGXUpdater:386] successfully launched nvidia-ngx-updater!
[LaunchNGXUpdater:330] starting nvidia-ngx-updater with command line " -api update -cmsid 2 -feature dlssd -bootstrap  -gpuarch 352"
[LaunchNGXUpdater:386] successfully launched nvidia-ngx-updater!
[LaunchNGXUpdater:330] starting nvidia-ngx-updater with command line " -api update -cmsid 3 -feature dlssd -bootstrap  -gpuarch 352"
[LaunchNGXUpdater:386] successfully launched nvidia-ngx-updater!
[NGXLoadFromPath:1751] Loading most recent 'libnvidia-ngx-dlssd.so' snippet from ''...
[NGXLoadFromPath:1770]     Found no snippets
[load:677] NGXLoadFromPath failed: -1160773628
[NGXSecureLoadFeature:1423] app E658702 feature dlssd snippet: ./libnvidia-ngx-dlssd.so version: 310.4.0
[NGXLoadFeature:1499] Setting show info tip callback for dlssd
[NGXLoadFeature:1514] Setting override status callback for dlssd
[NGXSecureLoadFeature:1148] unable to read the deny list. Assuming that the feature is allowed.
...
NVSDK_NGX_CUDA_Init_with_ProjectID: 0x1
[nvmlArchToNGX:46] Blackwell detected, chip is 55
[LaunchNGXUpdater:330] starting nvidia-ngx-updater with command line " -api update -cmsid 1 -feature dlssd -gpuarch 352"
[LaunchNGXUpdater:386] successfully launched nvidia-ngx-updater!
NVSDK_NGX_CUDA_GetFeatureRequirements: 0xbad00001 0
NVSDK_NGX_CUDA_Shutdown: 0x1

The DLL is loaded, the snippet seems to pass all checks, nvidia-ngx-updater is launched, the config file is read, and it seems like NGX is trying to load 160_E658703.bin but no models are downloaded to the /usr/share/nvidia/ngx directory — probably because my custom ID is not whitelisted.

Setting FeatureID to NVSDK_NGX_Feature_SuperSampling returns NVSDK_NGX_Result_Success. I know for sure that this PC supports DLSS RR because I’m able to use it on Windows (running on the same machine).

Could someone at NVIDIA please provide instructions on how to get this set up correctly?

Hi, maybe I should have made this more clear in my post over on the OptiX forum, but the CUDA api for DLSS-RR is NOT currently enabled in public drivers, even if you happen to find some related functions in the NGX headers.

In the meantime, you can however use DLSS-RR through the NGX Vulkan functions. It’s a bit of a pain, but you could interop your buffers from OptX/CUDA to Vulkan in your app, and get it work that way. You don’t have to use Streamline for that.

Hi, thanks for the clarification. I confirmed that NVSDK_NGX_VULKAN_GetFeatureRequirements succeeds and reports DLSS RR as supported. I had a look at libnvidia-ngx-dlssd.so and it seems that most of the neural net inference is anyway happening inside of CUDA kernels so it would be amazing if OptiX/CUDA was fully supported by NGX in the near future. Can we submit a feature request somewhere?