Utilisation de la couche de débogage pour déboguer des applications

Nous vous recommandons d’utiliser la couche de débogage pour déboguer vos applications afin de vous assurer qu’elles sont propre d’erreurs et d’avertissements. La couche de débogage vous aide à écrire du code Direct3D. En outre, votre productivité peut augmenter lorsque vous utilisez la couche de débogage, car vous pouvez voir immédiatement les causes des erreurs de rendu obscures ou même des écrans noirs à leur source. La couche de débogage fournit des avertissements pour de nombreux problèmes. Par exemple, la couche de débogage fournit des avertissements pour ces problèmes :

  • Vous avez oublié de définir une texture, mais lisez-la dans votre nuanceur de pixels
  • Profondeur de sortie, mais aucun état de profondeur-gabarit n’est lié
  • Échec de la création de texture avec INVALIDARG

Ici, nous vous expliquons comment activer la couche de débogage et certains des problèmes que vous pouvez éviter à l’aide de la couche de débogage.

Activation de la couche de débogage

Pour activer la couche de débogage, spécifiez l’indicateur D3D11_CREATE_DEVICE_DEBUG dans le paramètre Flags lorsque vous appelez la fonction D3D11CreateDevice pour créer le périphérique de rendu. Cet exemple de code montre comment activer la couche de débogage lorsque votre projet Microsoft Visual Studio se trouve dans une build de débogage :

        UINT creationFlags = D3D11_CREATE_DEVICE_BGRA_SUPPORT;
#if defined(_DEBUG)
        // If the project is in a debug build, enable the debug layer.
        creationFlags |= D3D11_CREATE_DEVICE_DEBUG;
#endif
        // Define the ordering of feature levels that Direct3D attempts to create.
        D3D_FEATURE_LEVEL featureLevels[] =
        {
            D3D_FEATURE_LEVEL_11_1,
            D3D_FEATURE_LEVEL_11_0,
            D3D_FEATURE_LEVEL_10_1,
            D3D_FEATURE_LEVEL_10_0,
            D3D_FEATURE_LEVEL_9_3,
            D3D_FEATURE_LEVEL_9_1
        };

        ComPtr<ID3D11Device> d3dDevice;
        ComPtr<ID3D11DeviceContext> d3dDeviceContext;
        DX::ThrowIfFailed(
            D3D11CreateDevice(
                nullptr,                    // specify nullptr to use the default adapter
                D3D_DRIVER_TYPE_HARDWARE,
                nullptr,                    // specify nullptr because D3D_DRIVER_TYPE_HARDWARE 
                                            // indicates that this function uses hardware
                creationFlags,              // optionally set debug and Direct2D compatibility flags
                featureLevels,
                ARRAYSIZE(featureLevels),
                D3D11_SDK_VERSION,          // always set this to D3D11_SDK_VERSION
                &d3dDevice,
                nullptr,
                &d3dDeviceContext
                )
            );

Prévention des erreurs dans votre application avec la couche de débogage

Si vous utilisez mal l’API Direct3D 11 ou passez des paramètres incorrects, la sortie de débogage de la couche de débogage signale une erreur ou un avertissement. Vous pouvez ensuite corriger votre erreur. Ensuite, nous examinons certains problèmes de codage qui peuvent entraîner un comportement non défini ou même le blocage du système d’exploitation. Vous pouvez intercepter et empêcher ces problèmes à l’aide de la couche de débogage.

Ne pas passer de pointeurs NULL à Map

Si vous transmettez NULL au paramètre pResource ou pMappedResource de la méthode ID3D11DeviceContext::Map , le comportement de Map n’est pas défini. Si vous avez créé un appareil qui prend uniquement en charge la couche principale, des paramètres non valides pour Mapper peuvent bloquer le système d’exploitation. Si vous avez créé un appareil qui prend en charge la couche de débogage, la sortie de débogage signale une erreur sur cet appel de carte non valide.

Confiner la zone source dans les ressources source et de destination

Dans un appel à la méthode ID3D11DeviceContext::CopySubresourceRegion , la zone source doit se trouver dans la ressource source. Les décalages de destination (x, y et z) permettent à la zone source d’être décalée lors de l’écriture dans la ressource de destination, mais les dimensions de la zone source et des décalages doivent être comprises dans la taille de la ressource. Si vous essayez de copier en dehors de la ressource de destination ou si vous spécifiez une zone source supérieure à la ressource source, le comportement de CopySubresourceRegion n’est pas défini. Si vous avez créé un appareil qui prend en charge la couche de débogage, la sortie de débogage signale une erreur sur cet appel CopySubresourceRegion non valide. Les paramètres non valides pour CopySubresourceRegion entraînent un comportement non défini et peuvent entraîner un rendu incorrect, un découpage, aucune copie ou même la suppression du périphérique de rendu.

Ne supprimez pas DiscardResource ou DiscardView

Le runtime supprime un appel à ID3D11DeviceContext1::D iscardResource ou ID3D11DeviceContext1::D iscardView , sauf si vous créez correctement la ressource.

La ressource que vous passez à ID3D11DeviceContext1::D iscardResource doit avoir été créée à l’aide de D3D11_USAGE_DEFAULT ou de D3D11_USAGE_DYNAMIC. Sinon, le runtime supprime l’appel à DiscardResource.

La ressource qui sous-tend l’affichage que vous passez à ID3D11DeviceContext1::D iscardView doit avoir été créée à l’aide de D3D11_USAGE_DEFAULT ou de D3D11_USAGE_DYNAMIC, sinon le runtime supprime l’appel à DiscardView.

Si vous avez créé un appareil qui prend en charge la couche de débogage, la sortie de débogage signale une erreur concernant l’appel supprimé.

Couches logicielles