373 Commits

Author SHA1 Message Date
Bill Hollings
4effb9a5fd Support automatically enable Metal argument buffers when
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.
2022-08-26 14:48:13 -04:00
Bill Hollings
e0a50c8f2d Add support for the VK_KHR_shader_float_controls extension.
- 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.
2022-08-18 13:35:35 -04:00
Bill Hollings
33ca59ef13 Fix retention of MVKSwapchain for future drawable presentations.
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.
2022-08-16 15:27:20 -04:00
Bill Hollings
f487a14975 Update dependency libraries to match Vulkan SDK 1.3.224.
Update What's New document.
2022-08-12 16:54:24 -04:00
Bill Hollings
5e324d620c Fix occasional missing Metal buffer binding when only offset changes.
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).
2022-08-10 20:21:25 -04:00
Bill Hollings
b16fef0ca2 Improve performance of vkResetDescriptorPool().
- 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).
2022-08-09 16:28:22 -04:00
Bill Hollings
cfe259fce2 Report appropriate values of VkDebugUtilsMessageTypeFlagsEXT
for debug util messages generated within MoltenVK.
2022-07-30 17:38:20 -04:00
Bill Hollings
152c605c20 Fix retrieval of accurate refresh duration across multiple display screens.
- 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.
2022-07-29 18:15:46 -04:00
Bill Hollings
991e1a9876 Update macOS Cube demo to demonstrate optimizing swapchain across multiple screens.
- 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.
2022-07-28 16:33:10 -04:00
Bill Hollings
85c4b5c680 Fix vkUpdateDescriptorSetWithTemplate() for inline block descriptors.
Wrap incoming data in VkWriteDescriptorSetInlineUniformBlock
before passing to MVKInlineUniformBlockDescriptor::write().
2022-07-26 16:57:47 -04:00
Bill Hollings
3008ec71e8 Ignore sampler update in descriptor set bindings that use immutable samplers.
Inline MVKDescriptorSetLayoutBinding::getImmutableSampler()
for consistency with usesImmutableSamplers().
2022-07-24 20:36:02 -04:00
Bill Hollings
cb57bf9973 Fix query pool wait block when query is not encoded to be written to.
When checking query wait completion, all queries were previously
checked for Available status, and blocked until all became Available.
However, only queries that were encoded to be written should be checked.
It is okay for queries that are not encoded to be written to remain in
Initial state, and not block the wait.
2022-07-24 15:33:02 -04:00
Bill Hollings
b04a6db72e Check MTLDevice for gpuAddress support.
Support by the MTLDevice for Metal Tier 2 argument buffers has an
impact on both descriptor indexing and buffer device address support.
Add MVKPhysicalDeviceMetalFeatures::argumentBuffersTier, to track
the MTLDevice argument buffers support tier, set it from
[MTLDevice argumentBuffersSupport], and subsequently enable support for
VK_KHR_buffer_device_address and VK_EXT_buffer_device_address extensions,
and set descriptor indexing resource counts, based on it.
Update documentation requirements.
2022-07-19 14:30:38 -04:00
Bill Hollings
b54c701393 Check MTLDevice for barycentric coordinate support.
Add MVKPhysicalDeviceMetalFeatures::shaderBarycentricCoordinates,
enable it based on [MTLDevice supportsShaderBarycentricCoordinates],
and subsequently enable support for VK_KHR_fragment_shader_barycentric
and VK_NV_fragment_shader_barycentric extensions, based on it.
2022-07-15 13:43:48 -04:00
Bill Hollings
c5c7e80a6c Work around MTLCounterSet crash on additional Intel Iris Plus Graphics drivers.
Add 0x8a51 and 0x8a52 to list of device IDs requiring workaround.
2022-07-14 11:19:48 -04:00
Bill Hollings
6655beebd7 Enhancements to recent extensions.
- Update to latest SPIRV-Cross to support `SPV_KHR_physical_storage_buffer`
  for `VK_KHR_buffer_device_address` and `VK_EXT_buffer_device_address`
