diff --git a/Docs/MoltenVK_Runtime_UserGuide.md b/Docs/MoltenVK_Runtime_UserGuide.md index f5ccf8fba..3200e3147 100644 --- a/Docs/MoltenVK_Runtime_UserGuide.md +++ b/Docs/MoltenVK_Runtime_UserGuide.md @@ -56,16 +56,21 @@ About **MoltenVK** graphics and compute API, that runs on Apple's [*Metal*](https://developer.apple.com/metal) graphics and compute framework on both *iOS* and *macOS*. -**MoltenVK** allows you to use the *Vulkan* graphics and compute API to develop modern, cross-platform, -high-performance graphical games and applications, and to run them across many platforms, including -both *iOS* and *macOS*. +**MoltenVK** allows you to use the *Vulkan* graphics and compute API to develop modern, +cross-platform, high-performance graphical games and applications, and to run them across +many platforms, including both *iOS* and *macOS*. *Metal* uses a different shading language, the *Metal Shading Language (MSL)*, than -*Vulkan*, which uses *SPIR-V*. However, fear not, as **MoltenVK** will automatically convert -your *SPIR-V* shaders to their *MSL* equivalents. This can be performed transparently at run time, -using the **Runtime Shader Conversion** feature of **MoltenVK**, or at development time using the -[**MoltenVKShaderConverter**](#shader_converter_tool) tool provided with this **MoltenVK** distribution -package. +*Vulkan*, which uses *SPIR-V*. **MoltenVK** automatically converts your *SPIR-V* shaders +to their *MSL* equivalents. This can be performed transparently at run time, using the +**Runtime Shader Conversion** feature of **MoltenVK**, or at development time using the +[**MoltenVKShaderConverter**] (#shader_converter_tool) tool provided with this **MoltenVK** +distribution package. + +To provide *Vulkan* capability to the *iOS* and *macOS* platforms, **MoltenVK** uses *Apple's* +publicly available API's, including *Metal*. **MoltenVK** does **_not_** use any private or +undocumented API calls or features, so your app will be compatible with all standard distribution +channels, including *Apple's App Store*. diff --git a/ExternalRevisions/SPIRV-Cross_repo_revision b/ExternalRevisions/SPIRV-Cross_repo_revision index 0b88db267..4264ea115 100644 --- a/ExternalRevisions/SPIRV-Cross_repo_revision +++ b/ExternalRevisions/SPIRV-Cross_repo_revision @@ -1 +1 @@ -be7425ef70231ab82930331959ab487d605d0482 +cc7679ee4586a2e19cb6277fe40228b03d191760 diff --git a/MoltenVK/MoltenVK.xcodeproj/project.pbxproj b/MoltenVK/MoltenVK.xcodeproj/project.pbxproj index 29d0753c1..034fcd1de 100644 --- a/MoltenVK/MoltenVK.xcodeproj/project.pbxproj +++ b/MoltenVK/MoltenVK.xcodeproj/project.pbxproj @@ -13,10 +13,6 @@ A90C8DEB1F45354D009CB32C /* MVKCommandEncodingPool.h in Headers */ = {isa = PBXBuildFile; fileRef = A90C8DE81F45354D009CB32C /* MVKCommandEncodingPool.h */; }; A90C8DEC1F45354D009CB32C /* MVKCommandEncodingPool.mm in Sources */ = {isa = PBXBuildFile; fileRef = A90C8DE91F45354D009CB32C /* MVKCommandEncodingPool.mm */; }; A90C8DED1F45354D009CB32C /* MVKCommandEncodingPool.mm in Sources */ = {isa = PBXBuildFile; fileRef = A90C8DE91F45354D009CB32C /* MVKCommandEncodingPool.mm */; }; - A92CAF392098166B009DA08E /* NSString+MoltenVK.h in Headers */ = {isa = PBXBuildFile; fileRef = A92CAF342098166A009DA08E /* NSString+MoltenVK.h */; }; - A92CAF3A2098166B009DA08E /* NSString+MoltenVK.h in Headers */ = {isa = PBXBuildFile; fileRef = A92CAF342098166A009DA08E /* NSString+MoltenVK.h */; }; - A92CAF3B2098166B009DA08E /* NSString+MoltenVK.mm in Sources */ = {isa = PBXBuildFile; fileRef = A92CAF382098166B009DA08E /* NSString+MoltenVK.mm */; }; - A92CAF3C2098166B009DA08E /* NSString+MoltenVK.mm in Sources */ = {isa = PBXBuildFile; fileRef = A92CAF382098166B009DA08E /* NSString+MoltenVK.mm */; }; A948BB7F1E51642700DE59F2 /* mvk_vulkan.h in Headers */ = {isa = PBXBuildFile; fileRef = A948BB7E1E51642700DE59F2 /* mvk_vulkan.h */; settings = {ATTRIBUTES = (Public, ); }; }; A948BB801E51642700DE59F2 /* mvk_vulkan.h in Headers */ = {isa = PBXBuildFile; fileRef = A948BB7E1E51642700DE59F2 /* mvk_vulkan.h */; settings = {ATTRIBUTES = (Public, ); }; }; A94FB7B01C7DFB4800632CA3 /* mvk_datatypes.h in Headers */ = {isa = PBXBuildFile; fileRef = A94FB7671C7DFB4800632CA3 /* mvk_datatypes.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -151,10 +147,6 @@ A98149561FB6A3F7005F00B4 /* MVKFoundation.mm in Sources */ = {isa = PBXBuildFile; fileRef = A98149451FB6A3F7005F00B4 /* MVKFoundation.mm */; }; A98149571FB6A3F7005F00B4 /* MVKObjectPool.h in Headers */ = {isa = PBXBuildFile; fileRef = A98149461FB6A3F7005F00B4 /* MVKObjectPool.h */; }; A98149581FB6A3F7005F00B4 /* MVKObjectPool.h in Headers */ = {isa = PBXBuildFile; fileRef = A98149461FB6A3F7005F00B4 /* MVKObjectPool.h */; }; - A98149591FB6A3F7005F00B4 /* MVKOSExtensions.h in Headers */ = {isa = PBXBuildFile; fileRef = A98149471FB6A3F7005F00B4 /* MVKOSExtensions.h */; }; - A981495A1FB6A3F7005F00B4 /* MVKOSExtensions.h in Headers */ = {isa = PBXBuildFile; fileRef = A98149471FB6A3F7005F00B4 /* MVKOSExtensions.h */; }; - A981495B1FB6A3F7005F00B4 /* MVKOSExtensions.mm in Sources */ = {isa = PBXBuildFile; fileRef = A98149481FB6A3F7005F00B4 /* MVKOSExtensions.mm */; }; - A981495C1FB6A3F7005F00B4 /* MVKOSExtensions.mm in Sources */ = {isa = PBXBuildFile; fileRef = A98149481FB6A3F7005F00B4 /* MVKOSExtensions.mm */; }; A981495D1FB6A3F7005F00B4 /* MVKWatermark.h in Headers */ = {isa = PBXBuildFile; fileRef = A98149491FB6A3F7005F00B4 /* MVKWatermark.h */; }; A981495E1FB6A3F7005F00B4 /* MVKWatermark.h in Headers */ = {isa = PBXBuildFile; fileRef = A98149491FB6A3F7005F00B4 /* MVKWatermark.h */; }; A981495F1FB6A3F7005F00B4 /* MVKWatermark.mm in Sources */ = {isa = PBXBuildFile; fileRef = A981494A1FB6A3F7005F00B4 /* MVKWatermark.mm */; }; @@ -167,24 +159,40 @@ A981496C1FB6A998005F00B4 /* MVKStrings.h in Headers */ = {isa = PBXBuildFile; fileRef = A981496A1FB6A998005F00B4 /* MVKStrings.h */; }; A98149A21FB6B9E1005F00B4 /* MoltenVKSPIRVToMSLConverter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A98149821FB6B566005F00B4 /* MoltenVKSPIRVToMSLConverter.framework */; }; A98149A51FB6B9F2005F00B4 /* MoltenVKSPIRVToMSLConverter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A98149841FB6B566005F00B4 /* MoltenVKSPIRVToMSLConverter.framework */; }; - A9917FF7209CC589004069EB /* MTLSamplerDescriptor+MoltenVK.m in Sources */ = {isa = PBXBuildFile; fileRef = A9917FF1209CC588004069EB /* MTLSamplerDescriptor+MoltenVK.m */; }; - A9917FF8209CC589004069EB /* MTLSamplerDescriptor+MoltenVK.m in Sources */ = {isa = PBXBuildFile; fileRef = A9917FF1209CC588004069EB /* MTLSamplerDescriptor+MoltenVK.m */; }; - A9917FF9209CC589004069EB /* MTLSamplerDescriptor+MoltenVK.h in Headers */ = {isa = PBXBuildFile; fileRef = A9917FF2209CC589004069EB /* MTLSamplerDescriptor+MoltenVK.h */; }; - A9917FFA209CC589004069EB /* MTLSamplerDescriptor+MoltenVK.h in Headers */ = {isa = PBXBuildFile; fileRef = A9917FF2209CC589004069EB /* MTLSamplerDescriptor+MoltenVK.h */; }; - A9917FFB209CC589004069EB /* MTLTextureDescriptor+MoltenVK.h in Headers */ = {isa = PBXBuildFile; fileRef = A9917FF3209CC589004069EB /* MTLTextureDescriptor+MoltenVK.h */; }; - A9917FFC209CC589004069EB /* MTLTextureDescriptor+MoltenVK.h in Headers */ = {isa = PBXBuildFile; fileRef = A9917FF3209CC589004069EB /* MTLTextureDescriptor+MoltenVK.h */; }; - A9917FFD209CC589004069EB /* MTLTextureDescriptor+MoltenVK.m in Sources */ = {isa = PBXBuildFile; fileRef = A9917FF4209CC589004069EB /* MTLTextureDescriptor+MoltenVK.m */; }; - A9917FFE209CC589004069EB /* MTLTextureDescriptor+MoltenVK.m in Sources */ = {isa = PBXBuildFile; fileRef = A9917FF4209CC589004069EB /* MTLTextureDescriptor+MoltenVK.m */; }; - A9917FFF209CC589004069EB /* CAMetalLayer+MoltenVK.h in Headers */ = {isa = PBXBuildFile; fileRef = A9917FF5209CC589004069EB /* CAMetalLayer+MoltenVK.h */; }; - A9918000209CC589004069EB /* CAMetalLayer+MoltenVK.h in Headers */ = {isa = PBXBuildFile; fileRef = A9917FF5209CC589004069EB /* CAMetalLayer+MoltenVK.h */; }; - A9918001209CC589004069EB /* CAMetalLayer+MoltenVK.m in Sources */ = {isa = PBXBuildFile; fileRef = A9917FF6209CC589004069EB /* CAMetalLayer+MoltenVK.m */; }; - A9918002209CC589004069EB /* CAMetalLayer+MoltenVK.m in Sources */ = {isa = PBXBuildFile; fileRef = A9917FF6209CC589004069EB /* CAMetalLayer+MoltenVK.m */; }; A9C96DD01DDC20C20053187F /* MVKMTLBufferAllocation.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C96DCE1DDC20C20053187F /* MVKMTLBufferAllocation.h */; }; A9C96DD11DDC20C20053187F /* MVKMTLBufferAllocation.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C96DCE1DDC20C20053187F /* MVKMTLBufferAllocation.h */; }; A9C96DD21DDC20C20053187F /* MVKMTLBufferAllocation.mm in Sources */ = {isa = PBXBuildFile; fileRef = A9C96DCF1DDC20C20053187F /* MVKMTLBufferAllocation.mm */; }; A9C96DD31DDC20C20053187F /* MVKMTLBufferAllocation.mm in Sources */ = {isa = PBXBuildFile; fileRef = A9C96DCF1DDC20C20053187F /* MVKMTLBufferAllocation.mm */; }; A9E4B7891E1D8AF10046A4CE /* MVKMTLResourceBindings.h in Headers */ = {isa = PBXBuildFile; fileRef = A9E4B7881E1D8AF10046A4CE /* MVKMTLResourceBindings.h */; }; A9E4B78A1E1D8AF10046A4CE /* MVKMTLResourceBindings.h in Headers */ = {isa = PBXBuildFile; fileRef = A9E4B7881E1D8AF10046A4CE /* MVKMTLResourceBindings.h */; }; + A9E53DD72100B197002781DD /* MTLSamplerDescriptor+MoltenVK.m in Sources */ = {isa = PBXBuildFile; fileRef = A9E53DCD2100B197002781DD /* MTLSamplerDescriptor+MoltenVK.m */; }; + A9E53DD82100B197002781DD /* MTLSamplerDescriptor+MoltenVK.m in Sources */ = {isa = PBXBuildFile; fileRef = A9E53DCD2100B197002781DD /* MTLSamplerDescriptor+MoltenVK.m */; }; + A9E53DD92100B197002781DD /* MVKOSExtensions.h in Headers */ = {isa = PBXBuildFile; fileRef = A9E53DCE2100B197002781DD /* MVKOSExtensions.h */; }; + A9E53DDA2100B197002781DD /* MVKOSExtensions.h in Headers */ = {isa = PBXBuildFile; fileRef = A9E53DCE2100B197002781DD /* MVKOSExtensions.h */; }; + A9E53DDB2100B197002781DD /* MVKOSExtensions.mm in Sources */ = {isa = PBXBuildFile; fileRef = A9E53DCF2100B197002781DD /* MVKOSExtensions.mm */; }; + A9E53DDC2100B197002781DD /* MVKOSExtensions.mm in Sources */ = {isa = PBXBuildFile; fileRef = A9E53DCF2100B197002781DD /* MVKOSExtensions.mm */; }; + A9E53DDD2100B197002781DD /* MTLTextureDescriptor+MoltenVK.h in Headers */ = {isa = PBXBuildFile; fileRef = A9E53DD02100B197002781DD /* MTLTextureDescriptor+MoltenVK.h */; }; + A9E53DDE2100B197002781DD /* MTLTextureDescriptor+MoltenVK.h in Headers */ = {isa = PBXBuildFile; fileRef = A9E53DD02100B197002781DD /* MTLTextureDescriptor+MoltenVK.h */; }; + A9E53DDF2100B197002781DD /* CAMetalLayer+MoltenVK.h in Headers */ = {isa = PBXBuildFile; fileRef = A9E53DD12100B197002781DD /* CAMetalLayer+MoltenVK.h */; }; + A9E53DE02100B197002781DD /* CAMetalLayer+MoltenVK.h in Headers */ = {isa = PBXBuildFile; fileRef = A9E53DD12100B197002781DD /* CAMetalLayer+MoltenVK.h */; }; + A9E53DE12100B197002781DD /* NSString+MoltenVK.h in Headers */ = {isa = PBXBuildFile; fileRef = A9E53DD22100B197002781DD /* NSString+MoltenVK.h */; }; + A9E53DE22100B197002781DD /* NSString+MoltenVK.h in Headers */ = {isa = PBXBuildFile; fileRef = A9E53DD22100B197002781DD /* NSString+MoltenVK.h */; }; + A9E53DE32100B197002781DD /* MTLSamplerDescriptor+MoltenVK.h in Headers */ = {isa = PBXBuildFile; fileRef = A9E53DD32100B197002781DD /* MTLSamplerDescriptor+MoltenVK.h */; }; + A9E53DE42100B197002781DD /* MTLSamplerDescriptor+MoltenVK.h in Headers */ = {isa = PBXBuildFile; fileRef = A9E53DD32100B197002781DD /* MTLSamplerDescriptor+MoltenVK.h */; }; + A9E53DE52100B197002781DD /* NSString+MoltenVK.mm in Sources */ = {isa = PBXBuildFile; fileRef = A9E53DD42100B197002781DD /* NSString+MoltenVK.mm */; }; + A9E53DE62100B197002781DD /* NSString+MoltenVK.mm in Sources */ = {isa = PBXBuildFile; fileRef = A9E53DD42100B197002781DD /* NSString+MoltenVK.mm */; }; + A9E53DE72100B197002781DD /* MTLTextureDescriptor+MoltenVK.m in Sources */ = {isa = PBXBuildFile; fileRef = A9E53DD52100B197002781DD /* MTLTextureDescriptor+MoltenVK.m */; }; + A9E53DE82100B197002781DD /* MTLTextureDescriptor+MoltenVK.m in Sources */ = {isa = PBXBuildFile; fileRef = A9E53DD52100B197002781DD /* MTLTextureDescriptor+MoltenVK.m */; }; + A9E53DE92100B197002781DD /* CAMetalLayer+MoltenVK.m in Sources */ = {isa = PBXBuildFile; fileRef = A9E53DD62100B197002781DD /* CAMetalLayer+MoltenVK.m */; }; + A9E53DEA2100B197002781DD /* CAMetalLayer+MoltenVK.m in Sources */ = {isa = PBXBuildFile; fileRef = A9E53DD62100B197002781DD /* CAMetalLayer+MoltenVK.m */; }; + A9E53DF32100B302002781DD /* MTLRenderPassDescriptor+MoltenVK.h in Headers */ = {isa = PBXBuildFile; fileRef = A9E53DEE2100B302002781DD /* MTLRenderPassDescriptor+MoltenVK.h */; }; + A9E53DF42100B302002781DD /* MTLRenderPassDescriptor+MoltenVK.h in Headers */ = {isa = PBXBuildFile; fileRef = A9E53DEE2100B302002781DD /* MTLRenderPassDescriptor+MoltenVK.h */; }; + A9E53DF52100B302002781DD /* MTLRenderPassDescriptor+MoltenVK.m in Sources */ = {isa = PBXBuildFile; fileRef = A9E53DF22100B302002781DD /* MTLRenderPassDescriptor+MoltenVK.m */; }; + A9E53DF62100B302002781DD /* MTLRenderPassDescriptor+MoltenVK.m in Sources */ = {isa = PBXBuildFile; fileRef = A9E53DF22100B302002781DD /* MTLRenderPassDescriptor+MoltenVK.m */; }; + A9E53DFF21064F84002781DD /* MTLRenderPipelineDescriptor+MoltenVK.m in Sources */ = {isa = PBXBuildFile; fileRef = A9E53DFA21064F84002781DD /* MTLRenderPipelineDescriptor+MoltenVK.m */; }; + A9E53E0021064F84002781DD /* MTLRenderPipelineDescriptor+MoltenVK.m in Sources */ = {isa = PBXBuildFile; fileRef = A9E53DFA21064F84002781DD /* MTLRenderPipelineDescriptor+MoltenVK.m */; }; + A9E53E0121064F84002781DD /* MTLRenderPipelineDescriptor+MoltenVK.h in Headers */ = {isa = PBXBuildFile; fileRef = A9E53DFE21064F84002781DD /* MTLRenderPipelineDescriptor+MoltenVK.h */; }; + A9E53E0221064F84002781DD /* MTLRenderPipelineDescriptor+MoltenVK.h in Headers */ = {isa = PBXBuildFile; fileRef = A9E53DFE21064F84002781DD /* MTLRenderPipelineDescriptor+MoltenVK.h */; }; A9F042A41FB4CF83009FCCB8 /* MVKCommonEnvironment.h in Headers */ = {isa = PBXBuildFile; fileRef = A9F0429D1FB4CF82009FCCB8 /* MVKCommonEnvironment.h */; }; A9F042A51FB4CF83009FCCB8 /* MVKCommonEnvironment.h in Headers */ = {isa = PBXBuildFile; fileRef = A9F0429D1FB4CF82009FCCB8 /* MVKCommonEnvironment.h */; }; A9F042A61FB4CF83009FCCB8 /* MVKLogging.h in Headers */ = {isa = PBXBuildFile; fileRef = A9F0429E1FB4CF82009FCCB8 /* MVKLogging.h */; }; @@ -248,8 +256,6 @@ A9096E5D1F81E16300DFBEA6 /* MVKCmdDispatch.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = MVKCmdDispatch.mm; sourceTree = ""; }; A90C8DE81F45354D009CB32C /* MVKCommandEncodingPool.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MVKCommandEncodingPool.h; sourceTree = ""; }; A90C8DE91F45354D009CB32C /* MVKCommandEncodingPool.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MVKCommandEncodingPool.mm; sourceTree = ""; }; - A92CAF342098166A009DA08E /* NSString+MoltenVK.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSString+MoltenVK.h"; sourceTree = ""; }; - A92CAF382098166B009DA08E /* NSString+MoltenVK.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = "NSString+MoltenVK.mm"; sourceTree = ""; }; A948BB7E1E51642700DE59F2 /* mvk_vulkan.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = mvk_vulkan.h; sourceTree = ""; }; A94FB7671C7DFB4800632CA3 /* mvk_datatypes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = mvk_datatypes.h; sourceTree = ""; }; A94FB7691C7DFB4800632CA3 /* vk_mvk_moltenvk.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = vk_mvk_moltenvk.h; sourceTree = ""; }; @@ -317,19 +323,11 @@ A98149441FB6A3F7005F00B4 /* MVKFoundation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MVKFoundation.h; sourceTree = ""; }; A98149451FB6A3F7005F00B4 /* MVKFoundation.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MVKFoundation.mm; sourceTree = ""; }; A98149461FB6A3F7005F00B4 /* MVKObjectPool.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MVKObjectPool.h; sourceTree = ""; }; - A98149471FB6A3F7005F00B4 /* MVKOSExtensions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MVKOSExtensions.h; sourceTree = ""; }; - A98149481FB6A3F7005F00B4 /* MVKOSExtensions.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MVKOSExtensions.mm; sourceTree = ""; }; A98149491FB6A3F7005F00B4 /* MVKWatermark.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MVKWatermark.h; sourceTree = ""; }; A981494A1FB6A3F7005F00B4 /* MVKWatermark.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MVKWatermark.mm; sourceTree = ""; }; A981494B1FB6A3F7005F00B4 /* MVKWatermarkShaderSource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MVKWatermarkShaderSource.h; sourceTree = ""; }; A981494C1FB6A3F7005F00B4 /* MVKWatermarkTextureContent.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MVKWatermarkTextureContent.h; sourceTree = ""; }; A981496A1FB6A998005F00B4 /* MVKStrings.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MVKStrings.h; sourceTree = ""; }; - A9917FF1209CC588004069EB /* MTLSamplerDescriptor+MoltenVK.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "MTLSamplerDescriptor+MoltenVK.m"; sourceTree = ""; }; - A9917FF2209CC589004069EB /* MTLSamplerDescriptor+MoltenVK.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "MTLSamplerDescriptor+MoltenVK.h"; sourceTree = ""; }; - A9917FF3209CC589004069EB /* MTLTextureDescriptor+MoltenVK.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "MTLTextureDescriptor+MoltenVK.h"; sourceTree = ""; }; - A9917FF4209CC589004069EB /* MTLTextureDescriptor+MoltenVK.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "MTLTextureDescriptor+MoltenVK.m"; sourceTree = ""; }; - A9917FF5209CC589004069EB /* CAMetalLayer+MoltenVK.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "CAMetalLayer+MoltenVK.h"; sourceTree = ""; }; - A9917FF6209CC589004069EB /* CAMetalLayer+MoltenVK.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "CAMetalLayer+MoltenVK.m"; sourceTree = ""; }; A9AD67C72054DD6C00ED3C08 /* vulkan */ = {isa = PBXFileReference; lastKnownFileType = folder; path = vulkan; sourceTree = ""; }; A9B8EE0A1A98D796009C5A02 /* MoltenVK.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = MoltenVK.framework; sourceTree = BUILT_PRODUCTS_DIR; }; A9C86CB61C55B8350096CAF2 /* MoltenVKShaderConverter.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = MoltenVKShaderConverter.xcodeproj; path = ../MoltenVKShaderConverter/MoltenVKShaderConverter.xcodeproj; sourceTree = ""; }; @@ -338,6 +336,20 @@ A9CBEE011B6299D800E45FDC /* MoltenVK.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = MoltenVK.framework; sourceTree = BUILT_PRODUCTS_DIR; }; A9DE1083200598C500F18F80 /* icd */ = {isa = PBXFileReference; lastKnownFileType = folder; path = icd; sourceTree = ""; }; A9E4B7881E1D8AF10046A4CE /* MVKMTLResourceBindings.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MVKMTLResourceBindings.h; sourceTree = ""; }; + A9E53DCD2100B197002781DD /* MTLSamplerDescriptor+MoltenVK.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "MTLSamplerDescriptor+MoltenVK.m"; sourceTree = ""; }; + A9E53DCE2100B197002781DD /* MVKOSExtensions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MVKOSExtensions.h; sourceTree = ""; }; + A9E53DCF2100B197002781DD /* MVKOSExtensions.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MVKOSExtensions.mm; sourceTree = ""; }; + A9E53DD02100B197002781DD /* MTLTextureDescriptor+MoltenVK.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "MTLTextureDescriptor+MoltenVK.h"; sourceTree = ""; }; + A9E53DD12100B197002781DD /* CAMetalLayer+MoltenVK.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "CAMetalLayer+MoltenVK.h"; sourceTree = ""; }; + A9E53DD22100B197002781DD /* NSString+MoltenVK.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSString+MoltenVK.h"; sourceTree = ""; }; + A9E53DD32100B197002781DD /* MTLSamplerDescriptor+MoltenVK.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "MTLSamplerDescriptor+MoltenVK.h"; sourceTree = ""; }; + A9E53DD42100B197002781DD /* NSString+MoltenVK.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = "NSString+MoltenVK.mm"; sourceTree = ""; }; + A9E53DD52100B197002781DD /* MTLTextureDescriptor+MoltenVK.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "MTLTextureDescriptor+MoltenVK.m"; sourceTree = ""; }; + A9E53DD62100B197002781DD /* CAMetalLayer+MoltenVK.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "CAMetalLayer+MoltenVK.m"; sourceTree = ""; }; + A9E53DEE2100B302002781DD /* MTLRenderPassDescriptor+MoltenVK.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "MTLRenderPassDescriptor+MoltenVK.h"; sourceTree = ""; }; + A9E53DF22100B302002781DD /* MTLRenderPassDescriptor+MoltenVK.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "MTLRenderPassDescriptor+MoltenVK.m"; sourceTree = ""; }; + A9E53DFA21064F84002781DD /* MTLRenderPipelineDescriptor+MoltenVK.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "MTLRenderPipelineDescriptor+MoltenVK.m"; sourceTree = ""; }; + A9E53DFE21064F84002781DD /* MTLRenderPipelineDescriptor+MoltenVK.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "MTLRenderPipelineDescriptor+MoltenVK.h"; sourceTree = ""; }; A9F0429D1FB4CF82009FCCB8 /* MVKCommonEnvironment.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MVKCommonEnvironment.h; sourceTree = ""; }; A9F0429E1FB4CF82009FCCB8 /* MVKLogging.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MVKLogging.h; sourceTree = ""; }; /* End PBXFileReference section */ @@ -369,6 +381,7 @@ A94FB76B1C7DFB4800632CA3 /* Commands */, A94FB77E1C7DFB4800632CA3 /* GPUObjects */, A94FB79F1C7DFB4800632CA3 /* Loader */, + A9E53DCC2100B197002781DD /* OS */, A98149401FB6A3F7005F00B4 /* Utility */, A94FB7A81C7DFB4800632CA3 /* Vulkan */, ); @@ -481,26 +494,16 @@ A98149401FB6A3F7005F00B4 /* Utility */ = { isa = PBXGroup; children = ( - A9917FF5209CC589004069EB /* CAMetalLayer+MoltenVK.h */, - A9917FF6209CC589004069EB /* CAMetalLayer+MoltenVK.m */, - A9917FF2209CC589004069EB /* MTLSamplerDescriptor+MoltenVK.h */, - A9917FF1209CC588004069EB /* MTLSamplerDescriptor+MoltenVK.m */, - A9917FF3209CC589004069EB /* MTLTextureDescriptor+MoltenVK.h */, - A9917FF4209CC589004069EB /* MTLTextureDescriptor+MoltenVK.m */, A98149411FB6A3F7005F00B4 /* MVKBaseObject.cpp */, A98149421FB6A3F7005F00B4 /* MVKBaseObject.h */, A98149431FB6A3F7005F00B4 /* MVKEnvironment.h */, A98149441FB6A3F7005F00B4 /* MVKFoundation.h */, A98149451FB6A3F7005F00B4 /* MVKFoundation.mm */, A98149461FB6A3F7005F00B4 /* MVKObjectPool.h */, - A98149471FB6A3F7005F00B4 /* MVKOSExtensions.h */, - A98149481FB6A3F7005F00B4 /* MVKOSExtensions.mm */, A98149491FB6A3F7005F00B4 /* MVKWatermark.h */, A981494A1FB6A3F7005F00B4 /* MVKWatermark.mm */, A981494B1FB6A3F7005F00B4 /* MVKWatermarkShaderSource.h */, A981494C1FB6A3F7005F00B4 /* MVKWatermarkTextureContent.h */, - A92CAF342098166A009DA08E /* NSString+MoltenVK.h */, - A92CAF382098166B009DA08E /* NSString+MoltenVK.mm */, ); path = Utility; sourceTree = ""; @@ -525,6 +528,27 @@ path = include; sourceTree = ""; }; + A9E53DCC2100B197002781DD /* OS */ = { + isa = PBXGroup; + children = ( + A9E53DD12100B197002781DD /* CAMetalLayer+MoltenVK.h */, + A9E53DD62100B197002781DD /* CAMetalLayer+MoltenVK.m */, + A9E53DEE2100B302002781DD /* MTLRenderPassDescriptor+MoltenVK.h */, + A9E53DF22100B302002781DD /* MTLRenderPassDescriptor+MoltenVK.m */, + A9E53DFE21064F84002781DD /* MTLRenderPipelineDescriptor+MoltenVK.h */, + A9E53DFA21064F84002781DD /* MTLRenderPipelineDescriptor+MoltenVK.m */, + A9E53DD32100B197002781DD /* MTLSamplerDescriptor+MoltenVK.h */, + A9E53DCD2100B197002781DD /* MTLSamplerDescriptor+MoltenVK.m */, + A9E53DD02100B197002781DD /* MTLTextureDescriptor+MoltenVK.h */, + A9E53DD52100B197002781DD /* MTLTextureDescriptor+MoltenVK.m */, + A9E53DCE2100B197002781DD /* MVKOSExtensions.h */, + A9E53DCF2100B197002781DD /* MVKOSExtensions.mm */, + A9E53DD22100B197002781DD /* NSString+MoltenVK.h */, + A9E53DD42100B197002781DD /* NSString+MoltenVK.mm */, + ); + path = OS; + sourceTree = ""; + }; A9F0429B1FB4CF82009FCCB8 /* Common */ = { isa = PBXGroup; children = ( @@ -569,17 +593,22 @@ A98149511FB6A3F7005F00B4 /* MVKEnvironment.h in Headers */, A948BB7F1E51642700DE59F2 /* mvk_vulkan.h in Headers */, A94FB8101C7DFB4800632CA3 /* MVKSurface.h in Headers */, + A9E53E0121064F84002781DD /* MTLRenderPipelineDescriptor+MoltenVK.h in Headers */, A94FB7F41C7DFB4800632CA3 /* MVKInstance.h in Headers */, A95870F81C90D29F009EB096 /* MVKCommandResourceFactory.h in Headers */, + A9E53DD92100B197002781DD /* MVKOSExtensions.h in Headers */, A94FB7FC1C7DFB4800632CA3 /* MVKQueryPool.h in Headers */, A95B7D691D3EE486003183D3 /* MVKCommandEncoderState.h in Headers */, A94FB7D81C7DFB4800632CA3 /* MVKCommandPipelineStateFactoryShaderSource.h in Headers */, A94FB7E01C7DFB4800632CA3 /* MVKDescriptorSet.h in Headers */, + A9E53DE12100B197002781DD /* NSString+MoltenVK.h in Headers */, + A9E53DDF2100B197002781DD /* CAMetalLayer+MoltenVK.h in Headers */, A94FB8041C7DFB4800632CA3 /* MVKRenderPass.h in Headers */, A9F042A61FB4CF83009FCCB8 /* MVKLogging.h in Headers */, A94FB8001C7DFB4800632CA3 /* MVKQueue.h in Headers */, A94FB7EC1C7DFB4800632CA3 /* MVKFramebuffer.h in Headers */, A98149611FB6A3F7005F00B4 /* MVKWatermarkShaderSource.h in Headers */, + A9E53DE32100B197002781DD /* MTLSamplerDescriptor+MoltenVK.h in Headers */, A94FB8181C7DFB4800632CA3 /* MVKSync.h in Headers */, A94FB7E41C7DFB4800632CA3 /* MVKDevice.h in Headers */, A94FB7D41C7DFB4800632CA3 /* MVKCommandPool.h in Headers */, @@ -593,24 +622,21 @@ A94FB7DC1C7DFB4800632CA3 /* MVKBuffer.h in Headers */, A9F042A41FB4CF83009FCCB8 /* MVKCommonEnvironment.h in Headers */, A981495D1FB6A3F7005F00B4 /* MVKWatermark.h in Headers */, - A9917FFB209CC589004069EB /* MTLTextureDescriptor+MoltenVK.h in Headers */, A94FB7C41C7DFB4800632CA3 /* MVKCmdRenderPass.h in Headers */, A94FB7BC1C7DFB4800632CA3 /* MVKCmdPipeline.h in Headers */, A94FB7F81C7DFB4800632CA3 /* MVKPipeline.h in Headers */, - A92CAF392098166B009DA08E /* NSString+MoltenVK.h in Headers */, A94FB7F01C7DFB4800632CA3 /* MVKImage.h in Headers */, A94FB7B81C7DFB4800632CA3 /* MVKCmdTransfer.h in Headers */, A94FB7C81C7DFB4800632CA3 /* MVKCmdDraw.h in Headers */, A94FB7D01C7DFB4800632CA3 /* MVKCommandBuffer.h in Headers */, + A9E53DF32100B302002781DD /* MTLRenderPassDescriptor+MoltenVK.h in Headers */, A98149631FB6A3F7005F00B4 /* MVKWatermarkTextureContent.h in Headers */, A98149531FB6A3F7005F00B4 /* MVKFoundation.h in Headers */, - A9917FF9209CC589004069EB /* MTLSamplerDescriptor+MoltenVK.h in Headers */, A94FB7E81C7DFB4800632CA3 /* MVKDeviceMemory.h in Headers */, - A98149591FB6A3F7005F00B4 /* MVKOSExtensions.h in Headers */, A9E4B7891E1D8AF10046A4CE /* MVKMTLResourceBindings.h in Headers */, A90C8DEA1F45354D009CB32C /* MVKCommandEncodingPool.h in Headers */, A94FB8081C7DFB4800632CA3 /* MVKResource.h in Headers */, - A9917FFF209CC589004069EB /* CAMetalLayer+MoltenVK.h in Headers */, + A9E53DDD2100B197002781DD /* MTLTextureDescriptor+MoltenVK.h in Headers */, A981496B1FB6A998005F00B4 /* MVKStrings.h in Headers */, A94FB81C1C7DFB4800632CA3 /* MVKLayers.h in Headers */, ); @@ -625,17 +651,22 @@ A98149521FB6A3F7005F00B4 /* MVKEnvironment.h in Headers */, A948BB801E51642700DE59F2 /* mvk_vulkan.h in Headers */, A94FB8111C7DFB4800632CA3 /* MVKSurface.h in Headers */, + A9E53E0221064F84002781DD /* MTLRenderPipelineDescriptor+MoltenVK.h in Headers */, A94FB7F51C7DFB4800632CA3 /* MVKInstance.h in Headers */, A95870F91C90D29F009EB096 /* MVKCommandResourceFactory.h in Headers */, + A9E53DDA2100B197002781DD /* MVKOSExtensions.h in Headers */, A94FB7FD1C7DFB4800632CA3 /* MVKQueryPool.h in Headers */, A95B7D6A1D3EE486003183D3 /* MVKCommandEncoderState.h in Headers */, A94FB7D91C7DFB4800632CA3 /* MVKCommandPipelineStateFactoryShaderSource.h in Headers */, A94FB7E11C7DFB4800632CA3 /* MVKDescriptorSet.h in Headers */, + A9E53DE22100B197002781DD /* NSString+MoltenVK.h in Headers */, + A9E53DE02100B197002781DD /* CAMetalLayer+MoltenVK.h in Headers */, A94FB8051C7DFB4800632CA3 /* MVKRenderPass.h in Headers */, A9F042A71FB4CF83009FCCB8 /* MVKLogging.h in Headers */, A94FB8011C7DFB4800632CA3 /* MVKQueue.h in Headers */, A94FB7ED1C7DFB4800632CA3 /* MVKFramebuffer.h in Headers */, A98149621FB6A3F7005F00B4 /* MVKWatermarkShaderSource.h in Headers */, + A9E53DE42100B197002781DD /* MTLSamplerDescriptor+MoltenVK.h in Headers */, A94FB8191C7DFB4800632CA3 /* MVKSync.h in Headers */, A94FB7E51C7DFB4800632CA3 /* MVKDevice.h in Headers */, A94FB7D51C7DFB4800632CA3 /* MVKCommandPool.h in Headers */, @@ -649,24 +680,21 @@ A94FB7DD1C7DFB4800632CA3 /* MVKBuffer.h in Headers */, A9F042A51FB4CF83009FCCB8 /* MVKCommonEnvironment.h in Headers */, A981495E1FB6A3F7005F00B4 /* MVKWatermark.h in Headers */, - A9917FFC209CC589004069EB /* MTLTextureDescriptor+MoltenVK.h in Headers */, A94FB7C51C7DFB4800632CA3 /* MVKCmdRenderPass.h in Headers */, A94FB7BD1C7DFB4800632CA3 /* MVKCmdPipeline.h in Headers */, A94FB7F91C7DFB4800632CA3 /* MVKPipeline.h in Headers */, - A92CAF3A2098166B009DA08E /* NSString+MoltenVK.h in Headers */, A94FB7F11C7DFB4800632CA3 /* MVKImage.h in Headers */, A94FB7B91C7DFB4800632CA3 /* MVKCmdTransfer.h in Headers */, A94FB7C91C7DFB4800632CA3 /* MVKCmdDraw.h in Headers */, A94FB7D11C7DFB4800632CA3 /* MVKCommandBuffer.h in Headers */, + A9E53DF42100B302002781DD /* MTLRenderPassDescriptor+MoltenVK.h in Headers */, A98149641FB6A3F7005F00B4 /* MVKWatermarkTextureContent.h in Headers */, A98149541FB6A3F7005F00B4 /* MVKFoundation.h in Headers */, - A9917FFA209CC589004069EB /* MTLSamplerDescriptor+MoltenVK.h in Headers */, A94FB7E91C7DFB4800632CA3 /* MVKDeviceMemory.h in Headers */, - A981495A1FB6A3F7005F00B4 /* MVKOSExtensions.h in Headers */, A9E4B78A1E1D8AF10046A4CE /* MVKMTLResourceBindings.h in Headers */, A90C8DEB1F45354D009CB32C /* MVKCommandEncodingPool.h in Headers */, A94FB8091C7DFB4800632CA3 /* MVKResource.h in Headers */, - A9918000209CC589004069EB /* CAMetalLayer+MoltenVK.h in Headers */, + A9E53DDE2100B197002781DD /* MTLTextureDescriptor+MoltenVK.h in Headers */, A981496C1FB6A998005F00B4 /* MVKStrings.h in Headers */, A94FB81D1C7DFB4800632CA3 /* MVKLayers.h in Headers */, ); @@ -829,22 +857,23 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + A9E53DFF21064F84002781DD /* MTLRenderPipelineDescriptor+MoltenVK.m in Sources */, A94FB80A1C7DFB4800632CA3 /* MVKResource.mm in Sources */, A94FB7E21C7DFB4800632CA3 /* MVKDescriptorSet.mm in Sources */, - A9917FFD209CC589004069EB /* MTLTextureDescriptor+MoltenVK.m in Sources */, + A9E53DE72100B197002781DD /* MTLTextureDescriptor+MoltenVK.m in Sources */, A95870FA1C90D29F009EB096 /* MVKCommandResourceFactory.mm in Sources */, A90C8DEC1F45354D009CB32C /* MVKCommandEncodingPool.mm in Sources */, A981495F1FB6A3F7005F00B4 /* MVKWatermark.mm in Sources */, A981494D1FB6A3F7005F00B4 /* MVKBaseObject.cpp in Sources */, + A9E53DE52100B197002781DD /* NSString+MoltenVK.mm in Sources */, + A9E53DDB2100B197002781DD /* MVKOSExtensions.mm in Sources */, A94FB8321C7DFB4800632CA3 /* vulkan.mm in Sources */, A94FB8121C7DFB4800632CA3 /* MVKSurface.mm in Sources */, A94FB7FE1C7DFB4800632CA3 /* MVKQueryPool.mm in Sources */, - A92CAF3B2098166B009DA08E /* NSString+MoltenVK.mm in Sources */, A94FB7F61C7DFB4800632CA3 /* MVKInstance.mm in Sources */, A94FB7EA1C7DFB4800632CA3 /* MVKDeviceMemory.mm in Sources */, A94FB7F21C7DFB4800632CA3 /* MVKImage.mm in Sources */, A94FB7D61C7DFB4800632CA3 /* MVKCommandPool.mm in Sources */, - A9917FF7209CC589004069EB /* MTLSamplerDescriptor+MoltenVK.m in Sources */, A94FB7CA1C7DFB4800632CA3 /* MVKCmdDraw.mm in Sources */, A94FB7D21C7DFB4800632CA3 /* MVKCommandBuffer.mm in Sources */, A94FB7C61C7DFB4800632CA3 /* MVKCmdRenderPass.mm in Sources */, @@ -852,8 +881,10 @@ A94FB82A1C7DFB4800632CA3 /* mvk_datatypes.mm in Sources */, A98149551FB6A3F7005F00B4 /* MVKFoundation.mm in Sources */, A94FB7E61C7DFB4800632CA3 /* MVKDevice.mm in Sources */, + A9E53DF52100B302002781DD /* MTLRenderPassDescriptor+MoltenVK.m in Sources */, A94FB7FA1C7DFB4800632CA3 /* MVKPipeline.mm in Sources */, A94FB8021C7DFB4800632CA3 /* MVKQueue.mm in Sources */, + A9E53DD72100B197002781DD /* MTLSamplerDescriptor+MoltenVK.m in Sources */, A94FB8061C7DFB4800632CA3 /* MVKRenderPass.mm in Sources */, A94FB7BA1C7DFB4800632CA3 /* MVKCmdTransfer.mm in Sources */, A94FB7C21C7DFB4800632CA3 /* MVKCmdQueries.mm in Sources */, @@ -867,8 +898,7 @@ A94FB81E1C7DFB4800632CA3 /* MVKLayers.mm in Sources */, A94FB7EE1C7DFB4800632CA3 /* MVKFramebuffer.mm in Sources */, A9C96DD21DDC20C20053187F /* MVKMTLBufferAllocation.mm in Sources */, - A981495B1FB6A3F7005F00B4 /* MVKOSExtensions.mm in Sources */, - A9918001209CC589004069EB /* CAMetalLayer+MoltenVK.m in Sources */, + A9E53DE92100B197002781DD /* CAMetalLayer+MoltenVK.m in Sources */, A9096E5E1F81E16300DFBEA6 /* MVKCmdDispatch.mm in Sources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -877,22 +907,23 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + A9E53E0021064F84002781DD /* MTLRenderPipelineDescriptor+MoltenVK.m in Sources */, A94FB80B1C7DFB4800632CA3 /* MVKResource.mm in Sources */, A94FB7E31C7DFB4800632CA3 /* MVKDescriptorSet.mm in Sources */, - A9917FFE209CC589004069EB /* MTLTextureDescriptor+MoltenVK.m in Sources */, + A9E53DE82100B197002781DD /* MTLTextureDescriptor+MoltenVK.m in Sources */, A95870FB1C90D29F009EB096 /* MVKCommandResourceFactory.mm in Sources */, A90C8DED1F45354D009CB32C /* MVKCommandEncodingPool.mm in Sources */, A98149601FB6A3F7005F00B4 /* MVKWatermark.mm in Sources */, A981494E1FB6A3F7005F00B4 /* MVKBaseObject.cpp in Sources */, + A9E53DE62100B197002781DD /* NSString+MoltenVK.mm in Sources */, + A9E53DDC2100B197002781DD /* MVKOSExtensions.mm in Sources */, A94FB8331C7DFB4800632CA3 /* vulkan.mm in Sources */, A94FB8131C7DFB4800632CA3 /* MVKSurface.mm in Sources */, A94FB7FF1C7DFB4800632CA3 /* MVKQueryPool.mm in Sources */, - A92CAF3C2098166B009DA08E /* NSString+MoltenVK.mm in Sources */, A94FB7F71C7DFB4800632CA3 /* MVKInstance.mm in Sources */, A94FB7EB1C7DFB4800632CA3 /* MVKDeviceMemory.mm in Sources */, A94FB7F31C7DFB4800632CA3 /* MVKImage.mm in Sources */, A94FB7D71C7DFB4800632CA3 /* MVKCommandPool.mm in Sources */, - A9917FF8209CC589004069EB /* MTLSamplerDescriptor+MoltenVK.m in Sources */, A94FB7CB1C7DFB4800632CA3 /* MVKCmdDraw.mm in Sources */, A94FB7D31C7DFB4800632CA3 /* MVKCommandBuffer.mm in Sources */, A94FB7C71C7DFB4800632CA3 /* MVKCmdRenderPass.mm in Sources */, @@ -900,8 +931,10 @@ A94FB82B1C7DFB4800632CA3 /* mvk_datatypes.mm in Sources */, A98149561FB6A3F7005F00B4 /* MVKFoundation.mm in Sources */, A94FB7E71C7DFB4800632CA3 /* MVKDevice.mm in Sources */, + A9E53DF62100B302002781DD /* MTLRenderPassDescriptor+MoltenVK.m in Sources */, A94FB7FB1C7DFB4800632CA3 /* MVKPipeline.mm in Sources */, A94FB8031C7DFB4800632CA3 /* MVKQueue.mm in Sources */, + A9E53DD82100B197002781DD /* MTLSamplerDescriptor+MoltenVK.m in Sources */, A94FB8071C7DFB4800632CA3 /* MVKRenderPass.mm in Sources */, A94FB7BB1C7DFB4800632CA3 /* MVKCmdTransfer.mm in Sources */, A94FB7C31C7DFB4800632CA3 /* MVKCmdQueries.mm in Sources */, @@ -915,8 +948,7 @@ A94FB81F1C7DFB4800632CA3 /* MVKLayers.mm in Sources */, A94FB7EF1C7DFB4800632CA3 /* MVKFramebuffer.mm in Sources */, A9C96DD31DDC20C20053187F /* MVKMTLBufferAllocation.mm in Sources */, - A981495C1FB6A3F7005F00B4 /* MVKOSExtensions.mm in Sources */, - A9918002209CC589004069EB /* CAMetalLayer+MoltenVK.m in Sources */, + A9E53DEA2100B197002781DD /* CAMetalLayer+MoltenVK.m in Sources */, A9096E5F1F81E16300DFBEA6 /* MVKCmdDispatch.mm in Sources */, ); runOnlyForDeploymentPostprocessing = 0; diff --git a/MoltenVK/MoltenVK/API/mvk_datatypes.h b/MoltenVK/MoltenVK/API/mvk_datatypes.h index c63962a68..1bdb26145 100644 --- a/MoltenVK/MoltenVK/API/mvk_datatypes.h +++ b/MoltenVK/MoltenVK/API/mvk_datatypes.h @@ -265,13 +265,25 @@ uint32_t mvkMipmapLevels3D(VkExtent3D extent); * Returns the size of the specified zero-based mipmap level, * when the size of the base level is the specified size. */ -VkExtent2D mvkMipmapLevelSizeFromBaseSize(VkExtent2D baseSize, uint32_t level); +VkExtent2D mvkMipmapLevelSizeFromBaseSize2D(VkExtent2D baseSize, uint32_t level); + +/** + * Returns the size of the specified zero-based mipmap level, + * when the size of the base level is the specified size. + */ +VkExtent3D mvkMipmapLevelSizeFromBaseSize3D(VkExtent3D baseSize, uint32_t level); /** * Returns the size of the mipmap base level, when the size of * the specified zero-based mipmap level is the specified size. */ -VkExtent2D mvkMipmapBaseSizeFromLevelSize(VkExtent2D levelSize, uint32_t level); +VkExtent2D mvkMipmapBaseSizeFromLevelSize2D(VkExtent2D levelSize, uint32_t level); + +/** + * Returns the size of the mipmap base level, when the size of + * the specified zero-based mipmap level is the specified size. + */ +VkExtent3D mvkMipmapBaseSizeFromLevelSize3D(VkExtent3D levelSize, uint32_t level); #pragma mark Samplers @@ -319,10 +331,12 @@ MTLVertexStepFunction mvkMTLVertexStepFunctionFromVkVertexInputRate(VkVertexInpu /** Returns the Metal MTLPrimitiveType corresponding to the specified Vulkan VkPrimitiveTopology. */ MTLPrimitiveType mvkMTLPrimitiveTypeFromVkPrimitiveTopology(VkPrimitiveTopology vkTopology); -#if MVK_MACOS -/** Returns the Metal MTLPrimitiveTopologyClass corresponding to the specified Vulkan VkPrimitiveTopology. */ -MTLPrimitiveTopologyClass mvkMTLPrimitiveTopologyClassFromVkPrimitiveTopology(VkPrimitiveTopology vkTopology); -#endif +/** + * Returns the Metal MTLPrimitiveTopologyClass corresponding to the specified Vulkan VkPrimitiveTopology. + * + * The value is treated as an NSUInteger to support OS versions on which the enum is unavailable. + */ +NSUInteger mvkMTLPrimitiveTopologyClassFromVkPrimitiveTopology(VkPrimitiveTopology vkTopology); /** Returns the Metal MTLLoadAction corresponding to the specified Vulkan VkAttachmentLoadOp. */ MTLLoadAction mvkMTLLoadActionFromVkAttachmentLoadOp(VkAttachmentLoadOp vkLoadOp); diff --git a/MoltenVK/MoltenVK/API/vk_mvk_moltenvk.h b/MoltenVK/MoltenVK/API/vk_mvk_moltenvk.h index c130a7c5e..66065dba3 100644 --- a/MoltenVK/MoltenVK/API/vk_mvk_moltenvk.h +++ b/MoltenVK/MoltenVK/API/vk_mvk_moltenvk.h @@ -48,7 +48,7 @@ extern "C" { */ #define MVK_VERSION_MAJOR 1 #define MVK_VERSION_MINOR 0 -#define MVK_VERSION_PATCH 15 +#define MVK_VERSION_PATCH 16 #define MVK_MAKE_VERSION(major, minor, patch) (((major) * 10000) + ((minor) * 100) + (patch)) #define MVK_VERSION MVK_MAKE_VERSION(MVK_VERSION_MAJOR, MVK_VERSION_MINOR, MVK_VERSION_PATCH) diff --git a/MoltenVK/MoltenVK/Commands/MVKCmdTransfer.h b/MoltenVK/MoltenVK/Commands/MVKCmdTransfer.h index fca4fcc95..c441dd6d1 100644 --- a/MoltenVK/MoltenVK/Commands/MVKCmdTransfer.h +++ b/MoltenVK/MoltenVK/Commands/MVKCmdTransfer.h @@ -242,7 +242,7 @@ class MVKCmdClearAttachments : public MVKCommand { void populateVertices(VkClearRect& clearRect, float attWidth, float attHeight); std::vector _clearRects; - std::vector _vertices; + std::vector _vertices; simd::float4 _clearColors[kMVKAttachmentFormatCount]; VkClearValue _vkClearValues[kMVKAttachmentFormatCount]; MVKRPSKeyClearAtt _rpsKey; @@ -279,9 +279,9 @@ class MVKCmdClearImage : public MVKCommand { MVKImage* _image; VkImageLayout _imgLayout; std::vector _subresourceRanges; - simd::float4 _clearColors[kMVKAttachmentFormatCount]; - MVKRPSKeyClearAtt _rpsKey; - uint32_t _mtlStencilValue; + MTLClearColor _mtlColorClearValue; + double _mtlDepthClearValue; + uint32_t _mtlStencilClearValue; bool _isDepthStencilClear; }; @@ -396,12 +396,12 @@ void mvkCmdClearAttachments(MVKCommandBuffer* cmdBuff, const VkClearRect* pRects); /** Adds a clear color image command to the specified command buffer. */ -void mvkCmdClearImage(MVKCommandBuffer* cmdBuff, - VkImage image, - VkImageLayout imageLayout, - const VkClearColorValue* pColor, - uint32_t rangeCount, - const VkImageSubresourceRange* pRanges); +void mvkCmdClearColorImage(MVKCommandBuffer* cmdBuff, + VkImage image, + VkImageLayout imageLayout, + const VkClearColorValue* pColor, + uint32_t rangeCount, + const VkImageSubresourceRange* pRanges); /** Adds a clear depth stencil image command to the specified command buffer. */ void mvkCmdClearDepthStencilImage(MVKCommandBuffer* cmdBuff, diff --git a/MoltenVK/MoltenVK/Commands/MVKCmdTransfer.mm b/MoltenVK/MoltenVK/Commands/MVKCmdTransfer.mm index 026476102..444cace0d 100644 --- a/MoltenVK/MoltenVK/Commands/MVKCmdTransfer.mm +++ b/MoltenVK/MoltenVK/Commands/MVKCmdTransfer.mm @@ -24,6 +24,7 @@ #include "MVKBuffer.h" #include "MVKFramebuffer.h" #include "MVKRenderPass.h" +#include "MTLRenderPassDescriptor+MoltenVK.h" #include "mvk_datatypes.h" @@ -774,35 +775,43 @@ bottomPos = (bottomPos * 2.0) - 1.0; topPos = (topPos * 2.0) - 1.0; - simd::float2 vtx; + simd::float4 vtx; - // Top left vertex - First triangle - vtx.y = topPos; - vtx.x = leftPos; - _vertices.push_back(vtx); + uint32_t startLayer = clearRect.baseArrayLayer; + uint32_t endLayer = startLayer + clearRect.layerCount; + for (uint32_t layer = startLayer; layer < endLayer; layer++) { - // Bottom left vertex - vtx.y = bottomPos; - vtx.x = leftPos; - _vertices.push_back(vtx); + vtx.z = 0.0; + vtx.w = layer; - // Bottom right vertex - vtx.y = bottomPos; - vtx.x = rightPos; - _vertices.push_back(vtx); + // Top left vertex - First triangle + vtx.y = topPos; + vtx.x = leftPos; + _vertices.push_back(vtx); - // Bottom right vertex - Second triangle - _vertices.push_back(vtx); + // Bottom left vertex + vtx.y = bottomPos; + vtx.x = leftPos; + _vertices.push_back(vtx); - // Top right vertex - vtx.y = topPos; - vtx.x = rightPos; - _vertices.push_back(vtx); + // Bottom right vertex + vtx.y = bottomPos; + vtx.x = rightPos; + _vertices.push_back(vtx); - // Top left vertex - vtx.y = topPos; - vtx.x = leftPos; - _vertices.push_back(vtx); + // Bottom right vertex - Second triangle + _vertices.push_back(vtx); + + // Top right vertex + vtx.y = topPos; + vtx.x = rightPos; + _vertices.push_back(vtx); + + // Top left vertex + vtx.y = topPos; + vtx.x = leftPos; + _vertices.push_back(vtx); + } } void MVKCmdClearAttachments::encode(MVKCommandEncoder* cmdEncoder) { @@ -840,7 +849,7 @@ cmdEncoder->setVertexBytes(mtlRendEnc, _clearColors, sizeof(_clearColors), 0); cmdEncoder->setFragmentBytes(mtlRendEnc, _clearColors, sizeof(_clearColors), 0); - cmdEncoder->setVertexBytes(mtlRendEnc, _vertices.data(), vtxCnt * sizeof(simd::float2), vtxBuffIdx); + cmdEncoder->setVertexBytes(mtlRendEnc, _vertices.data(), vtxCnt * sizeof(_vertices[0]), vtxBuffIdx); [mtlRendEnc drawPrimitives: MTLPrimitiveTypeTriangle vertexStart: 0 vertexCount: vtxCnt]; [mtlRendEnc popDebugGroup]; } @@ -858,23 +867,10 @@ _image = (MVKImage*)image; _imgLayout = imageLayout; _isDepthStencilClear = isDepthStencilClear; - _mtlStencilValue = 0; - - _rpsKey = kMVKRPSKeyClearAttDefault; - _rpsKey.mtlSampleCount = _image->getSampleCount(); - - if (_isDepthStencilClear) { - _rpsKey.enable(kMVKAttachmentFormatDepthStencilIndex); - _rpsKey.attachmentMTLPixelFormats[kMVKAttachmentFormatDepthStencilIndex] = _image->getMTLPixelFormat(); - float mtlDepthVal = mvkMTLClearDepthFromVkClearValue(clearValue); - _clearColors[kMVKAttachmentFormatDepthStencilIndex] = { mtlDepthVal, mtlDepthVal, mtlDepthVal, mtlDepthVal }; - _mtlStencilValue = mvkMTLClearStencilFromVkClearValue(clearValue); - } else { - _rpsKey.enable(0); - _rpsKey.attachmentMTLPixelFormats[0] = _image->getMTLPixelFormat(); - MTLClearColor mtlCC = mvkMTLClearColorFromVkClearValue(clearValue, _image->getVkFormat()); - _clearColors[0] = { (float)mtlCC.red, (float)mtlCC.green, (float)mtlCC.blue, (float)mtlCC.alpha}; - } + + _mtlColorClearValue = mvkMTLClearColorFromVkClearValue(clearValue, _image->getVkFormat()); + _mtlDepthClearValue = mvkMTLClearDepthFromVkClearValue(clearValue); + _mtlStencilClearValue = mvkMTLClearStencilFromVkClearValue(clearValue); // Add subresource ranges _subresourceRanges.clear(); @@ -883,64 +879,51 @@ _subresourceRanges.push_back(pRanges[i]); } } - void MVKCmdClearImage::encode(MVKCommandEncoder* cmdEncoder) { - - MTLPixelFormat imgMTLPixFmt = _image->getMTLPixelFormat(); - id imgMTLTex = _image->getMTLTexture(); + id imgMTLTex = _image->getMTLTexture(); if ( !imgMTLTex ) { return; } - cmdEncoder->endCurrentMetalEncoding(); + VkExtent3D imgBaseExtent = _image->getExtent3D(); + NSString* mtlRendEncName = (_isDepthStencilClear + ? mvkMTLRenderCommandEncoderLabel(kMVKCommandUseClearDepthStencilImage) + : mvkMTLRenderCommandEncoderLabel(kMVKCommandUseClearColorImage)); - static const simd::float2 vertices[] = { - { -1.0, -1.0 }, // Bottom-left - { 1.0, -1.0 }, // Bottom-right - { -1.0, 1.0 }, // Top-left - { 1.0, 1.0 }, // Top-right - }; + cmdEncoder->endCurrentMetalEncoding(); - uint32_t vtxBuffIdx = getDevice()->getMetalBufferIndexForVertexAttributeBinding(kMVKVertexContentBufferIndex); + for (auto& srRange : _subresourceRanges) { + + MTLRenderPassDescriptor* mtlRPDesc = [MTLRenderPassDescriptor renderPassDescriptor]; + MTLRenderPassColorAttachmentDescriptor* mtlRPCADesc = nil; + MTLRenderPassDepthAttachmentDescriptor* mtlRPDADesc = nil; + MTLRenderPassStencilAttachmentDescriptor* mtlRPSADesc = nil; - MTLRenderPassDescriptor* mtlRPDesc = [MTLRenderPassDescriptor renderPassDescriptor]; - MTLRenderPassAttachmentDescriptor* mtlRPCADesc = nil; - MTLRenderPassAttachmentDescriptor* mtlRPDADesc = nil; - MTLRenderPassAttachmentDescriptor* mtlRPSADesc = nil; - NSString* mtlRendEncName; - NSString* mtlDebugGroupName; - if (_isDepthStencilClear) { - if (mvkMTLPixelFormatIsDepthFormat(imgMTLPixFmt)) { + bool isClearingColor = !_isDepthStencilClear && mvkIsAnyFlagEnabled(srRange.aspectMask, VK_IMAGE_ASPECT_COLOR_BIT); + bool isClearingDepth = _isDepthStencilClear && mvkIsAnyFlagEnabled(srRange.aspectMask, VK_IMAGE_ASPECT_DEPTH_BIT); + bool isClearingStencil = _isDepthStencilClear && mvkIsAnyFlagEnabled(srRange.aspectMask, VK_IMAGE_ASPECT_STENCIL_BIT); + + if (isClearingColor) { + mtlRPCADesc = mtlRPDesc.colorAttachments[0]; + mtlRPCADesc.texture = imgMTLTex; + mtlRPCADesc.loadAction = MTLLoadActionClear; + mtlRPCADesc.storeAction = MTLStoreActionStore; + mtlRPCADesc.clearColor = _mtlColorClearValue; + } + + if (isClearingDepth) { mtlRPDADesc = mtlRPDesc.depthAttachment; mtlRPDADesc.texture = imgMTLTex; - mtlRPDADesc.loadAction = MTLLoadActionLoad; + mtlRPDADesc.loadAction = MTLLoadActionClear; mtlRPDADesc.storeAction = MTLStoreActionStore; + mtlRPDADesc.clearDepth = _mtlDepthClearValue; } - if (mvkMTLPixelFormatIsStencilFormat(imgMTLPixFmt)) { + + if (isClearingStencil) { mtlRPSADesc = mtlRPDesc.stencilAttachment; mtlRPSADesc.texture = imgMTLTex; - mtlRPSADesc.loadAction = MTLLoadActionLoad; + mtlRPSADesc.loadAction = MTLLoadActionClear; mtlRPSADesc.storeAction = MTLStoreActionStore; + mtlRPSADesc.clearStencil = _mtlStencilClearValue; } - mtlDebugGroupName = @"vkCmdClearDepthStencilImage"; - mtlRendEncName = mvkMTLRenderCommandEncoderLabel(kMVKCommandUseClearDepthStencilImage); - } else { - mtlRPCADesc = mtlRPDesc.colorAttachments[0]; - mtlRPCADesc.texture = imgMTLTex; - mtlRPCADesc.loadAction = MTLLoadActionLoad; - mtlRPCADesc.storeAction = MTLStoreActionStore; - mtlDebugGroupName = @"vkCmdClearColorImage"; - mtlRendEncName = mvkMTLRenderCommandEncoderLabel(kMVKCommandUseClearColorImage); - } - - MVKCommandEncodingPool* cmdEncPool = cmdEncoder->getCommandEncodingPool(); - id mtlRPS = cmdEncPool->getCmdClearMTLRenderPipelineState(_rpsKey); - - size_t srCnt = _subresourceRanges.size(); - for (uint32_t srIdx = 0; srIdx < srCnt; srIdx++) { - auto& srRange = _subresourceRanges[srIdx]; - - bool isClearingDepth = _isDepthStencilClear && mvkIsAnyFlagEnabled(srRange.aspectMask, VK_IMAGE_ASPECT_DEPTH_BIT); - bool isClearingStencil = _isDepthStencilClear && mvkIsAnyFlagEnabled(srRange.aspectMask, VK_IMAGE_ASPECT_STENCIL_BIT); - id mtlDSS = cmdEncPool->getMTLDepthStencilState(isClearingDepth, isClearingStencil); // Extract the mipmap levels that are to be updated uint32_t mipLvlStart = srRange.baseMipLevel; @@ -961,6 +944,7 @@ mtlRPCADesc.level = mipLvl; mtlRPDADesc.level = mipLvl; mtlRPSADesc.level = mipLvl; + mtlRPDesc.renderTargetArrayLengthMVK = mvkMipmapLevelSizeFromBaseSize3D(imgBaseExtent, mipLvl).depth; for (uint32_t layer = layerStart; layer < layerEnd; layer++) { mtlRPCADesc.slice = layer; @@ -969,17 +953,6 @@ id mtlRendEnc = [cmdEncoder->_mtlCmdBuffer renderCommandEncoderWithDescriptor: mtlRPDesc]; mtlRendEnc.label = mtlRendEncName; - - [mtlRendEnc pushDebugGroup: mtlDebugGroupName]; - [mtlRendEnc setRenderPipelineState: mtlRPS]; - [mtlRendEnc setDepthStencilState: mtlDSS]; - [mtlRendEnc setStencilReferenceValue: _mtlStencilValue]; - - cmdEncoder->setVertexBytes(mtlRendEnc, _clearColors, sizeof(_clearColors), 0); - cmdEncoder->setFragmentBytes(mtlRendEnc, _clearColors, sizeof(_clearColors), 0); - cmdEncoder->setVertexBytes(mtlRendEnc, vertices, sizeof(vertices), vtxBuffIdx); - [mtlRendEnc drawPrimitives: MTLPrimitiveTypeTriangleStrip vertexStart: 0 vertexCount: kMVKBlitVertexCount]; - [mtlRendEnc popDebugGroup]; [mtlRendEnc endEncoding]; } } @@ -1138,12 +1111,12 @@ void mvkCmdClearAttachments(MVKCommandBuffer* cmdBuff, cmdBuff->addCommand(cmd); } -void mvkCmdClearImage(MVKCommandBuffer* cmdBuff, - VkImage image, - VkImageLayout imageLayout, - const VkClearColorValue* pColor, - uint32_t rangeCount, - const VkImageSubresourceRange* pRanges) { +void mvkCmdClearColorImage(MVKCommandBuffer* cmdBuff, + VkImage image, + VkImageLayout imageLayout, + const VkClearColorValue* pColor, + uint32_t rangeCount, + const VkImageSubresourceRange* pRanges) { MVKCmdClearImage* cmd = cmdBuff->_commandPool->_cmdClearImagePool.acquireObject(); VkClearValue clrVal; clrVal.color = *pColor; diff --git a/MoltenVK/MoltenVK/Commands/MVKCommandBuffer.mm b/MoltenVK/MoltenVK/Commands/MVKCommandBuffer.mm index 19e11871f..a9aeee1cf 100644 --- a/MoltenVK/MoltenVK/Commands/MVKCommandBuffer.mm +++ b/MoltenVK/MoltenVK/Commands/MVKCommandBuffer.mm @@ -24,6 +24,7 @@ #include "MVKFramebuffer.h" #include "MVKQueryPool.h" #include "MVKFoundation.h" +#include "MTLRenderPassDescriptor+MoltenVK.h" using namespace std; @@ -225,6 +226,7 @@ MTLRenderPassDescriptor* mtlRPDesc = [MTLRenderPassDescriptor renderPassDescriptor]; getSubpass()->populateMTLRenderPassDescriptor(mtlRPDesc, _framebuffer, _clearValues, _isRenderingEntireAttachment); mtlRPDesc.visibilityResultBuffer = _occlusionQueryState.getVisibilityResultMTLBuffer(); + mtlRPDesc.renderTargetArrayLengthMVK = _framebuffer->getLayerCount(); _mtlRenderEncoder = [_mtlCmdBuffer renderCommandEncoderWithDescriptor: mtlRPDesc]; // not retained _mtlRenderEncoder.label = getMTLRenderCommandEncoderName(); @@ -314,7 +316,7 @@ VkClearRect clearRect; clearRect.rect = _renderArea; clearRect.baseArrayLayer = 0; - clearRect.layerCount = 1; + clearRect.layerCount = _framebuffer->getLayerCount(); // Create and execute a temporary clear attachments command. // To be threadsafe...do NOT acquire and return the command from the pool. diff --git a/MoltenVK/MoltenVK/Commands/MVKCommandPipelineStateFactoryShaderSource.h b/MoltenVK/MoltenVK/Commands/MVKCommandPipelineStateFactoryShaderSource.h index 3ba543f4c..f35f9b85c 100644 --- a/MoltenVK/MoltenVK/Commands/MVKCommandPipelineStateFactoryShaderSource.h +++ b/MoltenVK/MoltenVK/Commands/MVKCommandPipelineStateFactoryShaderSource.h @@ -16,24 +16,27 @@ * limitations under the License. */ +#include "MVKCommonEnvironment.h" -/** This file contains static source code for the MoltenVK command shaders. */ + +/** This file contains static MSL source code for the MoltenVK command shaders. */ static const char* _MVKStaticCmdShaderSource = " \n\ #include \n\ using namespace metal; \n\ \n\ typedef struct { \n\ - float2 a_position [[attribute(0)]]; \n\ + float4 a_position [[attribute(0)]]; \n\ } AttributesPos; \n\ \n\ typedef struct { \n\ float4 v_position [[position]]; \n\ + uint layer%s; \n\ } VaryingsPos; \n\ \n\ typedef struct { \n\ - float2 a_position [[attribute(0)]]; \n\ - float2 a_texCoord [[attribute(1)]]; \n\ + float2 a_position [[attribute(0)]]; \n\ + float2 a_texCoord [[attribute(1)]]; \n\ } AttributesPosTex; \n\ \n\ typedef struct { \n\ @@ -56,6 +59,7 @@ vertex VaryingsPos vtxCmdClearAttachments(AttributesPos attributes [[stage_in]], constant ClearColorsIn& ccIn [[buffer(0)]]) { \n\ VaryingsPos varyings; \n\ varyings.v_position = float4(attributes.a_position.x, -attributes.a_position.y, ccIn.colors[8].r, 1.0); \n\ + varyings.layer = uint(attributes.a_position.w); \n\ return varyings; \n\ } \n\ \n\ @@ -74,4 +78,12 @@ kernel void compCopyBufferBytes(device uint8_t* src [[ buffer(0) ]], }; \n\ "; +#if MVK_MACOS +static const char* _MVKAttrRTAI = " [[render_target_array_index]]"; +#endif + +#if MVK_IOS +static const char* _MVKAttrRTAI = ""; +#endif +#define MVKStaticCmdShaderSource [NSString stringWithFormat: @(_MVKStaticCmdShaderSource), _MVKAttrRTAI] diff --git a/MoltenVK/MoltenVK/Commands/MVKCommandResourceFactory.mm b/MoltenVK/MoltenVK/Commands/MVKCommandResourceFactory.mm index e9af48af9..c4a28284a 100644 --- a/MoltenVK/MoltenVK/Commands/MVKCommandResourceFactory.mm +++ b/MoltenVK/MoltenVK/Commands/MVKCommandResourceFactory.mm @@ -21,6 +21,7 @@ #include "MVKPipeline.h" #include "MVKFoundation.h" #include "NSString+MoltenVK.h" +#include "MTLRenderPipelineDescriptor+MoltenVK.h" #include "MVKLogging.h" using namespace std; @@ -31,7 +32,7 @@ id MVKCommandResourceFactory::newCmdBlitImageMTLRenderPipelineState(MVKRPSKeyBlitImg& blitKey) { MTLRenderPipelineDescriptor* plDesc = [[[MTLRenderPipelineDescriptor alloc] init] autorelease]; - plDesc.label = [NSString stringWithFormat: @"CmdBlitImage"]; + plDesc.label = @"CmdBlitImage"; plDesc.vertexFunction = getFunctionNamed("vtxCmdBlitImage"); plDesc.fragmentFunction = getBlitFragFunction(blitKey); @@ -85,10 +86,11 @@ id MVKCommandResourceFactory::newCmdClearMTLRenderPipelineState(MVKRPSKeyClearAtt& attKey) { MTLRenderPipelineDescriptor* plDesc = [[[MTLRenderPipelineDescriptor alloc] init] autorelease]; - plDesc.label = [NSString stringWithFormat: @"CmdClearAttachments"]; + plDesc.label = @"CmdClearAttachments"; plDesc.vertexFunction = getFunctionNamed("vtxCmdClearAttachments"); plDesc.fragmentFunction = getClearFragFunction(attKey); plDesc.sampleCount = attKey.mtlSampleCount; + plDesc.inputPrimitiveTopologyMVK = mvkMTLPrimitiveTopologyClassFromVkPrimitiveTopology(VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST); for (uint32_t caIdx = 0; caIdx < kMVKAttachmentFormatDepthStencilIndex; caIdx++) { MTLRenderPipelineColorAttachmentDescriptor* colorDesc = plDesc.colorAttachments[caIdx]; @@ -109,10 +111,10 @@ // Vertex location vaDesc = vaDescArray[0]; - vaDesc.format = MTLVertexFormatFloat2; + vaDesc.format = MTLVertexFormatFloat4; vaDesc.bufferIndex = vtxBuffIdx; vaDesc.offset = vtxStride; - vtxStride += sizeof(simd::float2); + vtxStride += sizeof(simd::float4); // Vertex attribute buffer. MTLVertexBufferLayoutDescriptorArray* vbDescArray = vtxDesc.layouts; @@ -357,7 +359,7 @@ @autoreleasepool { MTLCompileOptions* shdrOpts = [[MTLCompileOptions new] autorelease]; NSError* err = nil; - _mtlLibrary = [getMTLDevice() newLibraryWithSource: @(_MVKStaticCmdShaderSource) + _mtlLibrary = [getMTLDevice() newLibraryWithSource: MVKStaticCmdShaderSource options: shdrOpts error: &err]; // retained MVKAssert( !err, "Could not compile command shaders %s (code %li) %s", err.localizedDescription.UTF8String, (long)err.code, err.localizedFailureReason.UTF8String); diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKDevice.h b/MoltenVK/MoltenVK/GPUObjects/MVKDevice.h index ce6f4f1b9..73e13aae2 100644 --- a/MoltenVK/MoltenVK/GPUObjects/MVKDevice.h +++ b/MoltenVK/MoltenVK/GPUObjects/MVKDevice.h @@ -81,6 +81,9 @@ class MVKPhysicalDevice : public MVKDispatchableObject { /** Populates the specified structure with the properties of this device. */ void getProperties(VkPhysicalDeviceProperties* properties); + /** Returns whether the specified format is supported. */ + bool getFormatIsSupported(VkFormat format); + /** Populates the specified structure with the format properties of this device. */ void getFormatProperties(VkFormat format, VkFormatProperties* pFormatProperties); diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKDevice.mm b/MoltenVK/MoltenVK/GPUObjects/MVKDevice.mm index 68fbf46df..ea042069e 100644 --- a/MoltenVK/MoltenVK/GPUObjects/MVKDevice.mm +++ b/MoltenVK/MoltenVK/GPUObjects/MVKDevice.mm @@ -65,22 +65,31 @@ if (properties) { *properties = _properties; } } -#define MVK_FMT_NO_FEATS { 0, 0, 0 } +bool MVKPhysicalDevice::getFormatIsSupported(VkFormat format) { -void MVKPhysicalDevice::getFormatProperties(VkFormat format, - VkFormatProperties* pFormatProperties) { - if ( !pFormatProperties ) { return; } - - *pFormatProperties = mvkVkFormatProperties(format); + if ( !mvkVkFormatIsSupported(format) ) { return false; } + // Special-case certain formats that not all GPU's support. #if MVK_MACOS - // Special-case certain formats that not all macOS GPU's support. - // Lookup from Metal to Vulkan to avoid logging error message when going the other way. - if (format == mvkVkFormatFromMTLPixelFormat(MTLPixelFormatDepth24Unorm_Stencil8) && - !getMTLDevice().isDepth24Stencil8PixelFormatSupported) { - *pFormatProperties = MVK_FMT_NO_FEATS; - } + switch (mvkMTLPixelFormatFromVkFormat(format)) { + case MTLPixelFormatDepth24Unorm_Stencil8: + return getMTLDevice().isDepth24Stencil8PixelFormatSupported; + break; + + default: + break; + } #endif + + return true; +} + +void MVKPhysicalDevice::getFormatProperties(VkFormat format, + VkFormatProperties* pFormatProperties) { + static VkFormatProperties noFmtFeats = { 0, 0, 0 }; + if (pFormatProperties) { + *pFormatProperties = getFormatIsSupported(format) ? mvkVkFormatProperties(format) : noFmtFeats; + } } VkResult MVKPhysicalDevice::getImageFormatProperties(VkFormat format, @@ -90,7 +99,7 @@ VkImageCreateFlags flags, VkImageFormatProperties* pImageFormatProperties) { - if ( !mvkVkFormatIsSupported(format) ) { return VK_ERROR_FORMAT_NOT_SUPPORTED; } + if ( !getFormatIsSupported(format) ) { return VK_ERROR_FORMAT_NOT_SUPPORTED; } if ( !pImageFormatProperties ) { return VK_SUCCESS; } diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKFramebuffer.h b/MoltenVK/MoltenVK/GPUObjects/MVKFramebuffer.h index 2d0402def..344992559 100644 --- a/MoltenVK/MoltenVK/GPUObjects/MVKFramebuffer.h +++ b/MoltenVK/MoltenVK/GPUObjects/MVKFramebuffer.h @@ -33,6 +33,9 @@ class MVKFramebuffer : public MVKBaseDeviceObject { /** Returns the dimensions of this framebuffer. */ inline VkExtent2D getExtent2D() { return _extent; } + /** Returns the layers covered by this framebuffer. */ + inline uint32_t getLayerCount() { return _layerCount; } + /** Returns the attachment at the specified index. */ inline MVKImageView* getAttachment(uint32_t index) { return _attachments[index]; } @@ -44,6 +47,7 @@ class MVKFramebuffer : public MVKBaseDeviceObject { protected: VkExtent2D _extent; + uint32_t _layerCount; std::vector _attachments; }; diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKFramebuffer.mm b/MoltenVK/MoltenVK/GPUObjects/MVKFramebuffer.mm index 8dc74ba3c..878b7f40d 100644 --- a/MoltenVK/MoltenVK/GPUObjects/MVKFramebuffer.mm +++ b/MoltenVK/MoltenVK/GPUObjects/MVKFramebuffer.mm @@ -26,6 +26,7 @@ MVKFramebuffer::MVKFramebuffer(MVKDevice* device, const VkFramebufferCreateInfo* pCreateInfo) : MVKBaseDeviceObject(device) { _extent = { .width = pCreateInfo->width, .height = pCreateInfo->height }; + _layerCount = pCreateInfo->layers; // Add clear values _attachments.reserve(pCreateInfo->attachmentCount); diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKImage.mm b/MoltenVK/MoltenVK/GPUObjects/MVKImage.mm index 001b856e6..6d27cfd39 100644 --- a/MoltenVK/MoltenVK/GPUObjects/MVKImage.mm +++ b/MoltenVK/MoltenVK/GPUObjects/MVKImage.mm @@ -35,27 +35,16 @@ VkFormat MVKImage::getVkFormat() { return mvkVkFormatFromMTLPixelFormat(_mtlPixelFormat); } VkExtent3D MVKImage::getExtent3D(uint32_t mipLevel) { - VkExtent2D baseExtent = { _extent.width, _extent.height }; - VkExtent2D mipLvlExt = mvkMipmapLevelSizeFromBaseSize(baseExtent, mipLevel); - - VkExtent3D extent; - extent.width = mipLvlExt.width; - extent.height = mipLvlExt.height; - extent.depth = _extent.depth; - return extent; + return mvkMipmapLevelSizeFromBaseSize3D(_extent, mipLevel); } VkDeviceSize MVKImage::getBytesPerRow(uint32_t mipLevel) { - VkExtent2D baseExtent = { _extent.width, _extent.height }; - VkExtent2D mipLvlExt = mvkMipmapLevelSizeFromBaseSize(baseExtent, mipLevel); - size_t bytesPerRow = mvkMTLPixelFormatBytesPerRow(_mtlPixelFormat, mipLvlExt.width); + size_t bytesPerRow = mvkMTLPixelFormatBytesPerRow(_mtlPixelFormat, getExtent3D(mipLevel).width); return (uint32_t)mvkAlignByteOffset(bytesPerRow, _byteAlignment); } VkDeviceSize MVKImage::getBytesPerLayer(uint32_t mipLevel) { - VkExtent2D baseExtent = { _extent.width, _extent.height }; - VkExtent2D mipLvlExt = mvkMipmapLevelSizeFromBaseSize(baseExtent, mipLevel); - return mvkMTLPixelFormatBytesPerLayer(_mtlPixelFormat, getBytesPerRow(mipLevel), mipLvlExt.height); + return mvkMTLPixelFormatBytesPerLayer(_mtlPixelFormat, getBytesPerRow(mipLevel), getExtent3D(mipLevel).height); } VkResult MVKImage::getSubresourceLayout(const VkImageSubresource* pSubresource, diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKPipeline.mm b/MoltenVK/MoltenVK/GPUObjects/MVKPipeline.mm index c700aca59..ea7df6d7d 100644 --- a/MoltenVK/MoltenVK/GPUObjects/MVKPipeline.mm +++ b/MoltenVK/MoltenVK/GPUObjects/MVKPipeline.mm @@ -23,6 +23,7 @@ #include "MVKFoundation.h" #include "MVKOSExtensions.h" #include "MVKStrings.h" +#include "MTLRenderPipelineDescriptor+MoltenVK.h" #include "mvk_datatypes.h" #include @@ -343,11 +344,9 @@ plDesc.alphaToOneEnabled = pCreateInfo->pMultisampleState->alphaToOneEnable; } -#if MVK_MACOS if (pCreateInfo->pInputAssemblyState) { - plDesc.inputPrimitiveTopology = mvkMTLPrimitiveTopologyClassFromVkPrimitiveTopology(pCreateInfo->pInputAssemblyState->topology); + plDesc.inputPrimitiveTopologyMVK = mvkMTLPrimitiveTopologyClassFromVkPrimitiveTopology(pCreateInfo->pInputAssemblyState->topology); } -#endif return plDesc; } diff --git a/MoltenVK/MoltenVK/Utility/CAMetalLayer+MoltenVK.h b/MoltenVK/MoltenVK/OS/CAMetalLayer+MoltenVK.h similarity index 99% rename from MoltenVK/MoltenVK/Utility/CAMetalLayer+MoltenVK.h rename to MoltenVK/MoltenVK/OS/CAMetalLayer+MoltenVK.h index a56fee19a..ad18bbf2e 100644 --- a/MoltenVK/MoltenVK/Utility/CAMetalLayer+MoltenVK.h +++ b/MoltenVK/MoltenVK/OS/CAMetalLayer+MoltenVK.h @@ -16,6 +16,7 @@ * limitations under the License. */ +#pragma once #import diff --git a/MoltenVK/MoltenVK/Utility/CAMetalLayer+MoltenVK.m b/MoltenVK/MoltenVK/OS/CAMetalLayer+MoltenVK.m similarity index 97% rename from MoltenVK/MoltenVK/Utility/CAMetalLayer+MoltenVK.m rename to MoltenVK/MoltenVK/OS/CAMetalLayer+MoltenVK.m index bf45f2f5d..6c9581810 100644 --- a/MoltenVK/MoltenVK/Utility/CAMetalLayer+MoltenVK.m +++ b/MoltenVK/MoltenVK/OS/CAMetalLayer+MoltenVK.m @@ -18,7 +18,7 @@ #include "MVKCommonEnvironment.h" -#import "CAMetalLayer+MoltenVK.h" +#include "CAMetalLayer+MoltenVK.h" @implementation CAMetalLayer (MoltenVK) diff --git a/MoltenVK/MoltenVK/OS/MTLRenderPassDescriptor+MoltenVK.h b/MoltenVK/MoltenVK/OS/MTLRenderPassDescriptor+MoltenVK.h new file mode 100644 index 000000000..249b44966 --- /dev/null +++ b/MoltenVK/MoltenVK/OS/MTLRenderPassDescriptor+MoltenVK.h @@ -0,0 +1,34 @@ +/* + * MTLRenderPassDescriptor+MoltenVK.h + * + * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#pragma once + +#import + +/** Extensions to MTLRenderPassDescriptor to support MoltenVK. */ +@interface MTLRenderPassDescriptor (MoltenVK) + +/** + * Replacement for the renderTargetArrayLength property. + * + * This property allows support under all OS versions. Delegates to the renderTargetArrayLength + * property if it is available. otherwise, returns 0 when read and does nothing when set. + */ +@property(nonatomic, readwrite) NSUInteger renderTargetArrayLengthMVK; + +@end diff --git a/MoltenVK/MoltenVK/OS/MTLRenderPassDescriptor+MoltenVK.m b/MoltenVK/MoltenVK/OS/MTLRenderPassDescriptor+MoltenVK.m new file mode 100644 index 000000000..12a750a5a --- /dev/null +++ b/MoltenVK/MoltenVK/OS/MTLRenderPassDescriptor+MoltenVK.m @@ -0,0 +1,44 @@ +/* + * MTLRenderPassDescriptor+MoltenVK.m + * + * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#include "MTLRenderPassDescriptor+MoltenVK.h" +#include "MVKCommonEnvironment.h" + +@implementation MTLRenderPassDescriptor (MoltenVK) + +-(NSUInteger) renderTargetArrayLengthMVK { + +#if MVK_MACOS + return self.renderTargetArrayLength; +#endif +#if MVK_IOS + return 0; +#endif + +} + +-(void) setRenderTargetArrayLengthMVK: (NSUInteger) length { + +#if MVK_MACOS + self.renderTargetArrayLength = length; +#endif + +} + +@end diff --git a/MoltenVK/MoltenVK/OS/MTLRenderPipelineDescriptor+MoltenVK.h b/MoltenVK/MoltenVK/OS/MTLRenderPipelineDescriptor+MoltenVK.h new file mode 100644 index 000000000..d2a91326f --- /dev/null +++ b/MoltenVK/MoltenVK/OS/MTLRenderPipelineDescriptor+MoltenVK.h @@ -0,0 +1,38 @@ +/* + * MTLRenderPipelineDescriptor+MoltenVK.h + * + * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#pragma once + +#import + + +/** Extensions to MTLRenderPassDescriptor to support MoltenVK. */ +@interface MTLRenderPipelineDescriptor (MoltenVK) + +/** + * Replacement for the inputPrimitiveTopology property. + * + * This property allows support under all OS versions. Delegates to the inputPrimitiveTopology + * property if it is available. otherwise, returns MTLPrimitiveTopologyClassUnspecified when + * read and does nothing when set. + * + * The value is treated as an NSUInteger to support OS versions on which the enum is unavailable. + */ +@property(nonatomic, readwrite) NSUInteger inputPrimitiveTopologyMVK; + +@end diff --git a/MoltenVK/MoltenVK/OS/MTLRenderPipelineDescriptor+MoltenVK.m b/MoltenVK/MoltenVK/OS/MTLRenderPipelineDescriptor+MoltenVK.m new file mode 100644 index 000000000..50e4b8a1e --- /dev/null +++ b/MoltenVK/MoltenVK/OS/MTLRenderPipelineDescriptor+MoltenVK.m @@ -0,0 +1,44 @@ +/* + * MTLRenderPipelineDescriptor+MoltenVK.m + * + * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#include "MTLRenderPipelineDescriptor+MoltenVK.h" +#include "MVKCommonEnvironment.h" + +@implementation MTLRenderPipelineDescriptor (MoltenVK) + +-(NSUInteger) inputPrimitiveTopologyMVK { + +#if MVK_MACOS + return self.inputPrimitiveTopology; +#endif +#if MVK_IOS + return 0; +#endif + +} + +-(void) setInputPrimitiveTopologyMVK: (NSUInteger) topology { + +#if MVK_MACOS + self.inputPrimitiveTopology = topology; +#endif + +} + +@end diff --git a/MoltenVK/MoltenVK/Utility/MTLSamplerDescriptor+MoltenVK.h b/MoltenVK/MoltenVK/OS/MTLSamplerDescriptor+MoltenVK.h similarity index 98% rename from MoltenVK/MoltenVK/Utility/MTLSamplerDescriptor+MoltenVK.h rename to MoltenVK/MoltenVK/OS/MTLSamplerDescriptor+MoltenVK.h index be20245c2..ee55dcd88 100644 --- a/MoltenVK/MoltenVK/Utility/MTLSamplerDescriptor+MoltenVK.h +++ b/MoltenVK/MoltenVK/OS/MTLSamplerDescriptor+MoltenVK.h @@ -16,6 +16,7 @@ * limitations under the License. */ +#pragma once #import diff --git a/MoltenVK/MoltenVK/Utility/MTLTextureDescriptor+MoltenVK.m b/MoltenVK/MoltenVK/OS/MTLSamplerDescriptor+MoltenVK.m similarity index 72% rename from MoltenVK/MoltenVK/Utility/MTLTextureDescriptor+MoltenVK.m rename to MoltenVK/MoltenVK/OS/MTLSamplerDescriptor+MoltenVK.m index 4ca501b4f..8e9909bea 100644 --- a/MoltenVK/MoltenVK/Utility/MTLTextureDescriptor+MoltenVK.m +++ b/MoltenVK/MoltenVK/OS/MTLSamplerDescriptor+MoltenVK.m @@ -1,5 +1,5 @@ /* - * MTLTextureDescriptor+MoltenVK.m + * MTLSamplerDescriptor+MoltenVK.m * * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com) * @@ -17,17 +17,17 @@ */ -#import "MTLTextureDescriptor+MoltenVK.h" +#include "MTLSamplerDescriptor+MoltenVK.h" @implementation MTLSamplerDescriptor (MoltenVK) -(MTLCompareFunction) compareFunctionMVK { - if ( [self respondsToSelector: @selector(compareFunction)]) { return self.compareFunction; } - return MTLCompareFunctionNever; + if ( [self respondsToSelector: @selector(compareFunction)]) { return self.compareFunction; } + return MTLCompareFunctionNever; } -(void) setCompareFunctionMVK: (MTLCompareFunction) cmpFunc { - if ( [self respondsToSelector: @selector(setCompareFunction:)]) { self.compareFunction = cmpFunc; } + if ( [self respondsToSelector: @selector(setCompareFunction:)]) { self.compareFunction = cmpFunc; } } @end diff --git a/MoltenVK/MoltenVK/Utility/MTLTextureDescriptor+MoltenVK.h b/MoltenVK/MoltenVK/OS/MTLTextureDescriptor+MoltenVK.h similarity index 99% rename from MoltenVK/MoltenVK/Utility/MTLTextureDescriptor+MoltenVK.h rename to MoltenVK/MoltenVK/OS/MTLTextureDescriptor+MoltenVK.h index 3dd7e0a15..e7df96da8 100644 --- a/MoltenVK/MoltenVK/Utility/MTLTextureDescriptor+MoltenVK.h +++ b/MoltenVK/MoltenVK/OS/MTLTextureDescriptor+MoltenVK.h @@ -16,6 +16,7 @@ * limitations under the License. */ +#pragma once #import diff --git a/MoltenVK/MoltenVK/Utility/MTLSamplerDescriptor+MoltenVK.m b/MoltenVK/MoltenVK/OS/MTLTextureDescriptor+MoltenVK.m similarity index 64% rename from MoltenVK/MoltenVK/Utility/MTLSamplerDescriptor+MoltenVK.m rename to MoltenVK/MoltenVK/OS/MTLTextureDescriptor+MoltenVK.m index 71b26803c..1439e0da8 100644 --- a/MoltenVK/MoltenVK/Utility/MTLSamplerDescriptor+MoltenVK.m +++ b/MoltenVK/MoltenVK/OS/MTLTextureDescriptor+MoltenVK.m @@ -1,5 +1,5 @@ /* - * MTLSamplerDescriptor+MoltenVK.m + * MTLTextureDescriptor+MoltenVK.m * * Copyright (c) 2014-2018 The Brenwill Workshop Ltd. (http://www.brenwill.com) * @@ -17,26 +17,26 @@ */ -#import "MTLSamplerDescriptor+MoltenVK.h" +#include "MTLTextureDescriptor+MoltenVK.h" @implementation MTLTextureDescriptor (MoltenVK) -(MTLTextureUsage) usageMVK { - if ( [self respondsToSelector: @selector(usage)]) { return self.usage; } - return MTLTextureUsageUnknown; + if ( [self respondsToSelector: @selector(usage)]) { return self.usage; } + return MTLTextureUsageUnknown; } -(void) setUsageMVK: (MTLTextureUsage) usage { - if ( [self respondsToSelector: @selector(setUsage:)]) { self.usage = usage; } + if ( [self respondsToSelector: @selector(setUsage:)]) { self.usage = usage; } } -(MTLStorageMode) storageModeMVK { - if ( [self respondsToSelector: @selector(storageMode)]) { return self.storageMode; } - return MTLStorageModeShared; + if ( [self respondsToSelector: @selector(storageMode)]) { return self.storageMode; } + return MTLStorageModeShared; } -(void) setStorageModeMVK: (MTLStorageMode) storageMode { - if ( [self respondsToSelector: @selector(setStorageMode:)]) { self.storageMode = storageMode; } + if ( [self respondsToSelector: @selector(setStorageMode:)]) { self.storageMode = storageMode; } } @end diff --git a/MoltenVK/MoltenVK/Utility/MVKOSExtensions.h b/MoltenVK/MoltenVK/OS/MVKOSExtensions.h similarity index 95% rename from MoltenVK/MoltenVK/Utility/MVKOSExtensions.h rename to MoltenVK/MoltenVK/OS/MVKOSExtensions.h index 75f7d5ae0..4c655907e 100644 --- a/MoltenVK/MoltenVK/Utility/MVKOSExtensions.h +++ b/MoltenVK/MoltenVK/OS/MVKOSExtensions.h @@ -16,12 +16,8 @@ * limitations under the License. */ - -/* This file contains convenient functions for accessing Metal components during execution. */ - #pragma once -#include "MVKCommonEnvironment.h" #include #import diff --git a/MoltenVK/MoltenVK/Utility/MVKOSExtensions.mm b/MoltenVK/MoltenVK/OS/MVKOSExtensions.mm similarity index 97% rename from MoltenVK/MoltenVK/Utility/MVKOSExtensions.mm rename to MoltenVK/MoltenVK/OS/MVKOSExtensions.mm index 4e88f3f49..94092f78a 100644 --- a/MoltenVK/MoltenVK/Utility/MVKOSExtensions.mm +++ b/MoltenVK/MoltenVK/OS/MVKOSExtensions.mm @@ -19,19 +19,20 @@ #include "MVKOSExtensions.h" #include "MVKFoundation.h" +#include "MVKCommonEnvironment.h" #include #include #include #if MVK_MACOS -#import -#import -#import +# import +# import +# import #endif #if MVK_IOS -#import +# import #endif using namespace std; diff --git a/MoltenVK/MoltenVK/Utility/NSString+MoltenVK.h b/MoltenVK/MoltenVK/OS/NSString+MoltenVK.h similarity index 88% rename from MoltenVK/MoltenVK/Utility/NSString+MoltenVK.h rename to MoltenVK/MoltenVK/OS/NSString+MoltenVK.h index 361dc031d..406defb6c 100644 --- a/MoltenVK/MoltenVK/Utility/NSString+MoltenVK.h +++ b/MoltenVK/MoltenVK/OS/NSString+MoltenVK.h @@ -16,12 +16,8 @@ * limitations under the License. */ - -/* This file contains convenient functions for accessing Metal components during execution. */ - #pragma once -#include "MVKCommonEnvironment.h" #import diff --git a/MoltenVK/MoltenVK/Utility/NSString+MoltenVK.mm b/MoltenVK/MoltenVK/OS/NSString+MoltenVK.mm similarity index 100% rename from MoltenVK/MoltenVK/Utility/NSString+MoltenVK.mm rename to MoltenVK/MoltenVK/OS/NSString+MoltenVK.mm diff --git a/MoltenVK/MoltenVK/Utility/MVKFoundation.h b/MoltenVK/MoltenVK/Utility/MVKFoundation.h index 32b4043ab..090377fbc 100644 --- a/MoltenVK/MoltenVK/Utility/MVKFoundation.h +++ b/MoltenVK/MoltenVK/Utility/MVKFoundation.h @@ -213,6 +213,12 @@ void mvkFlipVertically(void* rowMajorData, uint32_t rowCount, size_t bytesPerRow #pragma mark Vulkan structure support functions +/** Returns a VkExtent2D created from the width and height of a VkExtent3D. */ +static inline VkExtent2D mvkVkExtent2DFromVkExtent3D(VkExtent3D e) { return {e.width, e.height }; } + +/** Returns a VkExtent3D, created from a VkExtent2D, and with depth of 1. */ +static inline VkExtent3D mvkVkExtent3DFromVkExtent2D(VkExtent2D e) { return {e.width, e.height, 1U }; } + /** Returns whether the two Vulkan extents are equal by comparing their respective components. */ static inline bool mvkVkExtent2DsAreEqual(VkExtent2D e1, VkExtent2D e2) { return (e1.width == e2.width) && (e1.height == e2.height); diff --git a/MoltenVK/MoltenVK/Vulkan/mvk_datatypes.mm b/MoltenVK/MoltenVK/Vulkan/mvk_datatypes.mm index db2e0d195..9816ce6c4 100644 --- a/MoltenVK/MoltenVK/Vulkan/mvk_datatypes.mm +++ b/MoltenVK/MoltenVK/Vulkan/mvk_datatypes.mm @@ -340,8 +340,8 @@ inline MVKOSVersion sinceOSVersion() const { MVK_MAKE_FMT_STRUCT( VK_FORMAT_R64G64B64A64_SINT, MTLPixelFormatInvalid, MTLPixelFormatInvalid, kMTLFmtNA, kMTLFmtNA, 1, 1, 32, MTLVertexFormatInvalid, kMVKFormatColorFloat, MVK_FMT_NO_FEATS, MVK_FMT_NO_FEATS ), MVK_MAKE_FMT_STRUCT( VK_FORMAT_R64G64B64A64_SFLOAT, MTLPixelFormatInvalid, MTLPixelFormatInvalid, kMTLFmtNA, kMTLFmtNA, 1, 1, 32, MTLVertexFormatInvalid, kMVKFormatColorFloat, MVK_FMT_NO_FEATS, MVK_FMT_NO_FEATS ), - MVK_MAKE_FMT_STRUCT( VK_FORMAT_B10G11R11_UFLOAT_PACK32, MTLPixelFormatRG11B10Float, MTLPixelFormatInvalid, 8.0, 10.11, 1, 1, 4, MTLVertexFormatInvalid, kMVKFormatColorFloat, MVK_FMT_COLOR_FEATS, MVK_FMT_BUFFER_FEATS ), // Vulkan packed is reversed - MVK_MAKE_FMT_STRUCT( VK_FORMAT_E5B9G9R9_UFLOAT_PACK32, MTLPixelFormatRGB9E5Float, MTLPixelFormatInvalid, 8.0, 10.11, 1, 1, 4, MTLVertexFormatInvalid, kMVKFormatColorFloat, MVK_FMT_COLOR_FEATS, MVK_FMT_BUFFER_FEATS ), // Vulkan packed is reversed + MVK_MAKE_FMT_STRUCT( VK_FORMAT_B10G11R11_UFLOAT_PACK32, MTLPixelFormatInvalid, MTLPixelFormatInvalid, 8.0, 10.11, 1, 1, 4, MTLVertexFormatInvalid, kMVKFormatColorFloat, MVK_FMT_COLOR_FEATS, MVK_FMT_BUFFER_FEATS ), // Vulkan packed is reversed + MVK_MAKE_FMT_STRUCT( VK_FORMAT_E5B9G9R9_UFLOAT_PACK32, MTLPixelFormatInvalid, MTLPixelFormatInvalid, 8.0, 10.11, 1, 1, 4, MTLVertexFormatInvalid, kMVKFormatColorFloat, MVK_FMT_COLOR_FEATS, MVK_FMT_BUFFER_FEATS ), // Vulkan packed is reversed MVK_MAKE_FMT_STRUCT( VK_FORMAT_D32_SFLOAT, MTLPixelFormatDepth32Float, MTLPixelFormatInvalid, 8.0, 10.11, 1, 1, 4, MTLVertexFormatInvalid, kMVKFormatDepthStencil, MVK_FMT_DEPTH_FEATS, MVK_FMT_BUFFER_FEATS ), MVK_MAKE_FMT_STRUCT( VK_FORMAT_D32_SFLOAT_S8_UINT, MTLPixelFormatDepth32Float_Stencil8, MTLPixelFormatInvalid, 9.0, 10.11, 1, 1, 5, MTLVertexFormatInvalid, kMVKFormatDepthStencil, MVK_FMT_DEPTH_FEATS, MVK_FMT_BUFFER_FEATS ), @@ -813,7 +813,7 @@ MVK_PUBLIC_SYMBOL uint32_t mvkMipmapLevels(uint32_t dim) { } MVK_PUBLIC_SYMBOL uint32_t mvkMipmapLevels2D(VkExtent2D extent) { - return mvkMipmapLevels3D( {extent.width, extent.height, 1} ); + return mvkMipmapLevels3D(mvkVkExtent3DFromVkExtent2D(extent)); } MVK_PUBLIC_SYMBOL uint32_t mvkMipmapLevels3D(VkExtent3D extent) { @@ -821,21 +821,27 @@ MVK_PUBLIC_SYMBOL uint32_t mvkMipmapLevels3D(VkExtent3D extent) { return max(mvkMipmapLevels(maxDim), 1U); } -MVK_PUBLIC_SYMBOL VkExtent2D mvkMipmapLevelSizeFromBaseSize(VkExtent2D baseSize, uint32_t level) { - // Before shifting, ensure dims are treated as unsigned - uint32_t width = baseSize.width; - uint32_t height = baseSize.height; +MVK_PUBLIC_SYMBOL VkExtent2D mvkMipmapLevelSizeFromBaseSize2D(VkExtent2D baseSize, uint32_t level) { + return mvkVkExtent2DFromVkExtent3D(mvkMipmapLevelSizeFromBaseSize3D(mvkVkExtent3DFromVkExtent2D(baseSize), level)); +} - VkExtent2D lvlSize; - lvlSize.width = MAX(width >> level, 1); - lvlSize.height = MAX(height >> level, 1); +MVK_PUBLIC_SYMBOL VkExtent3D mvkMipmapLevelSizeFromBaseSize3D(VkExtent3D baseSize, uint32_t level) { + VkExtent3D lvlSize; + lvlSize.width = max(baseSize.width >> level, 1U); + lvlSize.height = max(baseSize.height >> level, 1U); + lvlSize.depth = max(baseSize.depth >> level, 1U); return lvlSize; } -MVK_PUBLIC_SYMBOL VkExtent2D mvkMipmapBaseSizeFromLevelSize(VkExtent2D levelSize, uint32_t level) { - VkExtent2D baseSize; +MVK_PUBLIC_SYMBOL VkExtent2D mvkMipmapBaseSizeFromLevelSize2D(VkExtent2D levelSize, uint32_t level) { + return mvkVkExtent2DFromVkExtent3D(mvkMipmapBaseSizeFromLevelSize3D(mvkVkExtent3DFromVkExtent2D(levelSize), level)); +} + +MVK_PUBLIC_SYMBOL VkExtent3D mvkMipmapBaseSizeFromLevelSize3D(VkExtent3D levelSize, uint32_t level) { + VkExtent3D baseSize; baseSize.width = levelSize.width << level; baseSize.height = levelSize.height << level; + baseSize.depth = levelSize.depth << level; return baseSize; } @@ -968,8 +974,8 @@ MVK_PUBLIC_SYMBOL MTLPrimitiveType mvkMTLPrimitiveTypeFromVkPrimitiveTopology(Vk } } +MVK_PUBLIC_SYMBOL NSUInteger mvkMTLPrimitiveTopologyClassFromVkPrimitiveTopology(VkPrimitiveTopology vkTopology) { #if MVK_MACOS -MVK_PUBLIC_SYMBOL MTLPrimitiveTopologyClass mvkMTLPrimitiveTopologyClassFromVkPrimitiveTopology(VkPrimitiveTopology vkTopology) { switch (vkTopology) { case VK_PRIMITIVE_TOPOLOGY_POINT_LIST: return MTLPrimitiveTopologyClassPoint; @@ -992,8 +998,11 @@ MVK_PUBLIC_SYMBOL MTLPrimitiveTopologyClass mvkMTLPrimitiveTopologyClassFromVkPr mvkNotifyErrorWithText(VK_ERROR_FORMAT_NOT_SUPPORTED, "VkPrimitiveTopology value %d is not supported for render pipelines.", vkTopology); return MTLPrimitiveTopologyClassUnspecified; } -} #endif +#if MVK_IOS + return 0; +#endif +} MVK_PUBLIC_SYMBOL MTLLoadAction mvkMTLLoadActionFromVkAttachmentLoadOp(VkAttachmentLoadOp vkLoadOp) { switch (vkLoadOp) { diff --git a/MoltenVK/MoltenVK/Vulkan/vulkan.mm b/MoltenVK/MoltenVK/Vulkan/vulkan.mm index 37d75b374..d0ffe9cad 100644 --- a/MoltenVK/MoltenVK/Vulkan/vulkan.mm +++ b/MoltenVK/MoltenVK/Vulkan/vulkan.mm @@ -1281,7 +1281,7 @@ MVK_PUBLIC_SYMBOL void vkCmdClearColorImage( const VkImageSubresourceRange* pRanges) { MVKCommandBuffer* cmdBuff = MVKCommandBuffer::getMVKCommandBuffer(commandBuffer); - mvkCmdClearImage(cmdBuff, image, imageLayout, pColor, rangeCount, pRanges); + mvkCmdClearColorImage(cmdBuff, image, imageLayout, pColor, rangeCount, pRanges); } MVK_PUBLIC_SYMBOL void vkCmdClearDepthStencilImage( diff --git a/MoltenVKShaderConverter/MoltenVKGLSLToSPIRVConverter/GLSLConversion.mm b/MoltenVKShaderConverter/MoltenVKGLSLToSPIRVConverter/GLSLConversion.mm index fa7d800fd..ca1f46f12 100644 --- a/MoltenVKShaderConverter/MoltenVKGLSLToSPIRVConverter/GLSLConversion.mm +++ b/MoltenVKShaderConverter/MoltenVKGLSLToSPIRVConverter/GLSLConversion.mm @@ -75,9 +75,8 @@ MVK_PUBLIC_SYMBOL bool mvkConvertGLSLFileToSPIRV(const char* glslFilepath, error: &err]; if (err) { if (pResultLog) { - NSString* errMsg = [NSString stringWithFormat: @"Unable to convert GLSL in file %s to SPIR-V: %s (code %li) %s", - filePath.UTF8String, err.localizedDescription.UTF8String, - (long)err.code, err.localizedFailureReason.UTF8String]; + NSString* errMsg = [NSString stringWithFormat: @"Unable to convert GLSL in file %@ to SPIR-V: %@ (code %li) %@", + filePath, err.localizedDescription, (long)err.code, err.localizedFailureReason]; *pResultLog = (char*)malloc(errMsg.length + 1); strcpy(*pResultLog, errMsg.UTF8String); } diff --git a/MoltenVKShaderConverter/MoltenVKSPIRVToMSLConverter/SPIRVConversion.mm b/MoltenVKShaderConverter/MoltenVKSPIRVToMSLConverter/SPIRVConversion.mm index 8e23b0e5d..a566a8088 100644 --- a/MoltenVKShaderConverter/MoltenVKSPIRVToMSLConverter/SPIRVConversion.mm +++ b/MoltenVKShaderConverter/MoltenVKSPIRVToMSLConverter/SPIRVConversion.mm @@ -64,9 +64,8 @@ MVK_PUBLIC_SYMBOL bool mvkConvertSPIRVFileToMSL(const char* spvFilepath, NSData* spv = [NSData dataWithContentsOfFile: filePath options: 0 error: &err]; if (err) { if (pResultLog) { - NSString* errMsg = [NSString stringWithFormat: @"Unable to convert SPIR-V in file %s to MSL: %s (code %li) %s", - filePath.UTF8String, err.localizedDescription.UTF8String, - (long)err.code, err.localizedFailureReason.UTF8String]; + NSString* errMsg = [NSString stringWithFormat: @"Unable to convert SPIR-V in file %@ to MSL: %@ (code %li) %@", + filePath, err.localizedDescription, (long)err.code, err.localizedFailureReason]; *pResultLog = (char*)malloc(errMsg.length + 1); strcpy(*pResultLog, errMsg.UTF8String); } diff --git a/README.md b/README.md index 745514cc7..26019989e 100644 --- a/README.md +++ b/README.md @@ -47,18 +47,34 @@ If you are just looking for a pre-built **MoltenVK** runtime binary, you can dow Introduction ------------ +**MoltenVK** is an implementation of the [*Vulkan 1.0*](https://www.khronos.org/vulkan) +graphics and compute API, that runs on Apple's [*Metal*](https://developer.apple.com/metal) +graphics and compute framework on both *iOS* and *macOS*. + +**MoltenVK** allows you to use the *Vulkan* graphics and compute API to develop modern, +cross-platform, high-performance graphical games and applications, and to run them across +many platforms, including both *iOS* and *macOS*. + +*Metal* uses a different shading language, the *Metal Shading Language (MSL)*, than +*Vulkan*, which uses *SPIR-V*. **MoltenVK** automatically converts your *SPIR-V* shaders +to their *MSL* equivalents. + +To provide *Vulkan* capability to the *iOS* and *macOS* platforms, **MoltenVK** uses *Apple's* +publicly available API's, including *Metal*. **MoltenVK** does **_not_** use any private or +undocumented API calls or features, so your app will be compatible with all standard distribution +channels, including *Apple's App Store*. + **MoltenVK** contains two products: - **MoltenVK** is an implementation of the [*Vulkan 1.0*](https://www.khronos.org/vulkan) - graphics and compute API, that runs on Apple's [*Metal*](https://developer.apple.com/metal) - graphics and compute framework on both *iOS* and *macOS*. + graphics and compute API. - **MoltenVKShaderConverter** converts *SPIR-V* shader code to *Metal Shading Language (MSL)* - shader source code, and converts *GLSL* shader source code to *SPIR-V* shader code and/or - *Metal Shading Language (MSL)* shader source code, for use with **MoltenVK**. The converter - can run at runtime as a component of the *MoltenVK* runtime, or it can be packaged into a - stand-alone command-line *macOS* tool. The *Xcode* project contains several targets, - reflecting this multi-use capability. + shader code, and converts *GLSL* shader source code to *SPIR-V* shader code and/or + *Metal Shading Language (MSL)* shader code. The *SPIR-V* converter is included in the + **MoltenVK** runtime to automatically convert *SPIR-V* shaders to their *MSL* equivalents. + In addition, both the *SPIR-V* and *GLSL* converters can be be packaged into a stand-alone + command-line *macOS* tool for converting shaders at development time.