Skip to content

Version v0.30

Choose a tag to compare
@baldurk baldurk released this 01 Aug 16:40

NOTE: There's a crash with certain saved UI layouts, if you had multiple mesh views open at once. If v0.30 crashes whenever you open it, delete %APPDATA%\renderdoc\DefaultLayout.config

I started working on RenderDoc in 2012 as a hobby project just working in my spare time. Now since June this year I've been contracting with Valve to focus full-time on RenderDoc, allowing significantly more work and improvement on the tool. I'm thankful to everyone who has helped me get here as I'm very privileged to be in this position.

In order to make sure that I do the best work I can and focus on what is important to people using the tool, I have put together a short survey to find out who is using the tool and why, as well as gather opinion on ways I'd like to improve the tool with better crash reporting and anonymous telemetry.

Please take a few minutes to fill out this anonymous survey

The survey is now complete! The results are now available

It will make a big difference to understand the answers to these questions so please fill it out. There's no personal information or login required, and all of the questions are optional. If you have any questions or concerns about the survey or anything else RenderDoc related, feel free to email me at any time and I'll be glad to help.

Version v0.30

As always downloads of this release are now up on the builds page.

Note that I've decided to retire the beta builds, since for the last several versions they have simply been in lockstep with the stable builds. They may return in a different form in future, but for now I've removed them from the page as they have no historical interest (compared to nightly builds at least), and the <1% of users on beta versions will be automatically prompted to update to the latest stable version if they don't do so manually.

This release brings a bunch of improved functionality to Vulkan, as well as smaller features and bug-fixes across the board including something that's been on the backburner for a while - display of view formats of typeless resources and view parameters like a sub-range of mips or slices. I'm not entirely sure if this implementation is ideal, so please give me feedback on what you think of it!

The in-application API has been updated to v1.1.0. Following semantic versioning this adds new functionality in a backwards compatible way - specifically the returned pointer to a function table contains an extra entry on the end, and since it's not caller allocated it is safely backwards compatible with v1.0.x code.

