Releases: baldurk/renderdoc
Version v1.36
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...
Version v1.35
Version v1.35
This release of RenderDoc is primarily a bugfix release, with some small improvements also included.
As always binary builds with installers, zips and tarballs are available on renderdoc.org.
Python API changes
- No changes to the Python API.
Features/Improvements
- Allow searching PATH for executables to run instead of requiring an absolute path. Primarily relevant for linux where some environments might need a wrapper script to launch programs.
- Add support for fetching pixel history on draws using shader objects.
- Don't require
VK_EXT_hdr_metadata
as a pure WSI extension to be present on replay. - Compile PSOs in parallel on Vulkan and D3D12 during load to improve performance when serial shader compilation dominates load times.
- Add some newly added D3D12 interfaces including
ID3D12GraphicsCommandList10
andID3D12Device14
. Note the new functionality is still unsupported, only the interface queries. - Add support for quad overdraw with vulkan multiview, and signpost better that quad overdraw is not supported on Vulkan when MSAA is used (on other APIs it degrades to single-sample rendering).
- Global variable names in DXIL disassembly are demangled.
- Add a warning if vkconfig is active when RenderDoc is run in case it causes crashes.
- Prefer loading a local version of DXC for internal DXIL compiles.
Bugfixes
- All: Disallow re-docking panels onto main texture tabs in texture viewer.
- All: Fix a bounds check on loading images for view.
- Android: Fix case where capture options were not properly propagated.
- D3D11: Fix a crash opening constant buffers on stages where no shader is currently bound.
- D3D12: Fix a potential crash with dangling references to deleted items in DXIL editing.
- D3D12: Fix a crash creating PSOs on D3D12 with an implicitly embedded root signature.
- D3D12: Fix a crash processing RTV/DSV properties on replay if the RTV/DSV heap was deleted and isn't in the capture.
- Vulkan: Fix potentially broken captures when using the 'soft memory limit' option.
- Vulkan: Fix overly-pessimistic calculation of structure padding when the size of a struct needs to be determined from context.
- Vulkan: Fix a potential crash editing shader object shaders that aren't used in the current event.
- Vulkan: Fix a crash when using secondary command buffers and indirect-count draws.
- OpenGL: Fix an invalid GL query for SPIR-V shaders that don't declare a location on bindings.
Version v1.34
Version v1.34
This release contains a number of important fixes and some quality of life improvements and new functionality handling, as well as laying the groundwork and baseline for new features to come in later releases.
NOTE: Recent AMD drivers have a problem that for Vulkan and GL may cause problems creating swapchains. On UE5 this can cause fatal errors on or shortly after startup when using Vulkan, and this may also appear as the use of D3D12 in applications that don't use the API. This is an AMD driver issue which has been reported and is planned to be fixed on the AMD side.
As always binary builds with installers, zips and tarballs are available on renderdoc.org.
Python API changes
- There are no API changes in this release.
- The RenderDoc python documentation now includes embedded scripts and details of how to generate stubs for use with VS code auto-complete.
Features/Improvements
- Added support for a new GLES extension: GL_EXT_clip_control.
- Store texture data on GLES for sub-rect updates of compressed textures.
- Active shader viewer bookmarks are listed in the bookmarks menu.
- The custom more readable and human-friendly DXIL disassembly has had a number of readability improvements made.
- Add support for Vulkan extensions: VK_KHR_shader_relaxed_extended_instruction and VK_EXT_shader_object
- Improve the display of entry point interface lists in SPIR-V entry points.
- Add functionality to allow packing of bitfields even when the declared bitfield straddles the alignment of its base type with
#pack(tight_bitfield_packing)
. - Added a UI for managing the ignored PDBs when resolving callstacks.
- Implemented GPU feedback for detecting dynamic access to arrayed samplers.
Bugfixes
- All: Fix an error converting an XML/ZIP capture which contains a buffer over 4GB.
- All: Fix a potential crash viewing the inputs and outputs of texture copy operations in the texture viewer.
- UI: Fix double-scale factor applied to text editor margins that would cause overly-wide margins on high DPI scaled monitors.
- UI: Fix backwards use of D3D-style and Vulkan-style terminology for shader stages in resource usage.
- UI: Fix child processes not being shown properly for remote capture.
- UI: When opening a constant buffer viewer for a binding that is already open, ensure the UI doesn't continually expand.
- UI: Don't display a byte offset for specialisation constant buffers as it is not the byte offset in the data blob.
- Windows: Fix a potential race condition if a DLL is unloaded while it is being processed for injection.
- Linux: Fix rare crash if user is not fully configured and has no password entry to determine home folder.
- Image viewer: Fix a potential random crash when opening an image file (DDS, HDR, PNG, etc).
- D3D11: Fix an incorrect case where a reference to a swapchain backbuffer would be held over resizing causing the resize to fail, which could happen when capturing multiple frames in Unreal engine.
- D3D11: Fix PS UAV usage missing from D3D11 pixel history if OM targets are also bound.
- D3D11: Fix incorrect behaviour when opening a resource via the compute shader UAVs.
- D3D12: Fix a rare potential race condition crash when creating/destroying buffers.
- D3D12: Fix a crash if a pipeline state is created with no explicit root signature, instead coming from embedded root signature in shader binaries.
- D3D12: Fix a crash if multiple D3D12 devices are created and destroyed with overlapping lifetimes.
- D3D12: When editing a shader with builtin dxc handling ensure the command line arguments are properly passed.
- D3D12: Precompile internal shaders that need dxc to avoid relying on potentially buggy old dxc found at runtime.
- D3D12: When resolving ambiguous mapping from virtual address to resource use the largest possible valid resource to avoid crashes.
- D3D12: Fix a crash when applications use new dynamic DLL selection and loading for root signature decoding.
- D3D12: Fix decoding of partially replayed ExecuteIndirect commands where the arguments include state bindings.
- D3D12: Fix incorrect duplicate execution of ExecuteIndirect in certain cases.
- D3D12: Fix reflected byte size of matrices with padding up to float4 per row/column.
- D3D12: Fix type display for compute shader built-in inputs on DXIL.
- D3D12: Fix a possible crash running pixel history with multiple queues submitting work.
- D3D12: Fix incorrect calls to CheckFeatureSupport internally for checking feature bits.
- D3D12: Handle amplification shaders where the payload is not declared as groupshared.
- D3D12: Fix mesh or task shader output failing if the root signature used has
DENY_*_SHADER_ROOT_ACCESS
flags set. - Vulkan: Fix a crash when processing shader modules with multiple entry points where one is a mesh shader.
- Vulkan: Fix a crash when opening shader message viewer to view shader printf results.
- Vulkan: Fix a case where function points are incorrectly returned from
Get*ProcAddr
forVK_EXT_acquire_drm_display
. - Vulkan: Fix storage of backing data for memory only accessed via buffer_device_address that was uploaded before the captured region of work.
- Vulkan: Fix shader editing failure on Android or other remote capture scenario.
- Vulkan: Fix crash when push constants are expected by a pipeline but never bound as they are unused in the shader.
- Vulkan: Fix an error if the
PIPELINE_COMPILE_REQUIRED
bit is set when building a compute pipeline. - Vulkan: Fix an incorrect lookup for vertex attributes which would fail if the attributes are not densely/linearly assigned.
- Vulkan: Fix incorrect fetch of task shader output when a payload is declared but not used in the emit instruction.
- Vulkan: Fix broken handling of
vkCmdPushDescriptorSetWithTemplateKHR
with arrayed descriptors. - Vulkan: Fix a potential crash if
OpAccessChain
has no indices specified. - GL: Fix crash when creating textures that are larger than 4GB.
- GL: Fix a the vertex input attributes for SPIR-V shaders not being displayed correctly.
- GL: Fix cubemap array shadow samplers not being correctly reflected.
Version v1.33
Version v1.33
This release contains a new RenderDoc-specific disassembly view of DXIL, aiming to be more readable and digestible than the default DXIL disassembly. It also has several bugfixes and some quality of life improvements.
NOTE: Recent AMD drivers have a problem that for Vulkan and GL may cause problems creating swapchains. On UE5 this can cause fatal errors on or shortly after startup when using Vulkan, and this may also appear as the use of D3D12 in applications that don't use the API. This is an AMD driver issue which has been reported and is planned to be fixed on the AMD side.
As always binary builds with installers, zips and tarballs are available on renderdoc.org.
Main highlights
- The default DXIL disassembly type
DXBC/DXIL
has changed to use a new RenderDoc custom DXIL disassembly view.- The goals of the RenderDoc DXIL disassembly view is to make it easier for a human to read and parse the DXIL disassembly.
- It does not try to be compatible with or emulate the DXC DXIL disassembly output. DXC DXIL disassembly output can be selected using the
DXC DXIL
option in theDisassembly type
drop down.
- It does not try to be compatible with or emulate the DXC DXIL disassembly output. DXC DXIL disassembly output can be selected using the
- Highlights of the RenderDoc DXIL disassembly view:
- Leverages C-style syntax, HLSL naming and uses declared type SSA variables.
- Uses reflection data where possible for resource naming.
- Custom decoding of DXIL DX specific opcodes i.e.
LoadInput
,StoreOutput
,CBufferLoad
,BufferLoad
,BufferStore
,TextureLoad
,TextureStore
,Sample*
,AtomicBinOp
. - Where possible uses HLSL intrinsic names for DXIL DX opcodes i.e.
sin
,cos
,tan
,isnan
,ddx_coarse
, etc. - Custom decoding of handle creation and annotation to make it easier to link back to the resource.
- Examples of the new RenderDoc DXIL disassembly output: Vertex Shader, Pixel Shader, Compute Shader
- The goals of the RenderDoc DXIL disassembly view is to make it easier for a human to read and parse the DXIL disassembly.
Example Comparisons between DXC DXIL Disassembly and RenderDoc DXIL Disassembly
DXC DXIL Disassembly:
%VSConstants_cbuffer = call %dx.types.Handle @dx.op.createHandle(i32 57, i8 2, i32 0, i32 0, i1 false), !dbg !138 ; line:54 col:23 ; CreateHandle(resourceClass,rangeId,index,nonUniformIndex)
%1 = call float @dx.op.loadInput.f32(i32 4, i32 4, i32 0, i8 0, i32 undef), !dbg !138 ; line:54 col:23 ; LoadInput(inputSigId,rowIndex,colIndex,gsVertexAxis)
%15 = call %dx.types.CBufRet.f32 @dx.op.cbufferLoadLegacy.f32(i32 59, %dx.types.Handle %VSConstants_cbuffer, i32 0), !dbg !154 ; line:58 col:29 ; CBufferLoadLegacy(handle,regIndex)
%25 = call %dx.types.ResRet.f32 @dx.op.sample.f32(i32 60, %dx.types.Handle %texDiffuse_texture_2d, %dx.types.Handle %defaultSampler_sampler, float %16, float %17, float undef, float undef, i32 0, i32 0, i32 undef, float undef), !dbg !305 ; line:51 col:28 ; Sample(srv,sampler,coord0,coord1,coord2,coord3,offset0,offset1,offset2,clamp)
%RawBufferLoad1 = call %dx.types.ResRet.f32 @dx.op.rawBufferLoad.f32(i32 139, %dx.types.Handle %Exposure_texture_structbuf, i32 4, i32 0, i8 1, i32 4), !dbg !214 ; line:82 col:30 ; RawBufferLoad(srv,index,elementOffset,mask,alignment)
call void @dx.op.textureStore.i32(i32 67, %dx.types.Handle %LumaResult_UAV_2d, i32 %1, i32 %2, i32 undef, i32 %73, i32 %73, i32 %73, i32 %73, i8 15), !dbg !230 ; line:85 col:29 ; TextureStore(srv,coord0,coord1,coord2,value0,value1,value2,value3,mask)
RenderDoc DXIL Disassembly:
_dx.types.Handle _VSConstants_cbuffer = VSConstants;
float _1 = <IN>.BITANGENT.x;
_dx.types.CBufRet.f32 _15 = {VSConstants.modelToProjection[0]}; // cbuffer = VSConstants, byte_offset = 0
_dx.types.ResRet.f32 _25 = texDiffuse.Sample(defaultSampler, _16, _17, Offset = {0, 0});
_dx.types.ResRet.f32 _RawBufferLoad1 = Exposure[4];
LumaResult[_1, _2] = {_73, _73, _73, _73};
Python API changes
- The API for accessing descriptors and bound resources has been significantly refactored to remain compatible with older APIs like D3D11 and OpenGL but better handle new techniques in D3D12 and Vulkan. See the documentation for a more in-depth explanation of how things work now.
- This will affect usage of
PipeState
, any of the API-specific pipeline states such asD3D11PipeState
orVulkanPipeState
. If you were using thePipeState
helpers there will be a fairly direct translation, if you were doing manual examination of bindings then it may be more complex to adapt your scripts - generally speaking it's recommended to look and see if you can use the generic helpers as they will be more robust and stable as an interface. - Looking at changes to the test scripts may provide direction on how to adapt your scripts.
Features/Improvements
- UI: Add the ability to create and jump between bookmarks in the shader viewer, thanks to Louis de Carufel.
- D3D12 and Vulkan: You can now directly browse the contents of a given descriptor heap or descriptor set.
- D3D12 and Vulkan: Overlapping descriptor bindings will now properly indicate which binding was used to access which descriptor.
- D3D12: Added support for new DLL selection API
ID3D12DeviceFactory
and similar. - D3D12: SM6.6 direct heap accesses will now be displayed in the texture viewer.
- D3D12: Added new RenderDoc-specific DXIL disassembly.
- Vulkan: Added support for
VK_EXT_nested_command_buffer
. - Linux: Add counter handling for new Intel kernel driver.
Bugfixes
- UI: Prevent Shader Editor tooltip showing multiple "(F5)"
- UI: Fix a crash reading a custom formatted buffer with both SoA and AoS data where the SoA format is larger than the buffer itself.
- UI: Fix some cases where buffers used in indirect draws or dispatches were not properly listed in resource usage.
- UI: Fix treeview expanders not properly choosing a contrasting colour to the row background.
- Android: Add potential workaround for broken Android devices.
- Android: Prevent uses of external images where the format is unknown.
- D3D: Fix poor sorting of array members in DXBC debug info.
- D3D: Fix an obscure DXGI query that wouldn't return correctly wrapped interface.
- D3D11: Fix a case where output merger views could show stale data if unbound after being previously bound.
- D3D12: Fix a crash that could happen running pixel history on a typeless depth target.
- D3D12: Fix incorrect clamping of VB or IB sizes when displaying mesh preview.
- D3D12: Fix a crash if a root signature range specifies a subset of a single binding's registers.
- Vulkan: Fix some cases where DebugValue would not correctly map source variables to the right SSA value in SPIR-V debug info.
- Vulkan: Fix a crash when selecting draws in a non-zero subpass.
- Vulkan: Fix a bug fetching mesh output data if mesh and task shaders did not use the same entry point name (e.g. "main").
- Vulkan: Fix a case where on capture compatibility it incorrectly reported that the hardware was identical if only the driver is identical.
- OpenGL: Fix a bug where persistent mapped memory storage would get incorrect results detecting any changed data between first and second usage in a frame.
Version v1.32
Version v1.32
This version contains support for pixel history on D3D12, support for the slang shader language and tool, and other smaller improvements and bugfixes.
NOTE: Recent AMD drivers have a problem that for Vulkan and GL may cause problems creating swapchains. On UE5 this can cause fatal errors on or shortly after startup when using Vulkan, and this may also appear as the use of D3D12 in applications that don't use the API. This is an AMD driver issue which has been reported and is planned to be fixed on the AMD side.
As always binary builds with installers, zips and tarballs are available on renderdoc.org.
Main highlights
- Pixel history is now supported on D3D12, many thanks to the contributions by Steve Karolewics and Jovan Ristic.
Python API changes
ReplayController.DebugPixel
now takes a structureDebugPixelInputs
to determine parameters like sample or primitive, and now allows setting the desired multiview or layered rendering view as well.CaptureContext.ViewPixelHistory
takes a new parameterview
with the desired multiview or layered rendering view.
Features/Improvements
- All: Add the ability to right-click and rename a bookmark to give it a custom string name.
- All: Add the ability to right-click and copy from pipeline state stencil state, and the debug messages view.
- All: In the pixel history show depth value written even if no pixel shader is bound.
- All: The pixel history view will show range-scaled colour for integer targets as well as float/normalised targets.
- D3D12: Added support for pixel history.
- D3D12: Allow resource naming for queues and command buffers.
- Vulkan: Added support for the slang tool and shading language.
- Vulkan: Allow debugging specific pixel shader instance based on the multiview or layered rendering index.
- Vulkan: If multiple outputs are declared at the same location and have no names, use component in auto-generated name.
- Vulkan: Add support for extensions:
VK_KHR_calibrated_timestamps
VK_KHR_index_type_uint8
VK_KHR_line_rasterization
VK_KHR_load_store_op_none
VK_KHR_vertex_attribute_divisor
VK_EXT_texture_compression_astc_hdr
(was previously implemented but never reported)
- Android: Improve performance with high-instance count draws when selecting 'show all instances' in mesh viewer.
Bugfixes
- All: Fix the slice information in pipeline bindings tooltips not properly displaying for sub-sliced views.
- All: Fix a rare potential crash closing a capture.
- All: Fix some shader processing tool command lines not properly being replaced when using placeholder arguments.
- All: Fix a crash if the buffer formatter specifies a recursive struct definition (declaring a member of a struct that is of the struct type itself).
- Android: Fix a case where 32-bit incapable devices weren't properly detected when launching remote server.
- Linux: Fix multiple environment modifications when launching programs not properly stacking.
- OpenGL: Fix display and handling of texture views that target subsets of the mipchain of the original texture.
- Vulkan: Fix mesh output not properly accounting for dynamic vertex inputs.
- Vulkan: Fix a potential crash when loading captures with discarding resources.
- Vulkan: Fix spec-incompatible handling of unknown functions in
Get*ProcAddr
. - Vulkan: Fix an issue where incorrect buffer device addresses would be looked up.
- Vulkan: Fix misleading pixel history output when some output components are not written by a shader.
- Vulkan: Fix a case that could crash rebinding descriptor sets depending on pipeline compatibility and descriptor count.
- Vulkan: Fix inconsistent use of user allocation callbacks.
- Vulkan: Fix an error where dynamic state would not properly be restored if it were temporarily invalid with the bound pipeline.
- Vulkan: Fix edge case with
vkEnumeratePhysicalDeviceGroups
if user passes smaller-than-queried array to enumeration. - Vulkan: Fix a race condition if multiple BDA-capable buffers were created or destroyed simultaneously on different threads.
- Vulkan: Improve checking for OOM during mesh output fetch by checking against device-specific maximum memory allocation size before trying to allocate.
- Vulkan: Fix cases where pixel history would not properly decode integer data.
- D3D11: Fix a rare crash capturing with 3D textures reading past the end of mapped data.
- D3D11: Fix a crash when shader debugging if SampleBias is used with an unbound sampler.
- D3D12: Fix a case where the arguments buffer for an ExecuteIndirect would be read out of bounds.
- D3D12: Fix a deadlock if GPU readback is used for mapped memory but the queue being submitted on is blocked by a previous wait.
- D3D12: Strip some impossible-to-use flags from resources when recreating on replay.
- D3D12: Work around mixed support where new barriers can be unsupported but indirectly used by new creation functions.
- D3D12: Properly display depth-stencil target as unbound in pipeline state view if it was previously bound.
- D3D12: Fix quad overdraw overlay not working if current root signature disallows pixel shader access.
- D3D12: Fix a rare crash when binding descriptor tables that go out of bounds of the underlying heap.
Version v1.31
Version v1.31
This version contains some quality of life fixes and expanded SPIR-V debugging support, as well as a new mesh visualisation feature. There are also some important bugfixes for D3D11 and mesh shader usage, and a workaround for a recent nvidia driver bug.
NOTE: Recent AMD drivers have a problem that for Vulkan and GL may cause problems creating swapchains. On UE5 this can cause fatal errors on or shortly after startup when using Vulkan, and this may also appear as the use of D3D12 in applications that don't use the API. This is an AMD driver issue which has been reported and is planned to be fixed on the AMD side.
As always binary builds with installers, zips and tarballs are available on renderdoc.org.
Main highlights
-
The UI now has a configuration option to set consistent formatting of byte offset and size fields in the UI.
By default such fields are displayed as decimal numbers up to a threshold value and then larger values are displayed as hexadecimal, but with the configuration option it can be forced to be either always decimal numbers or always hexadecimal.
-
The SPIR-V debugger now supports debugging of shaders using the buffer device address extension.
Pointers in this fashion are displayed the same way as GPU pointers elsewhere in the UI, with a resource link that jumps to a buffer viewer with the given pointer type. -
Added a new 'mesh exploder' visualisation feature contributed by Dan Hawson which allows visualisation of mesh topology via a tweakable per-vertex offset. This can show poor or good vertex sharing by revealing vertices which share positions but are distinct.
Python API changes
SolidShade
enum has been renamed toVisualisation
, and similarly thesolidShadeMode
member ofMeshDisplay
is renamed tovisualisationMode
.
Features/Improvements
- UI: Messages suggesting enabling API validation for more error information now direct to
Open Capture with Options
to discourage permanently enabling validation. - UI: Only show byte range for a single subresource when viewing texture as buffer.
- UI: When switching between mesh shader draws and compute shader dispatches, preserve pipeline state flowchart.
- Vulkan: Fail instance creation if RenderDoc layer is explicitly enabled.
- Vulkan: Add support for 64-bit selectors to OpSwitch statements.
- Vulkan: When 'ref all resources' is enabled, ensure internal buffers aren't included.
- D3D11: Improve handling and checking for unsupported sparse textures.
- Android: Add workaround for broken Android devices that don't properly support layers in apks.
Bugfixes
- UI: Fix re-calculation of current 3D slice when moving up and down mip levels.
- UI: Fix a crash after a device lost when using mesh shaders.
- UI: Fix some tool buttons being unavailable in raw buffer viewer.
- UI: Fix incorrect error about invalid size when opening DDS files.
- UI: Fix incorrect tooltip on vulkan pipeline state shader save button.
- UI: Fix a case where the UI layout would corrupt itself if the event browser was closed when starting the program.
- Vulkan: Fix incorrect results when shader debugging non-float texture lookups.
- Vulkan: Fix depth/stencil discard patterns being incorrectly shown for aspects that are not discarded.
- Vulkan: Fix incorrect image layouts being tracked when multiple command buffers are submitted together.
- Vulkan: Fix a potential crash when using the triangle size overlay.
- Vulkan: Fix Depth overlay writing to pixels outside of drawcall for shaders exporting depth.
- Vulkan: Fix task payload readback on mesh shaders for array types.
- Vulkan: Fix an error fetching mesh output from mesh shaders if specialisation constants are used.
- Vulkan: Fix handling of mesh shader draws in pixel history.
- Vulkan: Don't generate invalid SPIR-V and potentially crash when patching shaders that contain debug information.
- Vulkan: Fix incorrect error debugging SPIR-V when writing to out of bounds Matrix element.
- Vulkan: Fix loading incorrect data when reading a row major matrix from a buffer.
- Vulkan: Fix wireframe overlay when drawcall modifies polygonMode dynamic state.
- Vulkan: Fix an invalid access when using mesh shaders with inline shader created in pipelines.
- Vulkan: SPIR-V debugger fix for OpBitcast from Vector to Scalar.
- Vulkan: When creating mesh shader output fetch pipelines, preserve required subgroup size.
- Vulkan: Fix a pixel history crash when using dynamic rendering and the target texture is bound as a storage image.
- Vulkan/D3D12: Fix incorrect indirect parameters being used for displaying mesh output data from mesh shaders.
- D3D: Fix mismatching shader interfaces if a semantic is used alone but with a non-zero index (i.e.
COLOR1
with noCOLOR0
). - D3D11: Fix crash in pipeline state viewer when displaying an empty binding after using the depth overlay and loading multiple captures.
- D3D11: Fix crash when discarding dynamic staging buffers.
- D3D12: Fix a potential crash showing whole-pass mesh output with mesh shaders.
- D3D12: Fix depth overlay writing to pixels outside of drawcall for shaders exporting depth.
- D3D12: Fix a crash when examining a mesh shader draw where an amplification shader is bound but its payload is unused.
Version v1.30
Version v1.30
This version contains support for mesh shaders on both Vulkan and D3D12. In addition there are a number of bugfixes including some crashes and a problem affecting recent NV drivers on UE5, as well as some other general improvements.
NOTE: Recent AMD drivers have a problem that for Vulkan and GL may cause problems creating swapchains. On UE5 this can cause fatal errors on or shortly after startup when using Vulkan, and this may also appear as the use of D3D12 in applications that don't use the API. This is an AMD driver issue which has been reported but it's unclear at this point if a workaround is possible.
As always binary builds with installers, zips and tarballs are available on renderdoc.org.
Main Highlights
Mesh shaders are supported with all existing features like pixel history, pipeline state, shader editing, shader printf on Vulkan, as would be expected.
The mesh viewer has been updated to display the relevant information. For task/amplification shaders it will display both the payload output and dispatched size from each threadgroup. Whether or not they are used, the final output from the mesh shader will be displayed for each meshlet that produced some outputs.
The 3D preview has also been updated to show a new solid shading mode which colourises different meshlets with different colours.
(screenshots courtesy of niagara)
It is also possible to filter all views down to either a single meshlet, or a single task and all meshlets produced.
Python API changes
- The
MeshDataStage.Unknown
enum value was removed.
Features/Improvements
- All: Extend depth test overlay to correctly report pass/fail with shader exported depth.
- UI: Improve tooltips for settings determining Android SDK/JDK.
- UI: Improve buffer formatter help and link properly to help documentation from UI.
- UI: Improve D3D12 line anti-aliasing on AMD.
- Vulkan: Add support for
VK_EXT_extended_dynamic_state3
extension. - Vulkan: Improve display of output parameters to strip unnecessary
gl_PerVertex
noise. - Android: Fade logo every 45 minutes to alleviate burn-in if server is left running long term.
- Android: Add handling of limited devices that only support 64-bit ARM and not also 32-bit ARM.
- D3D12 & Vulkan: Implement support for mesh shading. Interactions with multiview are not supported, and currently there is no mesh input visualisation option and shader debugging is disabled. NOTE: Currently there are known issues both with mesa radv and with dxc's SPIR-V output which are both being investigated.
Bugfixes
- UI: When loading a layout, close any existing windows which are not present in the new layout to avoid those windows becoming inaccessible or crashing.
- Vulkan: Fix incorrect flag being used when creating compiled versions of library pipelines.
- Vulkan: Fix render area not showing correctly when dynamic rendering is active.
- Vulkan: Work around a validation error when sampling counters during replay.
- Vulkan: Fixed current event action not always being displayed correctly when going from Texture Viewer
Stencil
overlay toNone
overlay. - Vulkan: Fix crash during replay of very large variable sized descriptor sets.
- Vulkan: Fix source level shader debugging not being available on Android.
- Vulkan: Fix rare error where garbage structs in pNext chain must be ignored.
- Vulkan: Fix error with overlay display when displayed texture is type-cast.
- Vulkan: Fix a crash if a descriptor update template references a layout unused elsewhere.
- Vulkan: Fix entry points incorrectly being returned from
VkG*PA
for future core versions not enabled. - Vulkan: Fix a potential crash with
VK_SWAPCHAIN_CREATE_DEFERRED_MEMORY_ALLOCATION_BIT_EXT
. - Vulkan: Fix a bug looking up matching bindings if vertex input bindings were specified out-of-order.
- D3D: Fix uint/int texture bindings being swapped in custom visualisation shaders.
- D3D: Disassemble inner coverage builtins in DXBC bytecode.
- D3D12: Fix a crash if mesh viewer is opened and closed many times.
- D3D12: Fix a crash when using new D3D12 barriers and ExecuteIndirect.
- D3D12: Fix failures when trying to slightly over-allocate on tier 3 descriptor heaps.
- D3D12: Fix crash when disassembling shaders that use embedded root signatures.
- D3D12: Fix potential crash with invalid out of bounds GPU addresses, while trying to preserve valid out of bounds GPU addresses.
- GL: Fixed incorrect replay (and potential driver crash) when using
glTexImage*
APIs and non-zeroUNPACK_ROW_LENGTH
. - GL: Workaround AMD driver behaviour that creates D3D12 device inside GL swapchains.
- GL: Don't treat unmaps of persistently mapped read-only buffers incorrectly as writes.
Version v1.29
Version v1.29
This release includes a number of bugfixes since v1.28, as well as improved handling of non-deterministic ExecuteIndirect calls on D3D12.
As always binary builds with installers, zips and tarballs are available on renderdoc.org.
An extra note for anyone with a fork or local changes to RenderDoc - the version of clang-format used upstream has been updated to 15.0. This may necessitate reformats of pending changes if you intend to upstream them.
Python API changes
ShaderProcessingTool.CompileShader
has a new parameterspirvVer
which can be specified to give the SPIR-V version to use when compiling. If left blank the existing default behaviour will be used. Shader reflection data with a SPIR-V version will have that listed under a new@spirver
compile flag.
Features/Improvements
- Refactored handling of ExecuteIndirect to more reliably replay the application's work even in the face of non-deterministic work. Executes with non-deterministic parameters will still not function properly anywhere that the draw parameters are referenced like the event browser, mesh viewer, etc. But selecting subsequent events in the command buffer will now replay the ExecuteIndirect faithfully.
- The pixel history events still show background colours in part when the row is selected.
- When editing SPIR-V shaders and recompiling them, wherever possible the same SPIR-V version will be used to recompile them. This is necessary when using features that target a minimum SPIR-V version.
Bugfixes
- All: Correctly load 3D textures with mipchains in image viewer.
- All: Fix memory overwrite when saving a single slice of a texture.
- All: Fixed error message which sometimes prevented valid DDS files from being opened.
- All: Prevent crash in capture connection windows during shutdown.
- All: Try to work around Android devices that take many seconds to enumerate installed programs to reduce the chance of a time out, and don't treat package names as local filenames if the timeout is hit.
- All: Don't allow shader debugging tooltip to show over the top of a context menu.
- All: Prevent a potential crash if corrupted data was received over a socket connection.
- All: Fix a potential crash on startup if file access failed to the config file.
- All: Fix pixel history 'debug pixel' text being incorrect when listing primitive ID.
- GL: Improve handling of uniform arrays of size one.
- GL: Fix thumbnail generation sometimes inverting middle two lines of the capture thumbnail image.
- GL: Changed resource preview tooltip to be multi-line instead of a single line.
- GL: Corrected layered depth buffer texture pipeline state tooltip from incorrectly displaying slices.
- GL: Try to prevent some crashes in cases where the GL driver fails to map a buffer.
- Vulkan: Fix SPIR-V shader debugger for specialisation constants using
OpLogicalNot
. - Vulkan: Allow override of GPU driver to select software drivers like llvmpipe.
- Vulkan: Fix SPIR-V parsing of
OpExecutionModeId
specifying compute threadgroup size. - Vulkan: Use up-to-date image layouts for processing pixel history, if images are transitioned immediately before use.
- Vulkan: Fix a case where pixel history would break if a small number of draws had a large amount of overdraw each.
- Vulkan: Work around an nvidia driver bug setting dynamic state in between binding identical static pipelines.
- Vulkan: Handle non-sparsely resident images correctly.
- Vulkan: Fix some indirect-count draws handling.
- D3D: Improve hlsl shader source debug stepping when the source shader contains empty filename directives i.e.
#line XXX ""
. - D3D: Be more robust in parsing DXBC containers with unexpected data.
- D3D11: Improve pixel history handling of discarded fragments.
- D3D11: Fix incorrect pipeline state tooltips for MSAA textures referencing mips that can't exist.
- D3D11: Prevent overlays from being rendered incorrectly and causing stale data when selecting different events.
- D3D11: Fix a problem where an application creating too many D3D11 state objects would not be able to release some and retry due to a cache not being cleared.
- D3D12: Avoid potential crash in nvidia driver when setting 0 UINTs as root constants.
- D3D12: Remove a spurious validation warning that could appear from internal RenderDoc use.
- D3D12: Fix an incorrect check when handling new version 2 depth-stencil pipeline chunks.
- D3D12: Make sure resource usage has the correct EID for trailing barriers in command buffers with no subsequent draws.
- D3D12: Fix serialisation of GPU addresses being based on buffers, when D3D12 doesn't require or bounds check against buffers for addresses but only uses underlying heaps.
- D3D12: Fix a potential problem with mapped CPU memory uploads not properly propagating before GPU work.
Version v1.28
Version v1.28
This release includes a number of bugfixes since v1.27, and includes a new capture option to aid capturing on Vulkan memory-constrained systems.
As always binary builds with installers, zips and tarballs are available on renderdoc.org.
Python API changes
renderdoc.ResultCode.ReplayOutOfMemory
andrenderdoc.ResultCode.ReplayDeviceLost
have been renamed torenderdoc.ResultCode.OutOfMemory
andrenderdoc.ResultCode.DeviceLost
.
Features/Improvements
- Improved capture writing process for larger captures especially on Vulkan & D3D12 to improve the time taken to write a capture to disk.
- Added a 'soft memory limit' capture option to reduce the chance of out-of-memory errors during capture, currently implemented only for Vulkan due to Linux and Android being platforms prone to OOM.
- Tweaked the display of checkboxes with RenderDoc's style to display with an X, for the sake of the low contrast dark theme where checkbox fills were not as clear as the normal light theme.
- Add support for
glCopyImageSubData
on GLES copying from uncompressed to compressed textures. - Add support for several vulkan extensions:
VK_EXT_provoking_vertex
VK_EXT_attachment_feedback_loop_dynamic_state
VK_EXT_image_2d_view_of_3d
Bugfixes
- All: Fix potential crash reading configuration file.
- All: Add better protection against invalid DDS file headers.
- All: Refuse to open EXR files that are too large (larger than maximum texture dimensions of 16384x16384).
- All: When opening a file type that is entirely unrecognised, report it as that instead of assuming it is a corrupted capture file.
- All: Fix generation of buffer format strings for R11G11B10 textures viewed as buffers.
- Linux: Fix a potential crash & failure of pipeline thumbnails when built against newer Qt versions.
- Android: Work around driver crash in emulation of
glGetTexImage
. - D3D12: Prevent use of new barriers on older beta SDKs with crashes.
- D3D12: Fix highlighted vertex/triangle not being properly perspective corrected in the mesh viewer.
- D3D12: Avoid crash when drawing Texture viewer overlay for an unbound resource.
- D3D12: Fix incorrect parameter display in ExecuteIndirect calls.
- D3D12: Avoid crash when indexed draw is called with no index buffer.
- D3D12: Fix a crash fetching bindless feedback for shaders with only SM6.6 resource accesses.
- D3D12: Fix a potential crash when
Set*Root32BitConstants
is called with 0 constants. - D3D12: Fix a potential device lost when resetting new barrier layouts.
- D3D12: Fix root signature elements with registers being displayed without a corresponding shader binding.
- Vulkan: Fix a crash when going through fallback path in bindless feedback with no BDA support.
- Vulkan: Fix detection of rendering to mip levels in pixel history.
- Vulkan: Fix shader debugging handling of arrays of textures.
- Vulkan: Fix size calculation for non-32-bit values at the end of constant buffers.
- Vulkan: Fix buffer formatting and shader disassembly of arrays of pointers.
- Vulkan: Fix a potential crash when fetching mesh output data if primitive restart is used.
- GL: Fix programs that recreate textures mid-frame.
- GL: Fix pixel history handling of multidraw draws.
- GL: Mute/hide any errors generated in DX interop functions.
- GL: Handle HALF_FLOAT typed values in
glClear*
. - GL: Treat BGRA8 textures imported from DX as RGBA8 since GL doesn't support BGRA8.
- GL: Fix pixel history having incorrect depth test results reported for multiple overlapping fragments.
- GLES: Fix pixel history reporting test failures incorrectly.
Version v1.27
Version v1.27
This release includes a number of bugfixes since v1.26, as well as support for the latest D3D12 SDK 1.610.1.
As always binary builds with installers, zips and tarballs are available on renderdoc.org.
Python API changes
D3D12Sampler.borderColor
has been split intoD3D12Sampler.borderColorType
andD3D12Sampler.borderColorValue
, and similarly forVKSampler.borderColor
intoVKSampler.borderColorType
andVKSampler.borderColorValue
, to allow for integer border colour types.D3D12RasterizerState.multisampleEnable
andD3D12RasterizerState.lineRasterMode
have been removed and replaced withD3D12RasterizerState.lineRasterMode
of typeLineRaster
.
Features/Improvements
- D3D12: Add support for new SDK 1.610.1:
- New state functionality
- New sampler creation parameters and PSO chunks
- New barrier API
- All: Show explicit dropdown arrow for tool buttons with menus.
- All: Report Windows 11 separately in analytics.
- Vulkan & D3D12: Optimisations to capture time overhead and GPU Syncs.
- D3D11: Disable query for undocumented internal D3D interface in composition API.
Bugfixes
- All: Fix potential crash when reading large amounts of data from sockets.
- All: Fix potential crash when serialising strings if length is corrupted.
- All: Fix potential crashes/fatal errors rendering 0x0 thumbnails.
- All: Remove fatal errors in XML codec and have error handling for corrupted XML.
- All: Sanitise strings printed when received from target control/remote server.
- All: Save any capture changes (renames/bookmarks) to local file when remotely replaying.
- UI: Fix potential race when destroying windows while command is in flight
- Linux: Don't open symlinks when opening logfile.
- Linux: Try to handle processes on linux that fork without exec.
- Linux: Work around bash overriding getenv/setenv with custom implementation.
- Android: Make timeouts waiting for process to start just depressingly high.
- Android: Speculative fix for Android thread race condition.
- Windows: Ignore
windows.storage.dll
which spams a huge number of LoadLibrary calls. - D3D: Fix shader debugging using wrong operand to look up resources in some gather4 opcodes.
- D3D11: Fix handling of RestoreDeferredContextState during capture if state isn't restored.
- D3D12: Add fatal error handling if a map fails during replay.
- D3D12: Add GPU syncs between potential moves of work across different queues.
- D3D12: Fix a bug with incorrect forward reference detection in DXIL.
- D3D12: Fix a discrepancy in DXIL disassembly from dxc.
- D3D12: Fix crash when D3D12 descriptor table is bound off the end of a heap.
- D3D12: Handle some unusually formatted DXIL shaders with missing implicit pointer types.
- OpenGL: Add workaround for Intel bug in pixel history.
- OpenGL: Don't show stencil for non-final fragments.
- OpenGL: Fix pixel history being affected by pixel pack/unpack state.
- OpenGL: Fix pixel history not using full precision depth.
- OpenGL: Fix pixel history on framebuffers that don't have stencil.
- OpenGL: Fix reporting of 10:10:10:2 resource formats.
- OpenGL: Fix some GL pixel history cases where not all events would be replayed correctly.
- OpenGL: Fix state tracking issues in GL pixel history.
- OpenGL: Handle drawbuffers when they aren't simple direct 1:1 with attachments
- OpenGL: Work around nvidia bug with failing GLX query.
- GLES: Fix requiring some proper GL GLSL extensions on GLES for blit shader.
- GLES: Fix use of proper GL function that's not available on GLES.
- GLES: Remove reset notification EGL context attribute preventing context sharing.
- Vulkan: Add fallback for shader feedback on Intel GPUs without int64 support.
- Vulkan: Disable buggy vulkan layers.
- Vulkan: Don't include discard in resource usage until end of renderpass.
- Vulkan: Fix a bug causing present fence extension to crash.
- Vulkan: Fix a missing flush for mapped non-coherent memory.
- Vulkan: Fix a potential GPU timeout on draws with huge number of instances with GS.
- Vulkan: Fix an incorrect use of GetInstanceProcAddr when initialising vkCreateDevice.
- Vulkan: Fix crashes for input structures with builtins.
- Vulkan: Fix depth results for fragments in pixel history.
- Vulkan: Fix detection of scalar packing from only matrix layout.
- Vulkan: Fix pixel history on framebuffers that don't have stencil.
- Vulkan: Fix separate stencil operations being applied properly with dynamic rendering.
- Vulkan: Fix uint/int bindings being broken in custom shader templates.
- Vulkan: Manually check and report depth bounds test in vulkan pixel history.
- Vulkan: Work around further broken Intel occlusion queries in pixel history.