- Add support for `VK_EXT_buffer_device_address` extension.
- Advertise support for `VK_KHR_buffer_device_address`
  and `VK_EXT_buffer_device_address` on macOS 12.5.
- Add appropriate extension reporting and enablement for
  `VkPhysicalDeviceBufferDeviceAddressFeatures`,
  `VkPhysicalDeviceBufferDeviceAddressFeaturesEXT`, and
  `VkPhysicalDeviceFragmentShaderBarycentricFeaturesKHR`.
- Support reading `VkMemoryAllocateFlagsInfo` to identify memory allocations that
  need to support buffer pointer access (in case needed in future on non-shared memory).
- Update `Whats_New.md` and `MoltenVK_Runtime_UserGuide` documents.
2022-07-12 12:35:50 -04:00
Bill Hollings
26d4a13e34 Support Xcode 14, macOS 13, and iOS/tvOS 16.
- Update minimum Xcode deployment targets to macOS 10.13, iOS 11, and tvOS 11,
  to avoid Xcode build warnings.
- Add support for MTLLanguageVersion3_0 enumeration.
- Build efficiencies:
  - Build scripts create_dylib.sh and gen_moltenvk_rev_hdr.sh
    only run if build dependencies require it.
  - Packaging and copy_to_staging.sh scripts are too complex to define dependencies,
    and are fast, so configured to run every time, to avoid build warning.
- Replace use of deprecated sprintf() with  snprintf().
- Replace use of deprecated kIOMasterPortDefault with  kIOMainPortDefault.
- Support old-style GPU debug capture only if building for earlier minimum
  deployment targets, to avoid deprecation warning.
- Update minimum Xcode deployment targets of Cube demo to macOS 10.14, iOS 12,
  and tvOS 12, to avoid Xcode build warning regarding MTLSharedEvent in .
- Update README.md document regarding minimum Xcode deployment targets.
2022-07-06 18:15:10 -04:00
Bill Hollings
2b05b95974 Add support for VK_EXT_metal_objects extension.
Update Vulkan-Headers version to include new VK_EXT_metal_objects extension.
Update MoltenVK version to 1.1.11.
Update What's New document.
2022-06-11 20:10:06 -04:00
Bill Hollings
292ea5e55a Update dependency libraries to match Vulkan SDK 1.3.216.
Update What's New document.
2022-06-04 21:06:56 -04:00
sean
9253d5c212
Fix compilation issues 2022-05-25 18:23:30 +02:00
Bill Hollings
866c0dc8eb Fix vertex buffer binding counts when establishing implicit buffers binding indexes.
This patch fixes a regression caused by 1b6b8bc9 when the implicit buffers
were moved to top of Metal buffer index range.

Fix vertex buffer binding counts when binding indexes are not consecutive,
or when additional synthetic buffer bindings are required to accommodate
vertex attributes that are outside the vertex buffer stride values.
Take into consideration that the app may bind more vertex attribute buffers
than a pipeline may consume, and don't allow these to overwrite any implicit
buffers sent to the shader.

MVKResourcesCommandEncoderState::encodeBinding() clear binding dirty flag
before calling lambda function to allow function operation to possibly
override and leave binding marked dirty.

Set tessellation vertex buffer indexes based on platform maximum vertex stage
buffer count, instead of hardcoding them, to preemptively avoid conflict with
implicit buffers should the platform counts ever change.
2022-05-22 15:50:26 -04:00
Bill Hollings
695a54037b Add workaround for zombie memory bug in Intel Iris Plus Graphics
driver when repeatedly retrieving GPU counter sets.
2022-05-12 11:40:02 -04:00
Bill Hollings
e2168a33db Fix error on some Apple GPU's where a vkCmdTimestampQuery() after a
renderpass was writing timestamp before renderpass activity was complete.

MVKCommandBuffer tracks whether it contains a stage-based timestamp command,
and MVKCommandEncoder updates the timestamp command fence when ending any
Metal command encoder on such a MVKCommandBuffer.

