D3D11CreateDeviceAndSwapChain не переключается в полноэкранный режим на втором мониторе - PullRequest
0 голосов
/ 20 мая 2018

Первоначальная проблема, с которой я столкнулся, заключалась в том, что я не смог запустить мою игру на полном экране на втором мониторе.Переходя к настройкам дисплея и переключая основной дисплей со второго на первый, я могу без проблем запускать игру на весь экран.Разрешение на обоих моих мониторах одинаково, поэтому проблема должна быть в другом месте.displays

Код, отвечающий за полноэкранный обмен, выглядит следующим образом:

// create device and front/back buffers
if( FAILED( hr = D3D11CreateDeviceAndSwapChain( 
    nullptr,
    D3D_DRIVER_TYPE_HARDWARE,
    nullptr,
    createFlags,
    nullptr,
    0,
    D3D11_SDK_VERSION,
    &sd,
    &pSwapChain,
    &pDevice,
    nullptr,
    &pImmediateContext ) ) )
{
    throw CHILI_GFX_EXCEPTION( hr,L"Creating device and swap chain" );
}

, а описание цепочки обмена sd ранее было создано следующим образом:это:

// create device and swap chain/get render target view
DXGI_SWAP_CHAIN_DESC sd = {};
sd.BufferCount = 1;
sd.BufferDesc.Width = Graphics::ScreenWidth;
sd.BufferDesc.Height = Graphics::ScreenHeight;
sd.BufferDesc.Format = DXGI_FORMAT_B8G8R8A8_UNORM;
sd.BufferDesc.RefreshRate.Numerator = 1;
sd.BufferDesc.RefreshRate.Denominator = 60;
sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
sd.OutputWindow = key.hWnd;
sd.SampleDesc.Count = 1;
sd.SampleDesc.Quality = 0;
sd.Windowed = !f;
sd.Flags = DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH;

f установлено на true, и код выполняет именно то, что я хочу, чтобы он выполнялся на мониторе 1, однако окно остается на мониторе 2 с окном 2. hr также S_OK говорит о том, что все прошло хорошо.

Справочник DXGI гласит:

Мы рекомендуем создать оконную цепочку обмена и позволить конечному пользователю изменить цепочку обмена на полный экранчерез IDXGISwapChain :: SetFullscreenState;

Быстрое изменение кода для установки полноэкранного состояния с помощью метода цепочки обмена приводит к:

hr = pSwapChain->SetFullscreenState(TRUE, vOutput[0]);

HRESULT hr говорит, чтометод не удался с E_FAIL.

В качестве дополнительного теста, изменение vOutput[0] на vOutput[1] заставляет мою игру работать на полном экране на другом мониторе без каких-либо проблем.

Попытка найтиинформация о нейs привел меня к нескольким сообщениям на Steam на форуме, где разные пользователи сталкивались с одним и тем же типом ошибки при попытке перейти на полный экран в таких играх, как Devil May Cry 4 , Company of Heroes 2 или Обитель зла 5 .Общим для всех этих постов было то, что игра не работала в полноэкранном режиме на втором мониторе.Из информации в этих постах я также обнаружил, что полноэкранный режим будет работать, если разрешение экрана установлено на 1680x1050 или ниже.

Это наводит меня на мысль, что настоящая ошибка может быть где-то внутри файлов Direct3D, но где?

Почему SetFullscreenState возвращает E_FAIL и D3D11CreateDeviceAndSwapChain ничего не делает и как я могу заставить его работать?

Если это невозможно, чем можно заменить SetFullscreenState, которыйдостигает той же цели?

...