Uso de la capa de depuración para depurar aplicaciones

Se recomienda usar la capa de depuración para depurar las aplicaciones para asegurarse de que están limpios de errores y advertencias. La capa de depuración le ayuda a escribir código de Direct3D. Además, la productividad puede aumentar al usar la capa de depuración porque puede ver inmediatamente las causas de errores de representación ocultos o incluso pantallas negras en su origen. La capa de depuración proporciona advertencias para muchos problemas. Por ejemplo, la capa de depuración proporciona advertencias para estos problemas:

  • Olvidó establecer una textura pero leerla en el sombreador de píxeles.
  • Profundidad de salida, pero no tiene ningún estado de galería de símbolos de profundidad enlazado
  • Error al crear la textura con INVALIDARG

Aquí se habla sobre cómo habilitar la capa de depuración y algunos de los problemas que puede evitar mediante el uso de la capa de depuración.

Habilitación de la capa de depuración

Para habilitar la capa de depuración, especifique la marca D3D11_CREATE_DEVICE_DEBUG en el parámetro Flags al llamar a la función D3D11CreateDevice para crear el dispositivo de representación. En este código de ejemplo se muestra cómo habilitar la capa de depuración cuando el proyecto de Microsoft Visual Studio está en una compilación de depuración:

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

Prevención de errores en la aplicación con la capa de depuración

Si usa la API de Direct3D 11 o pasa parámetros incorrectos, la salida de depuración de la capa de depuración notifica un error o una advertencia. A continuación, puedes corregir tu error. A continuación, se examinan algunos problemas de codificación que pueden provocar un comportamiento indefinido o incluso el sistema operativo para bloquearse. Puede detectar y evitar estos problemas mediante el uso de la capa de depuración.

No pase punteros NULL a Map

Si pasa NULL al parámetro pResource o pMappedResource del método ID3D11DeviceContext::Map , el comportamiento de Map no está definido. Si ha creado un dispositivo que solo admite la capa principal, los parámetros no válidos para Map pueden bloquear el sistema operativo. Si ha creado un dispositivo que admite la capa de depuración, la salida de depuración notifica un error en esta llamada de asignación no válida.

Cuadro de origen de límite dentro de los recursos de origen y destino

En una llamada al método ID3D11DeviceContext::CopySubresourceRegion , el cuadro de origen debe estar dentro del recurso de origen. Los desplazamientos de destino (x, y y z) permiten que el cuadro de origen se desfase al escribir en el recurso de destino, pero las dimensiones del cuadro de origen y los desplazamientos deben estar dentro del tamaño del recurso. Si intenta copiar fuera del recurso de destino o especifica un cuadro de origen mayor que el recurso de origen, el comportamiento de CopySubresourceRegion no está definido. Si ha creado un dispositivo que admite la capa de depuración, la salida de depuración notifica un error en esta llamada a CopySubresourceRegion no válida. Los parámetros no válidos para CopySubresourceRegion provocan un comportamiento indefinido y pueden dar lugar a una representación incorrecta, recorte, sin copia o incluso la eliminación del dispositivo de representación.

No quite DiscardResource ni DiscardView

El tiempo de ejecución quita una llamada a ID3D11DeviceContext1::D iscardResource o ID3D11DeviceContext1::D iscardView a menos que cree correctamente el recurso.

El recurso que se pasa a ID3D11DeviceContext1::D iscardResource debe haberse creado mediante D3D11_USAGE_DEFAULT o D3D11_USAGE_DYNAMIC; de lo contrario, el tiempo de ejecución quita la llamada a DiscardResource.

El recurso que subyace a la vista que pasa a ID3D11DeviceContext1::D iscardView debe haberse creado con D3D11_USAGE_DEFAULT o D3D11_USAGE_DYNAMIC; de lo contrario, el tiempo de ejecución quita la llamada a DiscardView.

Si ha creado un dispositivo que admite la capa de depuración, la salida de depuración notifica un error con respecto a la llamada eliminada.

Capas de software