MVKCommandEncoder reorder member variables to avoid layout gaps (unrelated).
MVKCommandBuffer update _commandCount even for single-use immediate command
encoding (unrelated).
2022-05-10 14:51:55 -04:00
Bill Hollings
1bad27cf26 Add support for VK_KHR_separate_depth_stencil_layouts extension.
Add VK_KHR_separate_depth_stencil_layouts and enable its features.
Metal generally ignores image layouts, so nothing further needed.
Update Whats_New.md and MoltenVK_Runtime_UserGuide.md documents
with recently-added extensions.

Passes almost all supported separate_layouts CTS tests, with the
few remaining tests failing due to issues with unrelated capabilities.

Unrelated cleanup:
- MVKDevice enable extensions before features.
- MVKDevice reorder ivar declarations to reduce
  memory layout gaps, and define default values.
- Rename VkSemaphoreStyle to MVKSemaphoreStyle to
  remove potential conflicts with Vulkan Vk name space.
2022-05-05 15:55:26 -04:00
Bill Hollings
cd5b336bec Add support for VK_EXT_separate_stencil_usage extension. 2022-04-29 22:14:05 -04:00
Bill Hollings
e00fef5b69 Update to latest SPIRV-Cross.
MSL: Emit interface block members of array length 1 as arrays instead of scalars.
2022-04-27 15:02:14 -04:00
Bill Hollings
751dac4391 Support attachment clearing when some clearing formats are not specified.
Exclude attachment from shader if clearing format is not specified.
2022-04-19 09:02:56 -04:00
Bill Hollings
e3f8ce4ebc Add support for VK_KHR_dynamic_rendering extension.
- MVKDevice track enabling VK_KHR_dynamic_rendering extension features.
- Add MVKCmdBeginRendering and MVKCmdEndRendering command objects
  and associated command pools.
- Add MVKCommandEncoder::beginRendering() which dynamically instantiates
  temporary MVKRenderpass and (imageless) MVKFramebuffer objects to handle
  equivalent renderpass operations.
- MVKCommandEncoder retain and release subpass and framebuffer objects
  to allow transient dynamic instances to be created and destroyed.
- Add support functions to create MVKRenderpass and (imageless)
  MVKFramebuffer objects from VkRenderingInfo.
- MVKRenderpass track VkRenderingFlags.
- MVKRenderSubpass create and track an internal VkPipelineRenderingCreateInfo.
- MVKRenderPassAttachment support LoadOp and StoreOp behavior for
  dynamic rendering suspend and resume.
- Refactor viewMask processing to permit operations on viewMask outside of
  MVKGraphicsPipeline without requiring the presence of an MVKSubpass.
- MVKGraphicsPipeline extract VkPipelineRenderingCreateInfo from MVKRenderSubpass
  if available, or VkGraphicsPipelineCreateInfo::pNext if not.
- MVKCommandBuffer track VkCommandBufferInheritanceRenderingInfo (currently unused).
- (unrelated) vulkan.mm move location of VK_EXT_sample_locations functions
  for layout readability consistency.
2022-04-19 07:27:41 -04:00
Bill Hollings
be7a68153f Fix error where previously bound push constants can override a descriptor
buffer binding used by a subsequent pipeline that does not use push constants.

This error was previously introduced in 2a17f75, where a push constants
binding could override the Metal buffer binding 0 of a subsequent pipeline
that does not use push constants.

When pipeline binding is encoded, track which stages use push constants
and only encode push constants if the pipeline and stage uses them.

(unrelated) Make use of MVKResourcesCommandEncoderState::getPipeline() consistent.
2022-04-18 15:32:40 -04:00
Bill Hollings
9fa373ebbb MoltenVK_icd.json support VK_KHR_portability_enumeration extension.
Update README.md and MoltenVK_Runtime_UserGuide.md to document the impact
of the VK_KHR_portability_enumeration extension during runtime loading on macOS.
Update MoltenVK version to 1.1.10.
2022-04-15 13:57:10 -04:00
Bill Hollings
be6f7a5083 Update dependency libraries to match Vulkan SDK 1.3.211.
Update What's New document.
2022-04-09 16:28:41 -04:00
Bill Hollings
3c0644f36a Add support for VK_EXT_sample_locations extension.
Supports only setting custom sample locations in subpasses via
vkBeginRenderpass. Does not support setting custom sample locations via
vkCmdBindPipeline or vkCmdSetSampleLocationsEXT, although collects that
info for possible future enhancements.

