Связывание Cuda (cudart.lib) приводит к сбою DXGI DuplicateOutput1 () - PullRequest
1 голос
/ 27 марта 2020

По непонятной причине мой вызов IDXGIOutput5 :: DuplicateOutput1 () завершился ошибкой 0x887a0004 (DXGI_ERROR_UNSUPPORTED) после того, как я добавил cudart.lib в свой проект.

Я работаю в Visual Studio 2019, мой код для монитора дублирование - это classi c:

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

И единственное, что я пытался сделать с cuda на данный момент, это просто перечислить устройства Cuda:

 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
            );
}

Более того, эта часть кода вызывается намного позже после Я пытаюсь запустить дублирование монитора с помощью DXGI.

В моем приложении все кажется правильным: я выполняю вызов SetProcessDpiAwarenessContext (DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2), и я не работает на дискретном графическом процессоре (см. [https://support.microsoft.com/en-us/help/3019314/error-generated-when-desktop-duplication-api-capable-application-is-ru] [1] )

И, кстати, он работал, и он снова работает, если я просто уберу "так просто "Вызов Cuda и cudart.lib с входа компоновщика!

Я действительно не понимаю, что может вызвать это странное поведение, любая идея?

1 Ответ

2 голосов
/ 28 марта 2020

... после того, как я добавил cudart.lib в свой проект

Когда вы связываете библиотеку CUDA, вы заставляете ваше приложение работать на дискретном графическом процессоре. Вы уже знаете, что этого следует избегать, но вы по-прежнему форсируете его по этой ссылке.

... и я не работаю на дискретном графическом процессоре ...

Вы, кстати, c ссылка на CUDA является специфической c случай, который намекает на использование dGPU.

Есть системы, в которых Desktop Duplication не работает с dGPU, и ваша, похоже, одна из них. Несмотря на то, что вы неочевидны, вы наблюдаете поведение по дизайну [NVIDIA].

(Однако существуют и другие системы, в которых Desktop Duplication работает против dGPU и не работает против iGPU).

Ваш потенциал решение по этой линии :

Приложение не связано напрямую с cuda.lib, cudart.lib или LoadLibrary для динамической загрузки nvcuda.dll или cudart * .dll и использует GetProcAddress для получения адресов функций из nvcuda.dll или cudart * .dll.

...