Skip to content

Releases: baldurk/renderdoc

Version v0.23 - Bugfix release

03 Mar 13:43
Compare
Choose a tag to compare

Version v0.23 - Bugfix release

Long story short: use v0.23 instead of v0.22, it is almost the same but with a very important bugfix included.
Builds are available in the usual place, both stable and beta updates.

Shortly after v0.22 was released I received a serious bug report that unfortunately hadn't been caught by my testing. It affects any D3D11 application that uses MSAA and can easily cause driver crashes when capturing, so the only realistic option is to make this new release with the bugfix included.

This release is almost identical to v0.22 so for new features & improvements I refer to those release notes. This release is primarily to include the fix for the above crash bug, and a few other fixes for bugs that were either recently reported over the weekend, or were found while verifying that v0.23 is more solid.

Version v0.22

27 Feb 15:52
Compare
Choose a tag to compare

NOTE: A crash bug with D3D11 & MSAA has been found in v0.22. It's recommended that you instead use v0.23 with the fix included.

Binary zips and installers for this release (and others) can be found on the builds page. Both stable and beta builds are up to date with this release, but beta builds will be updated more regularly. You can choose which type of release you want to install and receive updates for.

Version v0.22

Almost exactly 1 year ago from the time this release was posted, RenderDoc was first released to the public. Initially the source code was not included, that came a few months later in early May 2014.

RenderDoc was a hobby project that I had worked on entirely in my spare time for about 18 months, and I had no idea of what kind of reaction to expect. The positive feedback and hearing how the tool has proven useful to people finding and fixing bugs has been very rewarding, and I really appreciate everyone who has taken the time to try it out, use it, as well as to everyone who has given feedback, reported bugs or contributed to the repository.

RenderDoc has come a long way in the last year, and I know that it has a lot farther to go in many respects. I'm looking forward to seeing where it goes in the future, but I wanted to take this opportunity to thank everyone!

OpenGL Support

The big push for release v0.22 has been OpenGL support. While it's not quite at feature parity with D3D11 (and there's no linux UI - yet!) it's definitely at a place where I would encourage everyone to use it in anger and give feedback. I've tested it across many modern GL projects and titles between windows and linux and while it still has work to do, it's in a good shape. Please let me know how you get on with it!

RenderDoc supports OpenGL core profile 3.2-4.5 inclusive, which means it has full support for modern GL techniques like persistent mapped buffers, MultiDrawIndirect, and everything in Core OpenGL 4.5.

multidraw
azdo

Note: Only core profile 3.2-4.5 is supported. This means that any old codebases using older versions of GL or the compatibility profile functionality may not capture and replay. For more details on the exact limitations and requirements at the moment check out the wiki page.

I'd like to give particular thanks to Matías N. Goldberg, who tested RenderDoc's early OpenGL support on Ogre3D's 2.1 modern GL branch. Thank you for your endless patience while I fixed all the broken stuff! 😄

API Changes

While it's not a particularly stable and solid API just yet, RenderDoc does export some functions for use with applications that want to integrate RenderDoc more tightly into their codebases. This is just a warning to those of you who are using this API that there have been some changes since v0.21, and you should be careful to make sure you update properly. I'd recommend always checking RENDERDOC_GetAPIVersion matches RENDERDOC_API_VERSION as this will allow me to bump the version on any breaking API changes. In future when the API is more finalised and 'official', this should not happen often.

In particular this time, the CaptureOptions structure has changed a little, and wchar_t * strings are now expected to be char * UTF-8 strings.

Highlighted Features

