Skip to content

Version v1.14

Choose a tag to compare
@baldurk baldurk released this 28 May 16:13
· 2437 commits to v1.x since this release

Version v1.14

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 with zip and installer for Windows and binary tarball for linux.

Main Highlights

  • 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.

    Shader messages visible in event browser

    Shader messages from pixel shader

    Debugging the shader itself

    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.
    A texture preview being shown on hover
    The texture's usage in a context menu

    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.

Python API changes

  • 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.


  • UI: The constant buffer previewer can now apply custom formats to most non-buffer-backed constants, such as push constants on vulkan, and root values on D3D12. This is not possible for bare GL uniforms.
  • UI: OpenGL programs running unsupported legacy GL are no longer shown as captureable in the connection window.
  • UI: Pre-populate selected text in shader find dialog when pressing ctrl-f.
  • UI: Add support for #include directives referencing files on disk in custom shaders.
  • UI: Process injection is no longer available by default, as too many new users were getting confused and using it instead of launching their process through RenderDoc, which often broke. Since it is almost never the right method, it is now disabled by default and can be enabled in the settings the same way as global hooking.
  • D3D12: Add support for new D3D12 runtime. The D3D12Core.dll is copied into the .rdc file at capture time, and limited function hooking is used on replay to allow the D3D12 loader to load from a dynamic temporary file.
  • D3D12: Also force ref-all-resources for new SM6.6 bindless root signatures. Note that no bindings will be visible in the pipeline state viewer.
  • Vulkan: Refactored mesh output fetch to use buffer device addresses when available, to avoid any need to patch descriptor sets. This allows the mesh output to work on low-end drivers where update-after-bind descriptor sets are more flexible than normal descriptor sets, preventing any descriptor set patching.


  • UI: Thumbnails for empty-but-used textures are displayed instead of being hidden in the texture viewer.
  • UI: Fix bad painting of hover-highlight on pipeline state resource lists.
  • UI: Apply global font scale to fixed width fonts as well as normal fonts.
  • UI: Fix line number column in shader viewer being wrongly scaled when font scaling is in use.
  • UI: Fix a rare crash when dragging and docking windows.
  • UI: Fix the sorting of texture columns in texture list.
  • UI: Clamp vertex output data to sensible out-of-bounds behaviour to avoid crashes on extremely large draws.
  • UI: Fix crash on 32-bit index buffers that are less than 4 bytes in size.
  • UI: Fix background color selection button getting out of sync.
  • UI: Fix sorting in the GL pipeline state viewer that lead to read/write image and SSBO bindings being displayed wrongly.
  • UI: Fix a crash when the copy keyboard shortcut is invoked on a table with no selection.
  • All: Fix padding of non-block-aligned compressed textures when writing to DDS.
  • Vulkan: Fix cases where shaders with multiple entry points with the same name are incorrectly aliased in SPIR-V.
  • Vulkan: Fix dynamic offsets not being properly recorded if the same descriptor set is bound twice with two different dynamic offsets.
  • Vulkan: Patch imageless framebuffer pre-declared image usage to match patched image usage.
  • Vulkan: Fix behaviour of descriptor update rollover between descriptors when slots are sparse.
  • Vulkan: Fix pixel history to work with imageless framebuffers.
  • Vulkan: Fix reporting of depth test failures with no depth attachment.
  • Vulkan: Fix mistaken incompatibility reported when loading captures with sparse textures.
  • Vulkan: Fix shader debugging with input attachments.
  • Vulkan: Fix spec ambiguity around binding non-sparse-block aligned subresources.
  • Vulkan: Fix a crash if VK_WHOLE_SIZE is used to flush mapped memory that is also used for GPU-visible tiled resources.
  • Vulkan: Fix discard patterns where renderpass discards content and also transitions to presentable layout.
  • Vulkan: Fix a case where masked writes to mapped GPU-local memory regions could overrun bounds.
  • Vulkan: Fix incorrect readback of indirect command parameters inside renderpass2 RPs.
  • Vulkan: Fix crash with triangle size (pass) overlay and multiple subpasses.
  • Vulkan: Fix handling of SPIR-V 1.4+ modules that require all accessed global variables to be listed in entry point interface.
  • Vulkan: Fix conversion of vertex input attributes that don't match in size (e.g. short to full uint) in shader debugging.
  • Vulkan: Fix a crash when running pixel history on a texel modified by a secondary command buffer executed outside of a renderpass.
  • OpenGL: Ignore Location decorations in SPIR-V shaders where they shouldn't be present.
  • OpenGL: Handle calling 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.
  • OpenGL: Don't leak readback texture if renderbuffers are re-initialised.
  • OpenGL: Calculate texture byte size as 4GB to avoid overflow for extremely large textures.
  • OpenGL: Fix texture data readback from renderbuffers.
  • D3D12: Fix a crash when AGS CreateDevice() extension is called.
  • D3D12: Fix AMD vendor UAV not being correctly identified with SM6.x shaders.
  • D3D12: Fix a crash when accessing internal descriptors patched onto the end of a heap when root signature range is unbounded.
  • D3D12: Fix a crash with the quad overdraw overlay when the depth texture is multisampled and typeless.
  • D3D12: Fix a crash if a command allocator is deleted before capture the completes.
  • D3D12: Fix an issue where dxc would break compilation unless a precisely matching dxil.dll was used. This could happen if the dxc found was in the vulkan SDK which doesn't ship with dxil.dll.
  • D3D12: Fix a crash when applying discard patterns to UINT multisampled textures.
  • D3D12: Fix a crash when using a (Pass) overlay with API events selected.