DirectX 11 GetDisplayModeList () завершается ошибкой в ​​подключении к удаленному рабочему столу - PullRequest
0 голосов
/ 15 июня 2019

Добрый день,

У меня есть базовое приложение Direct3D, которое работает на главном ПК, но не может инициализировать DirectX при работе через удаленный рабочий стол.

Я проследил сбой этого вызова, где он завершается с помощью

    result = adapterOutput->GetDisplayModeList(DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_ENUM_MODES_INTERLACED, &numModes, NULL);
    if(FAILED(result))
    {
        return false;
    }

Не удается с:

result = 0x887a0022 : A resource is not available at the time of the call, but may become available later.

Полный код инициализации взят из учебников по Rastertek, которые можно найти здесь: http://www.rastertek.com/dx11tut03.html

Кто-нибудь знает способ решения этой проблемы?

Ответы [ 2 ]

0 голосов
/ 15 июня 2019

Удаленный рабочий стол связан с некоторыми примерами, и имейте в виду, что иногда он использует «Microsoft Basic Renderer» (например, программный драйвер WARP). См. это сообщение в блоге .

Вы также можете защитить использование GetDisplayModeList в удаленном сценарии, обнаружив его в первую очередь. Например, устаревшая модель DXUT сделала это в коде перечисления:

// mode for the current screen resolution for the remote session.
if( 0 != GetSystemMetrics( SM_REMOTESESSION) )
{
    DEVMODE DevMode;
    DevMode.dmSize = sizeof( DEVMODE );
    if( EnumDisplaySettings( nullptr, ENUM_CURRENT_SETTINGS, &DevMode ) )
    {
        NumModes = 1;
        pDesc[0].Width = DevMode.dmPelsWidth;
        pDesc[0].Height = DevMode.dmPelsHeight;
        pDesc[0].Format = DXGI_FORMAT_R8G8B8A8_UNORM;
        pDesc[0].RefreshRate.Numerator = 0;
        pDesc[0].RefreshRate.Denominator = 0;
        pDesc[0].ScanlineOrdering = DXGI_MODE_SCANLINE_ORDER_PROGRESSIVE;
        pDesc[0].Scaling = DXGI_MODE_SCALING_CENTERED;
    }
}

Вы также не можете использовать «полноэкранный эксклюзивный» режим на удаленном рабочем столе:

if( GetSystemMetrics(SM_REMOTESESSION) != 0 )
{
    sd.Windowed = TRUE;
}   

Вам не нужно вообще использовать GetDisplayModeList. Просто выберите разумный начальный размер или откройте окно «развернуто». См. directx-vs-templates для подхода, который просто использует «родное разрешение» рабочего стола как для оконного, так и для «поддельного полного экрана». Это также хорошо работает для удаленного рабочего стола.

Еще одним «угловым корпусом» с удаленным рабочим столом является «необработанный ввод» для мыши. См. Реализацию Mouse из DirectX Tool Kit .

0 голосов
/ 15 июня 2019

Технически это не решение, но проблема заключалась в инициализации частоты обновления, обход ее блоком try {} - catch {} позволил мне запускаться с частотой обновления по умолчанию через удаленный рабочий стол. Все остальное инициализировано без проблем

...