* The idea here is to directly extract a pointer and/or size and do few lookups
(hopefully only one) to verify that we have recognised the descriptor. We
still have the trie lookup as backup.
* For palettised image/sampler descriptors this includes initialising the
palette with the opaque data, and for regular image descriptors this means
recording the address range of images. Buffers we already have their addresses
which is all we need.
* This should really have been considered a property, it's unlikely drivers do
anything different, but we want to be able to count on it being present.
* ASs and samplers can only have one descriptor ever - we automatically fetch
this at creation time when descriptor buffers are enabled. We also fetch all
possible NULL descriptors at device creation and do not re-serialise them
afterwards.
* Image views may have either 1 descriptor (if layouts are ignored) or N (one
per layout). Buffers have N per offset/size and optionally format. These are
tracked for uniqueness in the corresponding resource record to ensure we don't
serialise infinite descriptors over time.
* For combined image/samplers since they are in a known format we serialise
these as-if they are image view descriptors only (with some extra data that we
ignore). The whole descriptor must still replay bitwise identical but we will
only use the image view part of it.
* This applies to all ASs, images, image views, buffers and samplers. Buffer
views are not used with this extension. We enable this globally even if there
are resources which wouldn't be possible to put in a descriptor (e.g. transfer
only) or if they are internal allocations. The ordering rules are poorly
written - as the letter of the spec goes it would be impossible to ever omit
this flag during capture since we can't put all capture/replay creates before
all non-capture/replay creates. On replay in theory we could, but we also
don't know how well drivers will implement these rules anyway.
* This will be optional in many cases but for some situations might be required
when type information is not implicitly available in the descriptor store.
Generally it should always be available unless the descriptor store is being
viewed 'blank' purely from its contents with no other context.
* We already enable this during replay, for descriptor buffer we will have to
have it match but in general it's a good idea to match environments between
capture and replay.
* This should not happen, the vulkan spec guarantees that this function must
return the same value passed in if there was one, and this can help detect BDA
addresses moving.
* This replaces the previous workaround disabling BDA capture/replay on
dedicated image memory, as that is not feasible with future functionality and
appears not to be the source of the bug seen before.
* Although this is believed to be a windows bug, it only manifests on NV so is
treated as an NV bug for now. A future NV driver should contain a workaround
for this so it can be disabled later.
* If a VS-PS declares a struct but there is an element which is declared but
never written in the VS (and never read in the PS) then we can't read from it
and must skip that element.
During Android >=15 app start android::uirenderer (i.e. the renderer for the APK's 'window') creates a VkInstance and VkDevice before the app does but after our layer has initialised. This is fine in principle because RD doesn't support multi-device capturing so the latter just replaces the former - unfortunately though the built-in shader construction is already underway at this point across the multiple threads. glslang's shader preprocessing is not threadsafe causing intermittent aborts and segfaults.
I haven't seen this on any app other than the RD demo app, presumably because 'real' apps take much longer to start up effectively serialising the shader processing.
Added D3D11_Workgroup_Zoo, D3D12 Workgroup Zoo, Vk Workgroup Zoo performance tests
Performance tests primarily for performance testing workgroup debugging speed
Changed workgroup and subgroup result variable from "data" -> "testResult" to help to reduce conflicts
* Scalar layout is required for vectors to straddle 16-byte boundaries but this
may not be detected if they are naturally aligned within an otherwise mis-
aligned struct.