Сбой API EnumOutputs DXGI_ERROR_NOT_FOUND в Win8/Windows 8

Была странная ситуация с нашим продуктом, который был слишком ярким на win8 по сравнению с win7. Так попробовал пример PNTriangles11 DX SDK и получил те же результаты. Это было после тестирования поведения в BestBuy, и все 24 системы вели себя одинаково, все не смогли вызвать EnumOutputs. Неважно, настольный компьютер, ноутбук, все в одном или планшет.

PNTriangles11 цветовая проблема

Где выглядел наш продукт для построения графиков DirectX... также показывает наш компонент построения графиков WPF и еще большее изменение яркости, вызванное той же самой ошибкой.

Проблема цвета компонента диаграммы DirectX, компонент диаграммы 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.

0 ответов

Другие вопросы по тегам