Compartir a través de


Validación basada en GPU y la capa de depuración de Direct3D 12

En este tema se describe cómo usar mejor la capa de depuración de Direct3D 12. La validación basada en GPU (GBV) permite escenarios de validación en la escala de tiempo de GPU que no son posibles durante las llamadas API en la CPU. GBV está disponible a partir de las herramientas de gráficos para la actualización de aniversario de Windows 10.

Propósito de la validación basada en GPU

La validación basada en GPU ayuda a identificar los siguientes errores:

  • Uso de descriptores no inicializados o incompatibles en un sombreador.
  • Uso de descriptores que hacen referencia a recursos eliminados en un sombreador.
  • Validación de los estados de recursos promocionados y la descomposición del estado de los recursos.
  • Indexación más allá del final del montón del descriptor en un sombreador.
  • El sombreador accede a los recursos en estado incompatible.
  • Uso de samplers no inicializados o incompatibles en un sombreador.

GBV funciona mediante la creación de sombreadores revisados que tienen validación agregada directamente al sombreador. Los sombreadores revisados inspeccionan los argumentos raíz y los recursos a los que se accede durante la ejecución del sombreador y notifican errores a un búfer de registro. GBV también inserta operaciones adicionales y las llamadas dispatch a las listas de comandos de la aplicación para validar y realizar un seguimiento de los cambios en el estado de los recursos impuesto por la lista de comandos en la escala de tiempo de GPU.

Dado que GBV requiere la capacidad de ejecutar sombreadores, las listas de comandos COPY se emulan mediante una lista de comandos COMPUTE. Esto puede cambiar la forma en que el hardware realiza copias aunque no se debe cambiar el resultado final. La aplicación seguirá percibiendo que son listas de comandos COPY y la capa de depuración las validará como tal.

Activación de la validación basada en GPU

GBV se puede forzar mediante el Panel de control de DirectX (DXCPL) forzando en la capa de depuración de Direct3D 12 y, además, forzando la validación basada en GPU (nueva pestaña en el panel de control). Una vez habilitado, GBV permanecerá habilitado hasta que se libere el dispositivo Direct3D 12. Como alternativa, GBV se puede habilitar mediante programación antes de crear el dispositivo Direct3D 12:

void EnableShaderBasedValidation()
{
    CComPtr<ID3D12Debug> spDebugController0;
    CComPtr<ID3D12Debug1> spDebugController1;
    VERIFY(D3D12GetDebugInterface(IID_PPV_ARGS(&spDebugController0)));
    VERIFY(spDebugController0->QueryInterface(IID_PPV_ARGS(&spDebugController1)));
    spDebugController1->SetEnableGPUBasedValidation(true);
}

Por lo general, debe ejecutar el código con la capa de depuración habilitada la mayor parte del tiempo. Sin embargo, GBV puede ralentizar mucho las cosas. Los desarrolladores pueden considerar la posibilidad de habilitar GBV con conjuntos de datos más pequeños (por ejemplo, demostraciones de motor o pequeños niveles de juego con menos recursos y ARCHIVOS) o durante la presentación temprana de la aplicación para reducir los problemas de rendimiento. Con contenido mayor, considere la posibilidad de activar GBV en una o dos máquinas de prueba en un pase de prueba nocturno.

Salida de depuración

GBV genera una salida de depuración después de una llamada a ExecuteCommandLists completa la ejecución en la GPU. Dado que se encuentra en la escala de tiempo de GPU, la salida de depuración puede ser asincrónica con otra validación de la escala de tiempo de CPU. Es posible que los desarrolladores de aplicaciones quieran insertar su propia espera después de la ejecución para sincronizar la salida de depuración.

La salida de GBV identifica dónde se produjo un error en un sombreador, junto con el recuento actual de draw/dispatch y las identidades de los objetos relacionados (por ejemplo, lista de comandos, cola, FEI, etc.).

Mensaje de depuración de ejemplo

El siguiente mensaje de error indica que se accedió a un recurso denominado "Main Color Buffer" en un sombreador como un recurso de sombreador, pero estaba en el estado de acceso desordenado cuando el sombreador se ejecutó en la GPU. También se proporciona información adicional, como la ubicación en el origen del sombreador, el nombre de la lista de comandos y el recuento de draw (Índice de dibujo) y los nombres de los objetos de interfaz D3D relacionados.

D3D12 ERROR: Incompatible resource state: Resource: 0x0000016F61A6EA80:'Main Color Buffer', 
Subresource Index: [0], 
Descriptor heap index: [0], 
Binding Type In Descriptor: SRV, 
Resource State: D3D12_RESOURCE_STATE_UNORDERED_ACCESS(0x8), 
Shader Stage: PIXEL, 
Root Parameter Index: [0], 
Draw Index: [0], 
Shader Code: E:\FileShare\MiniEngine_GitHub_160128\MiniEngine_GitHub\Core\Shaders\SharpeningUpsamplePS.hlsl(37,2-59), 
Asm Instruction Range: [0x138-0x16b], 
Asm Operand Index: [3], 
Command List: 0x0000016F6F75F740:'CommandList', SRV/UAV/CBV Descriptor Heap: 0x0000016F6F76F280:'Unnamed ID3D12DescriptorHeap Object', 
Sampler Descriptor Heap: <not set>, 
Pipeline State: 0x0000016F572C89F0:'Unnamed ID3D12PipelineState Object',  
[ EXECUTION ERROR #942: GPU_BASED_VALIDATION_INCOMPATIBLE_RESOURCE_STATE]

API de capa de depuración

Para habilitar la capa de depuración, llame a EnableDebugLayer.

Para habilitar la validación basada en GPU, llame a SetEnableGPUBasedValidationy consulte los métodos de las interfaces siguientes:

Consulte las siguientes enumeraciones y estructuras: