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"
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
Tout ce que je peux spécifier pour new Device() est l'adaptateur et le niveau de fonctionnalité minimum. –
Désolé - Je ne comprends pas votre requête sur mon commentaire. – PhillipH