December 13th, 2024

PIX 2412.12 – Texture/Buffer/Visualizer improvements, Work Graph Shader Debugging, and many Timing Capture improvements

Austin Kinross
Dev Lead

Today we released PIX on Windows version 2412.12, which can be downloaded here. This release includes several new improvements to GPU Captures and Timing Captures, including:

GPU Captures:

Timing Captures:

As always, nearly all of the new functionality in this release was added in direct response to customer feedback. Please continue to contact us with your issues and requests! The best ways to reach us are via the “Send Feedback” button in the top-right corner of PIX, and via the #pix channel on the DirectX Discord.

GPU Captures

Custom Buffer/Texture/Mesh Visualizer Improvements

As a reminder, the August PIX release added functionality that lets you write custom HLSL shaders to help visualize mesh/texture contents inside the PIX UI. 

This release adds several new improvements to this feature, including: 

  1. Visualize buffers as textures! 
  2. Bind by resource name. Your shader can instruct PIX to find a resource with a specific name in the selected event and read from it in your shader. 
  3. User constants. You can now declare constants inside your custom shaders, and you will be able to change their values within the PIX UI when using your visualizer. 
  4. VRS Image: Your custom shader can now read from the shading rate image bound to the selected event. 
  5. Improved error logging when your custom shader’s bindings aren’t compatible with the root signature bound to the command list. 
  6. Misc bug fixes, such as the ability to use a custom visualizer in a DispatchRays() event 

Several other “under the hood” improvements have been made as well, such as improved shader caching between different PIX documents to reduce the time spent waiting for custom shaders to compile. 

The full documentation for custom texture/mesh visualizers can be accessed here 

 

Work Graph Shader Debugging (preview)

This release includes our first preview version of shader debugging for work graphs. To launch, click on the green arrows next to any entry-point shader in the pipeline view for a DispatchGraph event:  

Image wg1

Then click the green “Start” arrow in the top-left of the Debug tab. PIX will record all threads for every entry point and any other nodes that might be invoked. Rather than choosing the thread of interest before starting debugging, you can switch between these threads using the “Invocations” view in the shader debugger (by default in the bottom-right part of the Debug tab): 

Image wg2 

Please send your feedback for bugs or improvements. 

 

VRS Shading Rate Visualizer

We have added a new image visualizer that shows you the shading rate used for each pixel drawn by the current event. We have also made miscellaneous other improvements to the image visualizers, including improved legends for each visualizer.

Image vrs

 

Many bug fixes + smaller improvements

  • Shader Debugging fixes:
    • Misc fixes/improvements for shader debugging reliability on Intel Arc GPUs
    • Fix min16float issue
    • Fix misc issues debugging DXR shaders with DXIL-defined root signatures
    • Fix misc issues debugging shaders in AddToStateObject chains
    • Robustify shader debugging against null global root signatures
  • Fix capture/replay of apps using generic programs
  • Fix capture issue caused by use of [WaveSize(n)] in Node shaders
  • Gather Accessed Resources: show dynamically-indexed TLASes properly
  • New AMD plugin, with some small bug fixes compared to the last release
  • Shader Table Viewer: rename column from ‘Root Signature’ to ‘Local Root Signature’
  • Fix View Instancing being disabled when flag isn’t set
  • Fix Capture-time crash in D3D12_STREAM_OUTPUT_DESC when NumEntries is 0
  • Acceleration Structure Viewer: Fix error when pressing camera in DXR invocations view when no entries are selected
  • Acceleration Structure Viewer: fix FOV Range Clamping Bug making it difficult to type + change the value
  • Acceleration Structure Viewer: fix aspect ratio when view size is changed
  • Fix capture reference tracker not using full paths (causes temp files to go missing)
  • Misc UI perf improvements
  • Disable GPU Upload Heaps in PIX on Windows 10 

 

Timing Captures

New Comparison Layout 

The Timing Capture comparison features have been moved from the Metrics view to a new dedicated Comparison Layout. This layout improves several comparison workflows, including the ability to compare data from multiple captures and points above and below a budgetThis release also adds support for comparing Consolidated Events and PIX GPU events.

Image metrics1

 

Range Details “v2” Preview 

This release includes a Preview of a new implementation of the Range Details.  This new implementation is built to be far more flexible than the original implementation to support many of the analyze scenarios you’ve asked for over the last few years. 

The flexibility comes from the combination of a pivot table, an event list and a set of filters.  The pivot table lets you aggregate the data on multiple dimensions, in an arbitrary order.  The event list shows the individual items that make up the aggregation.  Finally, filters can be used to restrict the data contained in the aggregation and the event list. 

Image range1

 

Zoom stack in the Timeline 

Have you ever been scrolling, zooming and panning around the timeline, only to wish you could jump back to your previous location?  This release of PIX on Windows contains a “zoom stack” that allows you “undo” and “redo” previous navigations within the timeline.  Activate the zoom stack using the arrows in the top left corner of the timeline. 

Image zoom1

Category
PIX
Topics
release

Author

Developer on the PIX on Windows team at Microsoft.

0 comments

'; block.insertAdjacentElement('beforebegin', codeheader); let button = codeheader.querySelector('.copy-button'); button.addEventListener("click", async () => { let blockToCopy = block; await copyCode(blockToCopy, button); }); } }); async function copyCode(blockToCopy, button) { let code = blockToCopy.querySelector("code"); let text = ''; if (code) { text = code.innerText; } else { text = blockToCopy.innerText; } try { await navigator.clipboard.writeText(text); } catch (err) { console.error('Failed to copy:', err); } button.innerText = "Copied"; setTimeout(() => { button.innerHTML = '' + svgCodeIcon + ' Copy'; }, 1400); }