RenderDoc is a stand-alone graphics debugging tool.
This release contains some support for a few new vulkan extensions as well as bug fixes.
As always binary releases are available on renderdoc.org with zip and installer for Windows and binary tarball for linux.
KnownShaderTool
has moved from the qrenderdoc
module to the renderdoc
module.CaptureContext.EditShader
takes an additional parameter KnownShaderTool knownTool
which indicates the tool that should be preferred for compilation by default, if known.PipeState.IsStripRestartEnabled
and PipeState.GetStripRestartIndex
have been renamed to IsRestartEnabled
and GetRestartIndex
and the SupportsRestart
helper has been removed, since primitive restart is supported on non-strip topologies on many APIs and will now be reported through it being enabled or not.ShaderDebugState
no longer contains a list of sourceVars
, this is now available as a per-instruction list in the instInfo
which is renamed from lineInfo
in the ShaderDebugTrace
. Similarly LineColumnInfo
has been renamed to InstructionSourceInfo
.VK_EXT_attachment_feedback_loop_layout
VK_EXT_primitive_topology_list_restart
VK_EXT_primitives_generated_query
VK_EXT_depth_clip_control
VK_EXT_multisampled_render_to_single_sampled
[[row_major]]
for non-matrix formats.vkQueueSubmit2
events being displayed when no command buffers are submitted.OpAccessChain
only dereferenced a global binding array.This release is primarily maintenance and bug fixing, as well as some small quality of life improvements.
As always binary releases are available on renderdoc.org with zip and installer for Windows and binary tarball for linux.
struct_var . member
) for showing variable tooltips.OpSource
is encountered with no source, only a language (and/or filename).DrawAuto
implementation.In this release the main improvement is a refresh and update to the buffer viewer, particularly in how it handles fixed (SoA) and repeating (AoS) data and improvements to how you specify custom formats of buffer data. In addition there are a number of bugfixes including some crashes using VK_KHR_dynamic_rendering.
As always binary releases are available on renderdoc.org with zip and installer for Windows and binary tarball for linux.
Views of buffers, either storage/raw buffers or constant buffers, have been refactored and improved.
Fixed variables now display their offsets within the buffer range and (optionally) padding:
Vulkan and OpenGL buffers which contain some fixed data before a trailing repeating array of structs (AoS) can now both be displayed at once:
Packing rules can be specified to significantly reduce or eliminate the need for manual or automatic 'padding' declarations:
Constant buffers now generate a complete automatic format:
The format specifier now supports binary interpretation, enums, and bitfields, for better display of data:
These formats can also be saved and loaded to presets, and these persist globally across all captures. For more information see the documentation on configuring these formats.
Most complex error messages (particularly those that reference some error replaying or problem with the API like a fatal error) now contain better explanations of what problem has happened.
renderdoc.ReplayStatus
enumeration has renamed to renderdoc.ResultCode
. The enum value names are the same as before.renderdoc.ReplayStatus
previously now return renderdoc.ResultDetails
. This contains both the result code and a string with any further information, but it can be directly compared to a result code enumeration for backwards compatibility.renderdoc.ExecuteResult
no longer has a member status
of type renderdoc.ReplayStatus
, it now has result
of type renderdoc.ResultDetails
. Functions that used to return a Tuple[ReplayStatus, ...]
now return Tuple[ResultDetails, ...]
.bool
success or failure, now also return a renderdoc.ResultDetails
.
renderdoc.ReplayOutput.AddThumbnail
renderdoc.ReplayOutput.SetPixelContext
renderdoc.ReplayController.SaveTexture
renderdoc.CaptureAccess.WriteSection
renderdoc.CaptureAccess.InitResolver
renderdoc.CaptureFile.CopyFileTo
renderdoc.RemoteServer.Ping
renderdoc.StartGlobalHook
renderdoc.CaptureFile.ErrorString
has been removed as it is no longer necessary - any functions with errors will return the error string in the renderdoc.ResultDetails
.qrenderdoc.ExtensionManager.LoadExtension
returns a string with any errors, or an empty string for success, instead of a bool
.renderdoc.VarType.Struct
type which will be reported for structs whether or not they have any members.renderdoc.ShaderVariable.displayAsHex
, renderdoc.ShaderVariable.rowMajor
, renderdoc.ShaderVariable.isStruct
, have been combined into renderdoc.ShaderVariable.flags
.renderdoc.ShaderConstantDescriptor
has been removed, and its members inlined into renderdoc.ShaderConstantType
, with the exception of the flag members as above renderdoc.ShaderConstantDescriptor.displayAsHex
, renderdoc.ShaderConstantDescriptor.displayAsRGB
, renderdoc.ShaderConstantDescriptor.rowMajorStorage
, which have been combined into renderdoc.ShaderConstantType.flags
. renderdoc.ShaderConstantDescriptor.type
has been renamed to renderdoc.ShaderConstantType.baseType
.renderdoc.VKPipeline.pipelineLayoutResourceId
has been removed to support VK_EXT_graphics_pipeline_library
. In its place are renderdoc.VKPipeline.pipelineComputeLayoutResourceId
, renderdoc.VKPipeline.pipelinePreRastLayoutResourceId
, and renderdoc.VKPipeline.pipelineFragmentLayoutResourceId
. In cases not using the extension these values may be identical.qrenderdoc.PersistantConfig.BufferFormatter_ShowHelp
has been removed.qrenderdoc.IConstantBufferPreviewer
has been removed. qrenderdoc.CaptureContext.ViewConstantBuffer
now returns a qrenderdoc.IBufferViewer
.VK_KHR_pipeline_library
VK_EXT_graphics_pipeline_library
VK_QCOM_render_pass_store_ops
VK_GOOGLE_surfaceless_query
vkCmdSetEvent2
that could crash for image & memory barriers.This release has a few new quality of life features as well as a number of bug reports following up from release v1.18.
Binary releases are available on renderdoc.org with zip and installer for Windows and binary tarball for linux.
Custom visualisation shaders have been refactored to be more portable and re-usable between APIs. Existing custom shaders will continue to work without modification, however it's recommended that you consult the documentation and/or new custom shader templates, to see how macros are now used to abstract around different binding models. This means a newly written HLSL custom shader should work both for D3D11/D3D12 as well as HLSL on Vulkan without modification.
The location breadcrumbs in the event browser now has an edit button to edit the 'path' as a text string. This can also be copy-pasted like a URL to jump to a known location in a new capture, or share a location with someone else making captures without needing to share a capture containing bookmarks.
GL programs that use unsupported functions will now be explicitly disabled from capture. This also applies to unsupported extensions, as it seems to be common among GL programs to not correctly check for which extensions are supported when running.
This only applies to if these functions are called at all. If they are queried but never called, this restriction will not apply.
renderdoc.BecomeRemoteServer
now accepts a port parameter, which can be set to 0 to listen on the default port.hostname:12345
, which allows multiple independent replays on a single host.LaunchReplayUI
is called from the in-application API, the UI process will no longer inherit handles from the captured process.vkQueuePresentKHR
bufferDeviceAddressCaptureReplay
.VkCommandBufferInheritanceRenderingInfo::flags
being incorrectly serialised.KHR_dynamic_rendering
inheritance into secondary command buffers.VK_EXT_vertex_input_dynamic_state
not being propagated properly.wglMakeContextCurrentARB
This release only has a small number of changes, and primarily adds support for the just-released Vulkan 1.3 including full support for everything in the Roadmap 2022 profile.
Please note: Upon installing a Vulkan 1.3 driver and creating a 1.3 Vulkan instance older versions of RenderDoc will be disabled automatically by the Vulkan loader, to prevent incompatibility problems. This release or newer will be required to debug Vulkan 1.3 applications, applications initialising Vulkan 1.2 or older can still be debugged by older versions of RenderDoc.
Binary releases are available on renderdoc.org with zip and installer for Windows and binary tarball for linux.
Full support for Vulkan 1.3 as well as the Roadmap 2022 profile including the new VK_KHR_global_priority promoted extension.
The primary font used in the UI can now be customised, as well as the secondary monospaced font.
ShowReplayUI
which acts similarly to LaunchReplayUI
but instead it will try to re-use an existing UI provided an active connection is currently open between an instance of the UI and the application. Together with IsTargetControlConnected
this can be used for repeated captures to open the UI if needed, but not open multiple copies.VK_EXT_4444_formats
VK_EXT_texture_compression_astc_hdr
VK_KHR_global_priority
IGNORED
queue families.VK_PIPELINE_CREATE_FAIL_ON_PIPELINE_COMPILE_REQUIRED_BIT_EXT
and the compile was skipped at capture time due to a duplicate PSO.KHR_buffer_device_address
is available.KHR_buffer_device_address
buffer is bound to memory.KHR_synchronization2
queue submissions with semaphore waits.KHR_buffer_device_address
buffer addresses before memory binds when using vkBindBufferMemory2
.NULL
device handle into IDXGIOutput::FindClosestMatchingMode
.glBindProgramPipeline
with a pipeline of 0, which could cause application-visible errors in glGetError
.This is RenderDoc's last release of the year and focusses mostly on some quality of life improvements and expanded Vulkan extension support.
Binary releases are available on renderdoc.org with zip and installer for Windows and binary tarball for linux.
Support for the new Vulkan extension VK_KHR_dynamic_rendering which allows dynamic renderpasses to be recorded at command record time across command buffers without needing to create renderpass or framebuffer objects up-front.
The resource inspector has some sorting options now - you can sort by alphabetical (the previous default), creation order (in terms of their original creation in the application), or by recently viewed. When sorted by recently viewed, the resources at the top are the most recently viewed in the resource inspector itself and will be resorted as resources are viewed.
Compute shader debugging can now be launched either by split workgroup & thread ID, or by global thread ID.
The mesh viewer now allows you to select the axis convention of input vertex data for e.g. Z-up instead of Y-up or left/right-handed.
ReplayController.GetCBufferVariableContents
now takes a ShaderStage
parameter after the pipeline and shader, to allow disambiguation on APIs like vulkan where a single shader object can have multiple shader stages with the same entry point name.D3D12RootSignatureRange.rootElement
has been renamed to D3D12RootSignatureRange.rootSignatureIndex
to make it more clear that this refers to the original element and to distinguish from the split-by-range elements in the pipeline state.ExecuteIndirect
is called on a compute only command buffer.This release is primarily a follow-up to v1.15, with the bindless feedback expanded now to support DXIL SM6.x shaders via shader patching.
One thing to note, the event browser refactor added in v1.15 had an unfortunate bug. If RenderDoc hadn't previously been used on a system and v1.15 was the first install, such that there was no configuration settings saved, the event browser would not start up with the default $action()
filter to mimic the filtering from previous versions, and wouldn't have any sample filters added. v1.16 and forwards will now address this only if no filters have been configured, such that users who have started to use the filters won't see any changes but those who didn't use any filters will have the bug fixed and will see the same thing as someone who updated from before v1.15.
Binary releases are available on renderdoc.org with zip and installer for Windows and binary tarball for linux.
The bindless feedback for D3D12 which was added in v1.15 now supports DXIL SM6.x shaders, via DXIL patching. This does not require the presence of dxcompiler.dll
or dxil.dll
from DXC on the system as the patching and hashing is all done within RenderDoc's code.
Note this does not yet support the new SM6.6 heap-indexed binding access, this only applies to arrayed descriptor binding access.
The API backends have been hardened to handle the majority of cases where an API fatal error happens during replay while analysing a capture - device lost/TDR, out of GPU memory, or when using remote-replay if the remote server crashes or disconnects.
When this happens the backend is unloaded and a null backend is loaded in its place, so the UI will continue to function but most panels will be non-functional - pipeline state will be empty, resource contents will not be displayed and any texture/buffer views will be empty. The capture can still be saved (unless the remote server has been disconnected) and a prompt will be given to report a potential bug. Note that on some APIs and GPU drivers, the process may be considered 'corrupt' and unable to load further captures.
Since these bugs aren't a traditional CPU crash, any bug reported from this is required to include the capture as otherwise it's not useful. If you don't want to share the capture you can still email me directly. If the crash was caused by a remote server disconnecting and the capture isn't saved locally, the bug can't be reported until that happens.
Note that a fatal error like this during capture is not handled and in the vast majority of cases cannot be captured.
ExecuteIndirect
.ExecuteIndirect()
calls with few actually executed commands.glVertexAttribPointer
is used to specify an integer formatted component and the shader reads an input. This is invalid, but most drivers cast int -> float, then the float bits are read as int (e.g. 0x3f800000
) so we emulate that.$action()
filter.com.android
activities which show up in some packages.vkCmdClearAttachments
.vkCmdSetScissorWithCountEXT
in the event browser including internal serialised data.vkFlushMappedMemoryRanges
are trusted to annotate all writes even to coherent memory, to prevent the need to check for changes. Now applications will be accurately captured even if calls to that functions on coherent memory are badly placed.ByteAddressBuffer
s in the pipeline state viewer based on the shader binding, not the flag on descriptors which may not be present.glDispatchCompute
in the event browser including internal serialised data.glVertexArrayVertexBuffers
with NULL buffer array.This release comes with a significant revamp to the event browser, to make it easier to customise the view of which events are displayed and how, as well as to format them for display. As part of this RenderDoc now uses the term 'action' to refer to what was loosely called a drawcall before - anything on the GPU timeline that visibly changes resource contents, such as draws and dispatches but also clears, copies, resolves, etc.
There are also improvements to how bindless resources are displayed on D3D12 when using SM5.1 DXBC shaders. Your shaders are now patched to annotate resource usage at runtime and this data is used to determine which resources to show - only those actually referenced by the given action. This significantly reduces the number of resources shown and makes it easier to find what is relevant. This feature is planned to come to SM6.0 DXIL shaders, but that will be in a future release given how difficult DXIL is to work with.
Binary releases are available on renderdoc.org with zip and installer for Windows and binary tarball for linux.
The Event Browser has been significantly refactored. By default the display is almost identical to what it was before, with the exception that 'API Calls' placeholder entries are no longer visible and any marker regions only containing state setting or other non-action events will be invisible. The new functionality means these are no longer necessary.
The events visible by default shows only actions (the new term used for drawcalls), the same as previous versions, with a default filter of $action()
. However the filter is now customisable and acts as a simple search query type filter. For example if you wanted to see Barriers in addition to normal actions you could add a Barrier
term:
Or if you wanted to hide copies and clears you could remove those with -Copy -Clear
:
Filters can also have functions that query on properties of actions, for example showing draws with more than 10,000 vertices/indices:
The filter can be modified to include or exclude whichever events you wish, and a blank filter allows viewing all API calls in sequence with no omissions, including state setting:
The filters can be customised and saved, and an interactive configuration panel can be used to interactively build filters and see the documentation on the fly:
For more information on how to use filters see the documentation on filtering events.
In addition to filtering which events are shown, the configuration panel shown above also allows you to show parameter names as well as values, show all parameters to function calls, or disable 'custom formatted' action names such as renderpass begin or end which shows the load and store ops. By default only the most relevant parameters are shown.
The new Event Browser includes a simple 'breadcrumbs' display showing where in the marker hierarchy the current event is. Each node has a dropdown that can select sibling markers at the same level:
Bindless feedback is available on D3D12 for DXBC shaders (SM5.1). This feature has existed for a while on Vulkan but is now implemented on D3D12. Note that because patching shaders on D3D12 is inherently unreliable, please report any issues you find either with resources being wrongly excluded or included.
Before:
After:
drawcall
→ action
to be consistent with the new terminology:
DrawcallDescription
→ ActionDescription
- see below for some notes.DrawFlags
→ ActionFlags
.DrawFlags.APICalls
was removed as API calls actions no longer exist.CaptureOptions.captureCallstacksOnlyDraws
→ CaptureOptions.captureCallstacksOnlyActions
EventBrowser_HideEmpty
and EventBrowser_HideAPICalls
members of qrenderdoc.PersistentConfig
have been removed as these settings are no longer relevant.CaptureContext
have been renamed as above:
CaptureContext.CurSelectedDrawcall
→ CaptureContext.CurSelectedAction
CaptureContext.CurDrawcall
→ CaptureContext.CurAction
CaptureContext.GetFirstDrawcall
→ CaptureContext.GetFirstAction
CaptureContext.GetLastDrawcall
→ CaptureContext.GetLastAction
CaptureContext.CurDrawcalls
→ CaptureContext.CurRootActions
CaptureContext.GetDrawcall
→ CaptureContext.GetAction
As above, these return renderdoc.ActionDescription
renamed from renderdoc.DrawcallDescription
.In particular note that for the new ActionDescription
struct the per-action name
member has been removed. There is a customName
member but for most actions this will be empty. The name for an action can be determined by looking up its chunk in the structured data, as given by the last API event in its list of events.
The name for the action is the name of the chunk, and optionally you can format the parameters. A new helper method exists GetName
to format the action name without parameters, and it takes the structured file as a parameter. This will generate a name like DrawIndexed()
and not DrawIndexed(123, 45)
. You may want to only include parameters that are marked with SDTypeFlags.Important
, which is a hint to which parameters are most relevant to a user.
debugPrintfEXT
in glsl syntax highlighting.glClear
is always listed as an action even if colour isn't cleared.D3D12Core.dll
embedded in captures.param@5
was incorrectly interpreted as a reference to EID 5.KHR_buffer_device_address
on Qualcomm as it causes crashes.KHR_buffer_device_address
on Intel on non-latest drivers.NULL
vertex buffers are bound using VK_EXT_robustness2
.0xFFFFFFFF
is used as a component in OpVectorShuffle
.fork
and exec
.This release includes UI support for Vulkan's shader printf, which can be used for wide debugging across a whole set of shader invocations as well as for highlighting particular problems with unexpected paths or results by printing a message with data.
Also in this release is support for the new D3D12 runtime which can be shipped with applications - upon capture the relevant runtime DLLs are bundled into the capture and written to a temporary file to be selected at replay time.
Binary releases are available on renderdoc.org with zip and installer for Windows and binary tarball for linux.
RenderDoc can now display print statements from shaders in Vulkan. Since this feature requires API support it's not supported elsewhere, but if it is added there it will function in the same way.
When a drawcall is selected any printf statements are evaluated and the event browser & pipeline state show how many messages have been made. Clicking these opens a window to display the messages themselves, and from there the particular shader invocation can be debugged.
These print statements do not need to be in the original shaders, they can be edited in at runtime while analysing a capture using the normal shader edit system. However NOTE: At the time of writing dxc has some known crash bugs with printf statements, and spirv-tools has a recently fixed bug that broke printf statements with parameters. Ensure you're using an up to date compiler if you have any problems.
For more information, see the documentation on this new panel.
The pipeline state view will now show thumbnail previews of textures on hover to help quickly identify which texture is bound to a given slot, which can be particularly useful if reflection information has not been included. In addition right clicking on any resource binding in the pipeline state viewer will show the resource usage context menu which allows you to switch to any other event that has been tracked to use the resource.
This feature is not available when the replay is running remotely such as on an Android device, to avoid costly image transfers by accident when moving the mouse over many bindings.
VKSpecializationConstant
has been removed. Specialization constants are now available by reading the bytes out of VKShader.specializationData
with the offset given by the relevant byteOffset in the shader constant. Note this date is unrelated to the actual bytes passed to the pipeline create, it is a 'virtual' buffer where the bytes of specialisation constants (whether default or specialised) are available at the offset based on their ID.ShaderViewer.ToggleBreakpoint
has been renamed to ShaderViewer.ToggleBreakpointOnInstruction
. There's a new function ShaderViewer.ToggleBreakpointOnDisassemblyLine
.CaptureContext.RegisterReplacement
now takes arguments for both old (replaced) and new (replacement) resource IDs, rather than just the replaced.#include
directives referencing files on disk in custom shaders.Location
decorations in SPIR-V shaders where they shouldn't be present.glRenderBufferMultisampledStorage
with a sample count of 0 to create a non-multisampled renderbuffer, as well as cases where the real number of samples was different from the number requested.This is primarily a maintenance release, fixing a number of bugs. This release also adds support for sparse resources on both Vulkan and D3D12. These features are now reported as supported when queried for and should function correctly. Note that it's expected that sparse uses are primarily used for defragmentation and manual virtual memory management, not for "megatexture" like uses where significant amounts of the texture are unmapped. The cost for capturing will be proportional to the total size of the texture whether mapped or not.
Binary releases are available on renderdoc.org with zip and installer for Windows and binary tarball for linux.
topology
and index byte width indexByteWidth
are no longer stored per-drawcall in DrawcallDescription
. These now come from the pipeline state consistently, even on GL where these parameters are specified per-draw in the API.callstack
member in APIEvent
. The callstack is available by looking up the structured chunk via chunkIndex
and examining the chunk's metadata.VK_KHR_zero_initialize_workgroup_memory
VK_KHR_workgroup_memory_explicit_layout
(not currently supported in shader debugging)VK_KHR_synchronization2
IDXGISwapchain::GetBuffer
as long as it's compatible with the D3D11/D3D12 resource interface.EXT_robustness2
in push descriptors.