Не могу перейти на полный экран под DirectX12 - PullRequest
1 голос
/ 08 июля 2019

У меня есть приложение, которое использует DirectX12.Я хотел поддерживать полноэкранный режим в моем приложении.Однако каждый раз, когда я вызывал IDXGISwapChain :: SetFullscreenState (), я получал эту ошибку:

DXGI ERROR: IDXGISwapChain :: GetConistingOutput: Адаптер swapchain не контролирует вывод, на котором находится окно swapchain.

Код ошибки, возвращенный IDXGISwapChain :: SetFullscreenState (), был

0x887a0004

Мой компьютер имеет два графических процессора:

Intel® R Graphics 630 и

NVIDIA GeForce GTX 1060

последний был адаптером, использованным для создания устройства d3d12 при возникновении ошибки.А если бы адаптер был прежним, то ошибки не было бы.

Поток кода, использованный для создания IDXGISwapChain3, был

//variables used in the code example
ID3D12Device *pDevice;
IDXGIFactory4 *pDXGIFactory;
IDXGIAdapter *pAdapter;
ID3D12CommandQueue *pCommandQueue;
IDXGISwapChain1 *pTempSwapchain;
IDXGISwapChain3 *pSwapchain;

//the code flow
CreateDXGIFactory2();
pDXGIFactory->EnumAdapter();
D3D12CreateDevice(pAdapter, ...);
pD3DDevice->CreateCommandQueue();
pDXGIFactory->CreateSwapChainForHwnd(pCommandQueue, ..., &pTempSwapchain);
pTempSwapchain->QueryInterface(IID_PPV_ARGS(&pSwapChain));

IDXGISwapChain :: SetFullscreenState () должен успешно завершиться, но этоне удалось.

Ответы [ 2 ]

2 голосов
/ 22 июля 2019

Обратите внимание, что проблема заключается в особой комбинации причудливого уровня отладки DXGI и способа реализации решений "гибридной графики" в зависимости от того, какое устройство вы используете в данный момент.

Наилучшеевариант здесь просто подавить ошибку:

#if defined(_DEBUG)
    // Enable the debug layer (requires the Graphics Tools "optional feature").
    //
    // NOTE: Enabling the debug layer after device creation will invalidate the active device.
    {
        ComPtr<ID3D12Debug> debugController;
        if (SUCCEEDED(D3D12GetDebugInterface(IID_PPV_ARGS(debugController.GetAddressOf()))))
        {
            debugController->EnableDebugLayer();
        }
        else
        {
            OutputDebugStringA("WARNING: Direct3D Debug Device is not available\n");
        }

        ComPtr<IDXGIInfoQueue> dxgiInfoQueue;
        if (SUCCEEDED(DXGIGetDebugInterface1(0, IID_PPV_ARGS(dxgiInfoQueue.GetAddressOf()))))
        {
            dxgiInfoQueue->SetBreakOnSeverity(DXGI_DEBUG_ALL, DXGI_INFO_QUEUE_MESSAGE_SEVERITY_ERROR, true);
            dxgiInfoQueue->SetBreakOnSeverity(DXGI_DEBUG_ALL, DXGI_INFO_QUEUE_MESSAGE_SEVERITY_CORRUPTION, true);

            DXGI_INFO_QUEUE_MESSAGE_ID hide[] =
            {
                80 /* IDXGISwapChain::GetContainingOutput: The swapchain's adapter does not control the output on which the swapchain's window resides. */,
            };
            DXGI_INFO_QUEUE_FILTER filter = {};
            filter.DenyList.NumIDs = _countof(hide);
            filter.DenyList.pIDList = hide;
            dxgiInfoQueue->AddStorageFilterEntries(DXGI_DEBUG_DXGI, &filter);
        }
    }
#endif

Я использую это во всех моих шаблонах на GitHub .

1 голос
/ 11 июля 2019

Я нашел решение. Используйте метод IDXGIFactory6 :: EnumAdapterByGpuPreference () вместо метода IDXGIFactory :: EnumAdapter (), тогда ошибка исчезнет.

...