Fix crash on CTS test:
dEQP-VK.robustness.robustness1_vertex_access.out_of_bounds_stride_30_middle_of_buffer
Bindings with multiple vertex attributes would not correctly detect
if the whole binding was remapped to new location/s. This meant
original binding's stride was never set to 0 which would report an
error and in some cases crash.
Fix issue where push constants contain a buffer address, but no descriptor
resources are encoded, resulting in addressed buffer not resident in GPU.
- Add MVKGPUAddressableBuffersCommandEncoderState to track when the
GPU-addressable buffer usage needs to be encoded, and only encode
them once per Metal renderpass.
- Set MVKGPUAddressableBuffersCommandEncoderState dirty whenever
a buffer is bound for a descriptor or a push constant.
Unrelated changes:
- MVKCommandEncoder::finalizeDrawState() reorder encoding of encoder
states to encode resource and push-constant encoder states together.
- Move getGraphicsPipeline() and getComputePipeline() to MVKCommandEncoder.
- MVKDevice Remove preallocation on _resources and _gpuAddressableBuffers.
- Align conditions for VkPhysicalDeviceVulkan12Features::bufferDeviceAddress
to those for VK_KHR_buffer_device_address/VK_EXT_buffer_device_address.
- MVKImage add functions to consolidate mapping plane indexes to memory bindings
to add safety in situation where one memory binding supports all planes.
- Update MoltenVK version to 1.2.8 (unrelated).
- Statically expose vkGetInstanceProcAddr(), even
when MVK_HIDE_VULKAN_SYMBOLS is enabled.
- To support Volk, link Cube demo dynamically to libMoltenVK.dylib
instead of statically to MoltenVK.xcframework.
- Add Volk repo to fetchDependencies script and
ExternalRevisions/Volk_repo_revision file.
- Cube.xcodeproj modify header paths, use of Volk,
and remove old and unused files.
- Update Demos/README.md to explain that Volk requires MoltenVK
be built with build setting MVK_HIDE_VULKAN_SYMBOLS enabled.
- MVKInstance support aliasing function name in one extension to a
function in another extension, to allow MVK_HIDE_VULKAN_SYMBOLS to
work with extensions promoted to another extension, but not to core,
and remove additional duplicate functions that were promoted to 1.3,
but were breaking use of MVK_HIDE_VULKAN_SYMBOLS.
To consistently modify settings based on MTLDevice,
MTLPixelFormats constructor retrieves or creates
temp MTLDevice once, and passes to support functions.
- Add MVKInflectionMap collection to manage lookups based on enums
that have a large set of consecutive elements, plus additional enum
values that are more sparsely assigned.
- Recognize every MTLPixelFormat value can be held in uint16_t.
- Reduce inflection-map sizes by calling shrink_to_fit().
- runcts script log completion time (unrelated).
- Add MVKInflectionMap collection to manage lookups based on enums
that have a large set of consecutive elements, plus additional enum
values that are more sparsely assigned.
- Recognize every MTLPixelFormat value can be held in uint16_t.
- Reduce inflection-map sizes by calling shrink_to_fit().
- runcts script log completion time (unrelated).
- Add MVKInflectionMap collection to manage lookups based on enums
that have a large set of consecutive elements, plus additional enum
values that are more sparsely assigned.
- Recognize every MTLPixelFormat value can be held in uint16_t.
- Reduce inflection-map sizes by calling shrink_to_fit().
- runcts script log completion time (unrelated).
- Remove MVKPixelFormats::_mtlFormatDescIndicesByMTLVertexFormats and
index into _mtlVertexFormatDescriptions using MTLVertexFormat directly.
- Fix assertion to test MTLVertexFormat < _mtlVertexFormatCount.
- Document the name of the MoltenVK driver layer.
- Support future multiple string members in MVKConfiguration.
- Add static assert on number of string members in MVKConfigruation.
- Rename global mvkConfig() to getGlobalMVKConfig().
- Rename global mvkSetConfig() to mvkSetGlobalConfig().
- Remove unused mvkPrintSizeOf() macro. (unrelated).
- Trim trailing spaces from Markdown documents because
it causes double-spaces in some Markdown readers (unrelated).
- MVKGraphicsPipeline::isRenderingPoints() fix regression error
to support dynamically setting point topology.
- Move emulation of VK_POLYGON_MODE_POINT in Metal, if the polygon model is static,
to MVKRenderingCommandEncoderState, to handle dynamic setting of topology.
- MVKDevice populate VkPhysicalDeviceExtendedDynamicState3PropertiesEXT.
- Move error reporting in mvkMTLTriangleFillModeFromVkPolygonModeInObj() to encoding.
- MVKRenderingCommandEncoderState::setCullMode() use getContent()
for readability and consistency (unrelated).
- Pass pipeline object to datatype functions for reporting accuracy (unrelated).
- Add MoltenVK_Configuration_Parameters.md to
document the MoltenVK configuration parameters.
- Deprecate vkSetMoltenVKConfigurationMVK().
- Deprecate mvk_config.h and move content to mvk_private_api.h and mvk_deprecated_api.h.
- Streamline lock on retrieval of MVKLayerManager singleton (unrelated).
- Consolidate info about CAMetalLayer and headless in MVKSurface.
- MVKSwapchainImage remove getCAMetalDrawable()
and focus on abstracting getMTLTexture().
- MVKPresentableSwapchainImage::getCAMetalDrawable() return nil if headless.
- Add MVKPresentableSwapchainImage::_mtlTextureHeadless to support
a fixed MTLTexture that is not retrieved from a CAMetalDrawable.
- MVKPresentableSwapchainImage refactor signalling semaphores and fences.
- MVKPresentableSwapchainImage don't lock when signalling semaphores and fences.
- If no present occurs, actualPresentTime will be zero. Set it to current
time, instead of to desiredPresentTime, since it's more accurate.
- Rework timestamps:
- Remove _mvkTimestampBase so mvkGetTimestamp() is equal to
mach_absolute_time(), which is used in presentation timing.
- Add mvkGetRuntimeNanoseconds().
- Rename mvkGetAbsoluteTime() to mvkGetContinuousNanoseconds().
- Remove mvkGetTimestampPeriod() as unused.
- MVKSemaphoreMTLEvent::encodeDeferredSignal remove redundant nil test (unrelated).
- Fix swapchain and surface bugs when windowing system
is accessed from off the main thread (unrelated).
- Log warning when deprecated functions vkCreateMacOSSurfaceMVK()
or vkCreateIOSSurfaceMVK() are used (unrelated).
- Remove documentation for visionos, as support is not ready (unrelated).
As required by the Vulkan spec.
Fixes the CTS tests
`dEQP-VK.api.info.vulkan1p2_limits_validation.khr_maintenance_3` and
`dEQP-VK.api.maintenance3_check.maintenance3_properties`.
- Don't update value of timestampPeriod on first measurement.
- Force that first measurement upon creation of MVKPhysicalDevice, so an
accurate value for timestampPeriod will be calculated when next queried.
Handle it similarly to the `A4R4B4G4` and `A4B4G4R4` formats, with a
swizzle. Vulkan requires support for this format.
Fixes the following tests:
* `dEQP-VK.api.info.format_properties.b4g4r4a4_unorm_pack16`.
* `dEQP-VK.texture.explicit_lod.2d.formats.b4g4r4a4*`
These features must be supported if the extension or `descriptorIndexing`
features is.
Conversely, disable the extension and the feature if we cannot support
the features.
Fixes `dEQP-VK.info.device_mandatory_features`.
Despite being an instance extension, `VK_EXT_debug_utils` provides some
functions that belong to the device, not the instance. Therefore, when
checking device functions, we must also check if an enabled *instance*
extension provides the function.
Also, only enable two-extension functions if *both* extensions or the
requisite core version are enabled. In all cases, these functions require
both extensions or the first extension plus some core version.
Fixes two CTS tests:
`dEQP-VK.info.instance_extension_device_functions`
`dEQP-VK.api.version_check.entry_points`
If the `fullDrawIndexUint32` feature is supported, then
`maxDrawIndexedIndexValue` must be `UINT32_MAX`. I had originally done
this when I turned the feature on, but for a while now, we've been
setting it to one less, because primitive restart can't be disabled and
the value is defined to exclude primitive restart.
The wording in the spec is ambiguous. The description of
`maxDrawIndexedIndexValue` says:
> * `maxDrawIndexedIndexValue` is the maximum index value that **can**
> be used for indexed draw calls when using 32-bit indices. *This
> excludes the primitive restart index value of 0xFFFFFFFF.* [emphasis
> added]
But the description of `fullDrawIndexUint32` says:
> * `fullDrawIndexUint32` specifies the full 32-bit range of indices is
> supported for indexed draw calls when using a VkIndexType of
> `VK_INDEX_TYPE_UINT32`. `maxDrawIndexedIndexValue` is the maximum
> index value that **may** [sic] be used *(aside from the primitive
> restart index, which is always 2<sup>32</sup>-1 when the VkIndexType
> is `VK_INDEX_TYPE_UINT32`)*. If this feature is supported,
> `maxDrawIndexedIndexValue` **must** be 2<sup>32</sup>-1; otherwise
> it **must** be no smaller than 2<sup>24</sup>-1. [emphasis added]
It's unclear whether it means that the primitive restart index is to be
ignored, or the maximum draw index must account for it.
The alternative is to disable `fullDrawIndexUint32` because we cannot
set `maxDrawIndexedIndexValue` to `UINT32_MAX`; but that might mislead
programs into thinking that we only support 24-bit vertex indices.
Fixes the rest of the `dEQP-VK.info.device_properties` test.
Previously, we were erroneously failing create calls that specified zero
external handle types (as opposed to omitting external memory info
entirely).
Fixes 6 tests under
`dEQP-VK.api.buffer_memory_requirements.create_no_flags.ext_mem_flags_included.*`