2016-05-04 14 views
-1

Ich arbeite mit den Microsoft-Beispielen von ihrer GitHub-Seite, und obwohl mein Code auf ihren basiert, erreiche ich nicht das gleiche Ergebnis. Beide Projekte haben diese ComPtrs, aber in meinem sind sie alle null (0x0000000000000000), während sie im Beispiel gut funktionieren.D3D12 Projekt: Dereferenzierung eines nullptr

ComPtr<IDXGISwapChain3> m_swapChain; 
ComPtr<ID3D12Device> m_device; 
ComPtr<ID3D12Resource> m_renderTargets[FrameCount]; 
ComPtr<ID3D12CommandAllocator> m_commandAllocator; 
ComPtr<ID3D12CommandQueue> m_commandQueue; 
ComPtr<ID3D12DescriptorHeap> m_rtvHeap; 
ComPtr<ID3D12PipelineState> m_pipelineState; 
ComPtr<ID3D12GraphicsCommandList> m_commandList; 

Speziell diese Zeile verursacht den Debugger zu brechen.

ThrowIfFailed(m_device->CreateCommandQueue(&queueDesc, IID_PPV_ARGS(&m_commandQueue))); 

Bearbeiten: Mein Code war falsch erstellen m_device, die den Fehler verursacht.

+0

Sie haben nur die Variablendeklarationen gezeigt, gibt es keine Möglichkeit für jedermann zu wissen, warum haben sie nicht-Null-Werte nicht eingestellt. Sie müssen mehr von Ihrem Code zeigen. –

+0

Wo ist der Code, der 'm_device' vor dem Aufruf von 'm_device-> CreateCommandQueue()' 'initialisiert? –

Antwort

0

Meine Vermutung ist, dass Sie eine fehlgeschlagene HRESULT zurück von CreateCommandQueue bekommen. Sie sollten den Debugger so einstellen, dass er Ausnahmen unterbricht (siehe MSDN). Alternativ können Sie es neu zu schreiben:

HRESULT hr = m_device->CreateCommandQueue(&queueDesc, IID_PPV_ARGS(&m_commandQueue)); 
ThrowIfFailed(hr); 

und einen Debug-Break-Punkt setzen auf der HRESULT hr = ... Linie.

Wie bereits erwähnt, stellen Sie sicher, dass Sie vor diesem Punkt alle möglichen Fehlerbedingungen überprüft haben. Für einige robusten Code ein Direct3D 12 Vorrichtung zur Erzeugung finden DeviceResources oder die VS Direct3D 12 Game templates

+0

Dies setzt voraus, dass 'm_device' zu ​​Beginn mit einem Nicht-Null-Wert initialisiert wurde. –

+0

Wahr genug. Wie ich in vielen SO-Threads gesagt habe, müssen Sie den Rückgabewert von allem, was ein '' HRESULT'' für den Fehler hat, mit '' SUCCEDED'' oder '' FAILED'' Makro oder etwas wie [ThrowIfFailed] (https://github.com/Microsoft/DirectXTK/wiki/ThrowIfFailed). Sie können den Rückgabewert nicht ignorieren. –