@baldurk baldurk released this Dec 2, 2016

Assets 2

Time for another RenderDoc release! This time coming with support for D3D12.

With the survey a few months ago it was very clear that a lot of people were looking for D3D12 support, and the back-end in RenderDoc is now ready for prime-time. I've tested it on every D3D12 program I can lay hands on, so if you run into any issues then do file a bug about it.

Version v0.32

Binaries for this release are up on the downloads page for Windows and x64 linux as a binary tarball.

The D3D12 support comes with a few provisos - it currently doesn't support multiple GPUs (i.e. NodeMask must be 0 everywhere), and it doesn't support tiled/reserved resources. This functionality will be filled in in the future, but given the high complexity to relatively low usage, it's prioritised appropriately.

Likewise shader debugging and pixel history is currently not yet implemented for D3D12, but all other RenderDoc features should be working. Again file a bug with anything that seems broken!

Aside from D3D12 there are a bunch of bugfixes and a few cool new features like a triangle size overlay which you can use to diagnose missing LODs or other super dense meshes.

Looking ahead to future versions, there's a refactored serialisation system coming in the pipeline which will enable a bunch of really cool new features. The downside is that it will break capture backwards compatibility. I'll give more details in future, but it's possible that v0.33 may be the last version that supports captures made on current versions.

