Note: v0.91 contains an important bugfix on top of v0.90
At the end of June, RenderDoc passed a milestone of 5 years of development since the very first commit.
Now this release marks another milestone, although in some respects it's arbitrary. The versions so far from v0.18 up to v0.34 have continued in the same family as the original internal builds marked alpha1 and alpha2 up to alpha17 right before the first public release of v0.18.
It's time to mark the end of the v0.x series of releases. v0.90 is the last planned release in this current v0.x series. The next planned release will at last be v1.0 and will bring with it a number of changes that have been discussed in release notes past.
With this comes a new approach to branching on the github repository. The
master branch is being retired, and instead it will continue on as
v0.x. This will continue to be a reliable branch to work from for anyone compiling from source themselves, and any bugs that are reported in the coming months will where possible be fixed on this branch. However it will see no new feature development and PRs will not be accepted against it, leaving it 'soft locked'. This branch will continue to exist until v1.0 is released, at which point it will also be retired.
At the same time there is a new branch
v1.x where future looking development happens. Especially in the near future, expect this branch to change a lot as I start making large-scale changes for v1.0.
The nightly builds will be made from both branches, to serve both people who want to test new bugfixes on
v0.x as well as anyone who is brave enough to try the new development in
Any feedback as always can be sent to me via twitter, email or on #renderdoc on freenode.
With that said, let's get into what v0.90 brings!
Binaries for this release are up on the downloads page for Windows and x64 linux as a binary tarball.
Qt UI improvements
Since the Qt UI is (currently) only used on linux, I'm separating it out from the other features/improvements so that those on windows can skip down to the relevant notes.
- A fairly large overhaul/customisation of the docking system leads to a much improve UI, with drop indicators and previous, as well as removing the timer-switching based targets. For more information see the fork at https://github.com/baldurk/toolwindowmanager.
- Improvements to theme handling in a few places in the UI, to better respect what the theme is rendering. E.g. this means light-on-dark themes should look much more natural.
- Switch to a new icon set that is high-dpi friendly.
- Initial implementation of the timeline bar available in the C# UI. This implementation doesn't heuristically try to scale to make all labels visible, instead it scales based purely on event IDs as a horizontal axis.
- Add default copy/paste handlers in most of the UI.
- Event browser columns are properly resizeable and re-orderable, and also configurable (so you can enable/disable draw ID or duration columns).
- Improved the sizing of sections in treeviews particularly in the pipeline state views, so that it's less extreme and balances free space more evenly between sections.
- Tooltips over resources in pipeline state views that show states now appear immediately.
- Add syntax highlighting for preprocessor commands in HLSL/GLSL
- Draw gridlines in treeviews.
- Implemented CSV export in constant buffer previewer.
- The mesh view's dock layout is persisted between sessions.
- When running python scripts from the command line, print output or exceptions to Qt's logger.
- Added purely opaque handling of
QWidgetpointers in the python scripting if pyside2 isn't available, so that you can still create and dock built-in windows.
- A custom tooltip displays for elided data in RDTreeViews to show the full data on hover.
- Fix a crash if the event browser is opened after capture is already open.
- Fixed duration summing incorrectly in the event browser.
- Fixed python handling for cross-thread operations to the render thread, around thread-safety and exception rethrowing.
- Fixed a Scintilla bug that caused mousetracking to be lost when an editor is hidden. See upstream bug.
- Fix an issue that menus could fail to appear if they aren't visible immediately after calling popup().
- Added GCN ISA decompilation and display. This is supported for all APIs but has some provisos. More information is available in the wiki.
- Add some optimisations to the D3D11 back-end that should improve the idle overhead (when renderdoc is injected but not actively capturing). See #660 for more discussion.
- Replay markers and object names in each API where possible, and add a new 'replay loop' mode to make it easier to trace renderdoc captures with RGP.
- Handle OpSource and OpSourceContinued instructions in SPIR-V, allowing embedded source to be properly displayed as with D3D bytecode blobs.
- Add support for capturing the first 'initial' frame in GL, from the start of the first attribs-based context create to the next present.
- Add support for fetching vulkan mesh output when the output variables are structures (potentially with nesting).
- Set original IDs in the per-drawcall output variables, for use in python scripting.
- Support buffers in the GL extensions providing interop with directx.
- When multiple captures are created manually in a single frame, prevent trampling over the first one with subsequent ones.
- Process filter for injecting into applications is now case insensitive.
- Add support for new Vulkan KHR external memory extensions, as well as VK_KHR_get_memory_requirements2 & dedicated_allocation.
- Don't look at IP address to see if a connection is local or not. This allows SSH port forwarding from local to remote machines and connecting to 'localhost' as a remote host.
- Backend support added for AMD performance counters. Although not exposed in the UI yet, these counters are available for query through the python API.
- Better handling for vulkan resolve attachments - displaying them in the UI properly as additional thumbnails, and fixing a few bugs with those attachments in render pass processing
- Add support for passing
- Add some build-time cmake options for specifying the qmake command, and SWIG tarball location.
- When 'ref all resources' is enabled on D3D12, don't actively track descriptors. This can save potentially a lot of time.
- vkCmdWaitEvents is now treated properly as a GPU-side command and displayed in-line with other GPU commands.
- For clear calls the target of the clear is shown instead of the currently bound target, in cases where this might be different (ie. when the target is passed purely as a parameter to the clear call, not as implicit state).
- Fix a known issue with v0.34 where on certain windows 10 versions a GL capture had a high chance to end up being empty.
- Fix a mismatch in enums between the C# UI and C++ core module, leading to some blend modes being incorrectly reported.
- Fix some cases where samplers could be mistaken for texture resources especially on D3D11, which could lead to mis-naming thumbnails.
- Fix a crash on intel mesa where calling XOpenDisplay multiple times would lead to driver issues. Thanks to @jljusten for tracking down this fix. For more information see this bug on freedesktop.org.
- Fix a crash on vulkan where more physical devices were available during capture than are available on replay.
- Fixed some refcount leaks that would cause some D3D11 captures to stay largely in memory when closed.
- Fix a potential divide by zero for 1-control point patchlist topologies.
- Fix the implementation of round_z in D3D - this needs to apply
ceilif the input is negative, or
floorif positive. Previously it was applying
floor(x < 0.0f ? x + 0.5f : x).
- Fix some handling of slice offsets for 3D textures - in high slice count 3D textures there could be some sampling that would go between slices or end up off-by-one.
- Fix a double delete with descriptor set layouts when immutable samplers are used.
- Fix invalid memory index types being reported in memory requirements.
- Fix a case where GL programs using libepoxy would fail to hook because glXGetProcAddress wasn't reflexive (wouldn't return itself when queried for itself).
- When showing the whole pass in the mesh viewer, show the correct number of instances for each draw.
- Partly speculative bugfix for a pixel history crash when using deferred command lists.
- Fix problems where not enough data is passed to an indirect draw call and we read garbage on the CPU.
- Fix a crash when naming or tagging VkSurfaceKHR.
- Workaround to applications that use DXGI refcounts incorrectly, to leak objects instead of crashing.
- Export glXWaitX as a pass-through so that applications needing it can find it with dlsym.
- Fix a bug where buffer usage was based on the last binding, and could be broken if a buffer is temporarily bound to COPY_READ_BUFFER for DSA style access. Instead examine the use of the buffer across the capture and use this to calculate the usage.
- Fix an extremely dubious problem from IronPython, where if you install a version >= 2.7.5 then it adds a global redirect that affects all programs including renderdoc, to point to 2.7.5. In the case of renderdoc, it's not found since only 2.7.4 is shipped.
- Handle vulkan descriptor set layout compatibility, and sets becoming invalidated if a new layout is bound, to avoid trying to bind a (now-invalid) descriptor set that might not be needed.
- Fix D3D12 crash where a Map() that doesn't write any data on an upload heap would lead to a crash creating an empty buffer on replay.
- Fix a D3D12 crash trying to apply graphics pipeline state to a compute or copy command list.
- Fix a D3D12 crash where a command allocator would be in use when a data upload was needed.
- Fix use of 'ref all resources' on D3D12.
- Fix a potential D3D12 problem when submitting on two different queues, by synchronising between the submissions.
- Allow descriptor set writes to be missing references to objects silently, as this is harmless if the descriptor set is not otherwise used.
- Fix a potential crash naming an actively-recording command buffer in vulkan.
- Fix for new compilation warnings on GCC about case fallthrough.
- Fix broken captures where the compressor used a 32-bit counter to count the uncompressed size and would wrap around at 4GB. There is still a potential problem if the compressed size becomes 64-bit.
- Fix the global hook shim referring to some removed functions, and so not properly setting capture options or target capture file.
- Fix a vulkan crash if multiple devices were created on an instance, leading to the wrong device being used on replay.
- Fix a case in GL where glBufferData would NULL dereference on uncreated internal data.
- Fixed a bug creating programs in a GL frame that's being captured.
- Fixed a crash where temporary events are created for use in command buffers and the code would delete them too early and try to re-use them after deletion.
- Fixed accidentally exposed statically linked symbols when statically linking libstdc++ into librenderdoc in the distributed binary builds.
- When closing a capture that contains callstacks release handles to the symbol files so they can be recreated, instead of holding onto them forever.
- Fix GL uniform arrays not properly copying all data.