This has caused us nothing but trouble. The code to build up the vertex
descriptor is fragile; we can rip that out now.
Also, make sure to positively identify per-patch blocks as per-patch.
For those, the individual members have the `Patch` decoration.
Update SPIRV-Cross to pull in the changes needed for this.
Fixes 66 tests in the CTS.
- Redefine enumeration values of MVKPrefillMetalCommandBuffersStyle.
- Add option to defer encoding prefilled MTLCommandBuffer to queue submission.
- Remove option to create an autorelease pool in the MVKCommandEncoder
to span immediate command encodings, because it causes crashes when
multiple command buffers were overlapping prefilling on the same thread.
- Replace MTLCommandEncoder retain/release macros with template member functions.
- Rename MVKCommandPool::newMTLCommandBuffer() to getMTLCommandBuffer()
and do not retain the returned MTLCommandBuffer (unrelated).
- Revert MoltenVK logging to use stderr instead of stdout (unrelated).
- Merge branch from master.
- Add MVKPrefillMetalCommandBuffersStyle enumeration to enable prefilling,
and configure memory recovery options.
- Redefine MVKConfiguration::prefillMetalCommandBuffers as a value from
MVKPrefillMetalCommandBuffersStyle instead of a simple boolean. Set the
values of MVKPrefillMetalCommandBuffersStyle and the default value of
MVKConfiguration::prefillMetalCommandBuffers to be compatible with
legacy use of this setting as a simple enable/disable boolean value.
- MVKCommandEncoder track prefill style, and support option to maintain
a Metal autorelease pool that is created on vkBeginCommandBuffer()
and drained on vkEndCommandBuffer(), when prefiling a command buffer
from a single thread, and an option to wrap each command addition in
a separate @autoreleasepool{} scope to create and drain an autorelease
pool at every command addition to the Vulkan command buffer, when
prefilling a single command buffer from multiple threads.
- MVKCommandEncoder retain Metal encoders when prefilling, because
prefilling may span multiple autorelease pools.
- MVKCommandEncoder clean up memory leak of MTLBlitPassDescriptor
during prefilling.
- MVKCommandEncoder rearrange declarations of MVKCommandUse member
variables to tighten up class memory use (unrelated).
- MVKCommandBuffer remove unnecessary inline declarations (unrelated).
- Change MoltenVK logging to use stdout instead of stderr (unrelated).
- If MTLEvents are unusable, fallback to single queue.
- Adjust values of MVKVkSemaphoreSupportStyle enumeration.
- For legacy compatibility, if legacy semaphoreUseMTLEvent and
semaphoreUseMTLFence are both disabled, use CPU callback emulation.
- Update and expand related documentation in vk_mvk_moltenvk.h.
- Remove separate extension entry points for 1.3 promoted
vkCmdBeginRenderingKHR() and vkCmdEndRenderingKHR() functions,
which caused build breaks when MVK_HIDE_VULKAN_SYMBOLS=1.
- For consistency, hide vkGetMoltenVKConfigurationMVK(),
vkSetMoltenVKConfigurationMVK(), and vkGetVersionStringsMVK()
when MVK_HIDE_VULKAN_SYMBOLS=1, which was an oversight in original
implementation of hiding Vulkan functions.
- Update build `README.md` for generic command line build settings
and MVK_HIDE_VULKAN_SYMBOLS in particular.
- Set MVK_VULKAN_API_VERSION from VK_API_VERSION_1_2.
- Update MoltenVK version to 1.2.0.
- Remove several previously overlooked extension suffixes
in use of promoted Vulkan struct and enum values.
- Update documentation.
when building with MVK_HIDE_VULKAN_SYMBOLS=1.
Alias vkGetBufferDeviceAddressEXT to core function,
and add it as promoted extension function in MVKInstance.
It is always legal in Vulkan to read a builtin, particularly
`BuiltInPosition`, even if it weren't written by the previous stage. The
CTS tests that this scenario works in the driver.
Update SPIRV-Cross to pull in a change required for this.
Fixes 8 CTS tests under `dEQP-VK.pipeline.*.no_position`. (Eight other
tests worked solely by accident without this change.)
- Support option to use MTLEvents for Vulkan semaphores on NVIDIA and Rosetta2.
- Add public MVKVkSemaphoreSupportStyle enumeration.
- MVKConfiguration replace deprecated legacy booleans semaphoreUseMTLEvent,
and semaphoreUseMTLFence with enumerated semaphoreSupportStyle.
- Alias legacy semaphoreUseMTLEvent to semaphoreSupportStyle and support legacy
use of semaphoreUseMTLFence and semaphoreUseMTLEvent for backwards compatibility.
- MVKConfiguration rename recently renamed semaphoreUseSingleQueue back to
semaphoreUseMTLFence for backwards compatibility.
VK_EXT_descriptor_indexing extension is enabled.
- Change MVKConfiguration::useMetalArgumentBuffers to enum instead of boolean
and default to enabling Metal argument buffers for VK_EXT_descriptor_indexing.
- Leave Metal argument buffers disabled by default until they are improved.
- Enable VkPhysicalDeviceVulkan12Features::descriptorIndexing.
- Add MVKPhysicalDeviceVulkan12FeaturesNoExt to track and enable Vulkan 1.2
features not part of any prior extensions absorbed by Vulkan 1.2.
- Update VK_MVK_MOLTENVK_SPEC_VERSION to version `36`.
- MVKDeviceTrackingMixin remove unnecessary inline declarations.
- MoltenShaderConveter tool support Metal Argument Buffers and MSL 3.0.
Vulkan 1.2 includes several optional extensions that are not currently
supported by Metal. These include:
- VK_KHR_draw_indirect_count (and VK_AMD_draw_indirect_count)
- VK_KHR_shader_atomic_int64
- VK_KHR_vulkan_memory_model
- VK_EXT_sampler_filter_minmax
Capability flags for these extensions are included in
VkPhysicalDeviceVulkan12Features and VkPhysicalDeviceVulkan12Properties,
and in parallell extension-specific structures.
This addition provides no new user functionality. For consistency with
VkPhysicalDeviceVulkan12Features and VkPhysicalDeviceVulkan12Properties,
the changes here flush out the extension/Vulkan 1.2 parallel functionality,
with a view to prepare to include the functionality consistently in both
an extension and Vulkan 1.2, should the functionality become available
in a future version of Metal.
This change also explicitly includes the optional extensions in
MVKExtensions.def, but disables them from user visibility.
- Enable shaderSignedZeroInfNanPreserveFloat16 and
shaderSignedZeroInfNanPreserveFloat32.
Other float control properties are not settable in Metal.
- MVKShaderModule log whether compiling with fast math enabled.
- Update MoltenVK_Runtime_UserGuide.md and Whats_New.md documents.
- runcts script enable MVK_CONFIG_FAST_MATH_ENABLED by default.
When presenting drawables in the future, the MVKPresentableSwapchainImage
and MVKSwapchain were both being retained by the drawable-presented callback,
so that the presentation timing info can be recorded on the swapchain.
Unfortunately, in the case where the presentation timing is set far enough
into the future (I'm looking at you CTS), the swapchain, and even the
CAMetalLayer's view may be destroyed, causing occasional bad access crashes.
- MVKSwapchainImage don't retain() the swapchain, and move clearing the
swapchain from the destructor to destroy(), so the MVKSwapchain is not
necessarily retained by the MVKSwapchainImage, for a drawable being
presented in the future.
- MVKSwapchainImage add a lock around clearing swapchain and accessing
it from callbacks.
- Add lockable releaseLayer() function in both MVKSwapchain and MVKSurface,
which is called from both layer observer and destructor, to handle race
conditions better.
- MVKSwapchain::initCAMetalLayer() call MVKSurface::getCAMetalLayer() only once.
- Update MoltenVK version to 1.1.12.
- Update What's New document.
- MVKPushConstantsCommandEncoderState move marking descriptor buffer
binding override from markDirty() to encodeImpl().
- MVKCommandEncoder::setXXXBytes() calls optionally mark overridden descriptor
buffer bindings as dirty, allowing this functionality to be generalized.
- MVKMTLBufferBinding::update() inline buffers never update just offset
because inline contents may have changed.
- MVKCmdClearAttachments mark specific overridden buffer bindings dirty
instead of marking entire MVKGraphicsResourcesCommandEncoderState dirty.
- MVKResourcesCommandEncoderState::bind() don't mark entire
MVKResourcesCommandEncoderState dirty unless the binding
itself was marked dirty (unrelated optimization).
- Rename markPushConstantBinding() to markBufferIndexDirty().
This fixes an earlier regression, where when only the offset changes in
a buffer descriptor, the binding is not marked dirty if the same Metal
binding index is used by a push constant in between descriptor bindings.
- MVKPushConstantsCommandEncoderState::markDirty() call resource encoder
state markPushConstantBinding() to find and mark dirty descriptor that
uses same Metal index as a push constant binding.
- Add MVKResourcesCommandEncoderState::markMetalBufferIndexDirty() to
find and mark dirty a descriptor buffer binding that uses
- MVKResourcesCommandEncoderState::bind() use range-based-for-loop
for consistency (unrelated).
- MVKDescriptorPool::reset() don't waste time freeing
descriptor sets that were never allocated.
- If descriptor set could not be allocated, set availability bit (unrelated).
- MVKBitArray add _lowestNeverClearedBitIndex to track the lowest bit index
that has not been cleared since last reset.
- MVKBitArray rename _minUnclearedSectionIndex to _clearedSectionCount for clarity.
- MVKBitArray use _clearedSectionCount and _lowestNeverClearedBitIndex to optimize
operation of setting or clearing all bits.
- MVKBitArray::setBit() ensure we don't try to change a bit that is out of range.
- MVKBitArray::resize() no-op if size doesn't actually change.
- MVKQueue don't include object pointer in error log, so CTS log results
are consistent across multiple CTS runs (unrelated).
In preparation for Vulkan 1.2, support the following device feature
and property structures, and use them to populate the corresponding
device feature and property values originally supplied by Vulkan
extensions, to ensure a single source of truth for these values:
- VkPhysicalDeviceVulkan11Features
- VkPhysicalDeviceVulkan11Properties
- VkPhysicalDeviceVulkan12Features
- VkPhysicalDeviceVulkan12Properties
Disable VkPhysicalDeviceVulkan12Features::drawIndirectCount and
VkPhysicalDeviceVulkan12Features::samplerFilterMinmax, to indicate that
Vulkan 1.2 support will not include extensions VK_KHR_draw_indirect_count
and VK_EXT_sampler_filter_minmax, respectively.
Support enabling device features during VkDevice creation using
VkPhysicalDeviceVulkan11Features and VkPhysicalDeviceVulkan12Features.
- Add MVKDeviceFeatureStructs.def file to describe each device feature
struct, and define, populate, and manage MVKDevice device feature
tracking iVars using the list in this file.
- Reorder switch cases in MVKPhysicalDevice::getFeatures() to match the
list in MVKDeviceFeatureStructs.def.
- Where possible, remove extension suffixes from device feature structs
and associated VkStructureType values.
- Remove const qualifier from device feature enabling structs.
- Add [CAMetalLayer screenMVK] extension method to retrieve screen.
- If the layer has a delegate view, use it to locate the screen, otherwise
revert to iterating across windows, looking for the CAMetalLayer, to identify
the window the layer is in, from which to retrieve the screen.
- Fix the iteration of the layer hierarchy, to accommodate that Apple may
add superlayers to the CAMetalLayer under the covers.
- Update MoltenVK_Runtime_UserGuide.md to encourage the app to ensure the view
is the delegate of the CAMetalLayer, to more efficiently access the screen.
- DemoView implements NSViewLayerContentScaleDelegate protocol to update
[CAMetalLayer contentsScale] property when moved between screens.
- Log contentsScale value during swapchain creation.
- Remove a few unnecessary inline declarations.