I've listed just the highlighted new features. There have been many bugfixes and smaller improvements as well, but I am too lazy to list them all - if you're curious check out the issues or changes.

  • RenderDoc can now act as a simple image viewer. This is a difficult feature to make obvious, but you can now load images as you would logfiles - either via file -> open, or just dragging into the viewer. The texture viewer controls work as normal. RenderDoc supports .dds, .hdr, .exr, .bmp, .jpg, .png, .tga, .gif, and .psd, and the dds file support should include any DXGI format and any number of slices, cubemap faces or mips - things traditional image viewers have a harder time with. The save tool has also been updated to save .exr files.
    imageview
  • The mesh preview window has had several improvements. Selecting instances in an instanced drawcall should now behave correctly in all circumstances, and choosing how the 3D preview will display is much more flexible. You can now right click on any column headers on input or output to choose which one will be used as position data for rendering, and which will be used as 'secondary' data, to optionally be displayed as a solid colour in the preview.
    mesh1
    mesh2
  • When using the pixel history feature, MSAA targets are now fully supported and the sample debugged will be the sample you are currently viewing (if you're viewing the average resolved image, any sample will be chosen). Also when a pixel is overdrawn by several fragments in a single drawcall, you can now select the fragment you want to debug and right click on it to see the result from that fragment, even if it's later overwritten.
    pixhist
  • There is now a very rough and early python scripting interface. You can open either an interactive shell or run a script (loaded from disk or edited live), and there is a simple python object that allows access to most of the raw data and control that renderdoc offers, so you can see all textures in the log, browse the drawcalls, cause the UI to jump to a drawcall or view a texture, etc.
    pythonshell
  • Most overlays now support MSAA targets, so you can see sample-accurate depth-test results etc.
  • Most UI windows now have copy-paste handlers, so e.g. in the constant buffer window you can select any number of constants and hit ctrl-c to copy them to the clipboard.
  • The D3D11 pipeline state can also now export the entire state to HTML (example exported pipeline) - this can be useful for comparing between two logs or two events to see if anything has changed.
  • When capturing an application that spawns child processes (such as a launcher application), the UI in the connection dialog has been improved. It will now show each child process that exists and give you the option to open a new connection to that process instead of the one originally launched. Also if a process only has one child when it exits, the connection will automatically transfer to the child process, in the assumption that it is the one you wish to trace.
  • It is now possible to activate a 'global process hook'. Read the documentation before using this feature as it can be dangerous to use without understanding. It will automatically insert a tiny dll into every new process started on the system, and when the target process that you want to inject is launched, this tiny dll will load renderdoc. This can be useful in extreme cases to capture programs that are launched indirectly or via pipes from another launcher process.
  • When capturing you can now enable an option to verify Map() overruns. This will activate in the captured frame, and insert a marker value at the end of each Map(). If the marker value is modified a message box will appear letting you know and giving you the option to breakpoint in the debugger to trace the problem.
  • While in the application, captured frames now 'decay' from the overlay after a certain length of time. If you're trying to capture some particular frame glitch and you end up with a lot of frame captures that didn't hit it, then this keeps the overlay from having a massive long list of captured frames.
  • Although largely untested since it's very rarely used in the real world, RenderDoc should now support DXGI 1.2/1.3 and DX11.2. The exception being tiled resources in DX11.2 as I couldn't find a single sample or example code that used them - if you have anything let me know so that I can write support against a real program.
  • The pipeline view has had a few tweaks to make better use of space - in particular rarely used sections like UAVs and shader linkage on D3D11 will vanish if there is nothing bound, to make room for the other sections. Also when moving between drawcalls if at all possible the pipeline view will try to avoid scrolling, so that you can more easily compare higher slots between two drawcalls.
  • When running on a system that doesn't have Feature Level 11 hardware, RenderDoc will now fall back to WARP software rendering rather than failing to replay. While slow, for simple cases this might mean it is still usable.
  • When shader debugging, hovering over a register in the disassembly will now show a tooltip with all three possible interpretations of the register. This is mostly useful if a register has mixed float and int data and you want to see them both quickly without needing to form complex watch expressions.
    reghover
  • The texture viewer has had a ...
Read more

Version v0.21

24 Sep 14:25
Compare
Choose a tag to compare

Binary zips and installers for this release (and others) can be found on the builds page. Both stable and beta builds are up to date with this release, but beta builds will be updated more regularly. You can choose which type of release you want to install and receive updates for.

Below are the visible changes since v0.20. There have also been a bunch of internal changes like lots of work to OpenGL and linux support (still lots to do, but progressing well), so if that interests you keep an eye on the changes here on github 😄

Other than many bugfixes some highlights include support for the missing common shader debugging operations, pixel history, a quad overdraw overlay, and a revamped save texture function.

As a side note, for users of Unreal Engine 4 there is a plugin for it that was written by Temaran, which integrates RenderDoc closely into the engine.

Bugfixes

  • When 'debug device' was selected, if any debug messages were saved to the log there was a crash reading the log.
  • Shader bytecode reading is more robust when undocumented data is encountered (See #54)
  • Shader viewer didn't display line numbers for files with > 1000 lines (See #57)
  • Fix Shader debugging always using pixel shader resources & samplers (See #59, #75)
  • Fix views of the backbuffer failing if their format was specified as DXGI_FORMAT_UNKNOWN (Part of #53)
  • Default options weren't properly set on capture, this together with #61 fixed other part of #53
  • As a follow up, prevent crash closing logs with #61 (it might still break in other ways though).
  • Fix for crash-reported exceptions thrown while reading from/writing to config files.
  • Possible fix for reported crash after failing to inject into a process
  • Shader debugging fix for circumstances where sampling parameters are long (See #64)
  • Fix a crash if UpdateSubresource is called on a resource otherwise not referenced in a frame.
  • Fix deferred command list executes not showing children
  • Fix for case where multiple executes of the same command list were not handled correctly
  • Possible fix for reported crash with invalid Rect inside dockpanelsuite code.
  • If a constant buffer has no reflection data available, the buffer viewer is opened (See #60)
  • When reading matrices from constant buffer data, respect padding of each row/column to a vec4 (See #69)
  • Skip anything but the first geometry shader output stream (partially addressing #27)
  • Handle streamout declarations with NULL semantic name - specifies a gap (See #55)
  • Fix a case where EndEvent marker calls right before the final Present() would be lost.
  • Fix an incorrect use of std::map operator[] that would add invalid entries and possibly cause a crash.
  • Address inconsistent use of culture formatting, with numbers potentially formatted as "0,0" but a list of numbers as "X,Y,Z,W". Given lack of localisation, instead we now always use UK English culture (See #72)
  • Fix not being able to launch a process for capture on 32bit windows - it was mis-identified as a 64bit process (See #66)
  • Fix 'how did this ever work' style bug, where matrix copies would copy the size of the whole matrix for each row (and overwrite their array bounds)
  • Changed to IAT hooking from mhook trampoline hooking, for better compatibility with some dlls mhook couldn't rewrite (such as 64bit opengl32.dll)
  • Workaround for internal compiler error in D3DCompiler_43.dll when pixel debugging by avoiding flow control, also now bundle D3DCompiler_47.dll with installation to help avoid this happening again (See #81)
  • Change behaviour when 'allow fullscreen' is off to be more compatible with applications, even if it involves less consistency (See #80)
  • Fix initial contents not being applied before first internal log-readthrough, which lead to incorrect values being fetched when decoding Indirect() draw/dispatch calls.
  • When shader debugging, helper pixels continue to run without having any side-effects, to ensure gradients are correct.
  • Fixed a crash on log close when replaying over the network on a remote host
  • Fixed a crash in shader disassembly when debug info is present and an input file is completely empty.
  • Better display of struct types in constant buffer previewer
  • Speculative fix for a crash enumerating log viewers while loading a log (See #77)
  • Fix texture histogram not properly respecting channels - it was only ever reading from Red rather than whatever combination of channels you had selected.

Improvements/features/additions

  • Added support for arrays in the buffer viewer (#56) and hex-formatted values as xint, xshort and xbyte
  • Added a bit visualisation to shader debugger, e.g. r0.x,b will display 32-bit binary visualisation (Thanks Kamuyuq - #71)
  • Pixel co-ordinates displayed in status bar on the texture viewer are clamped to the dimensions of the texture (See #68)
  • Add ability to show checkerboard/solid coloured background even when not displaying alpha to make texture boundaries clearer (See #69)
  • Add toggle for by-convention gamma 'correction' of linear data (See #58)
  • Added a faint hint text to the working directory box, indicating that the working directory will be guessed from the executable.
  • Support for setting a friendly name via SetPrivateData() on shaders
  • Added a button to flip textures vertically, mostly useful for systems that render upside down until a final flip
  • Sample selection added to the texture viewer, to allow choosing which sample to show (or a resolved image) when viewing a multisampled texture (See #79)
  • The constant buffer previewer now allows you to set a custom format for when reflection information isn't available, the same as the buffer format viewer.
  • Implemented several missing pieces of functionality in shader debugging:
    • Indexable temp registers x0[] etc, commonly generated for sampling kernels or other dynamically-indexed set of constants (See #73)
    • Groupshared memory, in compute shaders, and atomic opcodes interacting with uavs or groupshared.
    • Support for texture UAVs
    • gather4* opcodes (Thanks valeriog-crytek - #75)
    • samplepos, sampleinfo, lod opcodes
    • New double type opcodes from D3D11.1
    • SV_Coverage and SV_PrimitiveID semantics (See #74)
  • Added a pixel history view. Launched from the texture viewer next to the debug button, the history shows all pixel modifications of the selected pixel since the start of the frame on the current texture.
  • Pixel history in action
    • For each event that modified the target it shows whether or not it successfully wrote at least one fragment, or whether a test e.g. depth test failed. You can then expand it to see each fragment that wrote.
    • UAV modifications are simply listed as before/after values since by definition there isn't a 1:1 correspondence with which pixels wrote to a given texel.
    • While the pixel history window is selected, the timeline bar shows modification events instead of texture usage.
    • Failed events can be hidden, optionally.
  • Added an overlay 'quad overdraw' which shows overdraw on a per-2x2 quad basis. Thanks to Stephen Hill @self_shadow) for the idea and implementation.
  • Quad overdraw - comparison with and without depth prepass
  • Save texture functionality has been completely revamped.
    • Textures can now be saved to several forms - DDS, PNG, JPG, TGA, BMP, and HDR (radiance)
    • DDS will attempt to preserve the original texture as much as possible - saving out depth/array slices, mips and preserving the original format.
    • For other formats you can select how you want to map down the texture - selecting mips, exporting only one slice or multiple, mapping HDR images to 0-255 LDR.
    • Revamped save dialog
    • Slices of a depth texture can be saved in a grid
    • Slices saved as grid
    • Cubemaps can also be saved in a cross pattern
    • Cubemap saved as cross

Release Version v0.20

25 Aug 18:05
Compare
Choose a tag to compare

Bugfixes

  • I vastly improved the handling of line number information coming out of SPDB chunks in shaders. This means better inlining of HLSL when building with newer FXC versions. (#32)
  • When using #line directives I do a much better job of finding the correct source if it's available, and then using that source to inline HLSL. If the original file is attached to the shader debug chunk, it will be preprocessed to fill out the 'fake' files specified by #line directives. (#31)
  • Loading layouts could still cause a crash with a race in the mesh viewer if a very large set of geometry was being viewed (#14)
  • When seeking through a logfile to find the start of a frame capture and skipping chunks, if the buffer window reallocated during reading a chunk this wasn't handled. Lead to a rare crash loading a logfile, more likely the smaller the log is. (#38)
  • Typeless multisampled textures now have their initial contents saved when detected necessary. (#43)
  • In rare cases - I'm not sure what triggered it - when enumerating DLLs in the target process renderdoc would be returned as RENDERDOC.DLL, and so the code would fail to find it. DLL searching is now case-insensitive. (#25)
  • Opening a new texture viewer window while a log is open would cause a crash. (#35)
  • If a deferred command list had a marker as its very first event, this would cause a crash when loading the log. (#33)
  • When creating multiple blend states with equivalent but different descriptors (e.g. blending disabled but different functions), these would be created as unique states and serialised out as unique states, but upon reading the descriptors would be the same and cause overlaps and likely crashes. (#44)
  • Fix a crash if no input vertices are selected and you click to debug the vertex shader.
  • Fix a crash when there is no mesh data and synced scrolling is enabled.
  • Return the correct contents for structured buffers vs. static resource typed buffers.
  • Range-check DstSubresource value, so that a too-high value passed in doesn't cause an immediate crash.
  • Fix the shader viewer looking in the wrong place for UAVs when displaying the register bindings.
  • List the different streams on the output signature of geometry shaders.
  • Fix a crash where a drawcall referencing invalid indices would cause RenderDoc to try and allocate way too much space and fall over.
  • Fix the display of D16 depth buffers.
  • Fixed the implementation of float compares in shader debugging that were using integer compares.
  • If no markers are present in the log and RenderDoc automatically fills out some defaults, the last draw (usually Present()) would get lost.
  • Logs now serialise strings as UTF-8 instead of windows wchar_t, to make logs portable between platforms
  • Fixed a crash changing the show disabled/show empty toggles in the texture viewer if no log is loaded

Improvements/features/additions

  • It's very early days, but I've put in a skeletal framework of OpenGL support. e.g. You can now capture the 'bumpmapping' superbible 6 sample on windows or linux, and replay it on windows and inspect basic things. (#47)
  • To support the above, the C++/CLI wrapper DLL was removed in favour of direct P/Invoke from C#.
  • There's an option in the settings window that lets you choose where temporary logs are saved, in case %TEMP% is an inconvenient location. (#40)
  • Temporary log filenames no longer append _ for each subsequent capture, they format the filename with the frame number. (#39)
  • Applications that rely on the specific refcounts of backbuffer resources when resizing (I saw this in UE4 at least) will now have the same values reported with and without renderdoc. (#41)
  • When editing a shader that doesn't have debug information embedded (so no HLSL) the generated stub shader will now include textures, buffers, samplers and constant buffers. (#13)
  • While debugging a pixel shader, any discard/clip operations will visibly stop immediately on the instruction, rather than the highlight jumping to the end of the program. (#45)
  • There were many problems with the resinfo assembly instruction (equivalent of GetDimensions in HLSL) (#36)
  • Implemented a few more shader debugging instructions, including the double instructions and ld_raw/ld_uav_typed.
  • Float formatter is now used for unorm/snorm type values in the mesh viewer (ie. if they're intended to be shown as floats, even if the source data isn't floating point)