Skip to content

Releases: baldurk/renderdoc

Version v0.28

25 Apr 23:50
Compare
Choose a tag to compare

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

Version v0.28

This release is mostly a collection of bugfixes from the last few months - a large number are Vulkan related, but some are from crash uploads and other bug reports. There are a few new features though!

For those who compile the code or are interested in development there have been some behind the scenes improvements - things like better organisation of build configurations, a new assert macro, extra warning levels enabled and the removal of the crash when no debugger is present if a non-release build fails an assert or hits an error message. If you're curious try building the code and have a poke around - that's the beauty of open source after all!

Features/Improvements

  • A button on the texture viewer to open the texture contents in the buffer viewer for custom raw formatting and inspect. Be careful not to make too many columns (you might be tempted to create texture_width columns) as the .NET control crashes hard 😢.
  • Support for separate unstripped shader debug info - thanks to Arne Schober!
    • This allows a workaround for shaders needing embedded debug info but normal builds not wanting that disk size overhead. Instead you can compile the shaders in debug, save the unstripped blobs somewhere on disk, and then annotate the stripped blob with a file path. Then RenderDoc will know to find the unstripped blobs from elsewhere.
    • You can also specify the file path at runtime with SetPrivateData. For more information see the docs!
  • .cap files can be opened via file->open and drag & drop.
  • A new button to abort the running of a python script.
  • When buffer viewers are opened from an API's pipeline state, any offset or length from the views is applied to the initial layout.
  • A new experimental statistics view - thanks to Michael Vance!
    • Adds a new pane with rudimentary API surface area statistics, such as draw call counts, resource sets, sampler & constant buffer updates, etc.
    • This functionality is currently only supported on DX11.
    • Information is currently presented in a primitive text-based view, but we plan to move to a proper set of UI primitives in the future.
    • API coverage is incomplete but covers the majority of the pipeline.
    • Future work will be centered around completing API coverage, enhancing detection of redundancy, proper UI support, and automation of capture and export of API statistics.
  • Input layouts now pick up names set with SetPrivateData.
  • The pan is kept consistent for textures with an integer multiple of dimensions. So when you're looking at a downsample chain that goes from 256x256 to 128x128 to 64x64, you won't have to re-zoom and re-pan when switching between these textures.

General Bugfixes

  • The installer now packages and runs the appropriate VS2010 redistributable in case you don't already have it.
  • When y-flip was enabled, texture pixel picking co-ordinates were off by one.
  • Fixed some depth textures not displaying as depth and instead just as if they were red-green.
  • When editing and replacing shaders, the pipeline state instantly refreshes, instead of needing you to manually select another drawcall then back to the first.
  • An OpenGL performance regression is fixed - push/pop debug labels were spamming out debug messages to the log file and tanking framerate.
  • When saving logs they're immediately added to the recent files list.
  • Fixed a bug that caused calling glUseProgramStages mid-frame for different stages to not replay correctly.
  • D3D11 input layouts are now dependency tracked instead of all being included in the replay
  • Fixes for calling glBindTexture with ID 0 - on replay the texture would not be correctly unbound.
  • Fixes for separablee shader patching.
  • In the API view glSamplerParameter and similar enum parameters now display as strings.
  • Fix for glShaderSoruce being passed multiple negative lengths - thanks to @olvaffe!
  • Treat baseVertex correctly as signed instead of unsigned, fixing crashes when it was negative
  • Fixes for some OpenGL context creation failures and broken attrib list parsing.
  • Some OpenGL shader compile fixes for intel.
  • Fix for EXT_depth_bounds_test not being available.
  • Some D3D11 constant buffer packing fixes.
  • Fix to allow capturing oculus programs - D3D11 fix to QueryInterface() of IUnknown - thanks to Jamie Hayes!
  • Reduce stack size in log function - previously it was allocating 4kb of stack which could cause pressure on threads with small stacks.
  • Fix an OpenGL crash when using custom shaders in the texture view.
  • A speculative OpenGL fix for a crash when functions like glTextureImage2D was called with no texture bound.
  • Fix a crash copy-pasting in the UI with nothing selected in the pipeline view.
  • Fix a failure when saving really low resolution images as JPG.
  • Several fixes for saving 2-component textures.
  • Minor fixes for quad overdraw ramp decoding on extreme overdraw amounts (>= 64).

Vulkan Bugfixes

  • Fix a crash when passing oldSwapchain to swapchain creation - typically on resize.
  • Fix a random crash exposed by changes in the post-release loader versions around physical device enumeration.
  • Fix the vulkan nag message on the capture screen not working properly with RenderDoc installs on UNC paths.
  • Fixes for sparse descriptor sets where not all bindings are used contiguously.
  • Reduced compute workgroup size for running on older cards with lower limits.
  • Support for an implicit memory unmap before free.
  • Fix a crash if swapchains are created with invisible windows.
  • Some protection against invalid/misconfigured code.
  • Fixes for 32-bit - it just plain didn't work before!
  • Improvements to the API view to show flags/masks as strings.
  • Fix for vkCmdDispatch calls not working when stepping through a frame.
  • Many more code validity improvements.
  • Many improvements and fixes to SPIR-V reflection and disassembly.

Version v0.27

16 Feb 14:02
Compare
Choose a tag to compare

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

Version v0.27

It's been about 12 months since I posted that I was adding OpenGL support - and that was 1 year after RenderDoc's release. It's fitting then that just a little before RenderDoc's 2 year anniversary I can happily reveal support for the recently released Vulkan 1.0 API. I've been working since last september on including Vulkan support in RenderDoc at the same time as the launch of the API.

This is the reason why development has been quiet on github recently, as most work was happening behind the scenes. There are some other features and improvements in this release as well, so check the notes below to see them all.

The RenderDoc installer is also shipped in the Vulkan SDK - this is absolutely identical to what you download above or build from code here, just repackaged seamlessly into the SDK.

Side note: The in-application API was bumped to 1.0.1 for a minor bugfix. Going by semantic versioning, this is a backwards-compatible change so any code loading 1.0.0 will get 1.0.1 and everything will work.

Features/Improvements

  • Vulkan 1.0 support!
  • Added a warning if D3D11.1 calls are captured and the replay is not able to run them.
  • If SetResourceName is called on the same resource many times, we de-duplicate and only serialise the last.
  • When viewing a really massive buffer the UI could have trouble displaying enough rows. Instead, we clamp the row count to 200,000 and display a warning to view other sections with the row/byte offset.
  • Support added for displaying and picking S8 textures on GL.
  • GL errors are cleared after operations that might potentially generate them (such as RenderDoc's fetch/apply state vector).
  • GL hooks are added for wglSwapBuffers, wglSwapLayerBuffers and wglSwapMultipleBuffers.
  • When viewing an image rather than a capture, added a retry when reloading the file on change, in case the change is detected while the file is still locked by another program.
  • Picking vertices in the mesh viewer will enable synchronisation between the input and output views.
  • Buffer viewer elements that are NaN/Inf will display properly.
  • Images saved with only one channel visible are saved as greyscale instead.
  • If a custom shader is used to view a texture, then the results of that custom visualisation will be displayed, rather than the source texture.
  • Viewport/scissor overlay should now hopefully be clearer to see.
  • Added support for reverse-z projection matrices in mesh viewer unprojection
  • When StartFrameCapture() is called from the API, if there is a window identified (i.e. it's not just NULL, NULL) then make that window active.
  • The texture viewer input thumbnails now show inputs from all shader stages, not just pixel shader.

Bugfixes

  • Fixed a crash if an update check was ongoing when the main window was closed.
  • Fixed a common crash on shutdown when closing D3D11 captures that began happening, due to a mismanaged refcount on ID3D11DeviceContext.
  • Fix GL crash with glMultiDrawElements.
  • Fix some incorrect GL state setting.
  • Fix IsFrameCapturing API to return true for captures triggered with TriggerCapture().
  • Add mutex around destruction code that could be run on multiple threads at the same time.
  • Possible fix for crash on linux depending on global initialisation order.
  • Fix an edge-case with wglShareLists by avoiding creating any internal GL data for overlay rendering until the last possible minute in SwapBuffers.
  • Stop an erroneous warning firing while shader debugging.
  • Fix find-in-files not properly clearing previous results.
  • Fix a GL crash if buffer orphaning isn't properly detected.
  • Remove queries to GL_TEXTURE_COMPRESSED and decide for ourselves based on the internal format.
  • Improve handling of difficult GL context juggling between threads when capturing.
  • Fixed a case where compute debugging would incorrectly complain that the thread index was out of bounds.
  • When glUseProgramStages is called mid-frame, we now correctly replay it instead of caching it incorrectly.
  • When depth or stencil test is disabled, the overlay now shows all-green instead of what would have happened.
  • Added an overlay 'clear before draw/pass' that shows only the results of the selection on the current RT.
  • Fixed an overly-strict check for compatibility between IA bytecode and VS bytecode input signature.
  • When modifying GLSL, we now handle whitespace better around #version and other directives
  • Changed the shortcut for File -> Exit as it was clashing with File -> Recent Capture Settings
  • Fixed pixel history on depth-stencil targets from going badly wrong.
  • When saving a log, change the window title from the temporary filename.
  • Fixed texture viewer scrollbars being inconsistent and annoying, which caused them not to map properly to the full range of scrolling.
  • Fixed a crash if a find dialog is open when the shader window closes
  • Fixed a possible failure in the version updater when it goes to restart the program.
  • Always return typed component format for images, fixes a potential problem saving e.g. EXR images from typeless formatted textures.
  • Fix a case on GL where FBO attachments of a specific mip wouldn't properly be restored on replay.

Version v0.26

25 Sep 19:53
Compare
Choose a tag to compare

As always, you can find binary downloads of this release on the builds page.

Version v0.26

This is a smaller release but there are a couple of key features included. The main one is that the serialised capture format has changed. The new format should be more flexible and extensible for adding new features (to come in a later release), and it also has built-in compression, so that capture files are smaller on disk with minimal overhead for loading and saving.

This version will be backwards compatible, such that logfiles from older versions (back to v0.20) will load. Captures made in v0.26 will not load in older versions. In the future these old logfiles will not work, but hopefully after this there should be no need to make a backwards-compatible breaking change.

In this version there is a new stable RenderDoc application API, which is designed to be forwards and backwards compatible and is strongly supported. If you were integrating RenderDoc before you will need to update your code before it will work with v0.26.

Features

  • Updated capture file format, to compress the captured data, and support addition of arbitrary data - more details to follow in a future release.
  • Added stable in-application API. See the renderdoc_app.h file - included in all binary distributions.
  • Added a new application updater, that will automatically download and install new versions when detected at the click of a button.
  • IronPython standard library embedding now just distributes a .zip file rather than trying to compile into a .NET dll assembly. This means importing the standard library should be much more reliable.
  • Empty viewports are now highlighted more obviously in the pipeline state view
  • Compute UAV slots now use shader variable name where available.
  • Copy, dispatch and resolve calls now show the relevant inputs and outputs, rather than the current graphics bindings.
  • Add support for some new GL ARB extensions
  • Improved support for many shader source files when debugging - on the left hand side of the shader panel there is now a list of all source files, that you can click to quickly jump to those files. In addition, ctrl-shift-f will open a 'find in all files' window.
  • Shader disassembly now happens lazily, which should mean improvements to log loading and shader creation during capture.
  • Added more fallbacks for detecting position input elements in the mesh view, and made sure that no matter what at least some element will be selected.
  • GL captures should now not be susceptible to results from later in the capture 'leaking' backwards into earlier in the capture, if e.g. a texture is written and read from without ever being cleared at the start of the frame.
  • GL function names in the event browser have been tidied up to be more readable - now only counts and important parameters are displayed, the topology, index width, offsets etc are not displayed.
  • Added a tips dialog, that is accessible via Help -> Show Tips. The tips are also linkable online

Bugfixes

  • Fixed an unfortunate crash that snuck into 0.25, where viewing DDS files caused a 100% crash.
  • Fixed a crash trying to pick a vertex in a drawcall with no vertices.
  • Fixed some cases where function pointers on GL could be called without being verified as present properly.
  • Updated checks for GL on replay - ARB_buffer_storage is required as well as 4.3 + EXT_direct_state_access.
  • Fixed an edge case crash handling nested drawcall markers.
  • Fixed crashes where bad mesh data (inf, NaN, etc) would cause a crash when calculating the bounding box.
  • Fixed a race condition where C++ to C# marshalling could fight on multiple threads.
  • Handle invalid filename characters in shader filenames from debug info
  • Corrected bounds checking of ld_structured_indexable
  • Changed imm_atomic_consume used in ConsumeStructuredBuffers to do a prefix instead of postfix decrement.
  • Corrected behaviour where if a cwd-relative pathname was passed to the in-application API for where to store captures, the UI would not be able to locate it.
  • Create any parent directories in the path specified for captures to be stored.
  • Fixed GL to not crash when RenderDoc is injected after GL has been initialised and used - instead RenderDoc will do nothing and capture nothing, which is consistent with D3D11 behaviour.
  • Fix an incorrect serialise of glCompressedTex_Image3D_() calls
  • Make sure to render GL overlay to the backbuffer.
  • Handle unsized formats better in GL texture calls.
  • Speculative workaround for nvidia driver crash
  • Fix case where a geometry shader with streamout would fail to create if numStrides == 0
  • Fix for a marshalling crash if struct field order wasn't returned in layout order
  • Several crash report bug fixes and speculative fixes.
  • Fixed a case where loading of DDS files failed due to a flag bit being set
  • If a machine doing a renderdoc capture has no D3D11 runtime installed, fall back to using d3dcompiler from the renderdoc installation.
  • Call SetLastError(0) after renderdoc WGL functions to avoid leaking out error codes that shouldn't be there.
  • Protect against crashes or bad behaviour if FinishCommandList is called on an immediate context.

Version v0.25

19 Jul 16:22
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 can be updated more regularly. You can choose which type of release you want to install and receive updates for.

Version v0.25

This version brings some new features, tweaks to existing functionality and the bugfixes that have happened since v0.24. As always feel free to get in touch with me or post an issue here on github if you encounter a problem, or if you have feedback or a feature request.

Highlights include multiple OpenGL frame capture and dependency tracking, bookmarked events in the replay UI, improvements to the mesh preview window and iteration on pixel history and shader debugging for further accuracy.

OpenGL captures will not be backwards compatible as work has continued on that front, but D3D11 captures are backwards compatible with captures from previous versions.

In the source tree there's progress being made on OpenGL functionality and Linux support - glslang is now compiled into the distribution for compiling GLSL to SPIR-V. It's currently disabled in release builds but this will ultimately be used to support shader debugging on OpenGL. Likewise there is a Qt UI currently being built that will eventually be supported on Linux with the same functionality as the current .NET UI. Potentially in future the .NET UI will be retired, if the Qt version ever reaches parity.

Features

  • You can now make bookmarks in the event browser. Clicking on the bookmark button or Ctrl-B will add a new bookmark at the current event. Then you can either click on the shortcut buttons in the bookmark toolbar, or anywhere in the program you can press Ctrl-1 through Ctrl-0 to jump to the first 10 bookmarks.
  • This allows rapid jumping between interesting drawcalls, particularly useful if you are comparing two drawcalls back and forth.
  • screenshot 2015-07-19 135749
  • OpenGL applications can now capture many frames without needing to restart the application.
  • OpenGL captures now do proper dependency tracking, which means that like D3D11 logs only the resources needed for the captured frame are included in the capture file, not all resources that are live at that point.
  • Several improvements to the pixel history view, which will now show fragments that shader clip in a list of several drawing in one drawcall. You can also run the pixel history on a particular mip or array slice in cases where rendering happens to only one.
  • A bunch of improvements to the user experience in the mesh preview window.
    • The window now uses 4x MSAA by default (since there's barely any pixel work going on, this hopefully should not be a significant performance hit for anyone).
    • The arcball controls are now improved and are based around the bounding box calculated and rendered for each mesh component.
    • You can right click on the mesh to 'pick' vertices and select them in the raw data tables. Note that for when you have several vertices that have the same position but different UVs or normals, the first will be selected.
  • image
  • The log loading progress bar should hopefully now be a bit more representative rather than remaining mostly static and jumping several times.
  • Textures can now be zoomed up to 25600%
  • Constant buffer data can now be exported to a CSV file
  • The RenderDoc in-application API file has been simplified to remove typedefs and STL include, and a couple of new API convenience functions were added.
  • When single-stepping in a shader debugger, if a register tooltip is open it will now live-update instead of becoming stale.
  • Views of resources in D3D11 now have their lifetimes tracked separately. Previously if a resource continually had views created and released they would all be stored and replayed, causing slight overhead on capture and potentially significant slowdown on loading the capture.
  • Registers and constants are now highlighted in the register windows when selected in the disassembly view.
  • screenshot 2015-07-19 150155
  • Ctrl-F3 and Ctrl-Shift-F3 will search for the currently selected word in shader editors.
  • If pixel debugging fails, instead of popping up a dialog saying that the current drawcall doesn't write to that pixel, instead launch the pixel history.
  • When RenderDoc is displaying an image, if the image is changed on the filesystem the data will be reloaded and displayed with the pan and zoom otherwise staying identical. Note that if the image dimensions or format change the results might be unexpected.

Bugfixes

  • Fix QueryInterface for IRenderDoc_uuid returning the wrong pointer and causing problems on Release() (thanks @zao). Also the proper ID3D11Device* pointer is now used for identifying a window, it was wrongly casted.
  • When editing shaders, #include file searching is case insensitive.
  • If cbuffers have identical names, use the order to identify which one is which
  • Fixed a case where the currently active window being removed would mean no window is active.
  • Fixed pixel history on a depth-stencil texture not working properly.
  • Fixed a case where unpack state was inconsistent on loading GL texture data.
  • When an array of shader resources overlaps with a single shader resource in terms of register binding, the single shader resource has priority.
  • Fixed serialising GL program uniforms incorrectly
  • Report ARB_direct_state_access as a supported texture
  • Handle Luminance/Alpha texture formats in glTexStorage functions (kind of crazy that someone would do that, but not hard to support).
  • Hide extra refcounts on D3D11 resources for being bound to the pipeline from the user, as some naughty code would rely on the undefined refcounts and error message.
  • Register renaming for constants now supports arrays properly and structure heirarchies better.
  • Fixed a copy-paste mistake on GL that would cause an undesired dependency on ARB_direct_state_access
  • Right-clicking on auto-fit will re-fit whenever the texture selection changes, even if the event stays the same.
  • A variety of crash fixes both real and speculative from uploaded crash reports.
  • Using the arrow keys to nudge the selected pixel now works when the pixel context view is in focus as well as when the main texture view is in focus.
  • Fixed a memory leak that could happen with buffer orphaning using glBufferData
  • Fixed D3DCompiler register packing insanity when using arrays of float or float2 interpolators.
  • Fixed a case where NaNs in a texture's alpha would cause the texture to display incorrectly even when the alpha channel should not be visible.
  • When changing a value in the range control and deselecting the change is now committed rather than being left at a misleading value.
  • Fixed buffers as resources showing up as 'unbound' instead of using a default image and displaying their name.

Version v0.24

02 May 12:38
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.

Version v0.24

This release is by and large a collection of bugfixes both from crash reports that people sent in and other bugs that have been reported. There's not much new functionality as I was busy for most of April moving country for my new job.

OpenGL captures are not backwards compatible and old captures will not load in this version - once GL support is fully completed this will not happen so often. D3D11 captures are backwards compatible, and old captures will open in v0.24.

Features

  • OpenGL contexts that aren't created via CreateContextAttribs will now be disallowed for capturing, as they are very likely to be pre-3.2. RenderDoc will use super-old fixed function GL to display the text overlay, so that even 2.0 or older contexts will work. Contexts created via CreateContextAttribs will be captured, regardless of whether they are compatibility or core profile, to allow more programs to use RenderDoc. This is a bit dubious as RenderDoc still only supports core profile OpenGL, but hopefully this line in the sand will prevent most old programs will allowing through few incompatible programs. (sort of a feature!)
  • A few places in the UI now use a monospaced font, such as mesh output and constant buffer viewer. There is a new option in the general category to display all data everywhere (such as pipeline state viewer, event browser, etc) in a monospaced font.
  • GL draw elements calls will now support passing indices as a direct memory pointer, as a concession to old GL code. Note that all vertex data must still be in vertex buffers in a VAO, direct memory pointers are not supported here.
  • Resources are now tracked by usage in OpenGL, so the timeline bar will correctly indicate reads and writes per resource, as well as the thumbnail right-click menus in the texture viewer.
  • RenderDoc should now handle having multiple APIs alive in a program, which in this case means GL and D3D11. Cycling between active windows will cycle between all APIs alive.
  • Added in-API ways to detect RenderDoc. GL via this extension and D3D11 via querying the device for UUID A7AA6116-9C8D-4BBA-9083-B4D816B71B78.

Bugfixes

  • GL cubemap and array textures weren't properly showing the slice or face for mips above level 0.
  • When invalid indices like 0xcccccccc or 0xbaadf00d etc were used (probably by accident - but this is a debugger after all) for the Post VS mesh data we would stream-out all indices between the minimum e.g. 0 and that value, even if only a small subset were used. This caused out of memory and driver crashes. Instead we now only stream-out the indices used.
  • Fixed a crash when debugging such an invalid index.
  • Fixed a crash if vertex instance rate is 0 for instanced data (which is valid - the first element is used for every vertex).
  • Copy, Resolve and GenerateMips calls will now show up with draw calls in the event browser, to make it more clear where these events happen in the frame.
  • Fixed a crash if the constant buffer viewer is still open when a log is closed.
  • Fixed a crash if for some reason a shader debug trace comes back with no states.
  • Crash fix with CopySubresourceRegion if a box is specified.
  • Fix depth render target being larger than the colour render targets in D3D11 (was detected as invalid, but D3D11 allows this).
  • Fix from @vvuk - Present1() was using the wrong DXGI interface.
  • Fix a crash introduced in previous version, where SetPredication(NULL) would not be replayed and predicates would be left bound - which caused driver crashes.
  • Fixed some crashes if an index buffer wasn't multiple of 4 bytes, and fixed GL unsigned byte indices.
  • Fixed a couple of problems with the "remove empty marker groups" option - a crash if a marker group has an empty group as a child, and fixed calculating timings completely screwing up the drawcall list.
  • ld_structured was incorrectly looking at only UAVs to calculate its stride, instead it should check for the matching resource.
  • A few DX bytecode instructions assign to a scalar destination from a vector source, and these needed a fixup in the debugging to properly handle swizzles.
  • Fixed some crashes and problems with shader editing when the source has multiple files with #includes
  • With the SPDB debug chunk (which is produced by new d3dcompiler versions) #defines that are specified on the command line or to D3DCompile are now used when editing, to recompile the shader.
  • Executing python scripts that Invoke onto the render thread will now catch any python exceptions that are thrown on that thread, instead of crashing with an uncaught exception.
  • Shader debugging variable tooltips now show hex as well as int and float, and the register windows now show the tooltips as well as the source window.
  • Fixed some crashes if ctrl-c is pressed without a log loaded, and added copy-paste handlers to the GL pipeline state view.
  • Fixed a crash with the GL text overlay in-program, if the string is formatted very long and/or the glMap fails.
  • When redeclaring gl_in and gl_out in a GL shader only one of the redeclarations would be added, this is fixed.
  • Fixed shader debugging 'run to' command checking instruction number against trace length - which could be different whenever flow control occurs.
  • Outputting matrices from a shader in GL will now be listed correctly in the mesh output.
  • Clamped mips in textures without mips (but that aren't created immutable) to correctly bind when calculating min/max or histogram.
  • ID3D11Debug interface is wrapped, so that querying for ID3D11InfoQueue via it will return our dummy info queue.
  • The disassembly source window has a custom right-click menu now with relevant controls.
  • Temporary captures from a program connection window are kept around for longer even when saving them to a file. This prevents captures from being lost if a user saves them, then deletes the saved capture, and wants to save the capture again.
  • Fix a crash if an invalid filename is passed to D3DCompile as the source filename.
  • Fixed mesh preview window for geometry & tessellation output.
  • MultiDraw drawcalls now correctly create a nested section in timeline bar.
  • Fixed a crash if glUseProgramStages is called with program=0 to unbind.
  • Fixed an edge case where RenderDoc would incorrectly cause a program to run out of D3D11 state objects by caching them aggressively, if the program creates many temporary objects that are all unique.

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)