Here we have a new stable version of RenderDoc! In this release primarily we have bugfixes and improvements to general quality-of-life, as well as incremental improved API support.
Thank you to everyone who took the survey with the previous release. You can read the write-up and analysed results of the survey over here. One thing to highlight - there was enough support that there is now a RenderDoc discord server for those who prefer discord to IRC.
As always binaries for this release are up on the downloads page for Windows as zip and installers, and x64 Linux as a binary tarball.
Add support for YUV/YCbCr textures on all APIs that support them natively. The texture viewer by default will show the raw pixel values, but can be switched to a mode that does a packing-aware default YCbCr decode.
This also supports video decoding APIs on D3D11 which are the basis of higher level frameworks such as MediaFoundation.
On OpenGL there are no longer any required extensions for replay, all remaining required extensions are emulated when needed. As long as an implementation supports OpenGL 3.2 or OpenGL ES 3.0 it should be able to replay - though with reduced functionality in some cases if extensions like compute shaders are missing.
This is a step towards proper support of GL on macOS, which is not included with this release but is being developed.
Added a one-click button to load the last run capture session which persists from run to run. This is in addition to the existing functionality to save and load capture settings to disk in a config file.
OpenGL persistent buffer mapping has been refactored to behave more like Vulkan. Persistent buffer maps that are writeable will always have
GL_READadded to their parameters, and the direct mapped memory will be returned to the application instead of a shadow buffer.
This then means that there is minimal overhead while RenderDoc is idle in the background, and you only pay the cost of checking persistent buffer maps while actively capturing a frame (which will still be quite slow). Note that explicit flush buffer maps will still be vastly more performant in RenderDoc during capture.
On vulkan shaders accessing descriptor arrays will have dynamic GPU feedback fetched to determine which particular indices are used, and only these array indices will be shown in the pipeline state view and the texture viewer thumbnails.
Together with this, VK_EXT_descriptor_indexing is now supported.
Python breaking changes
Aside from some compatible changes adding new functionality and data, there are a few minor breaking or incompatible changes in the Python APIs:
ResourceFormatno longer contains data members
srgbCorrected. These have been changed to functions
firstSlicehas been removed from
GLPipeTexture, it is always considered 0.
ShaderRegisterstructure has been dropped,
ShaderConstantnow simply contains a byte offset instead of a legacy register/component location.
VarType.Inthas been renamed to
- Detect and suppress drawcalls on GL that have invalid vertex state and are likely to crash in the driver. The primary cause of this is deleting vertex buffers bound to a VAO before the draw.
- Android logging is now fetched and merged into the main PC logfile to aid in debugging issues without needing to run
- Skip installation of VS CRT if we detect it's already installed, since it likes to prompt for reboots. The RenderDoc installer should never need a reboot.
- Optimise some UI behaviour when large numbers or arrays of resources are bound to the pipeline.
- Optimise D3D12 replay to skip mapped buffer updates when serialising if we've cached the contents of the map update.
- Optimise D3D12 pipeline state view to skip work when many resources are bound but hidden (due to being unused or empty).
- The 'Mesh Output' panel has been renamed to the more accurate 'Mesh View' since it also shows inputs.
- For certain specific GL extension functions, check for their presence when replaying and abort replay if they aren't found. This isn't feasible to do in general for all GL functions, but there are some specific ones such as
glFramebufferTextureMultiviewOVRwhich indicate replaying an Android capture on PC where it's not supported. The user must have clicked through a warning saying that this may not work but we shouldn't crash if at all possible.
- Culling mode affects other overlays such as depth/stencil failure (this is a revert of a change to have culling not affect other overlays in v1.2). This means a culling failure can show up as a 'false positive' depth/stencil failure.
- When opening the file browser on a remote host to select an application, and an application has already been selected, start at its location instead of the home folder.
- Allow nested structs and arrays-of-structs in buffer format specifier.
- When opening the find/replace dialog in a shader viewer, select the text in the popup so you can easily replace by typing or pasting.
- Custom display shaders can now be used in the image viewer mode when loading a single image file from disk.
OpenSharedHandlesupport in D3D12 for shared resources.
ID3D11Multithreadinterface for automatic locking.
- When launching a program the connection window will now be docked with the capture dialog if it's visible, instead of on the main dock area.
- Add support for
GL_EXT_buffer_storageon OpenGL ES.
- Added support for global uniforms in SPIR-V and textures without explicit bindings, for the sake of OpenGL.
- With future validation layers any Vulkan objects referenced in captured debug messages will be replaced with resource links.
- Added support for
wglShareLists, but only before
wglMakeCurrenthas been called.
- Added a new RenderDoc API function
DiscardFrameCapturewhich will discard a frame capture currently in progress without saving it to disk, useful if you speculatively start a frame capture then later decide it is not needed and wish to skip the expense of ending the capture and saving it to disk only to delete the file.
- Add a warning when launching a new app to capture on Android if a capturing app is already running.
- A number of improvements to structured data, including better type names for flag/flagbits enums, fixed stringification for bitfield enums with duplicate bit values, and more.
renderdoccmdis now a 'console' type program on windows, meaning its stdin/stdout handling is as expected for a command-line utility.
- Add an uncompressed thumbnail into .rdc capture files.
- Add support for displaying MSAA array textures on OpenGL and Vulkan.
glBufferStorageon OpenGL ES.
- The texture viewer interprets images based on the type from a current Vulkan image view instead of always using the underlying image type. This is similar to
TYPELESStexture behaviour on D3D.
- Support using EGL with desktop GL.
- Try to handle applications that set
GL_MAX_LEVELdynamically on textures. Not all possible uses of these will work, but as long as
GL_MAX_LEVELis set to the actual maximum mip level at the start of the frame, changes to it within the frame will be correctly handled (e.g. for mip-generation rendering from one mip to another).
- Clamp D3D12 pipeline state view descriptor arrays to the declared array sizes in the shader. This can be a lot smaller when the array declared in the root signature is unbounded.
- Update GPUPerfAPI to 3.3.
- On D3D12 and Vulkan start 'frame 0' captures immediately when the API is initialised, instead of waiting for swapchain creation. This is feasible because unlike D3D11 and OpenGL it is not expected that the API will be initialised many times for enumeration/bootstrapping reasons.
- Block DXGI requests for unsupported DWM interfaces
- Explicitly skip system builtin inputs on GL even if driver reflection returns them.
- Add support for Intel GL performance counters on mesa.
- Add an option to make Y-Flipping a per-texture state instead of a global toggle. By default this is off but can be enabled in the settings window.
- On OpenGL the GREMEDY debug extensions are reported as supported even if the driver doesn't, so applications can call them.
- Add a qrenderdoc command-line parameter
--replayhostto select a replay host at startup.
- Add an option in a connection window to save all selected captures at once to a directory, which will take the selected filename and append
- Add support for EGL_EXT/KHR_swap_buffers_with_damage.
- When selecting drawcalls try to preserve the current offset in a raw buffer viewer as much as possible.
- Implement support for D3D12.3/D3D12.4 interfaces.
- Don't use
GPUCounterin python public interfaces, but instead use a simple integer. Python doesn't allow enum values that are not predefined, which is expected for that enum.
- Remove redundant calculation of 'bounding box' data for non-mesh buffer viewers.
- Strip nvidia optimus layer on replay if it was explicitly enabled by the application.
- Resource links use the correct font for their context, e.g. italics for unused items in the pipeline state.
- Remove redundant & inconsistent close button on Launch Application panel.
- Truncate long strings in displayed structured data.
- Remember the last executable captured and when browsing for an executable have it pre-selected.
- Improve Vulkan byte range descriptions in the pipeline state view.
- Don't waste time adding resource usage for unbound resources.
- Switch android devices to root as soon as possible to avoid disconnecting when selecting a package to debug.
- Handle displaying constant buffer values as hex when specifying a custom format for a constant buffer.
- Disable WGL hooks completely when EGL is hooked.
- Auto-fit the WASD camera to the mesh's bounding box after switching camera types in the mesh view.
- Improve disassembly & reflection of spec constant op based array sizes.
- When dragging the mouse on the timeline bar jump to the nearest draw, making for smoother scrubbing.
- With typeless textures display explicitly the fallback behaviour of interpreting them as 'unorm' typed.
- Add support for a number of Vulkan extensions:
- Fix an issue with Intel metrics crashing if they fail to initialise.
- Fix a crash on GL when saving a texture to disk due to incorrect thread access.
- Handle UNC/network paths consistently in vulkan layer registration.
- Don't try to use
basePipelineIndexif pipeline derivatives aren't used.
- Fix some refcounting leaks in D3D12.
- Fix some memory leaks in D3D12.
- Allow python extensions containing uppercase letters.
- Fix a potential race-condition crash when refreshing hosts in the remote manager.
- Fix a race-condition when browsing a remote host's filesystem to launch a program.
- Fix handling of implicit layout transitions around renderpasses in Vulkan.
- Fix image layout handling in Vulkan for images without a known starting image layout.
- Fix some missing handling for depth/stencil texture initial contents on D3D12.
- Fix mousewheel scrolling in texture viewer on high DPI screens.
- Fix issues with push descriptors that are not used or updated on Vulkan.
- Explicitly disable unsupported D3D12 features such as raytracing.
- Fix capturing D3D11 programs that run on lower feature levels, down to
- Fixed min/max and histogram calculation for stencil on GL and Vulkan.
- Fixed some bugs with linux callstacks in cases where offsets were being incorrectly handled.
- Fixed inconsistent assignment of drawcall IDs to markers in Vulkan and D3D12.
- Potential fix for 32-bit capture issue with conflicting pipe names used by breakpad.
- Fix bug with using D3D swapbuffer images as render targets without enabling the usage (some applications might not render directly to them so the usage might not be set).
- Fix out-of-bounds indexing problem when running through shader traces in shader debugger.
- Fix crashes on Huawei devices due to possible driver/OS bug with eglTerminate.
- If a remote server disconnects, stop fetching debug messages.
- Fix a bug where an OpenGL capture would fail if it had to retry the frame capture.
- Fix parsing of
/proc/<pid>/net/tcpwhich displays all ports for all processes, not just the target process.
- Fix a case where a sparsely populated descriptor array in a Vulkan descriptor set would be completely skipped if the first element was invalid.
- Don't show two empty rows for a combined image/sampler that is completely empty.
- Fix SPIR-V editing handling of different logical sections in the SPIR-V module, including new SPIR-V 1.3 opcodes such as
OpModuleProcessedand extensions like
- Remove extra state row in D3D12 pipeline state rasterizer tab.
- Fix formatting of buffer views in D3D12 pipeline state view.
- Fix structurising dummy serialisers incorrectly claiming arrays being serialised are out of bounds.
- Fix typo storing
StartIndexLocationin D3D12 indirect indexed draw.
- Fix the WARP fallback on D3D11 not correctly applying.
- Handle bugs on adb where forwarded ports can falsely connect successfully even if nothing on the other side is listening.
- Disable AMD memory-requirements padding workaround on new AMD drivers.
- Don't try to fetch initial contents for images currently in external or foreign queues, fixes a potential crash.
- Fix GL overlays when used with shaders created via
- Fix handling of double vertex input attributes in mesh viewer.
- Fix querying texture-only properties when an FBO attachment is a renderbuffer.
- Fix ARM driver bug workaround with unused UBOs on Vulkan.
- Fix D3D12 pipeline state view not having tooltip to show resource state.
- Fix pathological slowdown case in table views with extremely large number of rows.
- Fix memory leak in GL overlay text rendering.
- Fix memory leak in GL with initial contents of state objects (programs, FBOs, VAOs, etc).
- Don't try to fetch structured count for non-buffer UAVs.
- Handle type hint for typeless textures when pixel picking.
- Fix wrong GL function being called in
- Add a dummy stencil image to MSAA <-> Array copies on Vulkan when there's no stencil in the original texture.
- Fixed a crash with the D3D9 overlay that renders simple text saying D3D9 is unsupported.
- Fix resource usage tracking around indirect executes on D3D12.
- Workaround AMD driver crash when doing a 0-byte glCopyBufferSubData.
- Fix Qt QProcess thread ownership problems.
- Fix handling ExecuteIndirect VB and IB changing commands in D3D12.
- Fix copy-paste error on display of D3D12 ClearRenderTargetView color.
- Allow missing Vulkan layers on replay as a soft warning instead of a hard incompatibility.
- Fix a case where D3D12 overlay added root parameters could conflict.
- Fix enumeration of device extensions on Vulkan layers.
- Add a hard error if an unsupported device extension is used during capture.
- Fix trashing uniform buffer offset and size when pushing and popping state for in-application overlay rendering.
- Fix handling of programs with many shaders attached and detached over time.
- Don't allow indefinite leak of sampler parameters being set if they are set at high-frequency.
- Fix display of ETC texture format names.
- Fix some missing EGL functions that weren't handled in
- Fix the string name of
- Only use ASCII for the duration column name when exporting the event browser contents.
- Sync GPU work before destroying output windows on D3D12.
- Don't force gamma display when rendering overlay texture - even if the original texture had that option enabled.
- Don't call GetBaseFormat on compressed GL formats.
- Fix GL overlays for MSAA textures.
- Remove program leak when patching separable programs on GL.
- When exporting text files from Qt make sure to mark them as text so that newlines are converted to platform conventions.
- Correctly handle GPU virtual addresses of 0 in ExecuteIndirect.
- Handle buffers with overlapping GPU VA ranges where multiple buffers are mapped to co-sited regions of a heap.
- Fix missing register swizzles on relative addressing lookups.
- Fix incorrect deletion of custom shader programs.
- Fix missing bindpoint mapping re-map when looking up read-write resources in GL.
- On linux wait up to 1 second for a program to start.
- If GL vertex output fetch fails, don't leak the rasterizer discard state to the outside.
- QTBUG-14949 is supposed to be fixed in Qt 5.11, but it doesn't seem to be so continue to use our workaround.
- Don't query
- On D3D12 don't overwrite
elementByteSizefrom structured buffers with byte size calculated from format.
- Don't use transform feedback to fetch GS/Tessellation output on Vulkan when multiview is active.
- Don't apply view typecasting hint when displaying overlay texture - it should always be displayed in its native format.
- Fix incorrect fetching of indirect draw/dispatch parameters in secondary command buffers on Vulkan.
- Fix crash in Vulkan serialisation if an array is NULL but the corresponding count for the array is non-zero.
- Shorten android option name used to pass capture options to the device, as a long option name can fail.
- Fix handling of primitive restart with a vertex offset.
- Refactor buffer viewer to remove potential race conditions when rapidly changing events or current instance.
- Fix handling of shortcuts in shader viewer, as QShortCut can't handle ambiguity. This means the shortcuts will still work when multiple shader viewers are active - the one with focus will consume the shortcut key.
- Fix implementation of glFrameTerminatorGREMEDY.
- Fix vulkan overlay crash with using the wrong index for color attachments.
- Fix some cases decoding arrays of matrices in constant buffers.
- Fix handling of saturate on NaNs in DXBC debugging.
- Correct description of float controls in settings menu - min and max is for decimal places and not significant figures.
- Fix missing case where linux hooks weren't properly applied after a
- Fix underflow crash when a remote server crashes and invalid/empty data is returned for proxy calls.
- Fix handling for drivers that support 4x MSAA but not 2x.
- Fix order-of-destruction problem with global variables that could crash on shutdown.
- Fix UUID check for ID3D12Fence1.
- Fix typo in file open dialog with image filter.
- Fix querying for ID3D11Texture2D1 and ID3D12Resource1 on swapchain backbuffer images.
- Handle aliases of bindings in GL, pick the best possible match we can.
- Fix creating descriptors in D3D12 that reference the backbuffer and do have a descriptor struct but don't give the texture a typed format within that descriptor struct.
dlerrorwhen returning from our
dlopenhook for particularly aggressive error checks in applications.
- Skip vertex attributes that reference vertex buffers which are unbound or unspecified in Vulkan.
- Fix crash on GL when editing a shader with the vertex output is selected in the mesh output. An invalid buffer was used for a frame before the data is re-fetched.
- Apply luminance/alpha emulation to
- Fix reading back initial buffer/texture states in D3D12.
- Fix copying depth data from depth stencil with MSAA in DX12.
- Don't spam logs when nvapi is blocked.
- Ensure we keep a reference on descriptor heaps with pending use mid-frame capture if they're deleted by the application before the end of the capture.
- Fix setting of
pyrenderdocglobal in python extensions.
- Remove a number of small leaks and missing destruction of objects.
- Fix Vulkan injection of RenderDoc on new Android builds with a new
- Fix textures not getting displayed when using GL_COMPARE_REF_TO_TEXTURE.
- Fix skipping empty descriptor set bindings on Vulkan.
- Don't crash if an overlay didn't render because no drawcall was selected.
glBufferDatais called mid-frame to orphan a buffer, record that in the frame capture and not as initialisation, since the previous buffer data may have already been used.
- Fix an incorrect bounds check when nudging the selected pixel to the right in the texture viewer.
- Fix incorrect depth/stencil format check in Vulkan.
- Fix reflection of DXBC UAVs.
- Fix behaviour of maximising floating dock windows to not maximise over the taskbar on windows.
- Fix aliased GL functions not recording the correct variant as the source function call.
- Handle out of memory errors when fetching mesh outputs on Vulkan.
- Fix fetching of input attribute bindings for matrix inputs.
- Fix Vulkan mesh output for tessellated quads.
- Fix postvs descriptor validation checking for arrays with empty elements.
- Fix behaviour of
glRenderbufferStorageMultisampleEXTnot being a proper alias of
glRenderbufferStorageMultisampleon OpenGL ES.
- Fix a case where renderdoc's default-generated RPATH interferes with the RPATH/RUNPATH in an application on linux.
- Fix query for depth bounds state on OpenGL.
- Fix tracking of
wglMakeCurrent(NULL, NULL)to ensure current-context tracking is up to date.