- MVKPhysicalDevice track platform support and respond to property queries.
- MVKCmdBeginRenderPassBase collect subpass custom sample locations.
- MVKPipeline support dynamic state values beyond 31.
- MVKPipeline collect custom sample locations.
- Add MVKCmdSetSampleLocations to support vkCmdSetSampleLocations
  to collect dynamic custom sample locations.
- MVKCommandEncoder support collecting custom sample positions from subpass
  and dynamic, and set into MTLRenderPassDescriptor for each Metal render pass.
- MVKArrayRef add assignment operator.
- Add MVKPhysicalDeviceMetalFeatures::programmableSamplePositions.
- Update VK_MVK_MOLTENVK_SPEC_VERSION to version 34.
- MVKCommandBuffer.h remove obsolete comment documentation.
- Update Whats_New.md.
2022-04-08 18:50:32 -04:00
Bill Hollings
2a17f757e1 Fixes to pipeline layout compatibility.
For pipeline layout compatibility, consume the Metal resource indexes in this order:
- Consume a fixed number of Metal buffer indexes for Metal argument buffers,
  but only consume them if Metal argument buffers are not being used.
- Consume push constants  Metal buffer index before descriptor set resources,
  but only consume it if the stage uses push constants.
- Consume descriptor set bindings.

In MVKPipelineLayout, separate tracking resource counts from push constants
indexes, and move push constant indexes ahead of descriptor bindings.
In MVKPipeline, track which stages use push constants.
Remove unused and obsolete function declaration in MVKDescriptorSet.h.
2022-03-14 16:29:22 -04:00
Bill Hollings
9f4243ff91 Fixes to optimize resource objects retained by descriptors beyond their lifetimes.
For a resource object that can be retained by descriptors beyond its lifetime,
release memory resources when the object is destroyed by the app. This includes
objects of type MVKBuffer, MVKBufferView, MVKImageView, and MVKSampler.

When the app destroys an MVKBuffer, also detach from the MVKDeviceMemory,
to fix a potential race condition when the app updates the descriptor on
one thread while also freeing the MVKDeviceMemory on another thread.

MVKImageView guard against detached planes while in descriptor.

Add comment to clarify how destroy() is called from release().
2022-03-13 14:54:54 -04:00
Bill Hollings
cf3b5968ef Avoid adjusting SRGB clear color values by half-ULP.
For GPUs that round float clear colors down, a half-ULP adjustment is performed
on normalized formats. But this adjustment should not be performed on SRGB formats,
which Vulkan requires to be treated as linear, with the value managed by the app.
2022-03-11 11:24:05 -05:00
Bill Hollings
a91a3d000a Remove limit on VkPhysicalDeviceLimits::maxSamplerAllocationCount
when not using Metal argument buffers.
2022-03-10 18:12:54 -05:00
Bill Hollings
2aadca70ce Fix deletion of GPU counter MTLFence while it is being used by MTLCommandBuffer.
Move release of GPU counter MTLFence from MVKCommandEncoder destructor
to MTLCommandBuffer completion handler.
2022-03-10 13:25:09 -05:00
Bill Hollings
728182cf75 MoltenVKShaderConverter tool defaults to the
highest MSL version supported on runtime OS.

Update to latest SPIRV-Cross.
Update Docs/Whats_New.md document.
2022-03-08 21:22:25 -05:00
Bill Hollings
6327b767e0 Reinstate memory barriers on non-Apple GPUs.
Ensure non-Apple GPU's enable memory barriers.
A previous commit inadvertently disabled GPU memory barriers.

