Linking Cuda (cudart.lib) makes DXGI DuplicateOutput1() fail

2

For an obscure reason my call to IDXGIOutput5::DuplicateOutput1() fail with error 0x887a0004 (DXGI_ERROR_UNSUPPORTED) after I added cudart.lib in my project.

I work on Visual Studio 2019, my code for monitor duplication is the classic :

hr = output5->DuplicateOutput1(this->dxgiDevice, 0, sizeof(supportedFormats) / sizeof(DXGI_FORMAT), supportedFormats, &this->dxgiOutputDuplication);

And the only thing I tried to do with cuda at the moment is simply to list the Cuda devices :

 int nDevices = 0;

 cudaError_t error = cudaGetDeviceCount(&nDevices);

 for (int i = 0; i < nDevices; i++) {

            cudaDeviceProp prop;
            cudaGetDeviceProperties(&prop, i);

            LOG_FUNC_DEBUG("Graphic adapter : Descripion: %s, Memory Clock Rate : %d kHz, Memory Bus Width : %u bits",
                prop.name,
                prop.memoryClockRate,
                prop.memoryBusWidth
            );
}

Moreover this piece of code is called far later after I try to start monitor duplication with DXGI.

Every thing seems correct in my application : I do a call to SetProcessDpiAwarenessContext(DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2), and I'm not running on e discrete GPU (see [https://support.microsoft.com/en-us/help/3019314/error-generated-when-desktop-duplication-api-capable-application-is-ru][1])

And by the way it used to work, and it works again if I just remove the "so simple" Cuda call and the cudart.lib from the linker input !

I really don't understand what can cause this strange behavior, any idea ?

c++
cuda
dxgi
desktop-duplication
asked on Stack Overflow Mar 27, 2020 by SamT • edited Mar 28, 2020 by Roman R.

1 Answer

2

...after I added cudart.lib in my project

When you link CUDA library you force your application to run on discrete GPU. You already know this should be avoided, but you still force it through this link.

...and I'm not running on e discrete GPU...

You are, static link to CUDA is a specific case which hints to use dGPU.

There are systems where Desktop Duplication is not working against dGPU and yours seems to be one of those. Even though unobvious, you are seeing behavior by [NVIDIA] design.

(There are however also other systems where Desktop Duplication is working against dGPU and is not working against iGPU).

Your potential solution is along this line:

Application is not directly linked against cuda.lib or cudart.lib or LoadLibrary to dynamically load the nvcuda.dll or cudart*.dll and uses GetProcAddress to retrieve function addresses from nvcuda.dll or cudart*.dll.

answered on Stack Overflow Mar 28, 2020 by Roman R.

User contributions licensed under CC BY-SA 3.0