PIX 2108.18: New programmatic capture APIs and much more

Austin Kinross

Today we released PIX on Windows version 2108.18, which can be downloaded here. We have also released a new version of WinPixEventRuntime, available here.

This release has a lot of new features, including:

  • New in-application capture APIs.
    • These allow you to programmatically take GPU captures within your application, without running PIX programs like the PIX UI or pixtool.
  • New AMD counter graphs in the timeline.
    • These help you understand your occupancy and what factors are limiting it, such as VGPR usage.
  • The first release of our new Acceleration Structure viewer.
    • The new viewer is much faster than the old viewer. It also adds support for a free-roam camera.
    • We will be adding new features to this Acceleration Structure viewer over the coming months. Stay tuned for details!
  • File IO profiling support for archive files
  • Many bug fixes and other smaller improvements.

This release also includes a new Visual C++ Redistributable that may request a reboot during installation. We believe that anyone who has previously installed a 2019 VC++ redist on their computer (such as the one installed by older version of PIX) can safely ignore this reboot request.

As a friendly reminder, our PIX survey is still open for responses! If you haven’t already done so, then please consider filling in the survey to help us shape our future plans and make PIX better for you.


New in-application capture APIs

This release adds several new APIs to pix3.h that you can use within your application to take and/or control GPU Captures. The new APIs are documented here, including a setup guide.

These new APIs do not require you to use the PIX UI or pixtool at all. You just need to load WinPixGpuCapturer.dll into your application before creating your D3D12 device. We have added a helper function, PIXLoadLatestWinPixGpuCapturerLibrary(), to help with this.

Here’s a brief overview of the new APIs:

  • PIXBeginCapture()
    • Use this to programmatically start a GPU Capture immediately.
    • It takes the destination filename as input.
  • PIXEndCapture()
    • Ends a GPU Capture started via PIXBeginCapture()
  • PIXGpuCaptureNextFrames()
    • Use this to enqueue a GPU Capture that will start next time a qualifying Present() call is made.
    • This could, for example, be used to add your own “Take Capture” button to your in-game UI.
  • PIXSetTargetWindow()
    • This tells PIX which HWND the application is interested in capturing.
    • After calling this API, PIX will only start or stop present-to-present captures when the application presents the specified HWND.
    • This is helpful for multi-window applications, such as an engine editor. Without it, a present-to-present capture will capture the GPU work submitted between the next two Present() calls made for any HWNDs, which may not include the region of interest to the user.
  • PIXLoadLatestWinPixGpuCapturerLibrary()
    • This is a helper function to find and load the most recent version of WinPixGpuCapturer.dll that’s installed on the current PC.

We will be adding more APIs like these in the future. Please contact us if you have any particular requests.


New AMD occupancy graphs

This release adds new graphs to our timeline on RX 5000 and RX 6000 series AMD GPUs, to help you understand your GPU occupancy. The new graphs show your wave distribution across different shader types and occupancy limiting factors such as VGPR usage. These graphs complement similar graphs available on Intel and NVIDIA GPUs. Many thanks to our IHV partners for making this possible!

The new counters are documented here.

Image 202108 AmdGraphs


New Acceleration Structure Viewer 

Over the last few months, we’ve been rewriting our Acceleration Structure viewer, taking into account all the feedback you’ve sent to us about it. We have lots more planned for it, but we hope that you enjoy the improvements we’ve made so far. 

Load-time performance: Large acceleration structures would take an unacceptably long time to load with the old viewer. For example, we saw a capture that had a TLAS with > 100k instances and would take well over 10 minutes to load! 

We’ve focused heavily on improving this experience, and the new viewer can load acceleration structures much faster across the board. As a reference point, it can load the previously mentioned TLAS in less than 1 second. That’s a 600x improvement! 

Free-roam camera: TLASes may contain the entirety of the scene being rendered, making it awkward to navigate around with PIX’s arcball-style camera controls. As such, the new viewer has integrated free-roam/FPS-style camera controls, which should make it much easier to fly around and investigate your scenes. 

Simply navigate with WASD, and right-click + move the mouse (or use the arrow keys) to rotate the camera. Additionally, holding shift will let you move faster throughout the scene. 

Future Plans: We will be adding new features to this new acceleration structure viewer over the coming months. Please continue to contact us with your feature requests and/or suggestions!

Image 202108 AsViewer


File IO profiling support for archive files

If your title packages individual assets into composite archive files such as .zip or .pak, the file io profiler built into Timing Captures can now show which assets within the composite file were accessed, but it requires extra information from you, the title developer, to do so.  The extra information you supply is in the form of a Mapping File that PIX uses to decode accesses that occur within archive files.  The names of individual assets are displayed in the Range Details, Element Details and Timeline views in the UI.

Image 2108 IoProfiling


Other improvements

GPU Captures

  • Don’t throw exceptions in ID3D12PipelineLibrary::StorePipeline, to fix long launch times
  • Don’t show warning in Shader Table Viewer if no local root signature is set
  • Display the correct value of unbiased exponent for 999e5
  • Add partial support for capturing shared ID3D12Heaps
  • Avoid GPU Capture HUD crash during app termination on some GPUs
  • Make D3D12CreateDevice with NULL outptr return S_FALSE at capture time

Timing Captures

  • Fix bug where the ContextSwitch WaitReason was incorrect in extracted captures


  • Add safety measures to preserve UI state files in case of write failure (e.g. a full disk)
  • Avoid issue that can prevent running process list from populating on some PCs
  • Update VcRedist to latest version, to prevent installer hangs on ARM64
  • Add option to disable virtual space in the text editor



As always, if you have any feedback on PIX then please don’t hesitate to contact us. The best ways to reach us are via the feedback button (in the top-right corner of PIX), or on the DirectX Discord channel.


Discussion is closed.

Feedback usabilla icon