* Someone encountered miscompiled SPIR-V such that 1.1, 2.2 etc were compiled to
1.0, 2.0. I couldn't reproduce it and I don't know how glslang would
miscompile, but this workaround is at least safe to apply.
* When flattening array slices or remapping to a cube cruciform, we can remap to
RGBA32 when the output format is itself greater than 8bpp, to ensure we don't
lose quality before output.
* For pipelines using tessellation or containing a geometry shader we use
transform feedback to fetch the output of the vertex pipeline after these
stages.
* This self-insertion has the same kind of problem as overlapping ranges in
memcpy, the act of inserting items can affect the input range by shifting
things around. For inserting a single object we just copy it, for inserting a
range we duplicate the whole array and then do the insert from the old range
(and destruct it).
* Clearly this is not the most efficient implementation, a better solution would
be to append onto the existing array (potentially not even reallocating then)
and doing a rotate/shift in place.
* VK_EXT_astc_decode_mode
* VK_EXT_swapchain_colorspace - this will cause slight artifacts as we won't
interpret pixels in the right color space, but it's minor.
* VK_EXT_validation_cache - we don't serialise this but we do allow it during
capture and pass-through straight. We don't wrap the VkValidationCacheEXT
object at all which makes support simpler.
* VK_EXT_external_memory_dma_buf - this is just a new memory type for external
memory, we don't need to do anything special to handle it.
* VK_AMD_mixed_attachment_samples & VK_AMD_shader_core_properties - these are
no-op once enabled
* Many shader-only extensions:
- VK_AMD_gpu_shader_int16
- VK_AMD_shader_fragment_mask
- VK_AMD_image_load_store_lod
- VK_AMD_texture_gather_bias_lod
- VK_NV_compute_shader_derivatives
- VK_NV_fragment_shader_barycentric
- VK_NV_geometry_shader_passthrough
- VK_NV_sample_mask_override_coverage
- VK_NV_shader_image_footprint
- VK_NV_shader_subgroup_partitioned
- VK_NV_viewport_array2
* This reads the argument once during load exactly when the draw itself
executes. We read just before the draw in case the draw itself would modify
the params (which is likely invalid, but something we should avoid).