GPUOpen-LibrariesAndSDKs / FidelityFX-SDK

The main repository for the FidelityFX SDK.
Other
835 stars 80 forks source link

[FSR3] Question About effectContextIdSharedResources in Source Code #72

Closed FlyAndNotDown closed 1 month ago

FlyAndNotDown commented 2 months ago

According to my understanding, effect context is used to store gpu resources classified by effect like interpolation/shared/upscaler. To support all platforms, I not used dx12 or vulkan backend in preset and implement backend interfaces by our engine interface. But I found when configured FFX_FSR3_ENABLE_UPSCALING_ONLY in FfxFsr3ContextDescription::flags, shared resource like dilated depth can not be created correctly.

After read the SDK code in ffx_fsr3.cpp, I found that effectContextIdSharedResources, effectContextIdUpscaling and effectContextIdFrameGeneration 3 fields in FfxFsr3Context_Private is not set. Actually, upscaling effect context id is stored in FfxFsr3UpscalerContext_Private::effectContextId and interpolation effect context id is seem. But shared resources effect context id is stored in effectContextIdSharedResources. For interpolation usage, it is ok but for upscaling only usage, shared resource context is not created, see:

if (!contextPrivate->upscalingOnly)
{
    FFX_VALIDATE(contextPrivate->backendInterfaceSharedResources.fpCreateBackendContext(&contextPrivate->backendInterfaceSharedResources, &contextPrivate->effectContextIdSharedResources));
}
else
{
    contextPrivate->backendInterfaceSharedResources = contextPrivate->backendInterfaceUpscaling;
    contextDescription->backendInterfaceSharedResources = contextDescription->backendInterfaceUpscaling;
}

But for any usage, the shared resources will be used directly in the following:

// set up FSR3Upscaler resources
{
    FfxFsr3UpscalerSharedResourceDescriptions fs3UpscalerResourceDescs = {};
    FFX_VALIDATE(ffxFsr3UpscalerGetSharedResourceDescriptions(&contextPrivate->upscalerContext, &fs3UpscalerResourceDescs));

    wchar_t Name[256] = {};
    for (FfxUInt32 i = 0; i < contextPrivate->sharedResourceCount; i++)
    {
        FfxCreateResourceDescription dilD = fs3UpscalerResourceDescs.dilatedDepth;
        swprintf(Name, 255, L"%s%d", fs3UpscalerResourceDescs.dilatedDepth.name, i);
        dilD.name = Name;
        FFX_VALIDATE(contextDescription->backendInterfaceSharedResources.fpCreateResource(
            &contextDescription->backendInterfaceSharedResources, &dilD, contextPrivate->effectContextIdSharedResources, &contextPrivate->upscalerResources[FFX_FSR3_RESOURCE_IDENTIFIER_DILATED_DEPTH_0 + (i * FFX_FSR3_RESOURCE_IDENTIFIER_UPSCALED_COUNT)]));

        FfxCreateResourceDescription dilMVs = fs3UpscalerResourceDescs.dilatedMotionVectors;
        swprintf(Name, 255, L"%s%d", fs3UpscalerResourceDescs.dilatedMotionVectors.name, i);
        dilMVs.name = Name;
        FFX_VALIDATE(contextDescription->backendInterfaceSharedResources.fpCreateResource(
            &contextDescription->backendInterfaceSharedResources, &dilMVs, contextPrivate->effectContextIdSharedResources, &contextPrivate->upscalerResources[FFX_FSR3_RESOURCE_IDENTIFIER_DILATED_MOTION_VECTORS_0 + (i * FFX_FSR3_RESOURCE_IDENTIFIER_UPSCALED_COUNT)]));

        FfxCreateResourceDescription recND = fs3UpscalerResourceDescs.reconstructedPrevNearestDepth;
        swprintf(Name, 255, L"%s%d", fs3UpscalerResourceDescs.reconstructedPrevNearestDepth.name, i);
        recND.name = Name;
        FFX_VALIDATE(contextDescription->backendInterfaceSharedResources.fpCreateResource(
            &contextDescription->backendInterfaceSharedResources, &recND, contextPrivate->effectContextIdSharedResources, &contextPrivate->upscalerResources[FFX_FSR3_RESOURCE_IDENTIFIER_RECONSTRUCTED_PREVIOUS_NEAREST_DEPTH_0 + (i * FFX_FSR3_RESOURCE_IDENTIFIER_UPSCALED_COUNT)]));
    }
}

I guess author want to use upscaler effect context as shared resources effect context directly but forget to test this case. I can fix this issue locally but I want you to know it, is it necessary to fix this when implement custom backend interfaces and use FSR3 as upscaler only.

FlyAndNotDown commented 1 month ago

Seems FSR 3.1 SDK fixed this, after update SDK the problem gone. I want to close this issue now.