* This function patches a mesh shader to write to BDA instead of the output
object, as well as storing the vertex/primitive count. It separates indices,
per-vertex rate outputs and per-primitive rate outputs. The output is stored
not fully interleaved because we replace pointers in-place and they may be
combined if an output is a struct.
* If preceeded by a task shader, it will read a per-dispatch offset to account
for the fact that each task group produces an independent series of mesh
groups that can't differentiate from each other. Within that set of groups,
each group assigns its output linearly and this output will potentially be
sparse as it's sized based on the worst case output.
* This task shader is relatively degenerate, it just loads payload & dispatch
size from a buffer, writes to the payload, and dispatches. Used to
deterministically replay the same set of tasks as were saved.
* We do this by patching the shader to write to BDA pointers instead of Payload
pointers for all payload pointers, and also store the number of meshes
dispatched.
* After running this shader we'll read the results back and then feed the data
back onto the GPU via our own task shader, to ensure we can conservatively
size the mesh output buffer accounting for whatever task shader expansion
happened.
* This supports capture and replay of mesh draws, shader editing with printf
support, overlays, and pixel shader debugging.
* Not supported yet include the mesh viewer and shader debugging.
* The enums are given after compute, to preserve indices for the normal vertex
pipeline.
* Mesh dispatches are considered a new action type, rather than being bundled
into the `Drawcall` type. This will allow them to be distinguished by API
backends as needed. The UI treats them as drawcalls
* We apply this universally even though it's not relevant to D3D11/GL. It means
a couple of empty array entries but it should not cause any significant
issues.
* Shader messages will be identified by group and thread as with compute
shaders. For mesh shaders there is an additional subdivision to identify them
by task group, since each task group can submit a grid of mesh groups.
* Add helpers for creating DX op instructions with less boilerplate.
* On encode, strip any unused functions or globals to comply with strict
DXIL validation requirements.
* Create attribute sets on demand to match functions.
* Add some extra helpers for creating constants, blocks, and patching
runtime chunk.
* This prevents us from returning function pointers that should be NULL for core
functionality (or promoted extension functionality) which an application may
see and then try to call. The spec requires us to return NULL for these cases
(except for non-maint5 future core versions, but we can legally return NULL
there and that's the correct thing to do as the maint5 feature bit is stupid).
stb_image v2.12 has a memory corruption bug, updated to v2.28 to fix.
The only real API change is stb_image_resize.h is now stb_image_resize2.h, and stbir_resize_uint8_srgb() doesnt take alpha channels or flags as params.
This callback determines which tests passed or failed for a given
draw during pixel history. The set of tests mirrors the Vulkan
implementation, with some adjustments for D3D12 capabilities.
The code for updating PixelModification structs during pixel
history is included as well since they're related.
The buffer format help can be accessed via first opening the raw
buffer viewer (e.g. from the actions section on the texture viewer),
and then clicking the "?" under saved formats. It includes a nice
summary of the format syntax, but says that "Exhaustive documentation
can be found in the online docs." That was supposed to include a link
to https://renderdoc.org/docs/how/how_buffer_format.html, and in fact
it renders as if it were link, but clicking on it did nothing.
This has been fixed by adding `Qt::LinksAccessibleByMouse` and
`Qt::LinksAccessibleByKeyboard` to `textInteractionFlags`, and also
setting `openExternalLinks` to true (which requires use of a
`QTextBrowser` instead of a `QTextEdit`). I left the full list of flags
as `Qt::TextBrowserInteraction` does not include the
`TextSelectableByKeyboard` flag (which seems useful here and was
included before).
I verified that other uses of links work properly via checking all of
them found via `git grep href`:
* CaptureContext: Uses `QMessageBox` which defers to the style's `SH_MessageBox_TextInteractionFlags` which in practice has at least `Qt::LinksAccessibleByMouse`:
* https://github.com/qt/qtbase/blob/v5.15.11-lts-lgpl/src/plugins/styles/mac/qmacstyle_mac.mm#L2850-L2852
* https://github.com/qt/qtbase/blob/v5.15.11-lts-lgpl/src/widgets/styles/qcommonstyle.cpp#L5303-L5305
* https://github.com/qt/qtbase/blob/v5.15.11-lts-lgpl/src/widgets/styles/qfusionstyle.cpp#L3702-L3703
* AboutDialog: sets `openExternalLinks` to true on the `version` and `contact` labels in the ui file
* AnalyticsConfirmDialog and AnalyticsPromptDialog: uses `on_label_linkActivated` as an automatic slot (as it needs custom handling for opening the documented analytics report)
* SettingsDialog: uses `on_analyticsDescribeLabel_linkActivated` as an automatic slot (and only has an internal link for opening the documented analytics report)
* CrashDialog: several different ones:
* captureFilename works via `on_captureFilename_linkActivated` as an automatic slot (and opens a file in explorer)
* reportText has `openExternalLinks` in the ui file
* on_send_clicked uses `RDDialog::information` with an email address, which uses `QMessageBox` (see CaptureContext)
* finishedText has `openExternalLinks` in the ui file
* ExtensionManager: sets `openExternalLinks` to true on the `URL` and `author` labels in the ui file
* TipsDialog: sets `openExternalLinks` to true on the `tipUrlLabel` label in the ui file
* nv_counter_enumerator.cpp: sets `openExternalLinks` to true on the `counterDescription` label in PerformanceCounterSelection.ui