2017-01-30 1 views
0

Ich lerne DX11 durch folgende this tutorial auf DirectXTutorials.com. Ich bin an dem Punkt, wo ich das Gerät und seinen Kontext erstellt habe und nun die Swap-Kette erstellen muss.
Wenn ich jedoch CreateSwapChainForCoreWindow(...) aufrufen, verlässt es die Swap-Kette als nullptr und gibt 0x887a0001 zurück. DirectX Fehlersuche spuckt die folgenden für den Code aus:DXGI_ERROR_INVALID_CALL beim Erstellen von Swap-Kette für Core-Fenster

Name: DXGI_ERROR_INVALID_CALL 
Description: The application has made an erroneous API call that it had enough information to avoid. 
This error is intended to denote that the application should be altered to avoid the error. 
Use of the debug version of the DXGI.DLL will provide run-time debug output with further information. 
Severity code: Failed 

Wie soll ich gehen über, um Code zu ändern, diesen Fehler zu vermeiden? Ich habe versucht, anderen Antworten zu folgen, indem ich das Format oder den Effekt für die Beschreibung der Tauschkette vergeblich änderte.

Hier ist der Code in Frage, es ist der letzte Aufruf, der fehlschlägt:

void Game::Initialize() 
{ 
    // Define temporary pointers to a device and a device context 
    ComPtr<ID3D11Device> dev11; 
    ComPtr<ID3D11DeviceContext> devcon11; 

    // Create the device and device context objects 
    D3D11CreateDevice(
     nullptr, 
     D3D_DRIVER_TYPE_HARDWARE, 
     nullptr, 
     0, 
     nullptr, 
     0, 
     D3D11_SDK_VERSION, 
     &dev11, 
     nullptr, 
     &devcon11 
    ); 

    // Convert the pointers from the DirectX 11 version to the DirectX 11.1 versions 
    dev11.As(&mDevice); 
    devcon11.As(&mDeviceContext); 

    // Obtain the DXGI factory 
    // [1] Convert our ID3D11Device1 into an IDXGIDevice1 
    ComPtr<IDXGIDevice1> dxgiDevice; 
    mDevice.As(&dxgiDevice); 

    // [2] Use the IDXGDevice1 interface to get access to the adapter 
    ComPtr<IDXGIAdapter> dxgiAdapter; 
    dxgiDevice->GetAdapter(&dxgiAdapter); 

    // [3] Use the IDXGIAdapter interface to get access to the factory 
    ComPtr<IDXGIFactory2> dxgiFactory; 
    dxgiAdapter->GetParent(__uuidof(IDXGIFactory2), &dxgiFactory); 

    // Set up the swap chain description 
    DXGI_SWAP_CHAIN_DESC1 scd = { 0 }; 
    scd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; // How the swap chain should be used 
    scd.BufferCount = 2;        // A front and back buffer 
    scd.Format = DXGI_FORMAT_R8G8B8A8_UNORM;   // The most common swap chain format 
    scd.SwapEffect = DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL; // The recommended flip mode 
    scd.SampleDesc.Count = 1;       // Disable anti-aliasing 

    HRESULT result = dxgiFactory->CreateSwapChainForCoreWindow(
     mDevice.Get(),  // Address of the device 
     reinterpret_cast<IUnknown*>(CoreWindow::GetForCurrentThread()), // Address of the window 
     &scd,    // Address of the swap chain description       
     nullptr,   // Monitor selection stuff - leave null 
     &mSwapChain   // Address of the new swap chain 
    ); 
} 

mDevice, mDeviceContext und mSwapChain sind alle Mitglieder Variablen der Klasse.

Ich bin direkt von SDL und SFML zu DirectX gekommen, also ist das so niedrig wie ich es gewesen bin. Wenn es genug Informationen gibt, um den problematischen Anruf zu vermeiden, was soll ich dann anrufen? Ich sehe einige Fragen, wo Leute anrufen CreateDeviceAndSwapChain, ist dies die bevorzugte Methode?

EDIT: Um zu klären, der Projekttyp ist DirectX11 App (Universal Windows), wenn das einen Unterschied macht.

+1

Sie können sich dies [DeviceResources] (https://github.com/walbourn/directx-vs-templates/blob/master/d3d11game_uwp_dr/DeviceResources.cpp) und die Verwendung von 'CreateDXGIFactory2 ansehen "". –

+0

@ChuckWalbourn Danke, ich habe ein neues Projekt aus dieser Vorlage erstellt und es baut und funktioniert kein Problem; Also werde ich das mit meinem vergleichen. –

Antwort

0

Hier ist das Problem Linie:

reinterpret_cast<IUnknown*>(CoreWindow::GetForCurrentThread()), // Address of the window 

Ein Blick auf die Stack-Trace am Point of Failure zeigte, dass ich Game::Initialize von App::Initialize rief. Daher gab GetForCurrentThread() NULL zurück, weil das Fenster noch nicht existierte! (App::SetWindow(CoreWindow^ window) heißt danach, und nur von da an können wir das Fenster bekommen.)
Es war ein schmerzlich einfacher Fehler.

Verwandte Themen