* For some #extensions we can fallback to a lesser path (or just drop
that functionality - e.g. displaying cubemap arrays if there's no
extension for it).
* Of course if the capture used the storage functions during capture,
then they will still be used on replay. We are only removing extra
usage here for internal textures/buffers
* This is even messier than I thought - I didn't realise, but it in fact
varied depending on if the image was initialised with glTexStorage or
glTexImage (or possibly glCompressedTexImage2D).
* Either way, the query is much too unreliable to try and use and work
around, so instead we'll just use the GetCompressedByteSize function
and work out the size ourselves.
* EXT_direct_state_access emulated by pushing/popping current bind
* ARB_copy_image emulated with framebuffer blits
* ARB_clear_buffer_object emulated with Map + memset/memcpy
* ARB_internalformat_query2 emulated with a limited hardcoded database
* This is a bit of a hack. Mesa seems to return a function pointer for
functions it recognises but doesn't support. So e.g. if you query for
glBindFramebuffer you'll get the implementation, if you query for
glBindFramebufferEXT then you get a stub that errors out.
* So in this case we ensure that any EXT/ARB aliases only set their
function pointer if we don't have the core function already. This will
fix some cases but obviously doesn't help if the core function is the
error-stub and the extension is supported...
Currently, selecting an event with children (e.g. vkCmdExecuteCommands)
in the event browser will cause the API inspector window to show the
final child event, rather than the event itself. This behaviour makes
sense everywhere else: selecting an event with children shows the state
after all children have completed.
However, for the API inspector, we want to be able see API calls for
the parent event when it is selected rather than those of its last
child, particularly in the case of vkCmdExecuteCommands which may have
other API calls leading up to it.
To allow this, distinguish between the "current event" and "selected
event". For an event with children, the former refers to the last
child, while the latter refers to the event itself. ILogViewerForm now
has two separate event callbacks for when either one changes.
The API inspector now makes use of the selected event, while everything
else continues to use the current event.
Before editing a pipeline, we need to recreate its creation info struct.
Compute pipelines have their own VkComputePipelineCreateInfo instead of
VkGraphicsPipelineCreateInfo, and we now make that distinction.
* This means that any 'degenerate' cases of only one event or so on will
still have enough slots to be able to handle reasonable amount of
overdraw. The only case that will fail is if every event has loads of
hits, but on average there should be enough slots allocated.
* This requires that every operation on output windows leaves the state
untouched, so make a few changes to arrange that.
* By doing this it means any unstable/non-deterministic results are
consistent between the current capture inspection and the shader
debug results.
* Without this, the RADV open source driver also gets checked, and its
version is 0.0.1 so it gets marked as buggy.
* Unfortunately there's not a great way to identify different drivers
for the same piece of hardware (ie. PCI IDs are the same).