2017-06-25 7 views
1

Le but: écrire "minimum viable", aucun code fantaisie ou extras qui configure SharpDX 12 (un wrapper C# autour de DirectX 12), crée une fenêtre, et exécute une boucle présente qui efface l'écran pour RGBA (0, 0, 1, 1).Tentative de configuration "minimale viable" de SharpDX 12; erreur 0x887A0005 "périphérique supprimé"

L'attente: Après avoir suivi le mieux possible un tutoriel d'installation de DirectX 12, j'obtiendrais alors une fenêtre avec un fond bleu. Résultat: Sur le deuxième parcourir la boucle, sur la ligne "swapChain.Present (1, SharpDX.DXGI.PresentFlags.None);" Le message d'erreur « SharpDX.SharpDXException: HRESULT: [0x887A0005], Module: [SharpDX.DXGI], ApiCode: [DXGI_ERROR_DEVICE_REMOVED/DeviceRemoved], Message:.. L'instance de dispositif GPU a été suspendu Utilisez GetDeviceRemovedReason pour déterminer les mesures appropriées

à SharpDX.Result.CheckError() à SharpDX.DXGI.SwapChain.Present (Int32 syncInterval, drapeaux PresentFlags) à DirectX12BlueScreen.Program.Main (String [] args) dans * \ DirectX12BlueScreen \ DirectX12BlueScreen \ Program.cs: ligne 114 "imprimée dans la fenêtre de la console (que j'utilise pour la sortie de débogage)

Ce que je recherche: pourquoi l'erreur se produit (l'appareil n'a certainement pas été retiré); quelle partie de mon code provoque l'erreur; et une solution au problème, si les deux informations précédentes ne fournissent pas cette information.

Comme le code complet est de 165 lignes, j'ai posté la boucle ici, et le code complet dans un 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: En utilisant les informations fournies par PhillipH, j'ai maintenant une erreur plus précise lecture: « System.Runtime.InteropServices.SEHException (0x80004005): composant externe a jeté une exception à SharpDX.Direct3D12.GraphicsCommandList.ClearRenderTargetView (CpuDescriptorHandle renderTargetView, RawColor4 colorRGBA, Int32 numRects, RawRectangle [] rectsRef) à SharpDX.. Direct3D12.GraphicsCommandList.ClearRenderTargetView (CpuDescriptorHandle renderTargetVie w, RawColor4 colorRGBA) à DirectX12BlueScreen.Program.Main (String [] args) dans * \ DirectX12BlueScreen \ DirectX12BlueScreen \ Program.cs: ligne 138"

+0

Avez-vous "Utilisez GetDeviceRemovedReason pour déterminer les mesures appropriées"? DeviceRemoved se produit lorsque vous forcez DirectX à retirer le périphérique de vous - pas nécessairement à cause de n'importe quel facteur externe. Il est vraiment vital que vous définissiez correctement votre débogage pour SharpDX - vous devez activer le débogage de code natif, vous devez créer votre périphérique avec un nouveau périphérique (adaptateur, DeviceCreationFlags.Debug).Si vous prenez ces deux étapes, toutes les erreurs internes vous seront entièrement décrites dans la fenêtre Sortie de Visual Studio. – PhillipH

+0

Tout ce que je peux spécifier pour new Device() est l'adaptateur et le niveau de fonctionnalité minimum. –

+0

Désolé - Je ne comprends pas votre requête sur mon commentaire. – PhillipH

Répondre

0

je n'étais pas mise en place des cibles de rendu correctement, et je n » étais pas t en utilisant des clôtures du tout. J'utilisais SwapChain plutôt que SwapChain3, et je n'ai donc pas pu obtenir l'index de tampon actuel. Le code correct a été placé dans un pastebin pour référence future.

Il a été rendu avec succès comme prévu pour trois minutes, donc je pense que je peux appeler celui-ci résolu.

Merci à PhillipH, sans l'aide de qui je me demande toujours comment obtenir de bons messages d'erreur.

https://pastebin.com/Ku7wqHpJ

La boucle de rendu de travail:

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(); 
}