2017-06-25 10 views
1

Das Ziel: Schreibe "minimal machbar", keine Extras oder Extras-Code, der SharpDX 12 (ein C# -Wrapper um DirectX 12) einrichtet, ein Fenster erstellt und eine aktuelle Schleife ausführt, die den Bildschirm löscht RGBA (0, 0, 1, 1).Versuch eines "minimal realisierbaren" SharpDX 12 Setups; Fehler 0x887A0005 "Gerät entfernt"

Die Erwartung: Nachdem ich ein DirectX 12 Setup-Tutorial so gut wie möglich befolgt habe, würde ich dann ein Fenster mit einem blauen Hintergrund bekommen.

Das Ergebnis: Auf der Sekunde Durchlauf durch die Schleife, in der Zeile "swapChain.Present (1, SharpDX.DXGI.PresentFlags.None);" Die Fehlermeldung "SharpDX.SharpDXException: HRESULT: [0x887A0005], Modul: [SharpDX.DXGI], ApiCode: [DXGI_ERROR_DEVICE_REMOVED/DeviceRemoved], Nachricht: Die GPU-Geräteinstanz wurde angehalten. Verwenden Sie GetDeviceRemovedReason, um die entsprechende Aktion zu bestimmen.

bei SharpDX.Result.CheckError() bei SharpDX.DXGI.SwapChain.Present (Int32 SyncInterval, PresentFlags flags) bei DirectX12BlueScreen.Program.Main (String [] args) in * \ DirectX12BlueScreen \ DirectX12BlueScreen \ Program.cs: Zeile 114 "gedruckt auf dem Konsolenfenster (die ich für Debug-Ausgabe verwende)

Was ich suche: Warum der Fehler passiert (das Gerät wurde sicherlich nicht entfernt); Welcher Teil meines Codes verursacht den Fehler? und eine Lösung für das Problem, wenn die vorhergehenden zwei Teile der Information diese Information nicht liefern.

Wie der vollständige Code 165 Zeilen ist, habe ich die Schleife hier gepostet, und der vollständige Code in einem Pastebin: https://pastebin.com/vctaYkNC

while(form.Visible) 
{ 
    commandAllocator[0].Reset(); 
    commandList.Reset(commandAllocator[0], null); 
    commandList.SetViewport(viewport: viewport); 
    commandList.SetScissorRectangles(rectangle: scissorsRectangle); 
    commandList.ResourceBarrierTransition(
     resource: renderTargets[0], 
     stateBefore: ResourceStates.Present, 
     stateAfter: ResourceStates.RenderTarget); 
    commandList.ClearRenderTargetView(
     renderTargetView: 
     rtvDescriptorHeap.CPUDescriptorHandleForHeapStart, 
     colorRGBA: new RawColor4(0f, 0f, 1f, 1f)); 
    commandList.ResourceBarrierTransition(
     resource: renderTargets[0], 
     stateBefore: ResourceStates.RenderTarget, 
     stateAfter: ResourceStates.Present); 
    commandList.Close(); 
    commandQueue.ExecuteCommandList(commandList); 
    swapChain.Present(1, SharpDX.DXGI.PresentFlags.None); 
    Application.DoEvents(); 
} 

Edit: Unter Verwendung von Informationen von Philliph geliefert, ich habe jetzt einen genaueren Fehler Anzeige: „System.Runtime.InteropServices.SEHException (0x80004005): Externe Komponente hat eine Ausnahme geworfen bei SharpDX.Direct3D12.GraphicsCommandList.ClearRenderTargetView (CpuDescriptorHandle renderTargetView, RawColor4 colorRGBA, Int32 numRects, RawRectangle [] rectsRef) bei SharpDX.. Direct3D12.GraphicsCommandList.ClearRenderTargetView (CpuDescriptorHandle renderTargetVie RawColor4 colorRGBA) bei DirectX12BlueScreen.Program.Main (String [] args) in * \ DirectX12BlueScreen \ DirectX12BlueScreen \ Program.cs W,: Leitung 138"

+0

Haben Sie "Use GetDeviceRemovedReason die entsprechenden Maßnahmen, um zu bestimmen"? Der DeviceRemoved tritt auf, wenn Sie DirectX erzwingen, um das Gerät von Ihnen zu entfernen - nicht unbedingt wegen eines externen Faktors. Es ist wirklich wichtig, dass Sie Ihr Debugging richtig für SharpDX einrichten - Sie müssen Native Code Debuggen aktivieren, müssen Sie Ihr Gerät mit neuen Gerät (Adapter, DeviceCreationFlags.Debug) erstellen.Wenn Sie diese beiden Schritte ausführen, werden Ihnen alle internen Fehler im Ausgabefenster von Visual Studio vollständig beschrieben. – PhillipH

+0

Alles, was ich für neue Device() angeben kann, ist Adapter und Minimum Feature Level. –

+0

Entschuldigung - ich verstehe Ihre Anfrage zu meinem Kommentar nicht. – PhillipH

Antwort

0

I wurde Einstellung nicht mit den Renderzielen richtig dargestellt werden, und I wasn‘ t Zäune überhaupt zu benutzen. Ich habe SwapChain anstelle von SwapChain3 verwendet und konnte daher den aktuellen Pufferindex nicht abrufen. Der richtige Code wurde zur späteren Verwendung in einen Pastebin gegeben.

Es wurde erfolgreich wie vorgesehen für drei Minuten gerendert, so dass ich denke, ich kann dies eine gelöst nennen.

Danke an PhillipH, ohne dessen Hilfe ich mich immer noch fragen würde, wie man gute Fehlermeldungen bekommt.

https://pastebin.com/Ku7wqHpJ

Die Arbeits machen Schleife:

while (form.Visible) 
{ 
    commandAllocator[0].Reset(); 
    commandList.Reset(commandAllocator[0], null); 
    commandList.ResourceBarrierTransition(
     resource: renderTargets[currentBufferIndex], 
     stateBefore: ResourceStates.Present, 
     stateAfter: ResourceStates.RenderTarget); 
    renderTargetView = 
     rtvDescriptorHeap.CPUDescriptorHandleForHeapStart + 
     currentBufferIndex * 
     renderTargetViewHeapSize; 
    commandList.ClearRenderTargetView(
     renderTargetView: renderTargetView, 
     colorRGBA: new RawColor4(0f, 0f, 1f, 1f)); 
    commandList.ResourceBarrierTransition(
     resource: renderTargets[currentBufferIndex], 
     stateBefore: ResourceStates.RenderTarget, 
     stateAfter: ResourceStates.Present); 
    commandList.Close(); 
    commandQueue.ExecuteCommandList(commandList); 
    swapChain.Present(1, SharpDX.DXGI.PresentFlags.None); 
    long fenceToWaitFor = fenceValue; 
    commandQueue.Signal(fence[0], fenceValue); 
    ++fenceValue; 
    if (fence[0].CompletedValue < fenceValue) 
    { 
     fence[0].SetEventOnCompletion(fenceToWaitFor, 
      fenceEvent.SafeWaitHandle.DangerousGetHandle()); 
     fenceEvent.WaitOne(); 
     fenceEvent.Reset(); 
    } 

    currentBufferIndex = swapChain.CurrentBackBufferIndex; 
    Application.DoEvents(); 
}