Merge pull request #608 from billhollings/master
Add support for VK_EXT_debug_marker extension.
This commit is contained in:
commit
6b556a9625
@ -18,8 +18,10 @@ MoltenVK 1.0.35
|
||||
|
||||
Released TBD
|
||||
|
||||
- Support the `VK_EXT_debug_report` extension.
|
||||
- Support the `VK_NV_glsl_shader` extension.
|
||||
- Add support for extensions:
|
||||
- `VK_EXT_debug_report`
|
||||
- `VK_EXT_debug_marker`
|
||||
- `VK_NV_glsl_shader`
|
||||
- Change log indication of error in logs from `[***MoltenVK ERROR***]` to
|
||||
`[mvk-error]`, for consistency with other log level indications.
|
||||
- Tessellation fixes:
|
||||
|
@ -25,8 +25,8 @@
|
||||
A9096E5F1F81E16300DFBEA6 /* MVKCmdDispatch.mm in Sources */ = {isa = PBXBuildFile; fileRef = A9096E5D1F81E16300DFBEA6 /* MVKCmdDispatch.mm */; };
|
||||
A909F65F213B190700FCD6BE /* MVKExtensions.h in Headers */ = {isa = PBXBuildFile; fileRef = A909F65A213B190600FCD6BE /* MVKExtensions.h */; };
|
||||
A909F660213B190700FCD6BE /* MVKExtensions.h in Headers */ = {isa = PBXBuildFile; fileRef = A909F65A213B190600FCD6BE /* MVKExtensions.h */; };
|
||||
A909F661213B190700FCD6BE /* MVKExtensions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A909F65E213B190700FCD6BE /* MVKExtensions.cpp */; };
|
||||
A909F662213B190700FCD6BE /* MVKExtensions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A909F65E213B190700FCD6BE /* MVKExtensions.cpp */; };
|
||||
A909F661213B190700FCD6BE /* MVKExtensions.mm in Sources */ = {isa = PBXBuildFile; fileRef = A909F65E213B190700FCD6BE /* MVKExtensions.mm */; };
|
||||
A909F662213B190700FCD6BE /* MVKExtensions.mm in Sources */ = {isa = PBXBuildFile; fileRef = A909F65E213B190700FCD6BE /* MVKExtensions.mm */; };
|
||||
A90C8DEA1F45354D009CB32C /* MVKCommandEncodingPool.h in Headers */ = {isa = PBXBuildFile; fileRef = A90C8DE81F45354D009CB32C /* MVKCommandEncodingPool.h */; };
|
||||
A90C8DEB1F45354D009CB32C /* MVKCommandEncodingPool.h in Headers */ = {isa = PBXBuildFile; fileRef = A90C8DE81F45354D009CB32C /* MVKCommandEncodingPool.h */; };
|
||||
A90C8DEC1F45354D009CB32C /* MVKCommandEncodingPool.mm in Sources */ = {isa = PBXBuildFile; fileRef = A90C8DE91F45354D009CB32C /* MVKCommandEncodingPool.mm */; };
|
||||
@ -157,8 +157,8 @@
|
||||
A95B7D6A1D3EE486003183D3 /* MVKCommandEncoderState.h in Headers */ = {isa = PBXBuildFile; fileRef = A95B7D671D3EE486003183D3 /* MVKCommandEncoderState.h */; };
|
||||
A95B7D6B1D3EE486003183D3 /* MVKCommandEncoderState.mm in Sources */ = {isa = PBXBuildFile; fileRef = A95B7D681D3EE486003183D3 /* MVKCommandEncoderState.mm */; };
|
||||
A95B7D6C1D3EE486003183D3 /* MVKCommandEncoderState.mm in Sources */ = {isa = PBXBuildFile; fileRef = A95B7D681D3EE486003183D3 /* MVKCommandEncoderState.mm */; };
|
||||
A981494D1FB6A3F7005F00B4 /* MVKBaseObject.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A98149411FB6A3F7005F00B4 /* MVKBaseObject.cpp */; };
|
||||
A981494E1FB6A3F7005F00B4 /* MVKBaseObject.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A98149411FB6A3F7005F00B4 /* MVKBaseObject.cpp */; };
|
||||
A981494D1FB6A3F7005F00B4 /* MVKBaseObject.mm in Sources */ = {isa = PBXBuildFile; fileRef = A98149411FB6A3F7005F00B4 /* MVKBaseObject.mm */; };
|
||||
A981494E1FB6A3F7005F00B4 /* MVKBaseObject.mm in Sources */ = {isa = PBXBuildFile; fileRef = A98149411FB6A3F7005F00B4 /* MVKBaseObject.mm */; };
|
||||
A981494F1FB6A3F7005F00B4 /* MVKBaseObject.h in Headers */ = {isa = PBXBuildFile; fileRef = A98149421FB6A3F7005F00B4 /* MVKBaseObject.h */; };
|
||||
A98149501FB6A3F7005F00B4 /* MVKBaseObject.h in Headers */ = {isa = PBXBuildFile; fileRef = A98149421FB6A3F7005F00B4 /* MVKBaseObject.h */; };
|
||||
A98149511FB6A3F7005F00B4 /* MVKEnvironment.h in Headers */ = {isa = PBXBuildFile; fileRef = A98149431FB6A3F7005F00B4 /* MVKEnvironment.h */; };
|
||||
@ -179,6 +179,14 @@
|
||||
A98149641FB6A3F7005F00B4 /* MVKWatermarkTextureContent.h in Headers */ = {isa = PBXBuildFile; fileRef = A981494C1FB6A3F7005F00B4 /* MVKWatermarkTextureContent.h */; };
|
||||
A981496B1FB6A998005F00B4 /* MVKStrings.h in Headers */ = {isa = PBXBuildFile; fileRef = A981496A1FB6A998005F00B4 /* MVKStrings.h */; };
|
||||
A981496C1FB6A998005F00B4 /* MVKStrings.h in Headers */ = {isa = PBXBuildFile; fileRef = A981496A1FB6A998005F00B4 /* MVKStrings.h */; };
|
||||
A99C90EE229455B300A061DA /* MVKCmdDebug.h in Headers */ = {isa = PBXBuildFile; fileRef = A99C90EC229455B200A061DA /* MVKCmdDebug.h */; };
|
||||
A99C90EF229455B300A061DA /* MVKCmdDebug.h in Headers */ = {isa = PBXBuildFile; fileRef = A99C90EC229455B200A061DA /* MVKCmdDebug.h */; };
|
||||
A99C90F0229455B300A061DA /* MVKCmdDebug.mm in Sources */ = {isa = PBXBuildFile; fileRef = A99C90ED229455B300A061DA /* MVKCmdDebug.mm */; };
|
||||
A99C90F1229455B300A061DA /* MVKCmdDebug.mm in Sources */ = {isa = PBXBuildFile; fileRef = A99C90ED229455B300A061DA /* MVKCmdDebug.mm */; };
|
||||
A99C91022295FAC600A061DA /* MVKVulkanAPIObject.mm in Sources */ = {isa = PBXBuildFile; fileRef = A99C91002295FAC500A061DA /* MVKVulkanAPIObject.mm */; };
|
||||
A99C91032295FAC600A061DA /* MVKVulkanAPIObject.mm in Sources */ = {isa = PBXBuildFile; fileRef = A99C91002295FAC500A061DA /* MVKVulkanAPIObject.mm */; };
|
||||
A99C91042295FAC600A061DA /* MVKVulkanAPIObject.h in Headers */ = {isa = PBXBuildFile; fileRef = A99C91012295FAC500A061DA /* MVKVulkanAPIObject.h */; };
|
||||
A99C91052295FAC600A061DA /* MVKVulkanAPIObject.h in Headers */ = {isa = PBXBuildFile; fileRef = A99C91012295FAC500A061DA /* MVKVulkanAPIObject.h */; };
|
||||
A9B51BD7225E986A00AC74D2 /* MVKOSExtensions.mm in Sources */ = {isa = PBXBuildFile; fileRef = A9B51BD2225E986A00AC74D2 /* MVKOSExtensions.mm */; };
|
||||
A9B51BD8225E986A00AC74D2 /* MVKOSExtensions.mm in Sources */ = {isa = PBXBuildFile; fileRef = A9B51BD2225E986A00AC74D2 /* MVKOSExtensions.mm */; };
|
||||
A9B51BD9225E986A00AC74D2 /* MVKOSExtensions.h in Headers */ = {isa = PBXBuildFile; fileRef = A9B51BD6225E986A00AC74D2 /* MVKOSExtensions.h */; };
|
||||
@ -299,7 +307,7 @@
|
||||
A9096E5C1F81E16300DFBEA6 /* MVKCmdDispatch.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MVKCmdDispatch.h; sourceTree = "<group>"; };
|
||||
A9096E5D1F81E16300DFBEA6 /* MVKCmdDispatch.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = MVKCmdDispatch.mm; sourceTree = "<group>"; };
|
||||
A909F65A213B190600FCD6BE /* MVKExtensions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MVKExtensions.h; sourceTree = "<group>"; };
|
||||
A909F65E213B190700FCD6BE /* MVKExtensions.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MVKExtensions.cpp; sourceTree = "<group>"; };
|
||||
A909F65E213B190700FCD6BE /* MVKExtensions.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MVKExtensions.mm; sourceTree = "<group>"; };
|
||||
A90C8DE81F45354D009CB32C /* MVKCommandEncodingPool.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MVKCommandEncodingPool.h; sourceTree = "<group>"; };
|
||||
A90C8DE91F45354D009CB32C /* MVKCommandEncodingPool.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MVKCommandEncodingPool.mm; sourceTree = "<group>"; };
|
||||
A93E832E2121C5D3001FEBD4 /* MVKGPUCapture.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MVKGPUCapture.h; sourceTree = "<group>"; };
|
||||
@ -365,7 +373,7 @@
|
||||
A95870F71C90D29F009EB096 /* MVKCommandResourceFactory.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MVKCommandResourceFactory.mm; sourceTree = "<group>"; };
|
||||
A95B7D671D3EE486003183D3 /* MVKCommandEncoderState.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MVKCommandEncoderState.h; sourceTree = "<group>"; };
|
||||
A95B7D681D3EE486003183D3 /* MVKCommandEncoderState.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MVKCommandEncoderState.mm; sourceTree = "<group>"; };
|
||||
A98149411FB6A3F7005F00B4 /* MVKBaseObject.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MVKBaseObject.cpp; sourceTree = "<group>"; };
|
||||
A98149411FB6A3F7005F00B4 /* MVKBaseObject.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MVKBaseObject.mm; sourceTree = "<group>"; };
|
||||
A98149421FB6A3F7005F00B4 /* MVKBaseObject.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MVKBaseObject.h; sourceTree = "<group>"; };
|
||||
A98149431FB6A3F7005F00B4 /* MVKEnvironment.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MVKEnvironment.h; sourceTree = "<group>"; };
|
||||
A98149441FB6A3F7005F00B4 /* MVKFoundation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MVKFoundation.h; sourceTree = "<group>"; };
|
||||
@ -376,6 +384,10 @@
|
||||
A981494B1FB6A3F7005F00B4 /* MVKWatermarkShaderSource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MVKWatermarkShaderSource.h; sourceTree = "<group>"; };
|
||||
A981494C1FB6A3F7005F00B4 /* MVKWatermarkTextureContent.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MVKWatermarkTextureContent.h; sourceTree = "<group>"; };
|
||||
A981496A1FB6A998005F00B4 /* MVKStrings.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MVKStrings.h; sourceTree = "<group>"; };
|
||||
A99C90EC229455B200A061DA /* MVKCmdDebug.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MVKCmdDebug.h; sourceTree = "<group>"; };
|
||||
A99C90ED229455B300A061DA /* MVKCmdDebug.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MVKCmdDebug.mm; sourceTree = "<group>"; };
|
||||
A99C91002295FAC500A061DA /* MVKVulkanAPIObject.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MVKVulkanAPIObject.mm; sourceTree = "<group>"; };
|
||||
A99C91012295FAC500A061DA /* MVKVulkanAPIObject.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MVKVulkanAPIObject.h; sourceTree = "<group>"; };
|
||||
A9AD67C72054DD6C00ED3C08 /* vulkan */ = {isa = PBXFileReference; lastKnownFileType = folder; path = vulkan; sourceTree = "<group>"; };
|
||||
A9B51BD2225E986A00AC74D2 /* MVKOSExtensions.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MVKOSExtensions.mm; sourceTree = "<group>"; };
|
||||
A9B51BD6225E986A00AC74D2 /* MVKOSExtensions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MVKOSExtensions.h; sourceTree = "<group>"; };
|
||||
@ -432,6 +444,8 @@
|
||||
A94FB76B1C7DFB4800632CA3 /* Commands */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
A99C90EC229455B200A061DA /* MVKCmdDebug.h */,
|
||||
A99C90ED229455B300A061DA /* MVKCmdDebug.mm */,
|
||||
A9096E5C1F81E16300DFBEA6 /* MVKCmdDispatch.h */,
|
||||
A9096E5D1F81E16300DFBEA6 /* MVKCmdDispatch.mm */,
|
||||
A94FB7741C7DFB4800632CA3 /* MVKCmdDraw.h */,
|
||||
@ -499,6 +513,8 @@
|
||||
A94FB79C1C7DFB4800632CA3 /* MVKSwapchain.mm */,
|
||||
A94FB79D1C7DFB4800632CA3 /* MVKSync.h */,
|
||||
A94FB79E1C7DFB4800632CA3 /* MVKSync.mm */,
|
||||
A99C91012295FAC500A061DA /* MVKVulkanAPIObject.h */,
|
||||
A99C91002295FAC500A061DA /* MVKVulkanAPIObject.mm */,
|
||||
);
|
||||
path = GPUObjects;
|
||||
sourceTree = "<group>";
|
||||
@ -508,7 +524,7 @@
|
||||
children = (
|
||||
45003E6F214AD4C900E989CB /* MVKExtensions.def */,
|
||||
A909F65A213B190600FCD6BE /* MVKExtensions.h */,
|
||||
A909F65E213B190700FCD6BE /* MVKExtensions.cpp */,
|
||||
A909F65E213B190700FCD6BE /* MVKExtensions.mm */,
|
||||
A94FB7A01C7DFB4800632CA3 /* MVKLayers.h */,
|
||||
A94FB7A11C7DFB4800632CA3 /* MVKLayers.mm */,
|
||||
);
|
||||
@ -536,7 +552,7 @@
|
||||
45557A5721CD83C3008868BD /* MVKDXTnCodec.def */,
|
||||
83A4AD2521BD75570006C935 /* MVKVector.h */,
|
||||
83A4AD2921BD75570006C935 /* MVKVectorAllocator.h */,
|
||||
A98149411FB6A3F7005F00B4 /* MVKBaseObject.cpp */,
|
||||
A98149411FB6A3F7005F00B4 /* MVKBaseObject.mm */,
|
||||
A98149421FB6A3F7005F00B4 /* MVKBaseObject.h */,
|
||||
A98149431FB6A3F7005F00B4 /* MVKEnvironment.h */,
|
||||
A98149451FB6A3F7005F00B4 /* MVKFoundation.cpp */,
|
||||
@ -661,6 +677,7 @@
|
||||
83A4AD2A21BD75570006C935 /* MVKVector.h in Headers */,
|
||||
A94FB7D41C7DFB4800632CA3 /* MVKCommandPool.h in Headers */,
|
||||
A94FB80C1C7DFB4800632CA3 /* MVKShaderModule.h in Headers */,
|
||||
A99C91042295FAC600A061DA /* MVKVulkanAPIObject.h in Headers */,
|
||||
A94FB7C01C7DFB4800632CA3 /* MVKCmdQueries.h in Headers */,
|
||||
A94FB7CC1C7DFB4800632CA3 /* MVKCommand.h in Headers */,
|
||||
A981494F1FB6A3F7005F00B4 /* MVKBaseObject.h in Headers */,
|
||||
@ -681,6 +698,7 @@
|
||||
A94FB7C81C7DFB4800632CA3 /* MVKCmdDraw.h in Headers */,
|
||||
A94FB7D01C7DFB4800632CA3 /* MVKCommandBuffer.h in Headers */,
|
||||
A9E53DF32100B302002781DD /* MTLRenderPassDescriptor+MoltenVK.h in Headers */,
|
||||
A99C90EE229455B300A061DA /* MVKCmdDebug.h in Headers */,
|
||||
A98149631FB6A3F7005F00B4 /* MVKWatermarkTextureContent.h in Headers */,
|
||||
A98149531FB6A3F7005F00B4 /* MVKFoundation.h in Headers */,
|
||||
A94FB7E81C7DFB4800632CA3 /* MVKDeviceMemory.h in Headers */,
|
||||
@ -727,6 +745,7 @@
|
||||
83A4AD2B21BD75570006C935 /* MVKVector.h in Headers */,
|
||||
A94FB7D51C7DFB4800632CA3 /* MVKCommandPool.h in Headers */,
|
||||
A94FB80D1C7DFB4800632CA3 /* MVKShaderModule.h in Headers */,
|
||||
A99C91052295FAC600A061DA /* MVKVulkanAPIObject.h in Headers */,
|
||||
A94FB7C11C7DFB4800632CA3 /* MVKCmdQueries.h in Headers */,
|
||||
A94FB7CD1C7DFB4800632CA3 /* MVKCommand.h in Headers */,
|
||||
A98149501FB6A3F7005F00B4 /* MVKBaseObject.h in Headers */,
|
||||
@ -747,6 +766,7 @@
|
||||
A94FB7C91C7DFB4800632CA3 /* MVKCmdDraw.h in Headers */,
|
||||
A94FB7D11C7DFB4800632CA3 /* MVKCommandBuffer.h in Headers */,
|
||||
A9E53DF42100B302002781DD /* MTLRenderPassDescriptor+MoltenVK.h in Headers */,
|
||||
A99C90EF229455B300A061DA /* MVKCmdDebug.h in Headers */,
|
||||
A98149641FB6A3F7005F00B4 /* MVKWatermarkTextureContent.h in Headers */,
|
||||
A98149541FB6A3F7005F00B4 /* MVKFoundation.h in Headers */,
|
||||
A94FB7E91C7DFB4800632CA3 /* MVKDeviceMemory.h in Headers */,
|
||||
@ -961,11 +981,12 @@
|
||||
A9E53DFF21064F84002781DD /* MTLRenderPipelineDescriptor+MoltenVK.m in Sources */,
|
||||
A94FB80A1C7DFB4800632CA3 /* MVKResource.mm in Sources */,
|
||||
A94FB7E21C7DFB4800632CA3 /* MVKDescriptorSet.mm in Sources */,
|
||||
A99C91022295FAC600A061DA /* MVKVulkanAPIObject.mm 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 */,
|
||||
A981494D1FB6A3F7005F00B4 /* MVKBaseObject.mm in Sources */,
|
||||
A9E53DE52100B197002781DD /* NSString+MoltenVK.mm in Sources */,
|
||||
A94FB8321C7DFB4800632CA3 /* vulkan.mm in Sources */,
|
||||
A94FB8121C7DFB4800632CA3 /* MVKSurface.mm in Sources */,
|
||||
@ -979,7 +1000,7 @@
|
||||
A94FB7C61C7DFB4800632CA3 /* MVKCmdRenderPass.mm in Sources */,
|
||||
A94FB7DE1C7DFB4800632CA3 /* MVKBuffer.mm in Sources */,
|
||||
A94FB82A1C7DFB4800632CA3 /* mvk_datatypes.mm in Sources */,
|
||||
A909F661213B190700FCD6BE /* MVKExtensions.cpp in Sources */,
|
||||
A909F661213B190700FCD6BE /* MVKExtensions.mm in Sources */,
|
||||
A98149551FB6A3F7005F00B4 /* MVKFoundation.cpp in Sources */,
|
||||
A94FB7E61C7DFB4800632CA3 /* MVKDevice.mm in Sources */,
|
||||
A9E53DF52100B302002781DD /* MTLRenderPassDescriptor+MoltenVK.m in Sources */,
|
||||
@ -1004,6 +1025,7 @@
|
||||
A9C96DD21DDC20C20053187F /* MVKMTLBufferAllocation.mm in Sources */,
|
||||
A9E53DE92100B197002781DD /* CAMetalLayer+MoltenVK.m in Sources */,
|
||||
A9096E5E1F81E16300DFBEA6 /* MVKCmdDispatch.mm in Sources */,
|
||||
A99C90F0229455B300A061DA /* MVKCmdDebug.mm in Sources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
@ -1015,11 +1037,12 @@
|
||||
A9E53E0021064F84002781DD /* MTLRenderPipelineDescriptor+MoltenVK.m in Sources */,
|
||||
A94FB80B1C7DFB4800632CA3 /* MVKResource.mm in Sources */,
|
||||
A94FB7E31C7DFB4800632CA3 /* MVKDescriptorSet.mm in Sources */,
|
||||
A99C91032295FAC600A061DA /* MVKVulkanAPIObject.mm 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 */,
|
||||
A981494E1FB6A3F7005F00B4 /* MVKBaseObject.mm in Sources */,
|
||||
A9E53DE62100B197002781DD /* NSString+MoltenVK.mm in Sources */,
|
||||
A94FB8331C7DFB4800632CA3 /* vulkan.mm in Sources */,
|
||||
A94FB8131C7DFB4800632CA3 /* MVKSurface.mm in Sources */,
|
||||
@ -1033,7 +1056,7 @@
|
||||
A94FB7C71C7DFB4800632CA3 /* MVKCmdRenderPass.mm in Sources */,
|
||||
A94FB7DF1C7DFB4800632CA3 /* MVKBuffer.mm in Sources */,
|
||||
A94FB82B1C7DFB4800632CA3 /* mvk_datatypes.mm in Sources */,
|
||||
A909F662213B190700FCD6BE /* MVKExtensions.cpp in Sources */,
|
||||
A909F662213B190700FCD6BE /* MVKExtensions.mm in Sources */,
|
||||
A98149561FB6A3F7005F00B4 /* MVKFoundation.cpp in Sources */,
|
||||
A94FB7E71C7DFB4800632CA3 /* MVKDevice.mm in Sources */,
|
||||
A9E53DF62100B302002781DD /* MTLRenderPassDescriptor+MoltenVK.m in Sources */,
|
||||
@ -1058,6 +1081,7 @@
|
||||
A9C96DD31DDC20C20053187F /* MVKMTLBufferAllocation.mm in Sources */,
|
||||
A9E53DEA2100B197002781DD /* CAMetalLayer+MoltenVK.m in Sources */,
|
||||
A9096E5F1F81E16300DFBEA6 /* MVKCmdDispatch.mm in Sources */,
|
||||
A99C90F1229455B300A061DA /* MVKCmdDebug.mm in Sources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
|
91
MoltenVK/MoltenVK/Commands/MVKCmdDebug.h
Normal file
91
MoltenVK/MoltenVK/Commands/MVKCmdDebug.h
Normal file
@ -0,0 +1,91 @@
|
||||
/*
|
||||
* MVKCmdDebug.h
|
||||
*
|
||||
* Copyright (c) 2014-2019 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
|
||||
|
||||
#include "MVKCommand.h"
|
||||
|
||||
#import <Foundation/NSString.h>
|
||||
|
||||
|
||||
#pragma mark -
|
||||
#pragma mark MVKCmdDebugMarker
|
||||
|
||||
/**Abstract Vulkan class to support debug markers. */
|
||||
class MVKCmdDebugMarker : public MVKCommand {
|
||||
|
||||
public:
|
||||
void setContent(const char* pMarkerName, const float color[4]);
|
||||
|
||||
MVKCmdDebugMarker(MVKCommandTypePool<MVKCmdDebugMarker>* pool);
|
||||
|
||||
~MVKCmdDebugMarker() override;
|
||||
|
||||
protected:
|
||||
NSString* _markerName = nil;
|
||||
};
|
||||
|
||||
|
||||
#pragma mark -
|
||||
#pragma mark MVKCmdDebugMarkerBegin
|
||||
|
||||
/** Vulkan command to begin a marker region into the command buffer. */
|
||||
class MVKCmdDebugMarkerBegin : public MVKCmdDebugMarker {
|
||||
|
||||
public:
|
||||
void encode(MVKCommandEncoder* cmdEncoder) override;
|
||||
|
||||
MVKCmdDebugMarkerBegin(MVKCommandTypePool<MVKCmdDebugMarkerBegin>* pool);
|
||||
};
|
||||
|
||||
|
||||
#pragma mark -
|
||||
#pragma mark MVKCmdDebugMarkerEnd
|
||||
|
||||
/** Vulkan command to end an open marker region in the command buffer. */
|
||||
class MVKCmdDebugMarkerEnd : public MVKCommand {
|
||||
|
||||
public:
|
||||
void encode(MVKCommandEncoder* cmdEncoder) override;
|
||||
|
||||
MVKCmdDebugMarkerEnd(MVKCommandTypePool<MVKCmdDebugMarkerEnd>* pool);
|
||||
};
|
||||
|
||||
|
||||
#pragma mark -
|
||||
#pragma mark MVKCmdDebugMarkerInsert
|
||||
|
||||
/** Vulkan command to insert a debug marker into the command encoder. */
|
||||
class MVKCmdDebugMarkerInsert : public MVKCmdDebugMarker {
|
||||
|
||||
public:
|
||||
void encode(MVKCommandEncoder* cmdEncoder) override;
|
||||
|
||||
MVKCmdDebugMarkerInsert(MVKCommandTypePool<MVKCmdDebugMarkerInsert>* pool);
|
||||
};
|
||||
|
||||
|
||||
#pragma mark -
|
||||
#pragma mark Command creation functions
|
||||
|
||||
void mvkCmdDebugMarkerBegin(MVKCommandBuffer* cmdBuff, const VkDebugMarkerMarkerInfoEXT* pMarkerInfo);
|
||||
|
||||
void mvkCmdDebugMarkerEnd(MVKCommandBuffer* cmdBuff);
|
||||
|
||||
void mvkCmdDebugMarkerInsert(MVKCommandBuffer* cmdBuff, const VkDebugMarkerMarkerInfoEXT* pMarkerInfo);
|
||||
|
97
MoltenVK/MoltenVK/Commands/MVKCmdDebug.mm
Normal file
97
MoltenVK/MoltenVK/Commands/MVKCmdDebug.mm
Normal file
@ -0,0 +1,97 @@
|
||||
/*
|
||||
* MVKCmdDebug.mm
|
||||
*
|
||||
* Copyright (c) 2014-2019 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 "MVKCmdDebug.h"
|
||||
#include "MVKCommandBuffer.h"
|
||||
#include "MVKCommandPool.h"
|
||||
|
||||
#include "MVKLogging.h"
|
||||
|
||||
#pragma mark -
|
||||
#pragma mark MVKCmdDebugMarker
|
||||
|
||||
void MVKCmdDebugMarker::setContent(const char* pMarkerName, const float color[4]) {
|
||||
[_markerName release];
|
||||
_markerName = [@(pMarkerName) retain];
|
||||
}
|
||||
|
||||
MVKCmdDebugMarker::MVKCmdDebugMarker(MVKCommandTypePool<MVKCmdDebugMarker>* pool)
|
||||
: MVKCommand::MVKCommand((MVKCommandTypePool<MVKCommand>*)pool) {}
|
||||
|
||||
MVKCmdDebugMarker::~MVKCmdDebugMarker() {
|
||||
[_markerName release];
|
||||
}
|
||||
|
||||
#pragma mark -
|
||||
#pragma mark MVKCmdDebugMarkerBegin
|
||||
|
||||
// Vulkan debug groups are more general than Metal's.
|
||||
// Always push on command buffer instead of the encoder.
|
||||
void MVKCmdDebugMarkerBegin::encode(MVKCommandEncoder* cmdEncoder) {
|
||||
[cmdEncoder->_mtlCmdBuffer pushDebugGroup: _markerName];
|
||||
}
|
||||
|
||||
MVKCmdDebugMarkerBegin::MVKCmdDebugMarkerBegin(MVKCommandTypePool<MVKCmdDebugMarkerBegin>* pool)
|
||||
: MVKCmdDebugMarker::MVKCmdDebugMarker((MVKCommandTypePool<MVKCmdDebugMarker>*)pool) {}
|
||||
|
||||
|
||||
#pragma mark -
|
||||
#pragma mark MVKCmdDebugMarkerEnd
|
||||
|
||||
// Vulkan debug groups are more general than Metal's.
|
||||
// Always pop from command buffer instead of the encoder.
|
||||
void MVKCmdDebugMarkerEnd::encode(MVKCommandEncoder* cmdEncoder) {
|
||||
[cmdEncoder->_mtlCmdBuffer popDebugGroup];
|
||||
}
|
||||
|
||||
MVKCmdDebugMarkerEnd::MVKCmdDebugMarkerEnd(MVKCommandTypePool<MVKCmdDebugMarkerEnd>* pool)
|
||||
: MVKCommand::MVKCommand((MVKCommandTypePool<MVKCommand>*)pool) {}
|
||||
|
||||
|
||||
#pragma mark -
|
||||
#pragma mark MVKCmdDebugMarkerInsert
|
||||
|
||||
void MVKCmdDebugMarkerInsert::encode(MVKCommandEncoder* cmdEncoder) {
|
||||
[cmdEncoder->getMTLEncoder() insertDebugSignpost: _markerName];
|
||||
}
|
||||
|
||||
MVKCmdDebugMarkerInsert::MVKCmdDebugMarkerInsert(MVKCommandTypePool<MVKCmdDebugMarkerInsert>* pool)
|
||||
: MVKCmdDebugMarker::MVKCmdDebugMarker((MVKCommandTypePool<MVKCmdDebugMarker>*)pool) {}
|
||||
|
||||
|
||||
#pragma mark -
|
||||
#pragma mark Command creation functions
|
||||
|
||||
void mvkCmdDebugMarkerBegin(MVKCommandBuffer* cmdBuff, const VkDebugMarkerMarkerInfoEXT* pMarkerInfo) {
|
||||
MVKCmdDebugMarkerBegin* cmd = cmdBuff->_commandPool->_cmdDebugMarkerBeginPool.acquireObject();
|
||||
cmd->setContent(pMarkerInfo->pMarkerName, pMarkerInfo->color);
|
||||
cmdBuff->addCommand(cmd);
|
||||
}
|
||||
|
||||
void mvkCmdDebugMarkerEnd(MVKCommandBuffer* cmdBuff) {
|
||||
MVKCmdDebugMarkerEnd* cmd = cmdBuff->_commandPool->_cmdDebugMarkerEndPool.acquireObject();
|
||||
cmdBuff->addCommand(cmd);
|
||||
}
|
||||
|
||||
void mvkCmdDebugMarkerInsert(MVKCommandBuffer* cmdBuff, const VkDebugMarkerMarkerInfoEXT* pMarkerInfo) {
|
||||
MVKCmdDebugMarkerInsert* cmd = cmdBuff->_commandPool->_cmdDebugMarkerInsertPool.acquireObject();
|
||||
cmd->setContent(pMarkerInfo->pMarkerName, pMarkerInfo->color);
|
||||
cmdBuff->addCommand(cmd);
|
||||
}
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* MVKMVKCmdDispatch.h
|
||||
* MVKCmdDispatch.h
|
||||
*
|
||||
* Copyright (c) 2014-2019 The Brenwill Workshop Ltd. (http://www.brenwill.com)
|
||||
*
|
||||
@ -24,8 +24,6 @@
|
||||
|
||||
#import <Metal/Metal.h>
|
||||
|
||||
class MVKDevice;
|
||||
|
||||
|
||||
#pragma mark -
|
||||
#pragma mark MVKCmdDispatch
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* MVKMVKCmdDispatch.mm
|
||||
* MVKCmdDispatch.mm
|
||||
*
|
||||
* Copyright (c) 2014-2019 The Brenwill Workshop Ltd. (http://www.brenwill.com)
|
||||
*
|
||||
@ -25,7 +25,7 @@
|
||||
|
||||
|
||||
#pragma mark -
|
||||
#pragma mark MVKCmdDraw
|
||||
#pragma mark MVKCmdDispatch
|
||||
|
||||
void MVKCmdDispatch::setContent(uint32_t x, uint32_t y, uint32_t z) {
|
||||
_mtlThreadgroupCount.width = x;
|
||||
|
@ -24,8 +24,6 @@
|
||||
|
||||
#import <Metal/Metal.h>
|
||||
|
||||
class MVKDevice;
|
||||
|
||||
|
||||
#pragma mark -
|
||||
#pragma mark MVKCmdBindVertexBuffers
|
||||
|
@ -24,7 +24,6 @@
|
||||
|
||||
#import <Metal/Metal.h>
|
||||
|
||||
class MVKCommandBuffer;
|
||||
class MVKRenderPass;
|
||||
class MVKFramebuffer;
|
||||
|
||||
|
@ -26,7 +26,6 @@
|
||||
|
||||
#import <Metal/Metal.h>
|
||||
|
||||
class MVKCommandBuffer;
|
||||
class MVKImage;
|
||||
class MVKBuffer;
|
||||
|
||||
|
@ -322,7 +322,7 @@ void MVKCmdBlitImage::encode(MVKCommandEncoder* cmdEncoder) {
|
||||
mtlColorAttDesc.level = bltRend.dstLevel;
|
||||
mtlColorAttDesc.slice = bltRend.dstSlice;
|
||||
id<MTLRenderCommandEncoder> mtlRendEnc = [cmdEncoder->_mtlCmdBuffer renderCommandEncoderWithDescriptor: _mtlRenderPassDescriptor];
|
||||
mtlRendEnc.label = mvkMTLRenderCommandEncoderLabel(_commandUse);
|
||||
setLabelIfNotNil(mtlRendEnc, mvkMTLRenderCommandEncoderLabel(_commandUse));
|
||||
|
||||
[mtlRendEnc pushDebugGroup: @"vkCmdBlitImage"];
|
||||
[mtlRendEnc setRenderPipelineState: cmdEncPool->getCmdBlitImageMTLRenderPipelineState(_blitKey)];
|
||||
@ -517,7 +517,7 @@ void MVKCmdResolveImage::encode(MVKCommandEncoder* cmdEncoder) {
|
||||
mtlColorAttDesc.resolveLevel = rslvSlice.level;
|
||||
mtlColorAttDesc.resolveSlice = rslvSlice.slice;
|
||||
id<MTLRenderCommandEncoder> mtlRendEnc = [cmdEncoder->_mtlCmdBuffer renderCommandEncoderWithDescriptor: _mtlRenderPassDescriptor];
|
||||
mtlRendEnc.label = mvkMTLRenderCommandEncoderLabel(kMVKCommandUseResolveImage);
|
||||
setLabelIfNotNil(mtlRendEnc, mvkMTLRenderCommandEncoderLabel(kMVKCommandUseResolveImage));
|
||||
|
||||
[mtlRendEnc pushDebugGroup: @"vkCmdResolveImage"];
|
||||
[mtlRendEnc popDebugGroup];
|
||||
@ -1060,7 +1060,7 @@ void MVKCmdClearImage::encode(MVKCommandEncoder* cmdEncoder) {
|
||||
mtlRPSADesc.slice = layer;
|
||||
|
||||
id<MTLRenderCommandEncoder> mtlRendEnc = [cmdEncoder->_mtlCmdBuffer renderCommandEncoderWithDescriptor: mtlRPDesc];
|
||||
mtlRendEnc.label = mtlRendEncName;
|
||||
setLabelIfNotNil(mtlRendEnc, mtlRendEncName);
|
||||
[mtlRendEnc endEncoding];
|
||||
}
|
||||
}
|
||||
|
@ -149,6 +149,7 @@ protected:
|
||||
friend class MVKCommandPool;
|
||||
|
||||
MVKBaseObject* getBaseObject() override { return this; };
|
||||
void propogateDebugName() override {}
|
||||
void init(const VkCommandBufferAllocateInfo* pAllocateInfo);
|
||||
bool canExecute();
|
||||
bool canPrefill();
|
||||
@ -312,7 +313,7 @@ public:
|
||||
void endMetalRenderEncoding();
|
||||
|
||||
/**
|
||||
* The current Metal compute encoder for the specified use,
|
||||
* Returns trhe current Metal compute encoder for the specified use,
|
||||
* which determines the label assigned to the returned encoder.
|
||||
*
|
||||
* If the current encoder is not a compute encoder, this function ends current before
|
||||
@ -321,7 +322,7 @@ public:
|
||||
id<MTLComputeCommandEncoder> getMTLComputeEncoder(MVKCommandUse cmdUse);
|
||||
|
||||
/**
|
||||
* The current Metal BLIT encoder for the specified use,
|
||||
* Returns the current Metal BLIT encoder for the specified use,
|
||||
* which determines the label assigned to the returned encoder.
|
||||
*
|
||||
* If the current encoder is not a BLIT encoder, this function ends
|
||||
@ -329,6 +330,12 @@ public:
|
||||
*/
|
||||
id<MTLBlitCommandEncoder> getMTLBlitEncoder(MVKCommandUse cmdUse);
|
||||
|
||||
/**
|
||||
* Returns the current Metal encoder, which may be any of the Metal render,
|
||||
* comupte, or Blit encoders, or nil if no encoding is currently occurring.
|
||||
*/
|
||||
id<MTLCommandEncoder> getMTLEncoder();
|
||||
|
||||
/** Returns the push constants associated with the specified shader stage. */
|
||||
MVKPushConstantsCommandEncoderState* getPushConstants(VkShaderStageFlagBits shaderStage);
|
||||
|
||||
@ -460,9 +467,6 @@ protected:
|
||||
#pragma mark -
|
||||
#pragma mark Support functions
|
||||
|
||||
/** Returns a name, suitable for use as a MTLCommandBuffer label, based on the MVKCommandUse. */
|
||||
NSString* mvkMTLCommandBufferLabel(MVKCommandUse cmdUse);
|
||||
|
||||
/** Returns a name, suitable for use as a MTLRenderCommandEncoder label, based on the MVKCommandUse. */
|
||||
NSString* mvkMTLRenderCommandEncoderLabel(MVKCommandUse cmdUse);
|
||||
|
||||
|
@ -238,6 +238,8 @@ void MVKCommandEncoder::encode(id<MTLCommandBuffer> mtlCmdBuff) {
|
||||
|
||||
_mtlCmdBuffer = mtlCmdBuff; // not retained
|
||||
|
||||
setLabelIfNotNil(_mtlCmdBuffer, _cmdBuffer->_debugName);
|
||||
|
||||
MVKCommand* cmd = _cmdBuffer->_head;
|
||||
while (cmd) {
|
||||
if (cmd->canEncode()) { cmd->encode(this); }
|
||||
@ -307,7 +309,7 @@ void MVKCommandEncoder::beginMetalRenderPass(bool loadOverride, bool storeOverri
|
||||
}
|
||||
|
||||
_mtlRenderEncoder = [_mtlCmdBuffer renderCommandEncoderWithDescriptor: mtlRPDesc]; // not retained
|
||||
_mtlRenderEncoder.label = getMTLRenderCommandEncoderName();
|
||||
setLabelIfNotNil(_mtlRenderEncoder, getMTLRenderCommandEncoderName());
|
||||
|
||||
if ( !_isRenderingEntireAttachment ) { clearRenderArea(); }
|
||||
|
||||
@ -330,8 +332,11 @@ MVKRenderSubpass* MVKCommandEncoder::getSubpass() { return _renderPass->getSubpa
|
||||
|
||||
// Returns a name for use as a MTLRenderCommandEncoder label
|
||||
NSString* MVKCommandEncoder::getMTLRenderCommandEncoderName() {
|
||||
MVKCommandUse cmdUse = (_renderSubpassIndex == 0) ? kMVKCommandUseBeginRenderPass : kMVKCommandUseNextSubpass;
|
||||
return mvkMTLRenderCommandEncoderLabel(cmdUse);
|
||||
NSString* rpName = _renderPass ? _renderPass->getDebugName() : nil;
|
||||
if (rpName) { return rpName; }
|
||||
|
||||
MVKCommandUse cmdUse = (_renderSubpassIndex == 0) ? kMVKCommandUseBeginRenderPass : kMVKCommandUseNextSubpass;
|
||||
return mvkMTLRenderCommandEncoderLabel(cmdUse);
|
||||
}
|
||||
|
||||
void MVKCommandEncoder::bindPipeline(VkPipelineBindPoint pipelineBindPoint, MVKPipeline* pipeline) {
|
||||
@ -438,7 +443,7 @@ id<MTLComputeCommandEncoder> MVKCommandEncoder::getMTLComputeEncoder(MVKCommandU
|
||||
}
|
||||
if (_mtlComputeEncoderUse != cmdUse) {
|
||||
_mtlComputeEncoderUse = cmdUse;
|
||||
_mtlComputeEncoder.label = mvkMTLComputeCommandEncoderLabel(cmdUse);
|
||||
setLabelIfNotNil(_mtlComputeEncoder, mvkMTLComputeCommandEncoderLabel(cmdUse));
|
||||
}
|
||||
return _mtlComputeEncoder;
|
||||
}
|
||||
@ -450,10 +455,18 @@ id<MTLBlitCommandEncoder> MVKCommandEncoder::getMTLBlitEncoder(MVKCommandUse cmd
|
||||
}
|
||||
if (_mtlBlitEncoderUse != cmdUse) {
|
||||
_mtlBlitEncoderUse = cmdUse;
|
||||
_mtlBlitEncoder.label = mvkMTLBlitCommandEncoderLabel(cmdUse);
|
||||
setLabelIfNotNil(_mtlBlitEncoder, mvkMTLBlitCommandEncoderLabel(cmdUse));
|
||||
}
|
||||
return _mtlBlitEncoder;
|
||||
}
|
||||
|
||||
id<MTLCommandEncoder> MVKCommandEncoder::getMTLEncoder(){
|
||||
if (_mtlRenderEncoder) { return _mtlRenderEncoder; }
|
||||
if (_mtlComputeEncoder) { return _mtlComputeEncoder; }
|
||||
if (_mtlBlitEncoder) { return _mtlBlitEncoder; }
|
||||
return nil;
|
||||
}
|
||||
|
||||
MVKPushConstantsCommandEncoderState* MVKCommandEncoder::getPushConstants(VkShaderStageFlagBits shaderStage) {
|
||||
switch (shaderStage) {
|
||||
case VK_SHADER_STAGE_VERTEX_BIT: return &_vertexPushConstants;
|
||||
@ -602,16 +615,6 @@ MVKCommandEncoder::MVKCommandEncoder(MVKCommandBuffer* cmdBuffer) : MVKBaseDevic
|
||||
#pragma mark -
|
||||
#pragma mark Support functions
|
||||
|
||||
NSString* mvkMTLCommandBufferLabel(MVKCommandUse cmdUse) {
|
||||
switch (cmdUse) {
|
||||
case kMVKCommandUseQueueSubmit: return @"vkQueueSubmit CommandBuffer";
|
||||
case kMVKCommandUseQueuePresent: return @"vkQueuePresentKHR CommandBuffer";
|
||||
case kMVKCommandUseQueueWaitIdle: return @"vkQueueWaitIdle CommandBuffer";
|
||||
case kMVKCommandUseDeviceWaitIdle: return @"vkDeviceWaitIdle CommandBuffer";
|
||||
default: return @"Unknown Use CommandBuffer";
|
||||
}
|
||||
}
|
||||
|
||||
NSString* mvkMTLRenderCommandEncoderLabel(MVKCommandUse cmdUse) {
|
||||
switch (cmdUse) {
|
||||
case kMVKCommandUseBeginRenderPass: return @"vkCmdBeginRenderPass RenderEncoder";
|
||||
|
@ -28,6 +28,7 @@
|
||||
#include "MVKCmdDraw.h"
|
||||
#include "MVKCmdTransfer.h"
|
||||
#include "MVKCmdQueries.h"
|
||||
#include "MVKCmdDebug.h"
|
||||
#include "MVKMTLBufferAllocation.h"
|
||||
#include <unordered_set>
|
||||
|
||||
@ -139,6 +140,12 @@ public:
|
||||
|
||||
MVKCommandTypePool<MVKCmdPushDescriptorSetWithTemplate> _cmdPushSetWithTemplatePool;
|
||||
|
||||
MVKCommandTypePool<MVKCmdDebugMarkerBegin> _cmdDebugMarkerBeginPool;
|
||||
|
||||
MVKCommandTypePool<MVKCmdDebugMarkerEnd> _cmdDebugMarkerEndPool;
|
||||
|
||||
MVKCommandTypePool<MVKCmdDebugMarkerInsert> _cmdDebugMarkerInsertPool;
|
||||
|
||||
|
||||
#pragma mark Command resources
|
||||
|
||||
@ -173,6 +180,7 @@ public:
|
||||
~MVKCommandPool() override;
|
||||
|
||||
protected:
|
||||
void propogateDebugName() override {}
|
||||
MVKDeviceObjectPool<MVKCommandBuffer> _commandBufferPool;
|
||||
std::unordered_set<MVKCommandBuffer*> _allocatedCommandBuffers;
|
||||
MVKCommandEncodingPool _commandEncodingPool;
|
||||
|
@ -134,47 +134,50 @@ MVKCommandPool::MVKCommandPool(MVKDevice* device,
|
||||
_commandBufferPool(device),
|
||||
_commandEncodingPool(this),
|
||||
_queueFamilyIndex(pCreateInfo->queueFamilyIndex),
|
||||
_cmdPipelineBarrierPool(this, true),
|
||||
_cmdBindPipelinePool(this, true),
|
||||
_cmdBeginRenderPassPool(this, true),
|
||||
_cmdNextSubpassPool(this, true),
|
||||
_cmdExecuteCommandsPool(this, true),
|
||||
_cmdEndRenderPassPool(this, true),
|
||||
_cmdBindDescriptorSetsPool(this, true),
|
||||
_cmdSetViewportPool(this, true),
|
||||
_cmdSetScissorPool(this, true),
|
||||
_cmdSetLineWidthPool(this, true),
|
||||
_cmdSetDepthBiasPool(this, true),
|
||||
_cmdSetBlendConstantsPool(this, true),
|
||||
_cmdSetDepthBoundsPool(this, true),
|
||||
_cmdSetStencilCompareMaskPool(this, true),
|
||||
_cmdSetStencilWriteMaskPool(this, true),
|
||||
_cmdSetStencilReferencePool(this, true),
|
||||
_cmdBindVertexBuffersPool(this, true),
|
||||
_cmdBindIndexBufferPool(this, true),
|
||||
_cmdDrawPool(this, true),
|
||||
_cmdDrawIndexedPool(this, true),
|
||||
_cmdDrawIndirectPool(this, true),
|
||||
_cmdDrawIndexedIndirectPool(this, true),
|
||||
_cmdCopyImagePool(this, true),
|
||||
_cmdBlitImagePool(this, true),
|
||||
_cmdResolveImagePool(this, true),
|
||||
_cmdFillBufferPool(this, true),
|
||||
_cmdUpdateBufferPool(this, true),
|
||||
_cmdCopyBufferPool(this, true),
|
||||
_cmdBufferImageCopyPool(this, true),
|
||||
_cmdClearAttachmentsPool(this, true),
|
||||
_cmdClearImagePool(this, true),
|
||||
_cmdBeginQueryPool(this, true),
|
||||
_cmdEndQueryPool(this, true),
|
||||
_cmdWriteTimestampPool(this, true),
|
||||
_cmdResetQueryPoolPool(this, true),
|
||||
_cmdCopyQueryPoolResultsPool(this, true),
|
||||
_cmdPushConstantsPool(this, true),
|
||||
_cmdDispatchPool(this, true),
|
||||
_cmdDispatchIndirectPool(this, true),
|
||||
_cmdPushDescriptorSetPool(this, true),
|
||||
_cmdPushSetWithTemplatePool(this, true)
|
||||
_cmdPipelineBarrierPool(this),
|
||||
_cmdBindPipelinePool(this),
|
||||
_cmdBeginRenderPassPool(this),
|
||||
_cmdNextSubpassPool(this),
|
||||
_cmdExecuteCommandsPool(this),
|
||||
_cmdEndRenderPassPool(this),
|
||||
_cmdBindDescriptorSetsPool(this),
|
||||
_cmdSetViewportPool(this),
|
||||
_cmdSetScissorPool(this),
|
||||
_cmdSetLineWidthPool(this),
|
||||
_cmdSetDepthBiasPool(this),
|
||||
_cmdSetBlendConstantsPool(this),
|
||||
_cmdSetDepthBoundsPool(this),
|
||||
_cmdSetStencilCompareMaskPool(this),
|
||||
_cmdSetStencilWriteMaskPool(this),
|
||||
_cmdSetStencilReferencePool(this),
|
||||
_cmdBindVertexBuffersPool(this),
|
||||
_cmdBindIndexBufferPool(this),
|
||||
_cmdDrawPool(this),
|
||||
_cmdDrawIndexedPool(this),
|
||||
_cmdDrawIndirectPool(this),
|
||||
_cmdDrawIndexedIndirectPool(this),
|
||||
_cmdCopyImagePool(this),
|
||||
_cmdBlitImagePool(this),
|
||||
_cmdResolveImagePool(this),
|
||||
_cmdFillBufferPool(this),
|
||||
_cmdUpdateBufferPool(this),
|
||||
_cmdCopyBufferPool(this),
|
||||
_cmdBufferImageCopyPool(this),
|
||||
_cmdClearAttachmentsPool(this),
|
||||
_cmdClearImagePool(this),
|
||||
_cmdBeginQueryPool(this),
|
||||
_cmdEndQueryPool(this),
|
||||
_cmdWriteTimestampPool(this),
|
||||
_cmdResetQueryPoolPool(this),
|
||||
_cmdCopyQueryPoolResultsPool(this),
|
||||
_cmdPushConstantsPool(this),
|
||||
_cmdDispatchPool(this),
|
||||
_cmdDispatchIndirectPool(this),
|
||||
_cmdPushDescriptorSetPool(this),
|
||||
_cmdPushSetWithTemplatePool(this),
|
||||
_cmdDebugMarkerBeginPool(this),
|
||||
_cmdDebugMarkerEndPool(this),
|
||||
_cmdDebugMarkerInsertPool(this)
|
||||
{}
|
||||
|
||||
MVKCommandPool::~MVKCommandPool() {
|
||||
|
@ -81,6 +81,7 @@ public:
|
||||
protected:
|
||||
using MVKResource::needsHostReadSync;
|
||||
|
||||
void propogateDebugName() override;
|
||||
bool needsHostReadSync(VkPipelineStageFlags srcStageMask,
|
||||
VkPipelineStageFlags dstStageMask,
|
||||
VkBufferMemoryBarrier* pBufferMemoryBarrier);
|
||||
@ -112,6 +113,8 @@ public:
|
||||
~MVKBufferView() override;
|
||||
|
||||
protected:
|
||||
void propogateDebugName() override;
|
||||
|
||||
MVKBuffer* _buffer;
|
||||
id<MTLTexture> _mtlTexture;
|
||||
MTLPixelFormat _mtlPixelFormat;
|
||||
|
@ -28,6 +28,16 @@ using namespace std;
|
||||
#pragma mark -
|
||||
#pragma mark MVKBuffer
|
||||
|
||||
void MVKBuffer::propogateDebugName() {
|
||||
if (_deviceMemory &&
|
||||
_deviceMemory->isDedicatedAllocation() &&
|
||||
_deviceMemory->_debugName.length == 0) {
|
||||
|
||||
_deviceMemory->setDebugName(_debugName.UTF8String);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#pragma mark Resource memory
|
||||
|
||||
VkResult MVKBuffer::getMemoryRequirements(VkMemoryRequirements* pMemoryRequirements) {
|
||||
@ -70,6 +80,8 @@ VkResult MVKBuffer::bindDeviceMemory(MVKDeviceMemory* mvkMem, VkDeviceSize memOf
|
||||
|
||||
MVKResource::bindDeviceMemory(mvkMem, memOffset);
|
||||
|
||||
propogateDebugName();
|
||||
|
||||
return _deviceMemory ? _deviceMemory->addBuffer(this) : VK_SUCCESS;
|
||||
}
|
||||
|
||||
@ -130,6 +142,10 @@ MVKBuffer::~MVKBuffer() {
|
||||
#pragma mark -
|
||||
#pragma mark MVKBufferView
|
||||
|
||||
void MVKBufferView::propogateDebugName() {
|
||||
setLabelIfNotNil(_mtlTexture, _debugName);
|
||||
}
|
||||
|
||||
#pragma mark Metal
|
||||
|
||||
id<MTLTexture> MVKBufferView::getMTLTexture() {
|
||||
@ -161,6 +177,7 @@ id<MTLTexture> MVKBufferView::getMTLTexture() {
|
||||
_mtlTexture = [_buffer->getMTLBuffer() newTextureWithDescriptor: mtlTexDesc
|
||||
offset: _mtlBufferOffset
|
||||
bytesPerRow: _mtlBytesPerRow];
|
||||
propogateDebugName();
|
||||
}
|
||||
return _mtlTexture;
|
||||
}
|
||||
|
@ -175,6 +175,7 @@ protected:
|
||||
friend class MVKPipelineLayout;
|
||||
friend class MVKDescriptorSet;
|
||||
|
||||
void propogateDebugName() override {}
|
||||
MVKVectorInline<MVKDescriptorSetLayoutBinding, 8> _bindings;
|
||||
std::unordered_map<uint32_t, uint32_t> _bindingToIndex;
|
||||
MVKShaderResourceBinding _mtlResourceCounts;
|
||||
@ -314,6 +315,7 @@ protected:
|
||||
friend class MVKDescriptorSetLayout;
|
||||
friend class MVKDescriptorPool;
|
||||
|
||||
void propogateDebugName() override {}
|
||||
void setLayout(MVKDescriptorSetLayout* layout);
|
||||
MVKDescriptorBinding* getBinding(uint32_t binding);
|
||||
|
||||
@ -353,6 +355,7 @@ public:
|
||||
~MVKDescriptorPool() override;
|
||||
|
||||
protected:
|
||||
void propogateDebugName() override {}
|
||||
MVKDescriptorSetPool* getDescriptorSetPool(MVKDescriptorSetLayout* mvkDescSetLayout);
|
||||
|
||||
uint32_t _maxSets;
|
||||
@ -387,7 +390,9 @@ public:
|
||||
/** Destructor. */
|
||||
~MVKDescriptorUpdateTemplate() override = default;
|
||||
|
||||
private:
|
||||
protected:
|
||||
void propogateDebugName() override {}
|
||||
|
||||
VkDescriptorUpdateTemplateTypeKHR _type;
|
||||
std::vector<VkDescriptorUpdateTemplateEntryKHR> _entries;
|
||||
};
|
||||
|
@ -19,7 +19,7 @@
|
||||
#pragma once
|
||||
|
||||
#include "MVKFoundation.h"
|
||||
#include "MVKBaseObject.h"
|
||||
#include "MVKVulkanAPIObject.h"
|
||||
#include "MVKLayers.h"
|
||||
#include "MVKObjectPool.h"
|
||||
#include "mvk_datatypes.hpp"
|
||||
@ -309,6 +309,7 @@ public:
|
||||
protected:
|
||||
friend class MVKDevice;
|
||||
|
||||
void propogateDebugName() override {}
|
||||
MTLFeatureSet getMaximalMTLFeatureSet();
|
||||
void initMetalFeatures();
|
||||
void initFeatures();
|
||||
@ -407,6 +408,7 @@ public:
|
||||
|
||||
MVKSwapchainImage* createSwapchainImage(const VkImageCreateInfo* pCreateInfo,
|
||||
MVKSwapchain* swapchain,
|
||||
uint32_t swapchainIndex,
|
||||
const VkAllocationCallbacks* pAllocator);
|
||||
void destroySwapchainImage(MVKSwapchainImage* mvkImg,
|
||||
const VkAllocationCallbacks* pAllocator);
|
||||
@ -636,6 +638,7 @@ public:
|
||||
}
|
||||
|
||||
protected:
|
||||
void propogateDebugName() override {}
|
||||
MVKResource* addResource(MVKResource* rez);
|
||||
MVKResource* removeResource(MVKResource* rez);
|
||||
void initPerformanceTracking();
|
||||
|
@ -1597,7 +1597,7 @@ MVKQueue* MVKDevice::getQueue(uint32_t queueFamilyIndex, uint32_t queueIndex) {
|
||||
VkResult MVKDevice::waitIdle() {
|
||||
for (auto& queues : _queuesByQueueFamilyIndex) {
|
||||
for (MVKQueue* q : queues) {
|
||||
q->waitIdle(kMVKCommandUseDeviceWaitIdle);
|
||||
q->waitIdle();
|
||||
}
|
||||
}
|
||||
return VK_SUCCESS;
|
||||
@ -1718,8 +1718,9 @@ void MVKDevice::destroySwapchain(MVKSwapchain* mvkSwpChn,
|
||||
|
||||
MVKSwapchainImage* MVKDevice::createSwapchainImage(const VkImageCreateInfo* pCreateInfo,
|
||||
MVKSwapchain* swapchain,
|
||||
uint32_t swapchainIndex,
|
||||
const VkAllocationCallbacks* pAllocator) {
|
||||
return (MVKSwapchainImage*)addResource(new MVKSwapchainImage(this, pCreateInfo, swapchain));
|
||||
return (MVKSwapchainImage*)addResource(new MVKSwapchainImage(this, pCreateInfo, swapchain, swapchainIndex));
|
||||
}
|
||||
|
||||
void MVKDevice::destroySwapchainImage(MVKSwapchainImage* mvkImg,
|
||||
|
@ -114,6 +114,7 @@ protected:
|
||||
friend MVKBuffer;
|
||||
friend MVKImage;
|
||||
|
||||
void propogateDebugName() override;
|
||||
VkDeviceSize adjustMemorySize(VkDeviceSize size, VkDeviceSize offset);
|
||||
VkResult addBuffer(MVKBuffer* mvkBuff);
|
||||
void removeBuffer(MVKBuffer* mvkBuff);
|
||||
|
@ -28,8 +28,11 @@
|
||||
|
||||
using namespace std;
|
||||
|
||||
|
||||
#pragma mark MVKDeviceMemory
|
||||
|
||||
void MVKDeviceMemory::propogateDebugName() { setLabelIfNotNil(_mtlBuffer, _debugName); }
|
||||
|
||||
VkResult MVKDeviceMemory::map(VkDeviceSize offset, VkDeviceSize size, VkMemoryMapFlags flags, void** ppData) {
|
||||
|
||||
if ( !isMemoryHostAccessible() ) {
|
||||
@ -118,8 +121,7 @@ VkResult MVKDeviceMemory::addBuffer(MVKBuffer* mvkBuff) {
|
||||
}
|
||||
|
||||
// In the dedicated case, we already saved the buffer we're going to use.
|
||||
if (!_isDedicated)
|
||||
_buffers.push_back(mvkBuff);
|
||||
if (!_isDedicated) { _buffers.push_back(mvkBuff); }
|
||||
|
||||
return VK_SUCCESS;
|
||||
}
|
||||
@ -168,6 +170,8 @@ bool MVKDeviceMemory::ensureMTLBuffer() {
|
||||
}
|
||||
_pMemory = isMemoryHostAccessible() ? _mtlBuffer.contents : nullptr;
|
||||
|
||||
propogateDebugName();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -49,7 +49,9 @@ public:
|
||||
MVKFramebuffer(MVKDevice* device, const VkFramebufferCreateInfo* pCreateInfo);
|
||||
|
||||
protected:
|
||||
VkExtent2D _extent;
|
||||
void propogateDebugName() override {}
|
||||
|
||||
VkExtent2D _extent;
|
||||
uint32_t _layerCount;
|
||||
std::vector<MVKImageView*> _attachments;
|
||||
};
|
||||
|
@ -212,6 +212,7 @@ protected:
|
||||
friend class MVKImageView;
|
||||
using MVKResource::needsHostReadSync;
|
||||
|
||||
void propogateDebugName() override;
|
||||
MVKImageSubresource* getSubresource(uint32_t mipLevel, uint32_t arrayLayer);
|
||||
void validateConfig(const VkImageCreateInfo* pCreateInfo);
|
||||
VkSampleCountFlagBits validateSamples(const VkImageCreateInfo* pCreateInfo);
|
||||
@ -300,6 +301,7 @@ public:
|
||||
~MVKImageView() override;
|
||||
|
||||
protected:
|
||||
void propogateDebugName() override;
|
||||
id<MTLTexture> newMTLTexture();
|
||||
void initMTLTextureViewSupport();
|
||||
MTLPixelFormat getSwizzledMTLPixelFormat(VkFormat format,
|
||||
@ -339,6 +341,7 @@ public:
|
||||
~MVKSampler() override;
|
||||
|
||||
protected:
|
||||
void propogateDebugName() override {}
|
||||
MTLSamplerDescriptor* getMTLSamplerDescriptor(const VkSamplerCreateInfo* pCreateInfo);
|
||||
|
||||
id<MTLSamplerState> _mtlSamplerState;
|
||||
@ -365,6 +368,9 @@ class MVKSwapchainImage : public MVKImage {
|
||||
|
||||
public:
|
||||
|
||||
/** Returns the encompassing swapchain. */
|
||||
inline MVKSwapchain* getSwapchain() { return _swapchain; }
|
||||
|
||||
/** Returns the index of this image within the encompassing swapchain. */
|
||||
inline uint32_t getSwapchainIndex() { return _swapchainIndex; }
|
||||
|
||||
@ -397,7 +403,8 @@ public:
|
||||
/** Constructs an instance for the specified device and swapchain. */
|
||||
MVKSwapchainImage(MVKDevice* device,
|
||||
const VkImageCreateInfo* pCreateInfo,
|
||||
MVKSwapchain* swapchain);
|
||||
MVKSwapchain* swapchain,
|
||||
uint32_t swapchainIndex);
|
||||
|
||||
~MVKSwapchainImage() override;
|
||||
|
||||
|
@ -34,6 +34,8 @@ using namespace std;
|
||||
|
||||
#pragma mark MVKImage
|
||||
|
||||
void MVKImage::propogateDebugName() { setLabelIfNotNil(_mtlTexture, _debugName); }
|
||||
|
||||
VkImageType MVKImage::getImageType() { return mvkVkImageTypeFromMTLTextureType(_mtlTextureType); }
|
||||
|
||||
VkFormat MVKImage::getVkFormat() { return mvkVkFormatFromMTLPixelFormat(_mtlPixelFormat); }
|
||||
@ -270,6 +272,8 @@ id<MTLTexture> MVKImage::getMTLTexture() {
|
||||
if (_mtlTexture) { return _mtlTexture; }
|
||||
|
||||
_mtlTexture = newMTLTexture(); // retained
|
||||
|
||||
propogateDebugName();
|
||||
}
|
||||
return _mtlTexture;
|
||||
}
|
||||
@ -758,6 +762,8 @@ MVKImage::~MVKImage() {
|
||||
#pragma mark -
|
||||
#pragma mark MVKImageView
|
||||
|
||||
void MVKImageView::propogateDebugName() { setLabelIfNotNil(_mtlTexture, _debugName); }
|
||||
|
||||
void MVKImageView::populateMTLRenderPassAttachmentDescriptor(MTLRenderPassAttachmentDescriptor* mtlAttDesc) {
|
||||
mtlAttDesc.texture = getMTLTexture(); // Use image view, necessary if image view format differs from image format
|
||||
mtlAttDesc.level = _useMTLTextureView ? 0 : _subresourceRange.baseMipLevel;
|
||||
@ -795,6 +801,8 @@ id<MTLTexture> MVKImageView::getMTLTexture() {
|
||||
if (_mtlTexture) { return _mtlTexture; }
|
||||
|
||||
_mtlTexture = newMTLTexture(); // retained
|
||||
|
||||
propogateDebugName();
|
||||
}
|
||||
return _mtlTexture;
|
||||
} else {
|
||||
@ -1208,8 +1216,12 @@ void MVKSwapchainImage::presentCAMetalDrawable(id<MTLCommandBuffer> mtlCmdBuff)
|
||||
// and make myself available only once the command buffer has completed.
|
||||
// Otherwise, immediately present the drawable and make myself available.
|
||||
if (mtlCmdBuff) {
|
||||
[mtlCmdBuff presentDrawable: mtlDrawable];
|
||||
resetMetalSurface();
|
||||
NSString* scName = _swapchain->getDebugName();
|
||||
if (scName) { [mtlCmdBuff pushDebugGroup: scName]; }
|
||||
[mtlCmdBuff presentDrawable: mtlDrawable];
|
||||
if (scName) { [mtlCmdBuff popDebugGroup]; }
|
||||
|
||||
resetMetalSurface();
|
||||
if (_device->_pMetalFeatures->events && !_availabilitySignalers.empty()) {
|
||||
// Signal the semaphore device-side.
|
||||
_availabilitySignalers.front().first->encodeSignal(mtlCmdBuff);
|
||||
@ -1239,9 +1251,10 @@ void MVKSwapchainImage::resetMetalSurface() {
|
||||
|
||||
MVKSwapchainImage::MVKSwapchainImage(MVKDevice* device,
|
||||
const VkImageCreateInfo* pCreateInfo,
|
||||
MVKSwapchain* swapchain) : MVKImage(device, pCreateInfo) {
|
||||
MVKSwapchain* swapchain,
|
||||
uint32_t swapchainIndex) : MVKImage(device, pCreateInfo) {
|
||||
_swapchain = swapchain;
|
||||
_swapchainIndex = _swapchain->getImageCount();
|
||||
_swapchainIndex = swapchainIndex;
|
||||
_availability.acquisitionID = _swapchain->getNextAcquisitionID();
|
||||
_availability.isAvailable = true;
|
||||
_preSignaled = make_pair(nullptr, nullptr);
|
||||
|
@ -20,7 +20,7 @@
|
||||
|
||||
#include "MVKEnvironment.h"
|
||||
#include "MVKLayers.h"
|
||||
#include "MVKBaseObject.h"
|
||||
#include "MVKVulkanAPIObject.h"
|
||||
#include "vk_mvk_moltenvk.h"
|
||||
#include <vector>
|
||||
#include <unordered_map>
|
||||
@ -143,6 +143,7 @@ public:
|
||||
protected:
|
||||
friend MVKDevice;
|
||||
|
||||
void propogateDebugName() override {}
|
||||
void initProcAddrs();
|
||||
void initCreationDebugReportCallbacks(const VkInstanceCreateInfo* pCreateInfo);
|
||||
VkDebugReportFlagsEXT getVkDebugReportFlagsFromASLLevel(int aslLvl);
|
||||
@ -187,6 +188,8 @@ public:
|
||||
protected:
|
||||
friend MVKInstance;
|
||||
|
||||
void propogateDebugName() override {}
|
||||
|
||||
MVKInstance* _mvkInstance;
|
||||
VkDebugReportCallbackCreateInfoEXT _info;
|
||||
bool _isCreationCallback;
|
||||
|
@ -476,6 +476,11 @@ void MVKInstance::initProcAddrs() {
|
||||
ADD_DVC_EXT2_ENTRY_POINT(vkGetPhysicalDevicePresentRectanglesKHR, KHR_SWAPCHAIN, KHR_DEVICE_GROUP);
|
||||
ADD_DVC_EXT2_ENTRY_POINT(vkAcquireNextImage2KHR, KHR_SWAPCHAIN, KHR_DEVICE_GROUP);
|
||||
ADD_DVC_EXT_ENTRY_POINT(vkResetQueryPoolEXT, EXT_HOST_QUERY_RESET);
|
||||
ADD_DVC_EXT_ENTRY_POINT(vkDebugMarkerSetObjectTagEXT, EXT_DEBUG_MARKER);
|
||||
ADD_DVC_EXT_ENTRY_POINT(vkDebugMarkerSetObjectNameEXT, EXT_DEBUG_MARKER);
|
||||
ADD_DVC_EXT_ENTRY_POINT(vkCmdDebugMarkerBeginEXT, EXT_DEBUG_MARKER);
|
||||
ADD_DVC_EXT_ENTRY_POINT(vkCmdDebugMarkerEndEXT, EXT_DEBUG_MARKER);
|
||||
ADD_DVC_EXT_ENTRY_POINT(vkCmdDebugMarkerInsertEXT, EXT_DEBUG_MARKER);
|
||||
|
||||
}
|
||||
|
||||
|
@ -91,6 +91,8 @@ public:
|
||||
MVKPipelineLayout(MVKDevice* device, const VkPipelineLayoutCreateInfo* pCreateInfo);
|
||||
|
||||
protected:
|
||||
void propogateDebugName() override {}
|
||||
|
||||
MVKVectorInline<MVKDescriptorSetLayout, 8> _descriptorSetLayouts;
|
||||
MVKVectorInline<MVKShaderResourceBinding, 8> _dslMTLResourceIndexOffsets;
|
||||
MVKVectorInline<VkPushConstantRange, 8> _pushConstants;
|
||||
@ -141,6 +143,8 @@ public:
|
||||
_fullImageViewSwizzle(device->_pMVKConfig->fullImageViewSwizzle) {}
|
||||
|
||||
protected:
|
||||
void propogateDebugName() override {}
|
||||
|
||||
MVKPipelineCache* _pipelineCache;
|
||||
MVKShaderImplicitRezBinding _auxBufferIndex;
|
||||
bool _fullImageViewSwizzle;
|
||||
@ -335,6 +339,7 @@ public:
|
||||
~MVKPipelineCache() override;
|
||||
|
||||
protected:
|
||||
void propogateDebugName() override;
|
||||
MVKShaderLibraryCache* getShaderLibraryCache(MVKShaderModuleKey smKey);
|
||||
void readData(const VkPipelineCacheCreateInfo* pCreateInfo);
|
||||
void writeData(std::ostream& outstream, bool isCounting = false);
|
||||
|
@ -429,6 +429,8 @@ MTLRenderPipelineDescriptor* MVKGraphicsPipeline::getMTLRenderPipelineDescriptor
|
||||
// Output
|
||||
addFragmentOutputToPipeline(plDesc, reflectData, pCreateInfo);
|
||||
|
||||
setLabelIfNotNil(plDesc, ((MVKPipelineLayout*)pCreateInfo->layout)->getDebugName());
|
||||
|
||||
return plDesc;
|
||||
}
|
||||
|
||||
@ -578,6 +580,8 @@ MTLComputePipelineDescriptor* MVKGraphicsPipeline::getMTLTessControlStageDescrip
|
||||
}
|
||||
plDesc.stageInputDescriptor.indexBufferIndex = kMVKTessCtlIndexBufferIndex;
|
||||
|
||||
setLabelIfNotNil(plDesc, ((MVKPipelineLayout*)pCreateInfo->layout)->getDebugName());
|
||||
|
||||
return plDesc;
|
||||
}
|
||||
|
||||
@ -1166,8 +1170,12 @@ MVKComputePipeline::MVKComputePipeline(MVKDevice* device,
|
||||
_mtlPipelineState = nil;
|
||||
|
||||
if (shaderFunc.mtlFunction) {
|
||||
MTLComputePipelineDescriptor* plDesc = [[MTLComputePipelineDescriptor new] autorelease];
|
||||
plDesc.computeFunction = shaderFunc.mtlFunction;
|
||||
setLabelIfNotNil(plDesc, ((MVKPipelineLayout*)pCreateInfo->layout)->getDebugName());
|
||||
|
||||
MVKComputePipelineCompiler* plc = new MVKComputePipelineCompiler(this);
|
||||
_mtlPipelineState = plc->newMTLComputePipelineState(shaderFunc.mtlFunction); // retained
|
||||
_mtlPipelineState = plc->newMTLComputePipelineState(plDesc); // retained
|
||||
plc->destroy();
|
||||
} else {
|
||||
setConfigurationResult(reportError(VK_ERROR_INVALID_SHADER_NV, "Compute shader function could not be compiled into pipeline. See previous logged error."));
|
||||
@ -1209,6 +1217,13 @@ MVKComputePipeline::~MVKComputePipeline() {
|
||||
#pragma mark -
|
||||
#pragma mark MVKPipelineCache
|
||||
|
||||
|
||||
void MVKPipelineCache::propogateDebugName() {
|
||||
lock_guard<mutex> lock(_shaderCacheLock);
|
||||
|
||||
for (auto& slPair : _shaderCache) { slPair.second->propogateDebugName(); }
|
||||
}
|
||||
|
||||
// Return a shader library from the specified shader context sourced from the specified shader module.
|
||||
MVKShaderLibrary* MVKPipelineCache::getShaderLibrary(SPIRVToMSLConverterContext* pContext, MVKShaderModule* shaderModule) {
|
||||
lock_guard<mutex> lock(_shaderCacheLock);
|
||||
|
@ -148,6 +148,7 @@ public:
|
||||
MVKTimestampQueryPool(MVKDevice* device, const VkQueryPoolCreateInfo* pCreateInfo);
|
||||
|
||||
protected:
|
||||
void propogateDebugName() override {}
|
||||
void getResult(uint32_t query, void* pQryData, bool shouldOutput64Bit) override;
|
||||
id<MTLBuffer> getResultBuffer(MVKCommandEncoder* cmdEncoder, uint32_t firstQuery, uint32_t queryCount, NSUInteger& offset) override;
|
||||
void encodeSetResultBuffer(MVKCommandEncoder* cmdEncoder, uint32_t firstQuery, uint32_t queryCount, uint32_t index) override;
|
||||
@ -183,6 +184,7 @@ public:
|
||||
~MVKOcclusionQueryPool() override;
|
||||
|
||||
protected:
|
||||
void propogateDebugName() override;
|
||||
void getResult(uint32_t query, void* pQryData, bool shouldOutput64Bit) override;
|
||||
id<MTLBuffer> getResultBuffer(MVKCommandEncoder* cmdEncoder, uint32_t firstQuery, uint32_t queryCount, NSUInteger& offset) override;
|
||||
void encodeSetResultBuffer(MVKCommandEncoder* cmdEncoder, uint32_t firstQuery, uint32_t queryCount, uint32_t index) override;
|
||||
@ -201,6 +203,8 @@ class MVKPipelineStatisticsQueryPool : public MVKQueryPool {
|
||||
public:
|
||||
MVKPipelineStatisticsQueryPool(MVKDevice* device, const VkQueryPoolCreateInfo* pCreateInfo);
|
||||
|
||||
protected:
|
||||
void propogateDebugName() override {}
|
||||
};
|
||||
|
||||
|
||||
@ -213,5 +217,7 @@ class MVKUnsupportedQueryPool : public MVKQueryPool {
|
||||
public:
|
||||
MVKUnsupportedQueryPool(MVKDevice* device, const VkQueryPoolCreateInfo* pCreateInfo);
|
||||
|
||||
protected:
|
||||
void propogateDebugName() override {}
|
||||
};
|
||||
|
||||
|
@ -222,6 +222,8 @@ MVKTimestampQueryPool::MVKTimestampQueryPool(MVKDevice* device,
|
||||
#pragma mark -
|
||||
#pragma mark MVKOcclusionQueryPool
|
||||
|
||||
void MVKOcclusionQueryPool::propogateDebugName() { setLabelIfNotNil(_visibilityResultMTLBuffer, _debugName); }
|
||||
|
||||
// If a dedicated visibility buffer has been established, use it, otherwise fetch the
|
||||
// current global visibility buffer, but don't cache it because it could be replaced later.
|
||||
id<MTLBuffer> MVKOcclusionQueryPool::getVisibilityResultMTLBuffer() {
|
||||
|
@ -87,14 +87,13 @@ public:
|
||||
#pragma mark Queue submissions
|
||||
|
||||
/** Submits the specified command buffers to the queue. */
|
||||
VkResult submit(uint32_t submitCount, const VkSubmitInfo* pSubmits,
|
||||
VkFence fence, MVKCommandUse cmdBuffUse);
|
||||
VkResult submit(uint32_t submitCount, const VkSubmitInfo* pSubmits, VkFence fence);
|
||||
|
||||
/** Submits the specified presentation command to the queue. */
|
||||
VkResult submit(const VkPresentInfoKHR* pPresentInfo);
|
||||
|
||||
/** Block the current thread until this queue is idle. */
|
||||
VkResult waitIdle(MVKCommandUse cmdBuffUse);
|
||||
VkResult waitIdle();
|
||||
|
||||
/** Return the name of this queue. */
|
||||
inline const std::string& getName() { return _name; }
|
||||
@ -132,6 +131,7 @@ protected:
|
||||
friend class MVKQueuePresentSurfaceSubmission;
|
||||
|
||||
MVKBaseObject* getBaseObject() override { return this; };
|
||||
void propogateDebugName() override;
|
||||
void initName();
|
||||
void initExecQueue();
|
||||
void initMTLCommandQueue();
|
||||
@ -196,8 +196,7 @@ public:
|
||||
/** Constructs an instance for the queue. */
|
||||
MVKQueueCommandBufferSubmission(MVKQueue* queue,
|
||||
const VkSubmitInfo* pSubmit,
|
||||
VkFence fence,
|
||||
MVKCommandUse cmdBuffUse);
|
||||
VkFence fence);
|
||||
|
||||
protected:
|
||||
friend MVKCommandBuffer;
|
||||
@ -210,7 +209,6 @@ protected:
|
||||
MVKVectorInline<MVKCommandBuffer*, 16> _cmdBuffers;
|
||||
MVKVectorInline<MVKSemaphore*, 16> _signalSemaphores;
|
||||
MVKFence* _fence;
|
||||
MVKCommandUse _cmdBuffUse;
|
||||
id<MTLCommandBuffer> _activeMTLCommandBuffer;
|
||||
bool _isSignalingSemaphores;
|
||||
};
|
||||
@ -229,6 +227,8 @@ public:
|
||||
const VkPresentInfoKHR* pPresentInfo);
|
||||
|
||||
protected:
|
||||
id<MTLCommandBuffer> getMTLCommandBuffer();
|
||||
|
||||
MVKVectorInline<MVKSwapchainImage*, 4> _surfaceImages;
|
||||
};
|
||||
|
||||
|
@ -60,6 +60,8 @@ MVKQueueFamily::~MVKQueueFamily() {
|
||||
#pragma mark -
|
||||
#pragma mark MVKQueue
|
||||
|
||||
void MVKQueue::propogateDebugName() { setLabelIfNotNil(_mtlQueue, _debugName); }
|
||||
|
||||
|
||||
#pragma mark Queue submissions
|
||||
|
||||
@ -83,18 +85,17 @@ VkResult MVKQueue::submit(MVKQueueSubmission* qSubmit) {
|
||||
return rslt;
|
||||
}
|
||||
|
||||
VkResult MVKQueue::submit(uint32_t submitCount, const VkSubmitInfo* pSubmits,
|
||||
VkFence fence, MVKCommandUse cmdBuffUse) {
|
||||
VkResult MVKQueue::submit(uint32_t submitCount, const VkSubmitInfo* pSubmits, VkFence fence) {
|
||||
|
||||
// Fence-only submission
|
||||
if (submitCount == 0 && fence) {
|
||||
return submit(new MVKQueueCommandBufferSubmission(this, nullptr, fence, cmdBuffUse));
|
||||
return submit(new MVKQueueCommandBufferSubmission(this, nullptr, fence));
|
||||
}
|
||||
|
||||
VkResult rslt = VK_SUCCESS;
|
||||
for (uint32_t sIdx = 0; sIdx < submitCount; sIdx++) {
|
||||
VkFence fenceOrNil = (sIdx == (submitCount - 1)) ? fence : VK_NULL_HANDLE; // last one gets the fence
|
||||
VkResult subRslt = submit(new MVKQueueCommandBufferSubmission(this, &pSubmits[sIdx], fenceOrNil, cmdBuffUse));
|
||||
VkResult subRslt = submit(new MVKQueueCommandBufferSubmission(this, &pSubmits[sIdx], fenceOrNil));
|
||||
if (rslt == VK_SUCCESS) { rslt = subRslt; }
|
||||
}
|
||||
return rslt;
|
||||
@ -105,7 +106,7 @@ VkResult MVKQueue::submit(const VkPresentInfoKHR* pPresentInfo) {
|
||||
}
|
||||
|
||||
// Create an empty submit struct and fence, submit to queue and wait on fence.
|
||||
VkResult MVKQueue::waitIdle(MVKCommandUse cmdBuffUse) {
|
||||
VkResult MVKQueue::waitIdle() {
|
||||
|
||||
VkFenceCreateInfo vkFenceInfo = {
|
||||
.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO,
|
||||
@ -115,7 +116,7 @@ VkResult MVKQueue::waitIdle(MVKCommandUse cmdBuffUse) {
|
||||
|
||||
MVKFence mvkFence(_device, &vkFenceInfo);
|
||||
VkFence fence = (VkFence)&mvkFence;
|
||||
submit(0, nullptr, fence, cmdBuffUse);
|
||||
submit(0, nullptr, fence);
|
||||
return mvkWaitForFences(_device, 1, &fence, false);
|
||||
}
|
||||
|
||||
@ -265,7 +266,6 @@ void MVKQueueCommandBufferSubmission::setActiveMTLCommandBuffer(id<MTLCommandBuf
|
||||
if (_activeMTLCommandBuffer) { commitActiveMTLCommandBuffer(); }
|
||||
|
||||
_activeMTLCommandBuffer = mtlCmdBuff; // not retained
|
||||
_activeMTLCommandBuffer.label = mvkMTLCommandBufferLabel(_cmdBuffUse);
|
||||
[_activeMTLCommandBuffer enqueue];
|
||||
}
|
||||
|
||||
@ -313,8 +313,7 @@ void MVKQueueCommandBufferSubmission::finish() {
|
||||
|
||||
MVKQueueCommandBufferSubmission::MVKQueueCommandBufferSubmission(MVKQueue* queue,
|
||||
const VkSubmitInfo* pSubmit,
|
||||
VkFence fence,
|
||||
MVKCommandUse cmdBuffUse)
|
||||
VkFence fence)
|
||||
: MVKQueueSubmission(queue,
|
||||
(pSubmit ? pSubmit->waitSemaphoreCount : 0),
|
||||
(pSubmit ? pSubmit->pWaitSemaphores : nullptr)) {
|
||||
@ -338,7 +337,6 @@ MVKQueueCommandBufferSubmission::MVKQueueCommandBufferSubmission(MVKQueue* queue
|
||||
}
|
||||
|
||||
_fence = (MVKFence*)fence;
|
||||
_cmdBuffUse= cmdBuffUse;
|
||||
_activeMTLCommandBuffer = nil;
|
||||
|
||||
// static std::atomic<uint32_t> _subCount;
|
||||
@ -350,18 +348,13 @@ MVKQueueCommandBufferSubmission::MVKQueueCommandBufferSubmission(MVKQueue* queue
|
||||
#pragma mark MVKQueuePresentSurfaceSubmission
|
||||
|
||||
void MVKQueuePresentSurfaceSubmission::execute() {
|
||||
id<MTLCommandQueue> mtlQ = _queue->getMTLCommandQueue();
|
||||
|
||||
// If there are semaphores and this device supports MTLEvent, we must present
|
||||
// with a command buffer in order to synchronize with the semaphores.
|
||||
MVKDevice* mvkDev = _queue->getDevice();
|
||||
if (mvkDev->_pMetalFeatures->events && !_waitSemaphores.empty()) {
|
||||
// Create a command buffer, have it wait for the semaphores, then present
|
||||
// surfaces via the command buffer.
|
||||
id<MTLCommandBuffer> mtlCmdBuff = [mtlQ commandBufferWithUnretainedReferences];
|
||||
mtlCmdBuff.label = mvkMTLCommandBufferLabel(kMVKCommandUseQueuePresent);
|
||||
[mtlCmdBuff enqueue];
|
||||
|
||||
id<MTLCommandBuffer> mtlCmdBuff = getMTLCommandBuffer();
|
||||
for (auto& ws : _waitSemaphores) { ws->encodeWait(mtlCmdBuff); }
|
||||
for (auto& si : _surfaceImages) { si->presentCAMetalDrawable(mtlCmdBuff); }
|
||||
|
||||
@ -369,10 +362,7 @@ void MVKQueuePresentSurfaceSubmission::execute() {
|
||||
} else if (mvkDev->_pMVKConfig->presentWithCommandBuffer || mvkDev->_pMVKConfig->displayWatermark) {
|
||||
// Create a command buffer, present surfaces via the command buffer,
|
||||
// then wait on the semaphores before committing.
|
||||
id<MTLCommandBuffer> mtlCmdBuff = [mtlQ commandBufferWithUnretainedReferences];
|
||||
mtlCmdBuff.label = mvkMTLCommandBufferLabel(kMVKCommandUseQueuePresent);
|
||||
[mtlCmdBuff enqueue];
|
||||
|
||||
id<MTLCommandBuffer> mtlCmdBuff = getMTLCommandBuffer();
|
||||
for (auto& si : _surfaceImages) { si->presentCAMetalDrawable(mtlCmdBuff); }
|
||||
for (auto& ws : _waitSemaphores) { ws->wait(); }
|
||||
|
||||
@ -391,6 +381,13 @@ void MVKQueuePresentSurfaceSubmission::execute() {
|
||||
this->destroy();
|
||||
}
|
||||
|
||||
id<MTLCommandBuffer> MVKQueuePresentSurfaceSubmission::getMTLCommandBuffer() {
|
||||
id<MTLCommandBuffer> mtlCmdBuff = [_queue->getMTLCommandQueue() commandBufferWithUnretainedReferences];
|
||||
setLabelIfNotNil(mtlCmdBuff, @"vkQueuePresentKHR CommandBuffer");
|
||||
[mtlCmdBuff enqueue];
|
||||
return mtlCmdBuff;
|
||||
}
|
||||
|
||||
MVKQueuePresentSurfaceSubmission::MVKQueuePresentSurfaceSubmission(MVKQueue* queue,
|
||||
const VkPresentInfoKHR* pPresentInfo)
|
||||
: MVKQueueSubmission(queue, pPresentInfo->waitSemaphoreCount, pPresentInfo->pWaitSemaphores) {
|
||||
|
@ -160,10 +160,11 @@ public:
|
||||
MVKRenderPass(MVKDevice* device, const VkRenderPassCreateInfo* pCreateInfo);
|
||||
|
||||
protected:
|
||||
|
||||
friend class MVKRenderSubpass;
|
||||
friend class MVKRenderPassAttachment;
|
||||
|
||||
void propogateDebugName() override {}
|
||||
|
||||
std::vector<MVKRenderSubpass> _subpasses;
|
||||
std::vector<MVKRenderPassAttachment> _attachments;
|
||||
std::vector<VkSubpassDependency> _subpassDependencies;
|
||||
|
@ -29,6 +29,8 @@
|
||||
|
||||
class MVKPipelineCache;
|
||||
class MVKShaderCacheIterator;
|
||||
class MVKShaderLibraryCache;
|
||||
class MVKShaderModule;
|
||||
|
||||
using namespace mvk;
|
||||
|
||||
@ -73,7 +75,10 @@ public:
|
||||
|
||||
protected:
|
||||
friend MVKShaderCacheIterator;
|
||||
friend MVKShaderLibraryCache;
|
||||
friend MVKShaderModule;
|
||||
|
||||
void propogateDebugName();
|
||||
void handleCompilationError(NSError* err, const char* opDesc);
|
||||
MTLFunctionConstant* getFunctionConstant(NSArray<MTLFunctionConstant*>* mtlFCs, NSUInteger mtlFCID);
|
||||
|
||||
@ -113,7 +118,9 @@ public:
|
||||
protected:
|
||||
friend MVKShaderCacheIterator;
|
||||
friend MVKPipelineCache;
|
||||
friend MVKShaderModule;
|
||||
|
||||
void propogateDebugName();
|
||||
MVKShaderLibrary* findShaderLibrary(SPIRVToMSLConverterContext* pContext);
|
||||
MVKShaderLibrary* addShaderLibrary(SPIRVToMSLConverterContext* pContext,
|
||||
const std::string& mslSourceCode,
|
||||
@ -121,7 +128,6 @@ protected:
|
||||
void merge(MVKShaderLibraryCache* other);
|
||||
|
||||
MVKVulkanAPIDeviceObject* _owner;
|
||||
std::mutex _accessLock;
|
||||
std::vector<std::pair<SPIRVToMSLConverterContext, MVKShaderLibrary*>> _shaderLibraries;
|
||||
};
|
||||
|
||||
@ -192,6 +198,7 @@ public:
|
||||
protected:
|
||||
friend MVKShaderCacheIterator;
|
||||
|
||||
void propogateDebugName() override;
|
||||
MVKGLSLConversionShaderStage getMVKGLSLConversionShaderStage(SPIRVToMSLConverterContext* pContext);
|
||||
|
||||
MVKShaderLibraryCache _shaderLibraryCache;
|
||||
|
@ -31,6 +31,8 @@ const MVKMTLFunction MVKMTLFunctionNull = { nil, MTLSizeMake(1, 1, 1) };
|
||||
#pragma mark -
|
||||
#pragma mark MVKShaderLibrary
|
||||
|
||||
void MVKShaderLibrary::propogateDebugName() { setLabelIfNotNil(_mtlLibrary, _owner->getDebugName()); }
|
||||
|
||||
// If the size of the workgroup dimension is specialized, extract it from the
|
||||
// specialization info, otherwise use the value specified in the SPIR-V shader code.
|
||||
static uint32_t getWorkgroupDimensionSize(const SPIRVWorkgroupSizeDimension& wgDim, const VkSpecializationInfo* pSpecInfo) {
|
||||
@ -50,11 +52,7 @@ MVKMTLFunction MVKShaderLibrary::getMTLFunction(const VkSpecializationInfo* pSpe
|
||||
|
||||
if ( !_mtlLibrary ) { return MVKMTLFunctionNull; }
|
||||
|
||||
// Ensure the function name is compatible with Metal (Metal does not allow main()
|
||||
// as a function name), and retrieve the unspecialized Metal function with that name.
|
||||
NSString* mtlFuncName = @(_entryPoint.mtlFunctionName.c_str());
|
||||
|
||||
|
||||
MVKDevice* mvkDev = _owner->getDevice();
|
||||
uint64_t startTime = mvkDev->getPerformanceTimestamp();
|
||||
id<MTLFunction> mtlFunc = [[_mtlLibrary newFunctionWithName: mtlFuncName] autorelease];
|
||||
@ -91,6 +89,7 @@ MVKMTLFunction MVKShaderLibrary::getMTLFunction(const VkSpecializationInfo* pSpe
|
||||
fs->destroy();
|
||||
}
|
||||
}
|
||||
setLabelIfNotNil(mtlFunc, _owner->getDebugName());
|
||||
} else {
|
||||
reportError(VK_ERROR_INVALID_SHADER_NV, "Shader module does not contain an entry point named '%s'.", mtlFuncName.UTF8String);
|
||||
}
|
||||
@ -112,6 +111,7 @@ MVKShaderLibrary::MVKShaderLibrary(MVKVulkanAPIDeviceObject* owner, const string
|
||||
MVKShaderLibraryCompiler* slc = new MVKShaderLibraryCompiler(_owner);
|
||||
_mtlLibrary = slc->newMTLLibrary(@(mslSourceCode.c_str())); // retained
|
||||
slc->destroy();
|
||||
propogateDebugName();
|
||||
|
||||
_entryPoint = entryPoint;
|
||||
_msl = mslSourceCode;
|
||||
@ -132,6 +132,7 @@ MVKShaderLibrary::MVKShaderLibrary(MVKVulkanAPIDeviceObject* owner,
|
||||
handleCompilationError(err, "Compiled shader module creation");
|
||||
[shdrData release];
|
||||
}
|
||||
propogateDebugName();
|
||||
mvkDev->addActivityPerformance(mvkDev->_performanceStatistics.shaderCompilation.mslLoad, startTime);
|
||||
}
|
||||
|
||||
@ -165,6 +166,10 @@ MVKShaderLibrary::~MVKShaderLibrary() {
|
||||
#pragma mark -
|
||||
#pragma mark MVKShaderLibraryCache
|
||||
|
||||
void MVKShaderLibraryCache::propogateDebugName() {
|
||||
for (auto& slPair : _shaderLibraries) { slPair.second->propogateDebugName(); }
|
||||
}
|
||||
|
||||
MVKShaderLibrary* MVKShaderLibraryCache::getShaderLibrary(SPIRVToMSLConverterContext* pContext,
|
||||
MVKShaderModule* shaderModule,
|
||||
bool* pWasAdded) {
|
||||
@ -221,6 +226,13 @@ MVKShaderLibraryCache::~MVKShaderLibraryCache() {
|
||||
#pragma mark -
|
||||
#pragma mark MVKShaderModule
|
||||
|
||||
void MVKShaderModule::propogateDebugName() {
|
||||
lock_guard<mutex> lock(_accessLock);
|
||||
|
||||
_shaderLibraryCache.propogateDebugName();
|
||||
if (_defaultLibrary) { _defaultLibrary->propogateDebugName(); }
|
||||
}
|
||||
|
||||
MVKMTLFunction MVKShaderModule::getMTLFunction(SPIRVToMSLConverterContext* pContext,
|
||||
const VkSpecializationInfo* pSpecializationInfo,
|
||||
MVKPipelineCache* pipelineCache) {
|
||||
|
@ -18,7 +18,7 @@
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "MVKBaseObject.h"
|
||||
#include "MVKVulkanAPIObject.h"
|
||||
#include "MVKEnvironment.h"
|
||||
#include <mutex>
|
||||
|
||||
@ -69,6 +69,8 @@ public:
|
||||
~MVKSurface() override;
|
||||
|
||||
protected:
|
||||
void propogateDebugName() override {}
|
||||
|
||||
MVKInstance* _mvkInstance;
|
||||
CAMetalLayer* _mtlCAMetalLayer;
|
||||
std::mutex _lock;
|
||||
|
@ -96,6 +96,7 @@ public:
|
||||
protected:
|
||||
friend class MVKSwapchainImage;
|
||||
|
||||
void propogateDebugName() override;
|
||||
void initCAMetalLayer(const VkSwapchainCreateInfoKHR* pCreateInfo, uint32_t imgCnt);
|
||||
void initSurfaceImages(const VkSwapchainCreateInfoKHR* pCreateInfo, uint32_t imgCnt);
|
||||
void initFrameIntervalTracking();
|
||||
|
@ -34,6 +34,13 @@ using namespace std;
|
||||
|
||||
#pragma mark MVKSwapchain
|
||||
|
||||
void MVKSwapchain::propogateDebugName() {
|
||||
size_t imgCnt = _surfaceImages.size();
|
||||
for (size_t imgIdx = 0; imgIdx < imgCnt; imgIdx++) {
|
||||
_surfaceImages[imgIdx]->setDebugName([NSString stringWithFormat: @"%@(%lu)", _debugName, imgIdx].UTF8String);
|
||||
}
|
||||
}
|
||||
|
||||
uint32_t MVKSwapchain::getImageCount() { return (uint32_t)_surfaceImages.size(); }
|
||||
|
||||
MVKSwapchainImage* MVKSwapchain::getImage(uint32_t index) { return _surfaceImages[index]; }
|
||||
@ -265,7 +272,7 @@ void MVKSwapchain::initSurfaceImages(const VkSwapchainCreateInfoKHR* pCreateInfo
|
||||
|
||||
_surfaceImages.reserve(imgCnt);
|
||||
for (uint32_t imgIdx = 0; imgIdx < imgCnt; imgIdx++) {
|
||||
_surfaceImages.push_back(_device->createSwapchainImage(&imgInfo, this, NULL));
|
||||
_surfaceImages.push_back(_device->createSwapchainImage(&imgInfo, this, imgIdx, NULL));
|
||||
}
|
||||
|
||||
MVKLogInfo("Created %d swapchain images with initial size (%d, %d).", imgCnt, imgExtent.width, imgExtent.height);
|
||||
|
@ -142,6 +142,8 @@ public:
|
||||
~MVKSemaphore() override;
|
||||
|
||||
protected:
|
||||
void propogateDebugName() override {}
|
||||
|
||||
MVKSemaphoreImpl _blocker;
|
||||
id<MTLEvent> _mtlEvent;
|
||||
std::atomic<uint64_t> _mtlEventValue;
|
||||
@ -192,6 +194,7 @@ public:
|
||||
MVKVulkanAPIDeviceObject(device), _isSignaled(mvkAreFlagsEnabled(pCreateInfo->flags, VK_FENCE_CREATE_SIGNALED_BIT)) {}
|
||||
|
||||
protected:
|
||||
void propogateDebugName() override {}
|
||||
void notifySitters();
|
||||
|
||||
std::mutex _lock;
|
||||
|
153
MoltenVK/MoltenVK/GPUObjects/MVKVulkanAPIObject.h
Normal file
153
MoltenVK/MoltenVK/GPUObjects/MVKVulkanAPIObject.h
Normal file
@ -0,0 +1,153 @@
|
||||
/*
|
||||
* MVKVulkanAPIObject.h
|
||||
*
|
||||
* Copyright (c) 2014-2019 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
|
||||
|
||||
#include "MVKBaseObject.h"
|
||||
#include <vulkan/vk_icd.h>
|
||||
#include <string>
|
||||
#include <mutex>
|
||||
|
||||
#import <Foundation/NSString.h>
|
||||
|
||||
class MVKInstance;
|
||||
|
||||
|
||||
#pragma mark -
|
||||
#pragma mark MVKVulkanAPIObject
|
||||
|
||||
/**
|
||||
* Abstract class that represents an opaque Vulkan API handle object.
|
||||
*
|
||||
* API objects can sometimes be destroyed by the client before the GPU is done with them.
|
||||
* To support this, an object of this type will automatically be deleted iff it has been
|
||||
* destroyed by the client, and all references have been released. An object of this type
|
||||
* is therefore allowed to live past its destruction by the client, until it is no longer
|
||||
* referenced by other objects.
|
||||
*/
|
||||
class MVKVulkanAPIObject : public MVKConfigurableObject {
|
||||
|
||||
public:
|
||||
|
||||
/** Returns the Vulkan API opaque object controlling this object. */
|
||||
MVKVulkanAPIObject* getVulkanAPIObject() override { return this; };
|
||||
|
||||
/** Returns a reference to this object suitable for use as a Vulkan API handle. */
|
||||
virtual void* getVkHandle() { return this; }
|
||||
|
||||
/** Returns the debug report object type of this object. */
|
||||
virtual VkDebugReportObjectTypeEXT getVkDebugReportObjectType() = 0;
|
||||
|
||||
/** Returns the Vulkan instance. */
|
||||
virtual MVKInstance* getInstance() = 0;
|
||||
|
||||
/**
|
||||
* Called when this instance has been retained as a reference by another object,
|
||||
* indicating that this instance will not be deleted until that reference is released.
|
||||
*/
|
||||
void retain();
|
||||
|
||||
/**
|
||||
* Called when this instance has been released as a reference from another object.
|
||||
* Once all references have been released, this object is free to be deleted.
|
||||
* If the destroy() function has already been called on this instance by the time
|
||||
* this function is called, this instance will be deleted.
|
||||
*/
|
||||
void release();
|
||||
|
||||
/**
|
||||
* Marks this instance as destroyed. If all previous references to this instance
|
||||
* have been released, this instance will be deleted, otherwise deletion of this
|
||||
* instance will automatically be deferred until all references have been released.
|
||||
*/
|
||||
void destroy() override;
|
||||
|
||||
/** Gets the debug object name of this instance. */
|
||||
inline NSString* getDebugName() { return _debugName; }
|
||||
|
||||
/** Sets the debug object name of this instance. */
|
||||
VkResult setDebugName(const char* pObjectName);
|
||||
|
||||
/** Returns the MVKVulkanAPIObject instance referenced by the object of the given type. */
|
||||
static MVKVulkanAPIObject* getMVKVulkanAPIObject(VkDebugReportObjectTypeEXT objType, uint64_t object);
|
||||
|
||||
/** Construct an empty instance. Declared here to support copy constructor. */
|
||||
MVKVulkanAPIObject() {}
|
||||
|
||||
/**
|
||||
* Construct an instance from a copy. Default copy constructor disallowed due to mutex.
|
||||
* Copies start with fresh reference counts.
|
||||
*/
|
||||
MVKVulkanAPIObject(const MVKVulkanAPIObject& other) {}
|
||||
|
||||
~MVKVulkanAPIObject() override;
|
||||
|
||||
protected:
|
||||
bool decrementRetainCount();
|
||||
bool markDestroyed();
|
||||
virtual void propogateDebugName() = 0;
|
||||
|
||||
NSString* _debugName = nil;
|
||||
std::mutex _refLock;
|
||||
unsigned _refCount = 0;
|
||||
bool _isDestroyed = false;
|
||||
};
|
||||
|
||||
|
||||
#pragma mark -
|
||||
#pragma mark MVKDispatchableVulkanAPIObject
|
||||
|
||||
/** Abstract class that represents a dispatchable opaque Vulkan API handle object. */
|
||||
class MVKDispatchableVulkanAPIObject : public MVKVulkanAPIObject {
|
||||
|
||||
typedef struct {
|
||||
VK_LOADER_DATA loaderData;
|
||||
MVKDispatchableVulkanAPIObject* mvkObject;
|
||||
} MVKDispatchableObjectICDRef;
|
||||
|
||||
public:
|
||||
|
||||
/**
|
||||
* Returns a reference to this object suitable for use as a Vulkan API handle.
|
||||
* This is the compliment of the getDispatchableObject() method.
|
||||
*/
|
||||
void* getVkHandle() override { return &_icdRef; }
|
||||
|
||||
/**
|
||||
* Retrieves the MVKDispatchableVulkanAPIObject instance referenced by the dispatchable Vulkan handle.
|
||||
* This is the compliment of the getVkHandle() method.
|
||||
*/
|
||||
static inline MVKDispatchableVulkanAPIObject* getDispatchableObject(void* vkHandle) {
|
||||
return vkHandle ? ((MVKDispatchableObjectICDRef*)vkHandle)->mvkObject : nullptr;
|
||||
}
|
||||
|
||||
protected:
|
||||
MVKDispatchableObjectICDRef _icdRef = { ICD_LOADER_MAGIC, this };
|
||||
|
||||
};
|
||||
|
||||
#pragma mark -
|
||||
#pragma mark Support functions
|
||||
|
||||
#pragma clang diagnostic push
|
||||
#pragma clang diagnostic ignored "-Wobjc-method-access"
|
||||
/** Generically avoids setting a label to nil, which many objects don't like. */
|
||||
static inline void setLabelIfNotNil(id object, NSString* label) { if (label) { [object setLabel: label]; } }
|
||||
#pragma clang diagnostic pop
|
||||
|
||||
|
80
MoltenVK/MoltenVK/GPUObjects/MVKVulkanAPIObject.mm
Normal file
80
MoltenVK/MoltenVK/GPUObjects/MVKVulkanAPIObject.mm
Normal file
@ -0,0 +1,80 @@
|
||||
/*
|
||||
* MVKVulkanAPIObject.mm
|
||||
*
|
||||
* Copyright (c) 2014-2019 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 "MVKVulkanAPIObject.h"
|
||||
|
||||
using namespace std;
|
||||
|
||||
|
||||
#pragma mark -
|
||||
#pragma mark MVKVulkanAPIObject
|
||||
|
||||
void MVKVulkanAPIObject::retain() {
|
||||
lock_guard<mutex> lock(_refLock);
|
||||
|
||||
_refCount++;
|
||||
}
|
||||
|
||||
void MVKVulkanAPIObject::release() {
|
||||
if (decrementRetainCount()) { destroy(); }
|
||||
}
|
||||
|
||||
void MVKVulkanAPIObject::destroy() {
|
||||
if (markDestroyed()) { MVKConfigurableObject::destroy(); }
|
||||
}
|
||||
|
||||
// Decrements the reference count, and returns whether it's time to destroy this object.
|
||||
bool MVKVulkanAPIObject::decrementRetainCount() {
|
||||
lock_guard<mutex> lock(_refLock);
|
||||
|
||||
if (_refCount > 0) { _refCount--; }
|
||||
return (_isDestroyed && _refCount == 0);
|
||||
}
|
||||
|
||||
// Marks this object as destroyed, and returns whether no references are left outstanding.
|
||||
bool MVKVulkanAPIObject::markDestroyed() {
|
||||
lock_guard<mutex> lock(_refLock);
|
||||
|
||||
_isDestroyed = true;
|
||||
return _refCount == 0;
|
||||
}
|
||||
|
||||
VkResult MVKVulkanAPIObject::setDebugName(const char* pObjectName) {
|
||||
[_debugName release];
|
||||
_debugName = [[NSString stringWithUTF8String: pObjectName] retain]; // retained
|
||||
propogateDebugName();
|
||||
return VK_SUCCESS;
|
||||
}
|
||||
|
||||
MVKVulkanAPIObject* MVKVulkanAPIObject::getMVKVulkanAPIObject(VkDebugReportObjectTypeEXT objType, uint64_t object) {
|
||||
void* pVkObj = (void*)object;
|
||||
switch (objType) {
|
||||
case VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT:
|
||||
case VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT:
|
||||
case VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT:
|
||||
case VK_DEBUG_REPORT_OBJECT_TYPE_QUEUE_EXT:
|
||||
case VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT:
|
||||
return MVKDispatchableVulkanAPIObject::getDispatchableObject(pVkObj);
|
||||
default:
|
||||
return (MVKVulkanAPIObject*)pVkObj;
|
||||
}
|
||||
}
|
||||
|
||||
MVKVulkanAPIObject::~MVKVulkanAPIObject() {
|
||||
[_debugName release];
|
||||
}
|
@ -52,6 +52,7 @@ MVK_EXTENSION(KHR_surface, KHR_SURFACE)
|
||||
MVK_EXTENSION(KHR_swapchain, KHR_SWAPCHAIN)
|
||||
MVK_EXTENSION(KHR_swapchain_mutable_format, KHR_SWAPCHAIN_MUTABLE_FORMAT)
|
||||
MVK_EXTENSION(KHR_variable_pointers, KHR_VARIABLE_POINTERS)
|
||||
MVK_EXTENSION(EXT_debug_marker, EXT_DEBUG_MARKER)
|
||||
MVK_EXTENSION(EXT_debug_report, EXT_DEBUG_REPORT)
|
||||
MVK_EXTENSION(EXT_host_query_reset, EXT_HOST_QUERY_RESET)
|
||||
MVK_EXTENSION(EXT_memory_budget, EXT_MEMORY_BUDGET)
|
||||
|
@ -48,7 +48,7 @@ class MVKExtensionList : public MVKBaseObject {
|
||||
public:
|
||||
|
||||
/** Returns the Vulkan API opaque object controlling this object. */
|
||||
MVKVulkanAPIObject* getVulkanAPIObject() override { return _apiObject->getVulkanAPIObject(); };
|
||||
MVKVulkanAPIObject* getVulkanAPIObject() override { return _apiObject; };
|
||||
|
||||
union {
|
||||
struct {
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* MVKExtensions.cpp
|
||||
* MVKExtensions.mm
|
||||
*
|
||||
* Copyright (c) 2014-2019 The Brenwill Workshop Ltd. (http://www.brenwill.com)
|
||||
*
|
@ -19,11 +19,8 @@
|
||||
#pragma once
|
||||
|
||||
#include "mvk_vulkan.h"
|
||||
#include <vulkan/vk_icd.h>
|
||||
#include <string>
|
||||
#include <mutex>
|
||||
|
||||
class MVKInstance;
|
||||
class MVKVulkanAPIObject;
|
||||
|
||||
|
||||
@ -126,105 +123,3 @@ public:
|
||||
protected:
|
||||
VkResult _configurationResult = VK_SUCCESS;
|
||||
};
|
||||
|
||||
|
||||
#pragma mark -
|
||||
#pragma mark MVKVulkanAPIObject
|
||||
|
||||
/**
|
||||
* Abstract class that represents an opaque Vulkan API handle object.
|
||||
*
|
||||
* API objects can sometimes be destroyed by the client before the GPU is done with them.
|
||||
* To support this, an object of this type will automatically be deleted iff it has been
|
||||
* destroyed by the client, and all references have been released. An object of this type
|
||||
* is therefore allowed to live past its destruction by the client, until it is no longer
|
||||
* referenced by other objects.
|
||||
*/
|
||||
class MVKVulkanAPIObject : public MVKConfigurableObject {
|
||||
|
||||
public:
|
||||
|
||||
/** Returns the Vulkan API opaque object controlling this object. */
|
||||
MVKVulkanAPIObject* getVulkanAPIObject() override { return this; };
|
||||
|
||||
/** Returns a reference to this object suitable for use as a Vulkan API handle. */
|
||||
virtual void* getVkHandle() { return this; }
|
||||
|
||||
/** Returns the debug report object type of this object. */
|
||||
virtual VkDebugReportObjectTypeEXT getVkDebugReportObjectType() = 0;
|
||||
|
||||
/** Returns the Vulkan instance. */
|
||||
virtual MVKInstance* getInstance() = 0;
|
||||
|
||||
/**
|
||||
* Called when this instance has been retained as a reference by another object,
|
||||
* indicating that this instance will not be deleted until that reference is released.
|
||||
*/
|
||||
void retain();
|
||||
|
||||
/**
|
||||
* Called when this instance has been released as a reference from another object.
|
||||
* Once all references have been released, this object is free to be deleted.
|
||||
* If the destroy() function has already been called on this instance by the time
|
||||
* this function is called, this instance will be deleted.
|
||||
*/
|
||||
void release();
|
||||
|
||||
/**
|
||||
* Marks this instance as destroyed. If all previous references to this instance
|
||||
* have been released, this instance will be deleted, otherwise deletion of this
|
||||
* instance will automatically be deferred until all references have been released.
|
||||
*/
|
||||
void destroy() override;
|
||||
|
||||
/** Construct an empty instance. Declared here to support copy constructor. */
|
||||
MVKVulkanAPIObject() {}
|
||||
|
||||
/**
|
||||
* Construct an instance from a copy. Default copy constructor disallowed due to mutex.
|
||||
* Copies start with fresh reference counts.
|
||||
*/
|
||||
MVKVulkanAPIObject(const MVKVulkanAPIObject& other) {}
|
||||
|
||||
protected:
|
||||
|
||||
bool decrementRetainCount();
|
||||
bool markDestroyed();
|
||||
|
||||
std::mutex _refLock;
|
||||
unsigned _refCount = 0;
|
||||
bool _isDestroyed = false;
|
||||
};
|
||||
|
||||
|
||||
#pragma mark -
|
||||
#pragma mark MVKDispatchableVulkanAPIObject
|
||||
|
||||
/** Abstract class that represents a dispatchable opaque Vulkan API handle object. */
|
||||
class MVKDispatchableVulkanAPIObject : public MVKVulkanAPIObject {
|
||||
|
||||
typedef struct {
|
||||
VK_LOADER_DATA loaderData;
|
||||
MVKDispatchableVulkanAPIObject* mvkObject;
|
||||
} MVKDispatchableObjectICDRef;
|
||||
|
||||
public:
|
||||
|
||||
/**
|
||||
* Returns a reference to this object suitable for use as a Vulkan API handle.
|
||||
* This is the compliment of the getDispatchableObject() method.
|
||||
*/
|
||||
void* getVkHandle() override { return &_icdRef; }
|
||||
|
||||
/**
|
||||
* Retrieves the MVKDispatchableVulkanAPIObject instance referenced by the dispatchable Vulkan handle.
|
||||
* This is the compliment of the getVkHandle() method.
|
||||
*/
|
||||
static inline MVKDispatchableVulkanAPIObject* getDispatchableObject(void* vkHandle) {
|
||||
return vkHandle ? ((MVKDispatchableObjectICDRef*)vkHandle)->mvkObject : nullptr;
|
||||
}
|
||||
|
||||
protected:
|
||||
MVKDispatchableObjectICDRef _icdRef = { ICD_LOADER_MAGIC, this };
|
||||
|
||||
};
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* MVKBaseObject.cpp
|
||||
* MVKBaseObject.mm
|
||||
*
|
||||
* Copyright (c) 2014-2019 The Brenwill Workshop Ltd. (http://www.brenwill.com)
|
||||
*
|
||||
@ -17,11 +17,11 @@
|
||||
*/
|
||||
|
||||
#include "MVKBaseObject.h"
|
||||
#include "MVKVulkanAPIObject.h"
|
||||
#include "MVKInstance.h"
|
||||
#include "MVKFoundation.h"
|
||||
#include "MVKOSExtensions.h"
|
||||
#include "MVKLogging.h"
|
||||
#include <stdlib.h>
|
||||
#include <cxxabi.h>
|
||||
|
||||
using namespace std;
|
||||
@ -166,37 +166,3 @@ VkResult MVKBaseObject::reportError(MVKBaseObject* mvkObj, VkResult vkErr, const
|
||||
|
||||
return vkErr;
|
||||
}
|
||||
|
||||
|
||||
#pragma mark -
|
||||
#pragma mark MVKVulkanAPIObject
|
||||
|
||||
void MVKVulkanAPIObject::retain() {
|
||||
lock_guard<mutex> lock(_refLock);
|
||||
|
||||
_refCount++;
|
||||
}
|
||||
|
||||
void MVKVulkanAPIObject::release() {
|
||||
if (decrementRetainCount()) { destroy(); }
|
||||
}
|
||||
|
||||
void MVKVulkanAPIObject::destroy() {
|
||||
if (markDestroyed()) { MVKConfigurableObject::destroy(); }
|
||||
}
|
||||
|
||||
// Decrements the reference count, and returns whether it's time to destroy this object.
|
||||
bool MVKVulkanAPIObject::decrementRetainCount() {
|
||||
lock_guard<mutex> lock(_refLock);
|
||||
|
||||
if (_refCount > 0) { _refCount--; }
|
||||
return (_isDestroyed && _refCount == 0);
|
||||
}
|
||||
|
||||
// Marks this object as destroyed, and returns whether no references are left outstanding.
|
||||
bool MVKVulkanAPIObject::markDestroyed() {
|
||||
lock_guard<mutex> lock(_refLock);
|
||||
|
||||
_isDestroyed = true;
|
||||
return _refCount == 0;
|
||||
}
|
@ -242,7 +242,7 @@ MVK_PUBLIC_SYMBOL VkResult vkQueueSubmit(
|
||||
|
||||
MVKTraceVulkanCall();
|
||||
MVKQueue* mvkQ = MVKQueue::getMVKQueue(queue);
|
||||
return mvkQ->submit(submitCount, pSubmits, fence, kMVKCommandUseQueueSubmit);
|
||||
return mvkQ->submit(submitCount, pSubmits, fence);
|
||||
}
|
||||
|
||||
MVK_PUBLIC_SYMBOL VkResult vkQueueWaitIdle(
|
||||
@ -250,7 +250,7 @@ MVK_PUBLIC_SYMBOL VkResult vkQueueWaitIdle(
|
||||
|
||||
MVKTraceVulkanCall();
|
||||
MVKQueue* mvkQ = MVKQueue::getMVKQueue(queue);
|
||||
return mvkQ->waitIdle(kMVKCommandUseQueueWaitIdle);
|
||||
return mvkQ->waitIdle();
|
||||
}
|
||||
|
||||
MVK_PUBLIC_SYMBOL VkResult vkDeviceWaitIdle(
|
||||
@ -2133,6 +2133,53 @@ MVK_PUBLIC_SYMBOL void vkDebugReportMessageEXT(
|
||||
}
|
||||
|
||||
|
||||
#pragma mark -
|
||||
#pragma mark VK_EXT_debug_marker extension
|
||||
|
||||
MVK_PUBLIC_SYMBOL VkResult vkDebugMarkerSetObjectTagEXT(
|
||||
VkDevice device,
|
||||
const VkDebugMarkerObjectTagInfoEXT* pTagInfo) {
|
||||
|
||||
MVKTraceVulkanCall();
|
||||
return VK_SUCCESS;
|
||||
}
|
||||
|
||||
MVK_PUBLIC_SYMBOL VkResult vkDebugMarkerSetObjectNameEXT(
|
||||
VkDevice device,
|
||||
const VkDebugMarkerObjectNameInfoEXT* pNameInfo) {
|
||||
|
||||
MVKTraceVulkanCall();
|
||||
MVKVulkanAPIObject* mvkObj = MVKVulkanAPIObject::getMVKVulkanAPIObject(pNameInfo->objectType, pNameInfo->object);
|
||||
return mvkObj ? mvkObj->setDebugName(pNameInfo->pObjectName) : VK_SUCCESS;
|
||||
}
|
||||
|
||||
MVK_PUBLIC_SYMBOL void vkCmdDebugMarkerBeginEXT(
|
||||
VkCommandBuffer commandBuffer,
|
||||
const VkDebugMarkerMarkerInfoEXT* pMarkerInfo) {
|
||||
|
||||
MVKTraceVulkanCall();
|
||||
MVKCommandBuffer* cmdBuff = MVKCommandBuffer::getMVKCommandBuffer(commandBuffer);
|
||||
mvkCmdDebugMarkerBegin(cmdBuff, pMarkerInfo);
|
||||
}
|
||||
|
||||
MVK_PUBLIC_SYMBOL void vkCmdDebugMarkerEndEXT(
|
||||
VkCommandBuffer commandBuffer) {
|
||||
|
||||
MVKTraceVulkanCall();
|
||||
MVKCommandBuffer* cmdBuff = MVKCommandBuffer::getMVKCommandBuffer(commandBuffer);
|
||||
mvkCmdDebugMarkerEnd(cmdBuff);
|
||||
}
|
||||
|
||||
MVK_PUBLIC_SYMBOL void vkCmdDebugMarkerInsertEXT(
|
||||
VkCommandBuffer commandBuffer,
|
||||
const VkDebugMarkerMarkerInfoEXT* pMarkerInfo) {
|
||||
|
||||
MVKTraceVulkanCall();
|
||||
MVKCommandBuffer* cmdBuff = MVKCommandBuffer::getMVKCommandBuffer(commandBuffer);
|
||||
mvkCmdDebugMarkerInsert(cmdBuff, pMarkerInfo);
|
||||
}
|
||||
|
||||
|
||||
#pragma mark -
|
||||
#pragma mark iOS & macOS surface extensions
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user