Usando a camada de depuração para depurar aplicativos

Recomendamos que você use a camada de depuração para depurar seus aplicativos para garantir que eles sejam limpo de erros e avisos. A camada de depuração ajuda você a escrever código Direct3D. Além disso, sua produtividade pode aumentar quando você usa a camada de depuração porque você pode ver imediatamente as causas de erros de renderização obscuros ou até mesmo telas pretas em sua origem. A camada de depuração fornece avisos para muitos problemas. Por exemplo, a camada de depuração fornece avisos para esses problemas:

  • Esqueceu de definir uma textura, mas lê-la no sombreador de pixels
  • Profundidade de saída, mas não tem limite de estado de estêncil de profundidade
  • Falha na criação de textura com INVALIDARG

Aqui, falamos sobre como habilitar a camada de depuração e alguns dos problemas que você pode evitar usando a camada de depuração.

Habilitando a camada de depuração

Para habilitar a camada de depuração, especifique o sinalizador D3D11_CREATE_DEVICE_DEBUG no parâmetro Flags ao chamar a função D3D11CreateDevice para criar o dispositivo de renderização. Este código de exemplo mostra como habilitar a camada de depuração quando o projeto do Microsoft Visual Studio está em um build de depuração:

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

Prevenindo erros em seu aplicativo com a camada de depuração

Se você usar indevidamente a API do Direct3D 11 ou passar parâmetros inválidos, a saída de depuração da camada de depuração relatará um erro ou um aviso. Em seguida, você pode corrigir seu erro. Em seguida, analisamos alguns problemas de codificação que podem causar falha no comportamento indefinido ou até mesmo no sistema operacional. Você pode capturar e evitar esses problemas usando a camada de depuração.

Não passe ponteiros NULL para Mapa

Se você passar NULL para o parâmetro pResource ou pMappedResource do método ID3D11DeviceContext::Map , o comportamento de Map será indefinido. Se você criou um dispositivo que dá suporte apenas à camada principal, os parâmetros inválidos para Map podem falhar no sistema operacional. Se você criou um dispositivo que dá suporte à camada de depuração, a saída de depuração relatará um erro nesta chamada de Mapa inválida.

Caixa de origem de confinar dentro de recursos de origem e destino

Em uma chamada para o método ID3D11DeviceContext::CopySubresourceRegion , a caixa de origem deve estar dentro do recurso de origem. Os deslocamentos de destino ( x, y e z) permitem que a caixa de origem seja deslocada ao gravar no recurso de destino, mas as dimensões da caixa de origem e os deslocamentos devem estar dentro do tamanho do recurso. Se você tentar copiar fora do recurso de destino ou especificar uma caixa de origem maior que o recurso de origem, o comportamento de CopySubresourceRegion será indefinido. Se você criou um dispositivo que dá suporte à camada de depuração, a saída de depuração relatará um erro nesta chamada CopySubresourceRegion inválida. Parâmetros inválidos para CopySubresourceRegion causam comportamento indefinido e podem resultar em renderização incorreta, recorte, nenhuma cópia ou até mesmo a remoção do dispositivo de renderização.

Não descarte DiscardResource ou DiscardView

O runtime descarta uma chamada para ID3D11DeviceContext1::D iscardResource ou ID3D11DeviceContext1::D iscardView , a menos que você crie corretamente o recurso.

O recurso que você passa para ID3D11DeviceContext1::D iscardResource deve ter sido criado usando D3D11_USAGE_DEFAULT ou D3D11_USAGE_DYNAMIC, caso contrário, o runtime descarta a chamada para DiscardResource.

O recurso que está por trás da exibição que você passa para ID3D11DeviceContext1::D iscardView deve ter sido criado usando D3D11_USAGE_DEFAULT ou D3D11_USAGE_DYNAMIC, caso contrário, o runtime descarta a chamada para DiscardView.

Se você criou um dispositivo que dá suporte à camada de depuração, a saída de depuração relatará um erro em relação à chamada descartada.

Camadas de software