The HLSL debugger, which is one of the Graphics Diagnostics tools in Visual Studio, can help you understand how your HLSL shader code operates with graphics data that was recorded during a Graphics Diagnostics capture session.
This is the HLSL Debugger:
The HLSL Debugger can help you understand problems that arise in your shader code. Debugging HLSL code in Visual Studio resembles debugging code written in other languages—for example, C++, C#, or Visual Basic. You can inspect the contents of variables, set break points, step through code, and walk up the call-stack, just like you can when you debug other languages.
However, because CPU hardware and software (app code) is so different from GPU hardware and software (shader code), a CPU-like debugging experience is not possible on a GPU unless the GPU debugger works in a fundamentally different way. The fundamental difference between the kinds of work that GPUs and CPUs do is that GPUs spread the work across hundreds of relatively slow, simple processors that are optimized for graphics operations to handle very large data sets, but CPUs use a handful of relatively fast, complicated processors that can handle smaller, general-purpose workloads. Also, because a GPU is essentially an independent computer that manages its own internal workings and only infrequently shares information with the CPU, it's very difficult for a debugger that's running on the CPU to know what's happening on the GPU at any given time. Even if a CPU could keep up, GPU code just uses too many threads and generates too much data for a developer to sift through.
To work around these difficulties, the HLSL Debugger recreates captured frames by using information that was recorded in a graphics log, rather than attempting to monitor a GPU in real time as it runs shader code. Because a graphics log contains enough information to recreate any part of the output, and because Graphics Diagnostics provides tools that can help you pinpoint the exact pixel and event where an error occurs, the HLSL Debugger only has to simulate the exact shader thread that you are interested in. This means that the work of the shader can be simulated on the CPU, where its inner workings are in full view. This is what gives the HLSL Debugger a CPU-like debugging experience.
However, the HLSL debugger is currently limited in the following ways:
-
The HLSL Debugger doesn't support edit-and-continue.
-
It's not possible to debug an app and its shader code at the same time. However, you can alternate between them.
-
You can add variables and registers to the Watch window, but expressions are not supported.
-
Compute shaders are not supported.
Nevertheless, the HLSL Debugger provides a better, more CPU-like debugging experience than would be possible otherwise.