diff --git a/Docs/Whats_New.md b/Docs/Whats_New.md index 29d62fe06..1272d2c5a 100644 --- a/Docs/Whats_New.md +++ b/Docs/Whats_New.md @@ -26,6 +26,7 @@ Released TBD - Fix rendering issue with render pass that immediately follows a kernel dispatch. - Ensure all MoltenVK config info set by `VK_EXT_layer_settings` is used. - Move primitive-restart-disabled warning from renderpass to pipeline creation, to reduce voluminous log noise. +- iOS: Support storage images in _Metal_ argument buffers. MoltenVK 1.2.10 diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKDescriptor.mm b/MoltenVK/MoltenVK/GPUObjects/MVKDescriptor.mm index 36b075d29..716af8eca 100644 --- a/MoltenVK/MoltenVK/GPUObjects/MVKDescriptor.mm +++ b/MoltenVK/MoltenVK/GPUObjects/MVKDescriptor.mm @@ -724,6 +724,13 @@ void mvkPopulateShaderConversionConfig(mvk::SPIRVToMSLConversionConfiguration& s setResourceIndexOffset(textureIndex, 1); if (!getMetalFeatures().nativeTextureAtomics) { setResourceIndexOffset(bufferIndex, 1); } +#if MVK_IOS_OR_TVOS + // iOS Tier 1 argument buffers do not support writable images. + if (getMetalFeatures().argumentBuffersTier < MTLArgumentBuffersTier2) { + _layout->_canUseMetalArgumentBuffer = false; + } +#endif + if (pBinding->descriptorCount > 1 && !mtlFeats.arrayOfTextures) { _layout->setConfigurationResult(reportError(VK_ERROR_FEATURE_NOT_PRESENT, "Device %s does not support arrays of textures.", _device->getName())); } diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKDescriptorSet.h b/MoltenVK/MoltenVK/GPUObjects/MVKDescriptorSet.h index cb7a63d36..62a2e7b0d 100644 --- a/MoltenVK/MoltenVK/GPUObjects/MVKDescriptorSet.h +++ b/MoltenVK/MoltenVK/GPUObjects/MVKDescriptorSet.h @@ -140,6 +140,7 @@ class MVKDescriptorSetLayout : public MVKVulkanAPIDeviceObject { MVKShaderResourceBinding _mtlResourceCounts; int32_t _maxBufferIndex = -1; bool _isPushDescriptorLayout = false; + bool _canUseMetalArgumentBuffer = true; }; diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKDescriptorSet.mm b/MoltenVK/MoltenVK/GPUObjects/MVKDescriptorSet.mm index 5b064fdf5..896025e6e 100644 --- a/MoltenVK/MoltenVK/GPUObjects/MVKDescriptorSet.mm +++ b/MoltenVK/MoltenVK/GPUObjects/MVKDescriptorSet.mm @@ -300,7 +300,7 @@ static void populateAuxBuffer(mvk::SPIRVToMSLConversionConfiguration& shaderConf } bool MVKDescriptorSetLayout::isUsingMetalArgumentBuffers() { - return MVKDeviceTrackingMixin::isUsingMetalArgumentBuffers() && !_isPushDescriptorLayout; + return MVKDeviceTrackingMixin::isUsingMetalArgumentBuffers() && _canUseMetalArgumentBuffer; }; // Returns an autoreleased MTLArgumentDescriptor suitable for adding an auxiliary buffer to the argument buffer. @@ -354,6 +354,7 @@ static void populateAuxBuffer(mvk::SPIRVToMSLConversionConfiguration& shaderConf const VkDescriptorSetLayoutCreateInfo* pCreateInfo) : MVKVulkanAPIDeviceObject(device) { _isPushDescriptorLayout = mvkIsAnyFlagEnabled(pCreateInfo->flags, VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR); + _canUseMetalArgumentBuffer = !_isPushDescriptorLayout; // Push constants don't use argument buffers const VkDescriptorBindingFlags* pBindingFlags = nullptr; for (const auto* next = (VkBaseInStructure*)pCreateInfo->pNext; next; next = next->pNext) { diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKPipeline.mm b/MoltenVK/MoltenVK/GPUObjects/MVKPipeline.mm index 9411d4be4..6eb02085a 100644 --- a/MoltenVK/MoltenVK/GPUObjects/MVKPipeline.mm +++ b/MoltenVK/MoltenVK/GPUObjects/MVKPipeline.mm @@ -1769,6 +1769,7 @@ static MTLVertexFormat mvkAdjustFormatVectorToSize(MTLVertexFormat format, uint3 shaderConfig.options.mslOptions.argument_buffers = useMetalArgBuff; shaderConfig.options.mslOptions.force_active_argument_buffer_resources = false; shaderConfig.options.mslOptions.pad_argument_buffer_resources = useMetalArgBuff; + shaderConfig.options.mslOptions.argument_buffers_tier = (SPIRV_CROSS_NAMESPACE::CompilerMSL::Options::ArgumentBuffersTier)getMetalFeatures().argumentBuffersTier; shaderConfig.options.mslOptions.agx_manual_cube_grad_fixup = mtlFeats.needsCubeGradWorkaround; MVKPipelineLayout* layout = (MVKPipelineLayout*)pCreateInfo->layout; @@ -2213,6 +2214,7 @@ static MTLVertexFormat mvkAdjustFormatVectorToSize(MTLVertexFormat format, uint3 shaderConfig.options.mslOptions.argument_buffers = useMetalArgBuff; shaderConfig.options.mslOptions.force_active_argument_buffer_resources = false; shaderConfig.options.mslOptions.pad_argument_buffer_resources = useMetalArgBuff; + shaderConfig.options.mslOptions.argument_buffers_tier = (SPIRV_CROSS_NAMESPACE::CompilerMSL::Options::ArgumentBuffersTier)getMetalFeatures().argumentBuffersTier; #if MVK_MACOS shaderConfig.options.mslOptions.emulate_subgroups = !mtlFeats.simdPermute; @@ -2600,6 +2602,7 @@ void serialize(Archive & archive, CompilerMSL::Options& opt) { opt.texture_buffer_native, opt.force_active_argument_buffer_resources, opt.pad_argument_buffer_resources, + opt.argument_buffers_tier, opt.force_native_arrays, opt.enable_clip_distance_user_varying, opt.multi_patch_workgroup,