Skip to content

Version v1.2

Choose a tag to compare
@baldurk baldurk released this 30 Nov 18:14
· 6447 commits to v1.x since this release

Version v1.2

Time again for a new stable version of RenderDoc. This release includes a number of useful quality-of-life improvements as well as improved API support and of course plenty of bugfixes.

NOTE: The RGP integration added in v1.1 is now opt-in, to enable it go to Core in the settings menu and select to enable it, next to where the RGP executable is entered. This option takes effect the next time you load a capture.

As always binaries for this release are up on the downloads page for Windows and x64 Linux as a binary tarball.

Also separately RenderDoc is now available on Nintendo Switch™ to authorized developers, distributed as part of the NintendoSDK! For more information, consult the Nintendo Developer Portal.


A couple of years ago way back in September 2016 I ran a survey to get an idea of what the user-base was interested in both currently and for future support. Two years later I'd like to see how things have changed, so please go if you have 5-10 minutes to spare please fill in the new survey.


Main highlights

  • Shader edit & replace tooling has been significantly improved. Instead of each API either expecting HLSL or GLSL shaders to compile internally, APIs can accept the underlying bytecode (DXBC, SPIR-V) where supported. This means the compilation can happen in a custom fashion in the UI.

    Similarly decompilation from bytecode to high-level source (if the original source is not available) is fully customisable. RenderDoc ships with a number of default programs for handling SPIR-V, and they are autoconfigured either from system installs or from the shipped tool. You can add more custom tools in the options menu:
    When editing a shader, if multiple tools can decode the bytecode they will be available as a drop-down. Original source will be the preferred default item if the button is clicked, otherwise the first tool available will be used:
    Then if the shader debug information has compilation settings they will be pre-populated and the appropriate compilation tool can be selected:

  • Implement geometry/tessellation output on Vulkan. This is only available on drivers that implement the VK_EXT_transform_feedback extension, there are no plans to expand it to other drivers without that extension.

  • Added persistent python extensions. The existing python API grants access to all functionality that the UI provides, which means extensive customisability is possible. A system has now been added to allow users to have persistent extensions that are loaded at UI start-up by default without having to be explicitly run.

    Extensions can also add menu callbacks to the main menu as well as several of the common panels (buffer viewer, event browser, texture viewer) to add custom tools.

    Extensions are loaded as python modules in the user settings directory (either %APPDATA%\qrenderdoc\extensions on windows or ~/.local/share/qrenderdoc/extensions on Linux) and must be loaded explicitly after installation. After that the python script is loaded at UI startup and can register its callbacks as desired. The python modules are also available in the existing python shell panel via a normal import.

  • Save expanded tree views in API inspector, constant buffer previewer and resource inspector, so that tree views stay expanded between items instead of completely collapsing.

Python changes