Also, the linux build this time comes with a very early preview of qrenderdoc, the Qt UI. It is very much work in progress, many things are not yet implemented or buggy, but if you feel like trying it out then it's there. This will be the UI on windows eventually too, but only once it has reached feature and quality parity with the existing winforms UI.


  • Added beta D3D12 support! This should now be usable for day-to-day use, and has been tested on all the D3D12 things I could get my hands on, including a number of D3D12 games.

    It's listed as beta primarily because it hasn't yet had widespread testing. Note also that some features are not yet implemented on D3D12, notably shader debugging and pixel history.

  • Vertex picking is improved, thanks to @Velro. The mesh viewer now does a ray-cast per triangle and picks the closest vertex to the cursor on the best matching triangle, instead of just picking the closest vertex anywhere.

  • New triangle size overlay, showing a heat value for the size of a triangle. Any triangle above 4x4 pixels in area is the coolest value, and then 'heat' increases exponentially to triangles that are 1/16th a pixel in area.


  • Improved the accuracy of shader debugging in a number of cases by running transcendental functions on the GPU to precisely emulate the floating point accuracy of the current GPU. sin, cos, and others should now match the results from the real GPU and avoid slight ULP variances which could be amplified (e.g. by multiplying the result with a huge number for a rand()).

  • Early support for D3D9 overlay. Not all D3D9 programs will get an overlay yet, but where possible an overlay will display showing clearly that the API is unsupported. Work is ongoing in a separate fork.

  • Improved the 'inject into process' UI. Added a window title column, column sorting, fixed the missing refresh button and added a find-as-you-type filter.


    I still strongly recommend using the normal launch-to-capture workflow wherever possible, as injecting only works when the process hasn't used any target APIs, and has other drawbacks. It is useful in a small minority of cases.

  • Process injection now supports environment variable changes.

  • Added some error messages and detection if an invalid object is passed into GL functions. In general renderdoc doesn't do API validation, but some slight bullet-proofing will catch low hanging fruit problems.

  • If a launched process dies during startup, a more friendly/obvious error is printed to the logfile.

  • The replay no longer creates a debug context when replaying a GL capture.

  • Added support for an external SPIR-V disassembler tool, which can be configured to generate compilable glsl from SPIR-V directly, if the original source isn't available or isn't glsl.

  • Some slight improvements to the enumeration of remote hosts.

  • Implemented debug output muting on GL.

  • Detect and suppress any drawcalls that happen outside of render passes in Vulkan. Previously this would crash the program, but now the drawcall is skipped and an error message is added.

  • Display whether a DSV is depth or stencil read-only in D3D11 pipeline state.

  • Added support for remapping texture formats across APIs. This is useful in particular for e.g. Android replay with an ASTC texture that can't be natively displayed on a Windows UI, so it needs to be internally remapped to a format that can be displayed.

  • Added a tool menu option to start the Android remote server.

  • Support hooking libraries loaded with RTLD_DEEPBIND on linux.

  • Improved compression quality and size on capture thumbnails, and added a preview panel to the capture connection. E.g. this allows easy checking if the frame you just captured shows the bug you were after or not.


  • Min/max and histogram calculation now use custom visualisation shaders as their inputs instead of the real texture values.

  • Improved debug logging. All processes launched from a single instance of the UI now log to the same file - using appropriate OS mechanisms to ensure logs are distinct. This means the Help -> View Diagnostic Log File menu option is more useful.

  • Temporary files are now stored in a subdirectory - $TEMP/RenderDoc instead of spraying out in the root $TEMP folder

  • Added previous/next buttons to the event browser. These also have global shortcut keys ctrl-left/ctrl-right which work anywhere.

  • Added experimental support for WGL_NV_dx_interop to use DX textures in GL.

  • Exported the full GLX function set, to comply with ABI requirements for libGL.so.

  • In addition, added exports for unsupported GL1.0-1.2 deprecated functions, to allow a program to query for them and receive a valid function pointer. Note they aren't implemented, so it would still not work to call them.

  • Added wrapping for DXGI 1.5 and improved DXGI wrapping to have better compatibility with programs querying interfaces back and forward.

  • Multiple fixes and improvements to support capturing Direct2D in all known cases. This one is a bit funky, and DXGI is a complete mess of an API, so if you find a case that breaks then please report it as it may still be possible to support it.

  • Added easy support for self-hosting - ie. capturing RenderDoc's replay program with RenderDoc, and then debugging the replay.

  • Added a hover popup over tree views (e.g. the event browser) to show the full text of a line that is truncated for space


  • Added the ability to discard the alpha channel when saving to TGA/PNG, even though the format supports it.

  • Added support for multisampled image initial states in Vulkan, so that the data from previous frames is saved and restored. This also allows the display of multisampled images over a remote host connection.

  • Added a backdoor UUID - {3FC4E618-3F70-452A-8B8F-A73ACCB58E3D} - which returns the real unwrapped ID3D11InfoQueue from the D3D11 device. This allows custom filtering of messages, but you must be very careful not to use this to query for other interfaces as they will be returned unwrapped. Likewise any messages filtered out will not be retrieved or saved by RenderDoc's built-in API validation tracking. The debug layer must still be enabled via the capture options.

  • When serialising GL memory barriers, display the bitfield values as strings instead of a hex number.

  • Sort tree list values before copy-pasting, as the selection is stored by default in the order they were selected (possibly reversed).

  • Don't accumulate ResolveSubresource calls over time if we can't deduplicate them, but instead just mark the resource as dirty.


  • Fixed a crash that could happen if GetProcAddress was called for either itself or LoadLibrary, commonly happening in .NET programs that used P/Invoke for either function.
  • Fixes for the display and saving of 3D textures, in particular for at mip levels above 0.
  • Allowed hooking of delay-loaded ordinal imports. Mostly applicable for delay-loaded d3d12.dll.
  • Fixed the wrong operand being used in some sample operations - particularly comparison operations.
  • The arrow key nudge-by-1-pixel in the texture viewer accounts for mip level instead of requiring 2^n presses to move a texel in a mip.
  • Ampersands in event names no longer try to become shortcuts.
  • Calculation of uniform buffer sizes is fixed for arrays/structs in SPIR-V.
  • Fixed the RENDERDOC_TEMP override on linux not working properly.
  • Fixed cases where a buffer that's modified mid-frame in GL would not correctly restore its contents at the start of the frame, or where it could have the incorrect contents at the start of the frame if it's not modified before use.
  • Forced 'viewed' textures to have initial contents saved out, as there's no good way for the underlying texture to know if it was modified through a texture view or not.
  • Fixed event IDs from error messages being incorrect.
  • Fixed a case where internal tracking of vulkan image layouts could leak out into a barrier with an invalid state.
  • Fixed a crash that could happen when saving a texture in GL with a custom visualisation shader.
  • Fix a crash when switching back to a local context with connection windows open.
  • Hide any win32 errors from our internal code by calling GetLastError/SetLastError around our code inside the hooked LoadLibrary and GetProcAddress calls.
  • Fixed some broken memory walking code when unwrapping multiple vulkan queue submissions in one call.
  • Fixed some floating point exceptions that could happen as a result of trying to print buffer data as floats during serialisation.
  • Several bugfixes to callstack gathering - better support for dynamically loaded modules at runtime, handling over 2KB of ignored PDB paths, and more relaxed searching for symbols using DIA, checking for PublicSymbol type after trying Function type.
  • Fixed some serialisation bugs when using remote capture/replay between 64-bit and 32-bit.
  • Fixed a missing initialisation of shadow pointers in GL for persistent buffer maps.
  • Fixed the statistics viewer trying to access a file locally, even if it's being replayed remotely.
  • Fixed replaying of indirect drawcalls on vulkan.
  • Properly unwrap vulkan objects inside data structures for VK_EXT_debug_marker set name/set tag functions.
  • Fixed handling of unpack/pack state on GL, which wasn't properly ensuring the unpack state was nop'd out when replaying.
  • Handle render buffers when saving textures or viewing them across a remote host connection.
  • Fixed an oscillation in the errors and warnings window if the size was just right to continually add/remove a scrollbar.
  • When selecting the final flip/present call, choose the destination as our current texture if we don't have anything better to display. This fixes the backbuffer not being shown by default when loading a UE4 capture, for example, as it is unbound at the end of the frame.
  • Work around application bugs that call WSACleanup without first calling WSAStartup and destroying RenderDoc's internal sockets. This happened notably with GTA 5.
  • Fixed a crash if an element was selected in the remote host manager that wasn't a remote host (e.g. an application running on a remote host), and refresh was clicked.
  • Removed some leaking resources that could cause the whole D3D device to stay alive and leak a significant amount of memory each time a capture is loaded.
  • Fixed processing for glsl style mat4 square matrices in buffer formats.
  • Fixed a crash when saving a constant buffer to CSV if the file I/O failed.
  • Removed a possible deadlock against the loader lock when applying library hooks on windows.
  • Fixed multiple problems when debugging a SampleBias instruction, using the wrong sampler and potentially corrupting subsequent sample instructions.
  • Fixed colour luminance calculation when displaying event marker colours.
  • Allow querying for IDXGISurface in the swapchain's GetBuffer call. This is ambiguous, and so we assume the 'native' format type will be used.
  • Fixed a crash when VK_ATTACHMENT_UNUSED is specified for color or input attachments in a Vulkan render pass.
  • Remove unique objects layer when replaying in vulkan in case it's not present on replay (and because we don't need/want it).
  • Corrected handling of basevertex when picking vertices.
  • Take the opengl global lock inside SwapBuffers and Start/EndFrameCapture to ensure we don't have threading problems when recording commands at the same time as trying to start or stop a frame capture.
  • Fixed a crash when trying to show the find all dialog in the shader viewer if it was already visible.
  • Fixed a crash when fetching post-VS data in vulkan if the vertex ID wasn't declared as a signed 32-bit integer.