Version v1.36
This version contains improvements to bring better feature parity to D3D12 by supporting DXIL shaders in the shader debugger, as well as expands Vulkan and D3D12 to include sufficient handling for capturing raytracing work.
More details are found below, and please report any problems encountered while using these in particular with shader debugging of DXIL shaders.
As always binary builds with installers, zips and tarballs are available on renderdoc.org.
Main highlights
DXIL debugging
On D3D12 RenderDoc can now debug DXIL shaders produced by dxc. This is supported in the same way as shader debugging for DXBC shaders on D3D12 as well as shaders on other APIs with vertex, pixel and compute (single thread) debugging which can be launched from the mesh viewer, texture viewer or pipeline state respectively. For more information see the documentation on shader debugging.
The feature set extends up to and including the majority of shader model 6.6, with some remaining functionality planned for future releases. Source-level debugging is fully supported where source debug information is available with all existing features.
Not all possible DXIL instructions are currently supported and if an instruction is not supported then the Debug button will be inactive and its hover text will describe the reason that the shader can't be debugged. This currently includes for example wave operations and compute quad operations.
Raytracing capture
RenderDoc will now report the API feature bits for raytracing when attached to a program, for both Vulkan and D3D12. You can capture any application using the standard raytracing APIs and open the capture in the UI.
No debugging or introspection of raytracing work is available at all. This means that you can inspect and debug non-raytracing work as normal but any raytracing calls will effectively be a black box with no information provided and no way to inspect shaders & bindings or ASs.
This is a deliberate choice to make it very clear that RenderDoc is not a raytracing debugging tool. The primary goal is to unblock users who want to be able to use RenderDoc to debug non-raytracing work.
The Vulkan implementation was contributed in large part by ARM, and the D3D12 implementation was based on some initial work by AMD.
For more information see the raytracing page in the documentation.
NOTE FOR VULKAN NVIDIA USERS: On Vulkan RenderDoc relies on the API's built-in capture feature for pipelines. This feature is not implemented on nvidia's drivers currently so that means you will not be able to capture raytracing pipelines when using an nvidia GPU.
This is not a bug and will not be addressed on RenderDoc's side, it requires nvidia to implement the API feature. It has been reported to nvidia and they have said they are working on this.
It works as expected with ray query only, and on AMD both linux and windows drivers support the API feature so can capture all raytracing work.
D3D12 Descriptor naming
A new interface is now exposed whenever RenderDoc is active in a D3D12 program. You can query this interface from ID3D12DescriptorHeap
:
MIDL_INTERFACE("52528c37-bfd9-4bbb-99ff-fdb7188619ce")
IRenderDocDescriptorNamer : public IUnknown
{
public:
virtual HRESULT STDMETHODCALLTYPE SetName(UINT DescriptorIndex, LPCSTR Name) = 0;
};
This interface is free-threaded and allows you to assign a custom name per-descriptor in the heap, which will be displayed in the UI. This is primarily useful for the case of SM6.6 direct heap access where there is no debug or reflection metadata to give a variable or binding name, so in cases where the resource name is not obvious or sufficient or you want to check that the correct resource is bound for the correct descriptor, you can assign a name to the descriptor itself which will be displayed:
Python API changes
- No breaking changes to the Python API.
Features/Improvements
- All: Allow pointers to basic types (e.g.
float *foo
) in buffer formatter instead of requiring a struct as the pointee type. - All: Allow buffer formats to specify an alignment tighter than natural alignment (e.g. 4 byte alignment on a struct with 64-bit integers).
- All: Improve some performance during capture for DLL loads that happen at very high frequency.
- Images: Add support for tiled and mip-mapped EXR images and improved interpretation of channels.
- Images: Improve loading times of EXR files via multithreaded decoding and texel reading optimisations.
- D3D12: Display thread group size for MS/AS disassembly.
- D3D12: Match undocumented PIX behaviour to recursively search for matching shader debug files within search locations. Selection behaviour when there are multiple matches is not currently defined.
- D3D12: Improve reporting of driver version for WARP devices.
- D3D12: Improve some aspects of RenderDoc's DXIL disassembly for better readability and displaying more useful information.
- D3D12: Improve overhead when idle during capture by removing unnecessary CPU-GPU syncs.
- D3D12: Added a custom interface for naming descriptors in a descriptor heap.
- Vulkan: Add support for debugging shaders using EXT_shader_object.
- Vulkan: Implement support for VK_KHR_dynamic_rendering_local_read.
- Vulkan: Add support for debugging mesh shaders, with the same stipulations and restrictions as compute shaders that only one thread is simulated artificially in isolation without any other threads in the group to communciate with.
- Vulkan: Physical devices are clamped to the highest supported version (currently 1.3) manually now as the vulkan loader no longer does this or removes the layer automatically.
Bugfixes
- All: When using bitfields in a buffer format, fix alignment calculation of pointers.
- All: Handle bitfields inside pointer types in buffer formatter.
- All: Disable non-functional 'recompress capture' menu item when viewing an image.
- All: Fix a rare crash on shutdown in python if long linked list of actions is iterated.
- UI: Fix a case where using 'replace' in shader viewer directly would not work.
- UI: Fix a problem exhibited by the 'Where is my draw?' sample UI extension where some UI updates could get lost.
- Android: Fix an issue where the
--replayhost
command line could try to connect to a host before initial enumeration had completed. - D3D12: Fix a case where encoding DXIL would fail when there are multiple functions in a module (e.g with tessellation fork/join functions).
- D3D12: Fix a crash when opening a capture if the application passed a PSO object to
CreateCommandList
. - D3D12: Fix a crash decoding DXIL shaders where the first instruction is reported as being inside a class member function (typically due to dxc's source mapping being garbage for resource accesses).
- D3D12: Ignore written range passed to
ID3D12Resource::Unmap
, as some applications do not set it correctly. - D3D12: Fix a problem restoring texture contents of non-linear textures that require the use of
WriteToSubResource
. - D3D12: Fix incorrect state tracking when selecting events mid-way through an ExecuteIndirect that mutates state.
- D3D12: Correctly handle NULL descriptors in render target binds to create holes.
- D3D12: Fix bias from sampler not being properly applied when debugging
SampleBias
instructions. - D3D12: Fix a potential crash when fetching pixel history if the number of events in consideration is really small and the number of overdrawn fragments is really large.
- D3D12: Fix some missing cases where GPU was not properly synced on all queues.
- D3D12: Fix a potential crash in pixel history if results mutate out during processing because of non-determinism.
- D3D12: Ignore depth values for events where there is no depth work happening like copies.
- D3D12 & Vulkan: Fix a potential crash in pixel history with events that overdraw the same pixel multiple times.
- Vulkan: Fix an error where memory bound with
vkBindBufferMemory2
and only used with bufferDeviceAddress would not properly have CPU writes tracked. - Vulkan: Fix type reporting for debug mappings directly to scalars.
- Vulkan: Don't attempt to fetch primitive IDs in pixel history if geometryShader feature is not available.
- Vulkan: Ignore descriptor set parameter in vkCmdPushDescriptorSetKHR.
- Vulkan: Fix a crash applying debug names to objects not included in captures.
- Vulkan: Fix display of indirect mesh draw parameters.
- Vulkan: Fix a problem where required SPIR-V version for recompilation would not be applied if debug information was present.
- Vulkan: Fix incorrect entry point name being used when SPIR-V is compiled with a 'rename entry point' compilation setting.
- Vulkan: Speculative fix for mesh shaders that output matrices as per-vertex or per-primitive data.
- Vulkan: Fix a potential problem when generating discard patterns for rare unaligned texture formats.
- Vulkan: Fix cases where resources created mid-capture would not properly be included in captures.
- Vulkan: Fix query for promoted KHR_buffer_device_address feature structs on drivers where the feature can't be supported which weren't properly removing the feature.
- Vulkan: Fix a crash if an extended vulkan queue family is used, which code was not correctly handling.
- Vulkan: Fix issues displaying inline UBO descriptors.
- Vulkan: Fix incorrect application of multiple updates to inline UBO descriptors in the same descriptor template.
- Vulkan: Fix shader stage flags not properly propagating to recompilation of derived pipelines using those shaders.
- OpenGL: Fix separable shader patching for reflection if the shader uses gl_CullDistance.
- OpenGL: Fix an error querying invalid sampler parameters from MSAA textures.
- OpenGL: Fix an issue if applications resize MSAA textures using non-storage texture creation functions.
- OpenGL: Display transform feedback properly when selecting event with it active.
- OpenGL: Fix LOD bias from textures being still applied when viewing them in the texture viewer.