Сбой API EnumOutputs DXGI_ERROR_NOT_FOUND в Win8/Windows 8
Была странная ситуация с нашим продуктом, который был слишком ярким на win8 по сравнению с win7. Так попробовал пример PNTriangles11 DX SDK и получил те же результаты. Это было после тестирования поведения в BestBuy, и все 24 системы вели себя одинаково, все не смогли вызвать EnumOutputs. Неважно, настольный компьютер, ноутбук, все в одном или планшет.
Где выглядел наш продукт для построения графиков DirectX... также показывает наш компонент построения графиков WPF и еще большее изменение яркости, вызванное той же самой ошибкой.
Так что это привело к исследованиям, и я обнаружил, что могу воспроизвести на Win7, добавив ниже...
HRESULT CD3D11Enumeration::EnumerateOutputs( CD3D11EnumAdapterInfo* pAdapterInfo )
{
HRESULT hr;
IDXGIOutput* pOutput;
for( int iOutput = 0; ; ++iOutput )
{
pOutput = NULL;
hr = pAdapterInfo->m_pAdapter->EnumOutputs( iOutput, &pOutput );
// FORCE FAILURE ON WIN7 FOR TESTING PURPOSES
hr = DXGI_ERROR_NOT_FOUND;
if( DXGI_ERROR_NOT_FOUND == hr )
{
return S_OK;
}
else if( FAILED( hr ) )
{
return hr; //Something bad happened.
}
else //Success!
{
CD3D11EnumOutputInfo* pOutputInfo = new CD3D11EnumOutputInfo;
if( !pOutputInfo
Хотя, чтобы теперь запустить пример sdk на Win8 и Win7, вам также нужно изменить (добавив тест для ненулевого hAdapterMonitor...
// Check to see if the window needs to be resized.
// Handle cases where the window is minimized and maxmimized as well.
bool bNeedToResize = false;
if(hAdapterMonitor && DXUTGetIsWindowedFromDS( pNewDeviceSettings ) &&
!bKeepCurrentWindowSize )
{
UINT nClientWidth;
UINT nClientHeight;
if( IsIconic( DXUTGetHWNDDeviceWindowed() ) )
{
Вышесказанное позволяет возиться с проблемой на win7 как способ развития для win8.
Поэтому мой вопрос в том, что является лучшим решением для обработки ошибок EnumOutputs на Win8. И или какие другие изменения в DXUT вы считаете полезными.
Microsoft работает над этим, и я опубликую их ответ, надеюсь, в скором времени, но обсуждение этой темы необходимо, так как многие проекты, вдохновленные dxut, или проекты, использующие EnumOutputs, терпят неудачу на Win8.
ОТВЕТ 1: Microsoft ответила мне первоначальным ответом, чтобы заставить PNTriangles11 работать на Win8. Они указали мне на изменение в DXUTApplyDefaultDeviceSettings(DXUTDeviceSettings *modifySettings), где...
modifySettings->d3d11.sd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM_SRGB;
должен быть изменен на...
modifySettings->d3d11.sd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
но простой обходной путь для DXUTChangeDevice все еще необходим: тест для ненулевого hAdapterMonitor...
bool bNeedToResize = false;
if(hAdapterMonitor && DXUTGetIsWindowedFromDS( pNewDeviceSettings ) && !bKeepCurrentWindowSize )
{
UINT nClientWidth;
UINT nClientHeight;
if( ::IsIconic( DXUTGetHWNDDeviceWindowed() ) )
{
// Window is currently minimized. To tell if it needs to resize,
Все еще жду объяснения от Microsoft, почему EnumOutputs вышел из строя на всех 24 системах, которые я тестировал в BestBuy.