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 Windows 10 actualización de aniversario.

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 estados de recursos promocionados y de 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 llamadas dispatch a las listas de comandos de la aplicación para validar y realizar un seguimiento de los cambios en el estado de recursos impuesto por la lista de comandos en la escala de tiempo de GPU.

Dado que GBV requiere la capacidad de ejecutar sombreadores, una lista de comandos COMPUTE emula las listas de comandos COPY. Esto puede cambiar potencialmente la forma en que el hardware realiza copias aunque el resultado final no se debe cambiar. 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 directX Panel de control (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 del motor o niveles de juegos pequeños con menos recursos y DESES) o durante la puesta en marcha 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 que una llamada a ExecuteCommandLists complete la ejecución en la GPU. Puesto 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 ejecutar 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, GB, etc.).

Ejemplo de mensaje de depuración

El siguiente mensaje de error indica que se ha accedido a un recurso denominado "Búfer de color principal" 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 SetEnableGPUBasedValidation y consulte los métodos de las interfaces siguientes:

Consulte las siguientes enumeraciones y estructuras: