* We tune the pipeline state view and texture viewer to only iterate over a
small list of dynamically used binds in the (vastly more common) case where
unused binds are not being shown.
* This simplifies the code flow because we can be sure that we always have
cached read-only/read-write resources (this was true before, but now it's
clear).
* Using the auto-resizing mode of RDHeaderView resizes based on the whole column
every time, which is wasteful when only a few lines are added to a large log.
* Newer Qt versions will base64 the byte arrays even if we've already base64'd
them so they're safe. To prevent this we explicitly convert to QString
afterwards.
* This is still accurate, what we're missing is "read data as int, then cast to
float" which is represented by setting 'floatCast' to true. A normalized cast
or interpret is accurately represented by saying the input is snorm/unorm
typed.
* This is a leftover artifact from before we had general extended type support
and double was the only non-32 bit type we handled. Now we support most type
formats so doubles are just CompType::Float with 8 byte width
* We can still highlight them as empty the same as we do for insufficiently
sized constant buffers, but we should display the proper resource contents.
* Actually creating a 64-bit spinbox is not feasible without constructing it
almost from scratch due to how much QAbstractSpinBox depends on private
internals that can't be overridden. Instead use a QDoubleSpinBox with no
decimals since we don't need the full 64-bit range, and the mantissa of a
double is enough.
* E.g. on D3D12 we can debug DXBC shaders but not DXIL shaders. On vulkan this
will allow us to have the UI work better when encountering shaders with
unsupported capabilities or extensions.
* There was a race condition where the newly created HWND surface could
be resized during swap chain creation. This causes a
`VK_ERROR_DEVICE_LOST`, but is very timing dependent.
* The fix was to finish the resize, via `ResourcePreview::setActive()` /
`QWidget::show()` before scheduling any async functions that could
create a swapchain, namely `IReplayOutput::AddThumbnail()`.