Aside from some compatible changes adding new functionality and data, there are a few minor breaking or incompatible changes in the Python APIs:

  • ReplayOutput.BuildTargetShader now takes a bytes instead of a str for the source and a ShaderEncoding listing what the encoding of the source is, which may not be text.
  • TargetControl.ReceiveMessage now takes a progress callback which may be None.
  • PipeState.HasAlignedPostVSData now takes a MeshDataStage parameter as the alignment may vary by stage.
  • The SaveCallback function expected by qrenderdoc.CaptureContext.EditShader now has a different signature, that takes the ShaderStage being edited as well as the ShaderEncoding of the input files and ShaderCompileFlags used to compile the shader originally.
  • KnownSPIRVTool is now KnownShaderTool, and SPIRVDisassembler is replaced by ShaderProcessingTool.
  • CaptureContext.CreateWindowingData takes a QWidget instead of an int window ID, and must be called on the main thread.
  • CaptureOptions.verifyMapWrites is renamed to CaptureOptions.verifyBufferAccess.
  • GetDefaultCaptureOptions now returns the CaptureOptions struct directly.


  • Use a natural sort for resource names in resource inspector.
  • Remap index buffer on Vulkan when calculating vertex output data. This allows indices that are very sparse and wide to not over-allocate space.
  • Generate a reasonable buffer format string when opening raw buffer viewers based on the context where they're opened. E.g for vertex buffers it enumerates the types of all attributes referencing the buffer.
  • Improve heat-map display for quad overdraw and triangle size overlays. In addition to now being saved to disk as grayscale images, the picked values for triangle size are precisely accurate instead of being rounded to the nearest heatmap bucket.
  • Support display of MSAA textures over remote replay (primarily relevant for android).
  • Initialise adb on a thread since the first invocation can be quite slow, and we don't want to delay program startup.
  • When showing shader output value in pixel history, show all 4 components even if the output texture doesn't have 3 components.
  • Add support for Oculus VR end of frame markers in Vulkan.
  • In previous RenderDoc versions, for GL & D3D11 buffers that are created with 'undefined' initial contents were filled with a marker value like 0xfefefefe or 0xdddddddd. This behaviour is no longer the default, it is now enabled with the 'Verify buffer access' capture option (previously 'Verify Map() writes').
  • Implement MSAA <-> 2D Array copies on D3D12. Used primarily for saving multisampled images to disk, but also useful for remote replaying D3D12 captures.
  • Indirect calls on Vulkan now have their arguments read immediately next to the call (either immediately before for dispatches, or immediately after the renderpass for draws), instead of on the CPU. This ensure that even if the arguments are filled on the GPU the correct arguments are read back.
  • Make sure that internal resources created don't show up in captures with 'Ref All Resources' enabled.
  • Add a reminder message on the crash reporting dialog if the user has an old version installed.
  • Handle callstack resolution on windows even if DIA COM dll isn't registered, as is the case on VS2017 and up.
  • Add initialisation chunk markers to many missing GL functions, so they show up properly in the resource inspector.
  • Update RGA to 2.0.1 backend and add support for gfx900/gfx902.
  • Update GPUPerfAPI to 3.2.
  • Add support for ARB variants of glUniform functions.
  • Add support for GLVND with split libGLX/libOpenGL libraries.
  • Add support for OpenGL external objects/memory extensions.
  • Add support for a number of Vulkan extensions:
    • VK_AMD_gpu_shader_int16
    • VK_AMD_image_load_store_lod
    • VK_AMD_mixed_attachment_samples
    • VK_AMD_shader_core_properties
    • VK_AMD_shader_fragment_mask
    • VK_AMD_texture_gather_bias_lod
    • VK_EXT_astc_decode_mode
    • VK_EXT_external_memory_dma_buf
    • VK_EXT_pci_bus_info
    • VK_EXT_post_depth_coverage
    • VK_EXT_queue_family_foreign
    • VK_EXT_swapchain_colorspace
    • VK_EXT_transform_feedback
    • VK_EXT_validation_cache
    • VK_GOOGLE_decorate_string
    • VK_GOOGLE_hlsl_functionality1
    • VK_KHR_8bit_storage
    • VK_KHR_create_renderpass2
    • VK_KHR_draw_indirect_count
    • VK_KHR_driver_properties
    • VK_KHR_get_display_properties2
    • VK_KHR_incremental_present
    • VK_KHR_shader_atomic_int64
    • VK_KHR_shared_presentable_image
    • VK_KHR_vulkan_memory_model
    • VK_MVK_macos_surface
    • VK_NV_compute_shader_derivatives
    • VK_NV_fragment_shader_barycentric
    • VK_NV_geometry_shader_passthrough
    • VK_NV_sample_mask_override_coverage
    • VK_NV_shader_image_footprint
    • VK_NV_shader_subgroup_partitioned
    • VK_NV_viewport_array2
  • Handle generic compressed formats in GL by just remapping to uncompressed formats as allowed by the spec.
  • When creating a GLES3 replay context, retry without debug bit if it initially fails.
  • Add a friendly error message if using an Android 5.0 device or earlier.
  • Include resources referenced only in UpdateSubresource.
  • Improve performance for wrapped pools with frequent allocation/deallocation of wrapped API objects.
  • Improved replay of initial contents in D3D12 upload heaps.
  • Make message about closing android studio due to incompatibility much more explicit.
  • Reword buttons for capturing frames on capture connection window to be more clear.
  • Each capture reported has its API displayed, so an application using multiple APIs and copying from them will show which API was used for which capture.
  • Don't allocate too aggressively for stream-out output memory, to avoid bumping from 1GB to 2GB for 1.1GB of output data.
  • Added support for Intel performance counters on windows.
  • Add CopyStructureCount as a 'drawcall' level event.
  • Emulate ARB_program_interface_query if it's not available, even on desktop.
  • For formats on Vulkan that report only transfer bits (and not sampled image bits), report them as completely unsupported. This is spec-compliant because all required formats must support sampling, so these formats must be optional.
  • Added a progress bar for copies of captures back over a remote capture connection.
  • Add extra clarity to warning about injecting into running process not being generally supported.
  • Track backbuffer parameters on a per-context basis in GL, so two contexts with different sized backbuffers rendering in the same frame don't lead to a single backbuffer texture with the wrong size for one of them.
  • Add 'no to all' button when closing a capture connection and being prompted to save temporary captures.
  • Disable the use of nvapi, so that all nvapi functions are reported as unsupported. nvapi is not captured or replayed, or unwrapped during capture as necessary, so will likely lead to broken replay or possibly to crashes.
  • Exposed git commit hash query to python API.
  • Block use of AMD D3D extensions on D3D12.
  • Improve handling of D3D12 register space indices that are very sparse.
  • With remote replay, don't use slice in texture cache key for 3D textures. Avoids transferring the whole 3D texture for every slice needed - O(n2) transfers.
  • Display bound VAO in GL pipeline state viewer.
  • Change Vulkan vertex-output fetch to work even when all descriptor sets are being used by the existing shader.
  • Make sure options to hide empty marker regions in event browser work as expected.
  • Add '(Active)' suffix when displaying APIs in use by an application.
  • Improve ability to run a replay output with no backing window. Primarily useful for scripting to access output functionality without rendering anything to screen.
  • Shader debugging now blocks, displaying a progress bar if the debug process takes more than half a second. This prevents the user from clicking through to something else while the debug is happening.
  • Display compute-shader builtins as inputs for D3D shaders.
  • Add the ability to cycle the active window with a button on the capture connection dialog, primarily useful for android where in rare cases there are multiple visible windows and no keyboard to cycle.
  • Set previous/next links on marker drawcalls. Although marker drawcalls aren't part of the normal drawcall linked list, it's useful to have them point into it with previous/next so that iteration can start from a marker and continue through to proper draws.
  • Implement texture remapping to RGBA16/32 for D3D.
  • When performing image processing like slices-to-grid with high bit-depth images and saving to a format that supports it like HDR/EXR/DDS, perform the processing at 32-bit depth.
  • Skip read-only GL persistent maps without interception.
  • Adjust pipeline state flowchart active/inactive pipeline stage colouring to better suit dark theme.
  • When reading back luminance/luminance alpha formats on GLES do a blit to convert to RED/RG.
  • Add support for BitField{Insert,SExtract,UExtract} instructions in SPIR-V.
  • Add support for GL_QCOM_texture_foveated.
  • Make it more clear in GL pipeline state view when only depth or only stencil is bound, rather than combined depth-stencil.
  • Handle broken android distributions that don't have adb -g functioning properly, or where adb pull can't read the original apk.
  • Add ability to save .rdc file thumbnail in formats other than JPEG.
  • When running mesa driver, skip enabling AMD counters that might break.
  • Add padding when displaying signed integer 0 in buffer viewer.
  • Use 64-bit remote server on android where supported, to help avoid out of memory problems as well as on some drivers where the 64-bit driver has more functionality than the 32-bit driver (e.g. Vulkan physical device features exclusive to 64-bit version).
  • On Android devices, force screen to stay on while renderdoc is in the foreground.
  • Implement DXGI 1.6 & 1.7.
  • Added python API functionality to query for used driver version without capturing or replaying. The drvier version is now fetched on D3D, and printed on all APIs to the log on capture and replay.


  • Fix 100% failure to replay Vulkan or D3D12 captures introduced by recent AMD drivers.
  • Fix a crash on D3D12 where hardware support for available interfaces wasn't checked.
  • Fix hooking of GL/DX interop functions.
  • Fix serialisation of glFramebufferTextureMultiviewOVR not having correct framebuffer bound.
  • Avoid crashing in the general case when injecting into processes that are already running GL. Injecting into processes that have already initialised a graphics API is not supported.
  • Until D3D12 reserved resources are supported, return E_NOINTERFACE instead of passing through unwrapped resource which will inevitably cause crashes.
  • Shutdown adb if we're running our own internal copy, which could otherwise stay alive forever.
  • On linux prevent zombie processes from sticking around by adding custom sigaction handler.
  • Fix handling of CheckFeatureSupport queries in D3D12 for shader format support, by limiting to SM5.1.
  • Fix missing calling convention on EGL function pointers.
  • Fix 32-bit/64-bit incompatibility of captures using Vulkan descriptor update templates.
  • Handle dlopen(NULL) on android and linux.
  • Fix serialisation of passing NULL to glBindBuffers/glBindTextures multi-bind functions.
  • Fix a possible crash if Vulkan physical devices changed between capture and replay and the compatible GPU is a different index.
  • Fix a number of issues with GL hooking on windows and linux.
  • Support typedefs when decoding SPDB
  • Fix a crash if JDWP connection serialises a 0 length for a reply packet.
  • Fix serialising of client-memory indices on GL.
  • Fix calculation of size of UpdateSubresource source data.
  • Add a sleep on startup of hooked programs on linux, to give time for target control connections to queue early frame captures.
  • Fix a crash when trying to open shader viewer with no shader bound.
  • Fix a crash exporting pipeline state HTML when no capture is open.
  • Fix crash when dealing with D3D12 graphics command lists at higher interface level than is supported.
  • Fix a case where GL timestamps would be broken by markers.
  • Fix a crash if qrenderdoc takes a long time to run when installing Vulkan layer.
  • Fix calculation of the number of descriptors in a heap for an unbounded descriptor range.
  • Fix D3D12 samplers being incorrectly reported as not anisotropic.
  • Avoid deadlock issue in SHCreateDirectoryExW when called from DllMain.
  • Fix a potential crash when calling UpdateSubResource with 0 bytes of data.
  • Fix callstack capturing on OpenGL.
  • Avoid a race condition inside hooked GetProcAddress.
  • Add cache flushes and invalidates in Vulkan mapping code.
  • Fix crashes when application has no index buffer bound at an indexed draw.
  • Fix a number of cases with highlighting vertex/index buffers and vertex attributes on pipeline state view.
  • Fix default behaviour of windows installer to not overwrite files with a high version, it will now always overwrite.
  • Fix crash with D3D12 captures if a barrier is recorded for a resource that is otherwise unused in the capture.
  • Fix applying Vulkan memory initial contents after images and incorrectly overwriting them. Images are now always applied last.
  • Only do manual Qt event loop on windows where it's needed to work around a bug, on other platforms use normal Qt event loop as it's required there to work properly.
  • Call CreateWindowingData on main thread in case platforms have specific thread requirements for accessing windowing data.
  • Fix a crash serialising VkImportMemoryWin32HandleInfoKHR.
  • Don't crash if Vulkan library can't be loaded at runtime.
  • Fix incorrect discard of descriptor updates when the descriptor layout has immutable samplers.
  • Fix incorrect rendering of thumbnail over whole preview widget instead of just the thumbnail part.
  • Fix a crash when using multiple push descriptor bindings with different layouts.
  • When storing differences in map buffers align the start/end points to the buffer's StructureByteStride so that on replay we don't try to update an invalid section of the buffer.
  • Fix a crash if the texture viewer is closed while editing a custom shader.
  • Fix missing specialisation constant data when fetching Vulkan vertex output data.
  • On linux don't take address of glX symbols assuming they will be ours, instead grab our hooked aliases.
  • Add missing VKAPI_ATTR declaration on exported Vulkan layer functions.
  • Account for map offset when mapping with VK_WHOLE_SIZE.
  • Don't display vertex buffer if GL generic attributes are used.
  • Fix crash with input layout view button when no capture is loaded.
  • Fix crash when no Vulkan physical devices are enumerated on replay.
  • Fix broken iteration when deleting all resources associated with a GL context.
  • Fix potential trashing of GL state when serialising client memory fake buffers before activating a new context.
  • Add fallback handling if initial directory for VirtualFileDialog is invalid.
  • Handle EINTR properly with posix networking calls.
  • Fix incorrect handling of HS/CS shaders in D3D12 expanded pipeline state creation.
  • Fix hooking when a non-global dlopen happens, to search again for loaded libraries.
  • Fix handling multi-dimensional arrays in SPIR-V disassembly & reflection.
  • Fix calculation of array-of-structs bytesize calculation.
  • Fix handling of multi-dimensional arrays in GL uniforms.
  • Fix incorrect RTVFormats being specified when creating debug overlay pipelines on D3D12.
  • Workaround QTBUG-52697, manually specify high-dpi versions of icons in rich text.
  • Fix invalid zoom level being selected in texture viewer when no previous texture size is available to translate pan between textures.
  • Fix incorrect copy from 3D images when reading texture data back to CPU on replay.
  • Fix wrong resource type being referenced in glCreateQueries.
  • Handle unsized GL_DEPTH_STENCIL as a valid texture format.
  • Convert unsized renderbuffers to sized formats. This prevents GL implementations from creating pathological cases where an unsized texture is a different size to a renderbuffer an it becomes incompatible to copy between them.
  • Fix missing semaphore synchronisation when rendering Vulkan overlay on different queue.
  • Fix GLES display of wireframe overlay for non-indexed draws.
  • Fix a problem where loading a capture as GLES caused all subsequently loaded GL captures to be treated as GLES too.
  • Fix compilation of a number of debug shaders on GLES.
  • Fix D3D11 ClearBeforeDraw overlay not respecting visible range control.
  • Fix incorrect return of E_NOINTERFACE for recognised UUIDs in ID3D12Device::GetDevice().
  • Ensure cached pipeline state blobs are not used when replaying.
  • Apply backbuffer view format fixup to UAVs.
  • Fix invocation of kdesudo and gksudo with invalid parameters.
  • Fix some cases where root-level install of Vulkan layer on linux wouldn't work due to running qrenderdoc as a graphical program, instead run renderdoccmd.
  • Fix replay of SetResourceMinLOD on D3D11.
  • Fix state-setting in primary command buffer from affecting state listed in secondary command buffers in Vulkan.
  • Add GPU flush into D3D11 MSAA <-> Array copies so that slow GPUs don't TDR mid-way through the copy.
  • Fix display of storage buffers on Vulkan where there's no implicit root structure.
  • Fix crash if a hooked DLL is unloaded then reloaded at a different location, we change the original function pointers.
  • Handle WSAETIMEDOUT the same as WSAEWOULDBLOCK when doing blocking send/recv.
  • Fix invalid timeouts when remote replaying if a single command such as 'replay capture' takes longer than default timeout of 5 seconds. Long-running commands will send packets while running to verify that the connection is still alive.
  • Fix renderdoc not injecting if the application executable contains the substring 'explorer.exe', and instead require an exact match.
  • Fix display of stream-out in D3D pipeline state viewers.
  • Fix incorrect use of glMapBufferRange to read back indices when processing client memory vertex buffers, as index buffer may not be mappable.
  • Emulate glClearDepthf if not available.
  • Handle miscompiled SPIR-V when patching overlay shader.
  • Fix some cases where python interop wouldn't handle exceptions properly, especially with long-running or persistent function callbacks.
  • Fix handling of Vulkan vertex bindings/attributes which are not tightly packed.
  • When patching shaders for Vulkan vertex output fetch, remove any incompatible execution modes.
  • Fix using eglGetProcAddress for core functions which isn't always supported, fall back to regular OS-level function lookup in GLES libraries.
  • Fix RDStyle glitch where arrows on submenus didn't render correctly.
  • Fix incorrect declaration of CONCURRENT for Vulkan sharing mode when only one queue family exists.
  • Fix location of helper files relative to renderdoc as always being relative to the renderdoc library, not the current application. This allows functionality to work when loading the renderdoc python module where the application is the python binary.
  • Fix handling of push descriptors when calculating Vulkan vertex output.
  • Fix using glGetIntegerv instead of glGetFloatv to fetch GL_SAMPLE_COVERAGE_VALUE.
  • Fix a crash when not using interceptor-lib.
  • Fix missing align for array elements when fetching cbuffer contents in D3D12.
  • Fix depth/stencil overlays from being affected by current culling mode.
  • Fix depth/stencil testing not affecting quad overdraw on Vulkan & D3D12.
  • Fix blending not being enabled for viewport/scissor overlay on OpenGL.
  • Fix missing stencil from image on Vulkan when saving to disk.
  • Fix missing fetch of StructuredByteStride for BUFFEREX SRVs.
  • Fix check for undefined view format type on D3D pipeline state viewers that would cause the buffer format for typed SRVs not to show up properly.
  • Fix quad overlay on GL incorrectly binding array 2D array as non-array.
  • Fix skipping of sparse descriptor set bindings in Vulkan vertex output fetch.
  • Fix handling of multisampled targets with quad overdraw in D3D11.
  • Fix incorrect display of multisampled overlays on depth textures on D3D11.
  • Fix reflection of UAV textures as textures instead of buffers.
  • Fix potential race-condition with recreating completion object when adding environment variables for executable launch.
  • Fix fetching GL_DRAW_BUFFERn for values above GL_MAX_DRAW_BUFFERS.
  • Fix crashes when $HOME is not set.
  • Fix a crash when reading a corrupt capture file.
  • Fix potentially corrupted GL state when text rendering pushes/pops its GL state.
  • Fix corrupted data leaking in when doing glMap with GL_UNSYNCHRONISED_BIT immediately after orphaning buffer data, if the buffer data call initialised the buffer with marker data.
  • Fix handling of vertex builtins as both signed and unsigned on Vulkan vertex output fetch.
  • Fix D3D11.4 fence creation casting to the wrong type.
  • Fix thumbnail resampling code to eliminate rounding errors.
  • Fix potential overwrite happening when trying to workaround glTexImage2D initialisation of cubemaps. Only overwrite invalid/uninitialised mips.
  • Fix caret colour in scintilla not being the right colour in dark theme.
  • Fix potential incompatibility with external memory images, where they have lower memory requirements when external memory is used than when they're created standalone. Since replay never uses external memory this could lead to captures being impossible to open. Instead we create an image without external memory and report worst case of both memory requirements for the image.
  • Fix vkCmdPushDescriptorSetWithTemplateKHR which just didn't work at all.
  • Fix crash with using both graphics and compute push descriptors.
  • Fix missing handling of pNext chained physical device features struct when creating Vulkan device.
  • Fix potential crash if update check network request failed.
  • Fix incorrect image layout for depth image attachment when rendering depth overlay.
  • Fix undefined primitive topology used on D3D11 when copying MSAA texture to 2D Array.
  • Fix processing of implicit renderpass barriers & image layout transitions when partially replaying.
  • Don't call GetGPUVirtualAddress for non-buffer resources.