If you run into any problems, please open an issue or contact me to let me know - I can't fix what I don't know about!


  • When a bound resource doesn't just bind the whole resource but a sub-set, or if the resource is bound as a different type than it actually is (format casting, or if the resource itself is typeless and always cast), this is highlighted in the pipeline state and a tooltip shows the difference.
  • The source code has now been formatted by a .clang-format file to make for easier contributions (ie. without me nitpicking style problems).
  • Added Vulkan support for immutable samplers
  • Added Vulkan support for stepping through both multidraw (drawindirect with drawcount > 1) and secondary command buffers.
  • Implement saving multisampled textures to disk in Vulkan.
  • Added support for SPIR-V specialization constants.
  • Implemented mesh picking for Vulkan.
  • Implemented custom display shaders, and shader edit-and-replace for Vulkan.
  • On vulkan, image initial states are kept as buffers in CPU memory to reduce the device memory requirements and lessen the chances of out of memory errors (necessary for capturing DOOM).
  • For the moment on Vulkan, pretend to report only the single most capable queue and suppress the others, so that applications don't use multiple queues (also necessary for DOOM).
  • Added pipeline export to HTML for GL.
  • "Create Debug Device" capture option has been renamed to "API Validation" since it makes more sense cross-API.
  • Return dummy/stub interface for ID3D11Debug the same as for ID3D11InfoQueue
  • Added a button to zoom to 100% so that pixels are 1:1.
  • The 'attach to running instance' dialog now shows running programs much faster rather than checking and waiting on the timeout for all possible programs before showing anything.
  • Dragging an executable into the window anywhere will now pop it into the capture dialog, instead of trying to open it and complaining it's not a recognised capture log.
  • Supported marker colours in the UI, which is used by the D3D11 and Vulkan marker extensions. This can be disabled in the options if e.g. your code passes only one colour for all markers (opaque and transparent black are ignored if all markers have the same colour).
  • Added a mode to show all instances in a draw in the mesh output. Also adjusted the colouring between current instance, other instances, and previous draws to make it clear which mesh is which and avoid changing colours when viewing a single draw or viewing multiple.
  • Add copy-paste support from shader debugger registers.
  • Added support (largely untested though due to lack of samples!) for newer D3D11 (11.3 and 11.4) and DXGI (1.4 and 1.5) versions. If you run into bugs with this please let me know as there is little code using it, but at least this should allow proper capturing without crashes.
  • The buffer viewer should now save its internal layout, so if you rearrange the 3D preview or data panels, it will remember that.
  • Marker regions in the event viewer are now display the range of events they cover, not just the last one.
  • For the separate unstripped shader debug info feature added in v0.28, allow relative paths to be matched up to search paths in the UI.
  • Likewise this feature now supports lz4 compressing blobs, since they are often primarily text (containing source code) so they compress well.
  • The documentation is now generated through reStructuredText and sphinx - thanks @Anteru!
  • Added text file export of the entire event tree, to more easily batch-process.
  • Image barriers are now displayed in the timeline bar, as well as in the resource usage drop-downs. The current image state is shown in a tooltip in the pipeline state view.
  • Show the required size of a constant buffer vs the provided size, and highlight any that don't provide enough data.
  • Better display of multisample count, byte/structured buffer type, and image swizzles in pipeline state.
  • SNORM textures now display in the range [-1, 1] instead of [0, 1] by default.
  • Added support for importing by ordinal on windows, which is needed for D3D12 hooking.
  • Add a menu item to jump from a given pixel history event directly to the matching primitive.
  • The renderdoccmd command line program has been revamped to have a more friendly and intuitive interface, and more useful options for e.g. launching programs specifying capture options or a working directory.
  • Improved underlying technical work behind remote replay and capture, and running on linux in general. The UX still needs work though.
  • Tweaked logging output to stdout/stderr not to include such long line prefixes.
  • Added a SIGINT handler to linux to shut down the remote replay host cleanly.
  • Added a feature to capture N successive frames. This won't necessarily help in some cases where bugs are timing related, as the frames will run very slow during capture. However it can be useful if it's known that a bug happens every second frame or so.
  • Improved float formatting when in exponential notation, as previously it could print a lot of unnecessary trailing 0s.
  • Add a small popup in the TextureViewer to go to a particular pixel. It's accessible in the toolbar, or via CTRL-G
  • The buffer viewer (mesh or raw buffer view) will now try to size columns to fit likely content.
  • When using per-texture settings (the default option), then the visualisation type (RGBA vs RGBM vs custom) and selected custom shader is also saved per-texture.
  • Custom visualisation shaders are provided the selected slice as well as the selected sample from the UI. On GL, they are now also provided with [0, 1] UVs for convenience.


  • Fix an error where an update could fail if the renderdoc.dll module was injected into a program while the update process is on-going. This would commonly happen if the UI was launched from a program like the Unity or Unreal editor, and then the update was found. It left the UI and core module on inconsistent versions, which lead to crashes/bad behaviour.
  • Fixed a long-standing bug where a Win32Exception could be thrown creating some handles. I still don't know what the problem is or why the fix works, but this seems to be corrected now by simply forcing handles to create at creation time instead of lazily.
  • Several fixes for pixel history on D3D11 - a bug causing all events after the first failed pixel to be dropped, show failures due to sample masking, don't show shader output if there is no pixel shader bound.
  • Fix cases where D3D11 shader debugging could become incorrect by not accounting for diverging and converging code flow. The debugging of pixel quads now should correctly sync up after divergent control flow to ensure subsequent derivatives are correct.
  • Several smaller fixes for shader debugging on D3D11: byte address buffer loads and stores, StructuredBuffer.GetDimensions returned nonsense, shift operations always shifting by first component instead of component-wise, the firstbit opcodes not using BitScan correctly.
  • Fix an edge case where exes with 'renderdoc' in the filename wouldn't be hooked.
  • Fix being able to undo the initial entry of text into a shader editor.
  • Fixed a Vulkan crash with a vertex buffer stride of 0.
  • Fix various Vulkan validation problems/illegal behaviour.
  • Fix for Vulkan memory maps not being correctly recorded if an offset is specified.
  • Fix a case where selecting an instance would break viewing other draws.
  • Fix handling of glCreate*d GL buffers that aren't explicitly bound to a type.
  • Fix a crash when vertex picking if no mesh data is present (e.g. empty inputs).
  • Fixed handling of stencil-only images on Vulkan.
  • Fixed implementation of Discard on D3D11.
  • Added support for the D3D11 workaround for UpdateSubresource on software command lists.
  • Fixed some incorrect handling of texture buffers on GL.
  • Fixed handling of integer formats on buffer clear functions in GL.
  • Correctly capture a D3D11 deferred context that is created mid-way through a capturing frame.
  • Fixed some bugs to do with calling UpdateSubresource on a new resource in the middle of a capturing frame.
  • Fix tracking of read-write conflicts in D3D11 at subresource granularity, which allows classic 'mip generation' style rendering where draws read from one mip and write into the next.
  • Add a heuristic to avoid crashing if vulkan swapchains fail to create intermittently.
  • Fix a SPIR-V disassembly crash with double-index of matrices (e.g. myMatrix[x][y]).
  • Remove top-most windows, we only want windows that are on top of the rest of the RenderDoc UI, e.g. the crash reporter should not be top-most.
  • When an instanced drawcall has 0 instances, skip it entirely from the PostVS rather than showing some data incorrectly.
  • Fix incorrect sRGB handling on clear colours.
  • Depth and stencil overlays should show as completely green if there is no depth/stencil buffer bound to test against.
  • Show sample mask and blend factor even if the NULL blend state was set (these are set independently).
  • Fixed handling of vulkan descriptor set updates where a large array applies to multiple consecutive descriptors of the same type.
  • Fix a crash on Win32 in vkQueueSubmit if wait semaphores are specified (the wrong value size was used - 64-bit vs pointer-sized).
  • Fixed many issues to with rendering to or displaying mips of textures: for GL or with Y flip enabled texel co-ordinates were incorrect, pixel context size wasn't consistent between mips, compute dispatches didn't show the bound mip level properly, locked textures didn't keep their mip consistently, custom shaders weren't rendered at the selected mip level.
  • Improved handling of applications using VAO 0, which isn't valid in core profile but is quite common in otherwise core code so we support it as a concession.
  • Fix a number of issues found by valgrind and add a valgrind.supp file for future use.
  • Fix applications that use OpenCL on nvidia, which calls wglGetProcAddress with magic strings to fetch internal functions.
  • Fix compute resources not being properly shown on vulkan.
  • Change internal sRGB curve to the proper piece-wise sRGB function instead of using the pow(2.2f) approximation.
  • Add missing handling of USCALED/SSCALED texture formats.
  • Fix a crash when hitting page-down in an empty tree list.
  • Fixed register renaming in shader viewer going wrong for column-major matrices.
  • Fix printing of stencil refs and masks in GL as hexadecimal.
  • Fix calculation of mesh bounding boxes when dealing with formats that aren't simple float or unorm typed.
  • Fix a crash when an invalid path is specified in the Vulkan layer registry key.
  • Suppress GL debug messages when trying to make separable programs, so as not to fill the log with 'false positive' errors that are then handled.