Change tests for memory barriers to runtime test for Apple GPU, instead of
build-time test for Apple Silicon, to accommodate running on Rosetta2, and
refactor tests for Apple Silicon and OS version on some macOS GPU feature settings.
2022-03-08 17:01:50 -05:00
Bill Hollings
e42b33e593 Don't attempt to store the depth component of a stencil-only renderpass attachment.
For a combined depth-stencil format in a MVKImageView attachment with
VK_IMAGE_ASPECT_STENCIL_BIT, the attachment format may have been swizzled
to a stencil-only format. In this case, we want to guard against an attempt
to store the non-existent depth component.

Pass MVKImageView attachment to MVKRenderPassAttachment::encodeStoreAction()
and MVKRenderPassAttachment::populateMTLRenderPassAttachmentDescriptor() to
check attachment depth format component.

Consolidate calls to MVKImageView::populateMTLRenderPassAttachmentDescriptor() by calling
it from within MVKRenderPassAttachment::populateMTLRenderPassAttachmentDescriptor().
2022-02-24 11:42:12 -05:00
Bill Hollings
e28a16d76b Update MoltenVK version number to 1.1.9.
Adjust Whats_New.md to accommodate earlier
trivial 1.1.8 patch release for SDK 1.3.204.1.
2022-02-22 14:18:55 -05:00
Bill Hollings
afd997ab31 Align flattened shader inputs to previous stage output structs.
When flattening shader inputs for stage_in, which are to be read from a buffer
that was populated as nested structs during an earlier stage, the structs will
be aligned according to C++ rules, which can affect the alignment of the first
member of the flattened input struct.

Add SPIRVShaderOutput::firstStructMemberAlignment to track the alignment
requirements of the first member of a nested structure, and recursively
determine the alignment of the first member of each nested output structure.

Move sizeOfOutput() from MVKPipeline.mm to SPIRVReflection.h,
rename to getShaderOutputSize(), and add getShaderOutputAlignment()
to extract member alignment.
2022-02-22 12:17:15 -05:00
Bill Hollings
f7ca132844 Update glslang version, to use python3 in glslang scripts,
to replace missing python on macOS 12.3.
2022-02-16 14:02:01 -05:00
Bill Hollings
16408fd6ae Remove logged warning if MoltenVK does not support VkApplicationInfo::apiVersion value.
Update MoltenVK version to 1.1.8.
Minor spelling fixes in comments.
2022-02-09 13:36:08 -05:00
Bill Hollings
24ff2106d9 Update dependency libraries to match Vulkan SDK 1.3.204.
Update What's New document.
2022-02-06 19:55:44 -05:00
Nikita Fediuchin
4efb90b3c1 Update license year 2022-02-04 13:33:27 +02:00
Bill Hollings
9986e92f35
Merge pull request #1497 from billhollings/apple-silicon-deviceID
On Apple Silicon, set VkPhysicalDeviceProperties::deviceID from GPU capabilities.
2021-12-28 22:08:44 -05:00
Bill Hollings
9633f4843d Improve accuracy of VkPhysicalDeviceLimits::timestampPeriod.
If using GPU counters, on all Apple GPUs lock timestampPeriod to 1.0,
since Apple GPUs use nanoseconds, and on non-Apple GPUs, dynamically
adapt value of timestampPeriod by correlating GPU ticks with GPU ticks.

If using CPU sync, set timestampPeriod to OS CPU timestamp tick period.
2021-12-28 17:19:11 -05:00
Bill Hollings
df043487e4 On Apple Silicon, set VkPhysicalDeviceProperties::deviceID from GPU capabilities.
Previously, on Apple Silicon (iOS, tvOS & macOS M1), we tried to guess
deviceID from GPU parameters, but this is becoming harder as the types
of Apple Silicon is growing, and the actual device SoC itself is less
relevant that the GPU capabilities. So we now set deviceID from the
combination of OS version and GPU type.

Rename MVKDevice::getHighestMTLFeatureSet() to getHighestGPUCapability().
2021-12-27 16:45:12 -05:00
Bill Hollings
5810772644 Fix merge conflicts and syntax build error in iOS build. 2021-12-26 18:30:31 -05:00