diff --git a/Common/MVKCommonEnvironment.h b/Common/MVKCommonEnvironment.h index b82c2b2a..1b22d33f 100644 --- a/Common/MVKCommonEnvironment.h +++ b/Common/MVKCommonEnvironment.h @@ -100,6 +100,10 @@ extern "C" { /** Directive to identify public symbols. */ #define MVK_PUBLIC_SYMBOL __attribute__((visibility("default"))) + +/** Directive to make a public alias of another symbol. */ +#define MVK_PUBLIC_ALIAS(ALIAS, TARGET) asm(".globl _" #ALIAS "\n\t_" #ALIAS " = _" #TARGET) + /** * Directives to hide public symbols from the Vulkan API, to avoid library linking * conflicts when bound to a Vulkan Loader that also exports identical symbols. @@ -109,13 +113,12 @@ extern "C" { #endif #if MVK_HIDE_VULKAN_SYMBOLS # define MVK_PUBLIC_VULKAN_SYMBOL +# define MVK_PUBLIC_VULKAN_ALIAS(ALIAS, TARGET) #else # define MVK_PUBLIC_VULKAN_SYMBOL MVK_PUBLIC_SYMBOL +# define MVK_PUBLIC_VULKAN_ALIAS(ALIAS, TARGET) MVK_PUBLIC_ALIAS(ALIAS, TARGET) #endif -/** Directive to make a public alias of another symbol. */ -#define MVK_PUBLIC_ALIAS(ALIAS, TARGET) asm(".globl _" #ALIAS "\n\t_" #ALIAS " = _" #TARGET) - #ifdef __cplusplus } diff --git a/Docs/Whats_New.md b/Docs/Whats_New.md index 27c61afb..3fabb283 100644 --- a/Docs/Whats_New.md +++ b/Docs/Whats_New.md @@ -23,6 +23,7 @@ Released TBD - Support compiling *MSL 2.4* in runtime pipelines and `MoltenVKShaderConverterTool`. - Fix issue where *MSL 2.3* only available on *Apple Silicon*, even on *macOS*. - Fix memory leak of dummy `MTLTexture` in render subpasses that use no attachments. +- Fix Metal object retain-release errors in assignment operators. - Update to latest SPIRV-Cross: - MSL: Add 64 bit support for `OpSwitch`. - MSL: Don't output depth and stencil values with explicit early fragment tests. diff --git a/MoltenVK/MoltenVK/API/vk_mvk_moltenvk.h b/MoltenVK/MoltenVK/API/vk_mvk_moltenvk.h index eaa69900..999555ef 100644 --- a/MoltenVK/MoltenVK/API/vk_mvk_moltenvk.h +++ b/MoltenVK/MoltenVK/API/vk_mvk_moltenvk.h @@ -55,7 +55,7 @@ typedef unsigned long MTLLanguageVersion; #define MVK_MAKE_VERSION(major, minor, patch) (((major) * 10000) + ((minor) * 100) + (patch)) #define MVK_VERSION MVK_MAKE_VERSION(MVK_VERSION_MAJOR, MVK_VERSION_MINOR, MVK_VERSION_PATCH) -#define VK_MVK_MOLTENVK_SPEC_VERSION 32 +#define VK_MVK_MOLTENVK_SPEC_VERSION 33 #define VK_MVK_MOLTENVK_EXTENSION_NAME "VK_MVK_moltenvk" /** Identifies the level of logging MoltenVK should be limited to outputting. */ @@ -1113,11 +1113,8 @@ VKAPI_ATTR VkResult VKAPI_CALL vkSetMoltenVKConfigurationMVK( * In that case, this function will set *pMetalFeaturesSize to the size that MoltenVK expects * MVKPhysicalDeviceMetalFeatures to be. * - * This function is not supported by the Vulkan SDK Loader and Layers framework. - * The VkPhysicalDevice object you provide here must have been retrieved directly from - * MoltenVK, and not through the Vulkan SDK Loader and Layers framework. Opaque Vulkan - * objects are often changed by layers, and passing them from one layer to another, - * or from a layer directly to MoltenVK, will result in undefined behaviour. + * This function is not supported by the Vulkan SDK Loader and Layers framework + * and is unavailable when using the Vulkan SDK Loader and Layers framework. */ VKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceMetalFeaturesMVK( VkPhysicalDevice physicalDevice, @@ -1146,11 +1143,8 @@ VKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceMetalFeaturesMVK( * pPerf to NULL. In that case, this function will set *pPerfSize to the size that MoltenVK * expects MVKPerformanceStatistics to be. * - * This function is not supported by the Vulkan SDK Loader and Layers framework. - * The VkDevice object you provide here must have been retrieved directly from - * MoltenVK, and not through the Vulkan SDK Loader and Layers framework. Opaque Vulkan - * objects are often changed by layers, and passing them from one layer to another, - * or from a layer directly to MoltenVK, will result in undefined behaviour. + * This function is not supported by the Vulkan SDK Loader and Layers framework + * and is unavailable when using the Vulkan SDK Loader and Layers framework. */ VKAPI_ATTR VkResult VKAPI_CALL vkGetPerformanceStatisticsMVK( VkDevice device, @@ -1177,11 +1171,8 @@ VKAPI_ATTR void VKAPI_CALL vkGetVersionStringsMVK( * source code or MSL compiled code. Workgroup size is determined automatically * if you're using SPIR-V. * - * This function is not supported by the Vulkan SDK Loader and Layers framework. - * The VkShaderModule object you provide here must have been retrieved directly from - * MoltenVK, and not through the Vulkan SDK Loader and Layers framework. Opaque Vulkan - * objects are often changed by layers, and passing them from one layer to another, - * or from a layer directly to MoltenVK, will result in undefined behaviour. + * This function is not supported by the Vulkan SDK Loader and Layers framework + * and is unavailable when using the Vulkan SDK Loader and Layers framework. */ VKAPI_ATTR void VKAPI_CALL vkSetWorkgroupSizeMVK( VkShaderModule shaderModule, @@ -1194,11 +1185,8 @@ VKAPI_ATTR void VKAPI_CALL vkSetWorkgroupSizeMVK( /** * Returns, in the pMTLDevice pointer, the MTLDevice used by the VkPhysicalDevice. * - * This function is not supported by the Vulkan SDK Loader and Layers framework. - * The VkPhysicalDevice object you provide here must have been retrieved directly from - * MoltenVK, and not through the Vulkan SDK Loader and Layers framework. Opaque Vulkan - * objects are often changed by layers, and passing them from one layer to another, - * or from a layer directly to MoltenVK, will result in undefined behaviour. + * This function is not supported by the Vulkan SDK Loader and Layers framework + * and is unavailable when using the Vulkan SDK Loader and Layers framework. */ VKAPI_ATTR void VKAPI_CALL vkGetMTLDeviceMVK( VkPhysicalDevice physicalDevice, @@ -1214,11 +1202,8 @@ VKAPI_ATTR void VKAPI_CALL vkGetMTLDeviceMVK( * * Returns VK_SUCCESS. * - * This function is not supported by the Vulkan SDK Loader and Layers framework. - * The VkImage object you provide here must have been retrieved directly from - * MoltenVK, and not through the Vulkan SDK Loader and Layers framework. Opaque Vulkan - * objects are often changed by layers, and passing them from one layer to another, - * or from a layer directly to MoltenVK, will result in undefined behaviour. + * This function is not supported by the Vulkan SDK Loader and Layers framework + * and is unavailable when using the Vulkan SDK Loader and Layers framework. */ VKAPI_ATTR VkResult VKAPI_CALL vkSetMTLTextureMVK( VkImage image, @@ -1227,11 +1212,8 @@ VKAPI_ATTR VkResult VKAPI_CALL vkSetMTLTextureMVK( /** * Returns, in the pMTLTexture pointer, the MTLTexture currently underlaying the VkImage. * - * This function is not supported by the Vulkan SDK Loader and Layers framework. - * The VkImage object you provide here must have been retrieved directly from - * MoltenVK, and not through the Vulkan SDK Loader and Layers framework. Opaque Vulkan - * objects are often changed by layers, and passing them from one layer to another, - * or from a layer directly to MoltenVK, will result in undefined behaviour. + * This function is not supported by the Vulkan SDK Loader and Layers framework + * and is unavailable when using the Vulkan SDK Loader and Layers framework. */ VKAPI_ATTR void VKAPI_CALL vkGetMTLTextureMVK( VkImage image, @@ -1240,11 +1222,8 @@ VKAPI_ATTR void VKAPI_CALL vkGetMTLTextureMVK( /** * Returns, in the pMTLBuffer pointer, the MTLBuffer currently underlaying the VkBuffer. * -* This function is not supported by the Vulkan SDK Loader and Layers framework. -* The VkBuffer object you provide here must have been retrieved directly from -* MoltenVK, and not through the Vulkan SDK Loader and Layers framework. Opaque Vulkan -* objects are often changed by layers, and passing them from one layer to another, -* or from a layer directly to MoltenVK, will result in undefined behaviour. + * This function is not supported by the Vulkan SDK Loader and Layers framework + * and is unavailable when using the Vulkan SDK Loader and Layers framework. */ VKAPI_ATTR void VKAPI_CALL vkGetMTLBufferMVK( VkBuffer buffer, @@ -1253,11 +1232,8 @@ VKAPI_ATTR void VKAPI_CALL vkGetMTLBufferMVK( /** * Returns, in the pMTLCommandQueue pointer, the MTLCommandQueue currently underlaying the VkQueue. * -* This function is not supported by the Vulkan SDK Loader and Layers framework. -* The VkQueue object you provide here must have been retrieved directly from -* MoltenVK, and not through the Vulkan SDK Loader and Layers framework. Opaque Vulkan -* objects are often changed by layers, and passing them from one layer to another, -* or from a layer directly to MoltenVK, will result in undefined behaviour. + * This function is not supported by the Vulkan SDK Loader and Layers framework + * and is unavailable when using the Vulkan SDK Loader and Layers framework. */ VKAPI_ATTR void VKAPI_CALL vkGetMTLCommandQueueMVK( VkQueue queue, @@ -1289,11 +1265,8 @@ VKAPI_ATTR void VKAPI_CALL vkGetMTLCommandQueueMVK( * - VK_ERROR_FEATURE_NOT_PRESENT if IOSurfaces are not supported on the platform. * - VK_ERROR_INITIALIZATION_FAILED if ioSurface is specified and is not compatible with this VkImage. * - * This function is not supported by the Vulkan SDK Loader and Layers framework. - * The VkImage object you provide here must have been retrieved directly from - * MoltenVK, and not through the Vulkan SDK Loader and Layers framework. Opaque Vulkan - * objects are often changed by layers, and passing them from one layer to another, - * or from a layer directly to MoltenVK, will result in undefined behaviour. + * This function is not supported by the Vulkan SDK Loader and Layers framework + * and is unavailable when using the Vulkan SDK Loader and Layers framework. */ VKAPI_ATTR VkResult VKAPI_CALL vkUseIOSurfaceMVK( VkImage image, @@ -1304,11 +1277,8 @@ VKAPI_ATTR VkResult VKAPI_CALL vkUseIOSurfaceMVK( * as set by the useIOSurfaceMVK() function, or returns null if the VkImage is not using * an IOSurface, or if the platform does not support IOSurfaces. * - * This function is not supported by the Vulkan SDK Loader and Layers framework. - * The VkImage object you provide here must have been retrieved directly from - * MoltenVK, and not through the Vulkan SDK Loader and Layers framework. Opaque Vulkan - * objects are often changed by layers, and passing them from one layer to another, - * or from a layer directly to MoltenVK, will result in undefined behaviour. + * This function is not supported by the Vulkan SDK Loader and Layers framework + * and is unavailable when using the Vulkan SDK Loader and Layers framework. */ VKAPI_ATTR void VKAPI_CALL vkGetIOSurfaceMVK( VkImage image, diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKFramebuffer.mm b/MoltenVK/MoltenVK/GPUObjects/MVKFramebuffer.mm index 31daa65b..f65e0aee 100644 --- a/MoltenVK/MoltenVK/GPUObjects/MVKFramebuffer.mm +++ b/MoltenVK/MoltenVK/GPUObjects/MVKFramebuffer.mm @@ -64,7 +64,7 @@ id MVKFramebuffer::getDummyAttachmentMTLTexture(MVKRenderSubpass* su mtlTexDesc.sampleCount = sampleCount; } #if MVK_IOS - if ([_renderPass->getMTLDevice() supportsFeatureSet: MTLFeatureSet_iOS_GPUFamily1_v3]) { + if ([getMTLDevice() supportsFeatureSet: MTLFeatureSet_iOS_GPUFamily1_v3]) { mtlTexDesc.storageMode = MTLStorageModeMemoryless; } else { mtlTexDesc.storageMode = MTLStorageModePrivate; diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKInstance.mm b/MoltenVK/MoltenVK/GPUObjects/MVKInstance.mm index 5654cb16..c1882e28 100644 --- a/MoltenVK/MoltenVK/GPUObjects/MVKInstance.mm +++ b/MoltenVK/MoltenVK/GPUObjects/MVKInstance.mm @@ -386,7 +386,10 @@ void MVKInstance::initDebugCallbacks(const VkInstanceCreateInfo* pCreateInfo) { } } -#define ADD_ENTRY_POINT(func, api, ext1, ext2, isDev) _entryPoints[""#func] = { (PFN_vkVoidFunction)&func, api, ext1, ext2, isDev } +#define ADD_ENTRY_POINT_MAP(name, func, api, ext1, ext2, isDev) \ + _entryPoints[""#name] = { (PFN_vkVoidFunction)&func, api, ext1, ext2, isDev } + +#define ADD_ENTRY_POINT(func, api, ext1, ext2, isDev) ADD_ENTRY_POINT_MAP(func, func, api, ext1, ext2, isDev) #define ADD_INST_ENTRY_POINT(func) ADD_ENTRY_POINT(func, VK_API_VERSION_1_0, nullptr, nullptr, false) #define ADD_DVC_ENTRY_POINT(func) ADD_ENTRY_POINT(func, VK_API_VERSION_1_0, nullptr, nullptr, true) @@ -394,11 +397,21 @@ void MVKInstance::initDebugCallbacks(const VkInstanceCreateInfo* pCreateInfo) { #define ADD_INST_1_1_ENTRY_POINT(func) ADD_ENTRY_POINT(func, VK_API_VERSION_1_1, nullptr, nullptr, false) #define ADD_DVC_1_1_ENTRY_POINT(func) ADD_ENTRY_POINT(func, VK_API_VERSION_1_1, nullptr, nullptr, true) -#define ADD_INST_EXT_ENTRY_POINT(func, EXT) ADD_ENTRY_POINT(func, 0, VK_ ##EXT ##_EXTENSION_NAME, nullptr, false) -#define ADD_DVC_EXT_ENTRY_POINT(func, EXT) ADD_ENTRY_POINT(func, 0, VK_ ##EXT ##_EXTENSION_NAME, nullptr, true) +// Adds both the 1.1 function and the promoted extension function. +#define ADD_INST_1_1_PROMOTED_ENTRY_POINT(func, EXT) \ + ADD_INST_1_1_ENTRY_POINT(func); \ + ADD_ENTRY_POINT_MAP(func##KHR, func, 0, VK_##EXT##_EXTENSION_NAME, nullptr, false) -#define ADD_INST_EXT2_ENTRY_POINT(func, EXT1, EXT2) ADD_ENTRY_POINT(func, 0, VK_ ##EXT1 ##_EXTENSION_NAME, VK_ ##EXT2 ##_EXTENSION_NAME, false) -#define ADD_DVC_EXT2_ENTRY_POINT(func, EXT1, EXT2) ADD_ENTRY_POINT(func, 0, VK_ ##EXT1 ##_EXTENSION_NAME, VK_ ##EXT2 ##_EXTENSION_NAME, true) +// Adds both the 1.1 function and the promoted extension function. +#define ADD_DVC_1_1_PROMOTED_ENTRY_POINT(func, EXT) \ + ADD_DVC_1_1_ENTRY_POINT(func); \ + ADD_ENTRY_POINT_MAP(func##KHR, func, 0, VK_##EXT##_EXTENSION_NAME, nullptr, true) + +#define ADD_INST_EXT_ENTRY_POINT(func, EXT) ADD_ENTRY_POINT(func, 0, VK_##EXT##_EXTENSION_NAME, nullptr, false) +#define ADD_DVC_EXT_ENTRY_POINT(func, EXT) ADD_ENTRY_POINT(func, 0, VK_##EXT##_EXTENSION_NAME, nullptr, true) + +#define ADD_INST_EXT2_ENTRY_POINT(func, EXT1, EXT2) ADD_ENTRY_POINT(func, 0, VK_##EXT1##_EXTENSION_NAME, VK_##EXT2##_EXTENSION_NAME, false) +#define ADD_DVC_EXT2_ENTRY_POINT(func, EXT1, EXT2) ADD_ENTRY_POINT(func, 0, VK_##EXT1##_EXTENSION_NAME, VK_##EXT2##_EXTENSION_NAME, true) // Initializes the function pointer map. void MVKInstance::initProcAddrs() { @@ -418,17 +431,17 @@ void MVKInstance::initProcAddrs() { ADD_INST_ENTRY_POINT(vkEnumerateDeviceLayerProperties); ADD_INST_ENTRY_POINT(vkGetPhysicalDeviceSparseImageFormatProperties); - ADD_INST_1_1_ENTRY_POINT(vkEnumeratePhysicalDeviceGroups); - ADD_INST_1_1_ENTRY_POINT(vkGetPhysicalDeviceFeatures2); - ADD_INST_1_1_ENTRY_POINT(vkGetPhysicalDeviceProperties2); - ADD_INST_1_1_ENTRY_POINT(vkGetPhysicalDeviceFormatProperties2); - ADD_INST_1_1_ENTRY_POINT(vkGetPhysicalDeviceImageFormatProperties2); - ADD_INST_1_1_ENTRY_POINT(vkGetPhysicalDeviceQueueFamilyProperties2); - ADD_INST_1_1_ENTRY_POINT(vkGetPhysicalDeviceMemoryProperties2); - ADD_INST_1_1_ENTRY_POINT(vkGetPhysicalDeviceSparseImageFormatProperties2); - ADD_INST_1_1_ENTRY_POINT(vkGetPhysicalDeviceExternalFenceProperties); - ADD_INST_1_1_ENTRY_POINT(vkGetPhysicalDeviceExternalBufferProperties); - ADD_INST_1_1_ENTRY_POINT(vkGetPhysicalDeviceExternalSemaphoreProperties); + ADD_INST_1_1_PROMOTED_ENTRY_POINT(vkEnumeratePhysicalDeviceGroups, KHR_DEVICE_GROUP_CREATION); + ADD_INST_1_1_PROMOTED_ENTRY_POINT(vkGetPhysicalDeviceFeatures2, KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2); + ADD_INST_1_1_PROMOTED_ENTRY_POINT(vkGetPhysicalDeviceProperties2, KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2); + ADD_INST_1_1_PROMOTED_ENTRY_POINT(vkGetPhysicalDeviceFormatProperties2, KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2); + ADD_INST_1_1_PROMOTED_ENTRY_POINT(vkGetPhysicalDeviceImageFormatProperties2, KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2); + ADD_INST_1_1_PROMOTED_ENTRY_POINT(vkGetPhysicalDeviceQueueFamilyProperties2, KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2); + ADD_INST_1_1_PROMOTED_ENTRY_POINT(vkGetPhysicalDeviceMemoryProperties2, KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2); + ADD_INST_1_1_PROMOTED_ENTRY_POINT(vkGetPhysicalDeviceSparseImageFormatProperties2, KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2); + ADD_INST_1_1_PROMOTED_ENTRY_POINT(vkGetPhysicalDeviceExternalFenceProperties, KHR_EXTERNAL_FENCE_CAPABILITIES); + ADD_INST_1_1_PROMOTED_ENTRY_POINT(vkGetPhysicalDeviceExternalBufferProperties, KHR_EXTERNAL_MEMORY_CAPABILITIES); + ADD_INST_1_1_PROMOTED_ENTRY_POINT(vkGetPhysicalDeviceExternalSemaphoreProperties, KHR_EXTERNAL_SEMAPHORE_CAPABILITIES); // Device functions: ADD_DVC_ENTRY_POINT(vkGetDeviceProcAddr); @@ -554,34 +567,23 @@ void MVKInstance::initProcAddrs() { ADD_DVC_ENTRY_POINT(vkCmdExecuteCommands); ADD_DVC_1_1_ENTRY_POINT(vkGetDeviceQueue2); - ADD_DVC_1_1_ENTRY_POINT(vkBindBufferMemory2); - ADD_DVC_1_1_ENTRY_POINT(vkBindImageMemory2); - ADD_DVC_1_1_ENTRY_POINT(vkGetBufferMemoryRequirements2); - ADD_DVC_1_1_ENTRY_POINT(vkGetImageMemoryRequirements2); - ADD_DVC_1_1_ENTRY_POINT(vkGetImageSparseMemoryRequirements2); - ADD_DVC_1_1_ENTRY_POINT(vkGetDeviceGroupPeerMemoryFeatures); - ADD_DVC_1_1_ENTRY_POINT(vkCreateDescriptorUpdateTemplate); - ADD_DVC_1_1_ENTRY_POINT(vkDestroyDescriptorUpdateTemplate); - ADD_DVC_1_1_ENTRY_POINT(vkUpdateDescriptorSetWithTemplate); - ADD_DVC_1_1_ENTRY_POINT(vkGetDescriptorSetLayoutSupport); - ADD_DVC_1_1_ENTRY_POINT(vkCreateSamplerYcbcrConversion); - ADD_DVC_1_1_ENTRY_POINT(vkDestroySamplerYcbcrConversion); - ADD_DVC_1_1_ENTRY_POINT(vkTrimCommandPool); - ADD_DVC_1_1_ENTRY_POINT(vkCmdSetDeviceMask); - ADD_DVC_1_1_ENTRY_POINT(vkCmdDispatchBase); + ADD_DVC_1_1_PROMOTED_ENTRY_POINT(vkBindBufferMemory2, KHR_BIND_MEMORY_2); + ADD_DVC_1_1_PROMOTED_ENTRY_POINT(vkBindImageMemory2, KHR_BIND_MEMORY_2); + ADD_DVC_1_1_PROMOTED_ENTRY_POINT(vkGetBufferMemoryRequirements2, KHR_GET_MEMORY_REQUIREMENTS_2); + ADD_DVC_1_1_PROMOTED_ENTRY_POINT(vkGetImageMemoryRequirements2, KHR_GET_MEMORY_REQUIREMENTS_2); + ADD_DVC_1_1_PROMOTED_ENTRY_POINT(vkGetImageSparseMemoryRequirements2, KHR_GET_MEMORY_REQUIREMENTS_2); + ADD_DVC_1_1_PROMOTED_ENTRY_POINT(vkGetDeviceGroupPeerMemoryFeatures, KHR_DEVICE_GROUP); + ADD_DVC_1_1_PROMOTED_ENTRY_POINT(vkCreateDescriptorUpdateTemplate, KHR_DESCRIPTOR_UPDATE_TEMPLATE); + ADD_DVC_1_1_PROMOTED_ENTRY_POINT(vkDestroyDescriptorUpdateTemplate, KHR_DESCRIPTOR_UPDATE_TEMPLATE); + ADD_DVC_1_1_PROMOTED_ENTRY_POINT(vkUpdateDescriptorSetWithTemplate, KHR_DESCRIPTOR_UPDATE_TEMPLATE); + ADD_DVC_1_1_PROMOTED_ENTRY_POINT(vkGetDescriptorSetLayoutSupport, KHR_MAINTENANCE3); + ADD_DVC_1_1_PROMOTED_ENTRY_POINT(vkCreateSamplerYcbcrConversion, KHR_SAMPLER_YCBCR_CONVERSION); + ADD_DVC_1_1_PROMOTED_ENTRY_POINT(vkDestroySamplerYcbcrConversion, KHR_SAMPLER_YCBCR_CONVERSION); + ADD_DVC_1_1_PROMOTED_ENTRY_POINT(vkTrimCommandPool, KHR_MAINTENANCE1); + ADD_DVC_1_1_PROMOTED_ENTRY_POINT(vkCmdSetDeviceMask, KHR_DEVICE_GROUP); + ADD_DVC_1_1_PROMOTED_ENTRY_POINT(vkCmdDispatchBase, KHR_DEVICE_GROUP); // Instance extension functions: - ADD_INST_EXT_ENTRY_POINT(vkEnumeratePhysicalDeviceGroupsKHR, KHR_DEVICE_GROUP_CREATION); - ADD_INST_EXT_ENTRY_POINT(vkGetPhysicalDeviceExternalFencePropertiesKHR, KHR_EXTERNAL_FENCE_CAPABILITIES); - ADD_INST_EXT_ENTRY_POINT(vkGetPhysicalDeviceExternalBufferPropertiesKHR, KHR_EXTERNAL_MEMORY_CAPABILITIES); - ADD_INST_EXT_ENTRY_POINT(vkGetPhysicalDeviceExternalSemaphorePropertiesKHR, KHR_EXTERNAL_SEMAPHORE_CAPABILITIES); - ADD_INST_EXT_ENTRY_POINT(vkGetPhysicalDeviceFeatures2KHR, KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2); - ADD_INST_EXT_ENTRY_POINT(vkGetPhysicalDeviceProperties2KHR, KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2); - ADD_INST_EXT_ENTRY_POINT(vkGetPhysicalDeviceFormatProperties2KHR, KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2); - ADD_INST_EXT_ENTRY_POINT(vkGetPhysicalDeviceImageFormatProperties2KHR, KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2); - ADD_INST_EXT_ENTRY_POINT(vkGetPhysicalDeviceQueueFamilyProperties2KHR, KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2); - ADD_INST_EXT_ENTRY_POINT(vkGetPhysicalDeviceMemoryProperties2KHR, KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2); - ADD_INST_EXT_ENTRY_POINT(vkGetPhysicalDeviceSparseImageFormatProperties2KHR, KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2); ADD_INST_EXT_ENTRY_POINT(vkDestroySurfaceKHR, KHR_SURFACE); ADD_INST_EXT_ENTRY_POINT(vkGetPhysicalDeviceSurfaceSupportKHR, KHR_SURFACE); ADD_INST_EXT_ENTRY_POINT(vkGetPhysicalDeviceSurfaceCapabilitiesKHR, KHR_SURFACE); @@ -626,27 +628,12 @@ void MVKInstance::initProcAddrs() { ADD_INST_EXT_ENTRY_POINT(vkGetMTLCommandQueueMVK, MVK_MOLTENVK); // Device extension functions: - ADD_DVC_EXT_ENTRY_POINT(vkBindBufferMemory2KHR, KHR_BIND_MEMORY_2); - ADD_DVC_EXT_ENTRY_POINT(vkBindImageMemory2KHR, KHR_BIND_MEMORY_2); ADD_DVC_EXT_ENTRY_POINT(vkCreateRenderPass2KHR, KHR_CREATE_RENDERPASS_2); ADD_DVC_EXT_ENTRY_POINT(vkCmdBeginRenderPass2KHR, KHR_CREATE_RENDERPASS_2); ADD_DVC_EXT_ENTRY_POINT(vkCmdNextSubpass2KHR, KHR_CREATE_RENDERPASS_2); ADD_DVC_EXT_ENTRY_POINT(vkCmdEndRenderPass2KHR, KHR_CREATE_RENDERPASS_2); - ADD_DVC_EXT_ENTRY_POINT(vkCreateDescriptorUpdateTemplateKHR, KHR_DESCRIPTOR_UPDATE_TEMPLATE); - ADD_DVC_EXT_ENTRY_POINT(vkDestroyDescriptorUpdateTemplateKHR, KHR_DESCRIPTOR_UPDATE_TEMPLATE); - ADD_DVC_EXT_ENTRY_POINT(vkUpdateDescriptorSetWithTemplateKHR, KHR_DESCRIPTOR_UPDATE_TEMPLATE); - ADD_DVC_EXT_ENTRY_POINT(vkGetDeviceGroupPeerMemoryFeaturesKHR, KHR_DEVICE_GROUP); - ADD_DVC_EXT_ENTRY_POINT(vkCmdSetDeviceMaskKHR, KHR_DEVICE_GROUP); - ADD_DVC_EXT_ENTRY_POINT(vkCmdDispatchBaseKHR, KHR_DEVICE_GROUP); - ADD_DVC_EXT_ENTRY_POINT(vkGetBufferMemoryRequirements2KHR, KHR_GET_MEMORY_REQUIREMENTS_2); - ADD_DVC_EXT_ENTRY_POINT(vkGetImageMemoryRequirements2KHR, KHR_GET_MEMORY_REQUIREMENTS_2); - ADD_DVC_EXT_ENTRY_POINT(vkGetImageSparseMemoryRequirements2KHR, KHR_GET_MEMORY_REQUIREMENTS_2); - ADD_DVC_EXT_ENTRY_POINT(vkTrimCommandPoolKHR, KHR_MAINTENANCE1); - ADD_DVC_EXT_ENTRY_POINT(vkGetDescriptorSetLayoutSupportKHR, KHR_MAINTENANCE3); ADD_DVC_EXT_ENTRY_POINT(vkCmdPushDescriptorSetKHR, KHR_PUSH_DESCRIPTOR); ADD_DVC_EXT2_ENTRY_POINT(vkCmdPushDescriptorSetWithTemplateKHR, KHR_PUSH_DESCRIPTOR, KHR_DESCRIPTOR_UPDATE_TEMPLATE); - ADD_DVC_EXT_ENTRY_POINT(vkCreateSamplerYcbcrConversionKHR, KHR_SAMPLER_YCBCR_CONVERSION); - ADD_DVC_EXT_ENTRY_POINT(vkDestroySamplerYcbcrConversionKHR, KHR_SAMPLER_YCBCR_CONVERSION); ADD_DVC_EXT_ENTRY_POINT(vkCreateSwapchainKHR, KHR_SWAPCHAIN); ADD_DVC_EXT_ENTRY_POINT(vkDestroySwapchainKHR, KHR_SWAPCHAIN); ADD_DVC_EXT_ENTRY_POINT(vkGetSwapchainImagesKHR, KHR_SWAPCHAIN); diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKShaderModule.mm b/MoltenVK/MoltenVK/GPUObjects/MVKShaderModule.mm index 7da3dca2..e53aeb61 100644 --- a/MoltenVK/MoltenVK/GPUObjects/MVKShaderModule.mm +++ b/MoltenVK/MoltenVK/GPUObjects/MVKShaderModule.mm @@ -37,8 +37,10 @@ MVKMTLFunction::MVKMTLFunction(const MVKMTLFunction& other) { } MVKMTLFunction& MVKMTLFunction::operator=(const MVKMTLFunction& other) { - [_mtlFunction release]; - _mtlFunction = [other._mtlFunction retain]; // retained + if (_mtlFunction != other._mtlFunction) { + [_mtlFunction release]; + _mtlFunction = [other._mtlFunction retain]; // retained + } shaderConversionResults = other.shaderConversionResults; threadGroupSize = other.threadGroupSize; return *this; @@ -179,9 +181,11 @@ MVKShaderLibrary::MVKShaderLibrary(const MVKShaderLibrary& other) { } MVKShaderLibrary& MVKShaderLibrary::operator=(const MVKShaderLibrary& other) { - [_mtlLibrary release]; + if (_mtlLibrary != other._mtlLibrary) { + [_mtlLibrary release]; + _mtlLibrary = [other._mtlLibrary retain]; + } _owner = other._owner; - _mtlLibrary = [other._mtlLibrary retain]; _shaderConversionResults = other._shaderConversionResults; _msl = other._msl; return *this; diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKVulkanAPIObject.mm b/MoltenVK/MoltenVK/GPUObjects/MVKVulkanAPIObject.mm index 64556b38..d3af0521 100644 --- a/MoltenVK/MoltenVK/GPUObjects/MVKVulkanAPIObject.mm +++ b/MoltenVK/MoltenVK/GPUObjects/MVKVulkanAPIObject.mm @@ -66,8 +66,10 @@ MVKVulkanAPIObject::MVKVulkanAPIObject(const MVKVulkanAPIObject& other) { } MVKVulkanAPIObject& MVKVulkanAPIObject::operator=(const MVKVulkanAPIObject& other) { - [_debugName release]; - _debugName = [other._debugName retain]; + if (_debugName != other._debugName) { + [_debugName release]; + _debugName = [other._debugName retain]; + } return *this; } diff --git a/MoltenVK/MoltenVK/Vulkan/vk_mvk_moltenvk.mm b/MoltenVK/MoltenVK/Vulkan/vk_mvk_moltenvk.mm index 6afdd218..001acb1b 100644 --- a/MoltenVK/MoltenVK/Vulkan/vk_mvk_moltenvk.mm +++ b/MoltenVK/MoltenVK/Vulkan/vk_mvk_moltenvk.mm @@ -69,7 +69,7 @@ MVK_PUBLIC_SYMBOL VkResult vkSetMoltenVKConfigurationMVK( return rslt; } -MVK_PUBLIC_SYMBOL VkResult vkGetPhysicalDeviceMetalFeaturesMVK( +MVK_PUBLIC_VULKAN_SYMBOL VkResult vkGetPhysicalDeviceMetalFeaturesMVK( VkPhysicalDevice physicalDevice, MVKPhysicalDeviceMetalFeatures* pMetalFeatures, size_t* pMetalFeaturesSize) { @@ -78,7 +78,7 @@ MVK_PUBLIC_SYMBOL VkResult vkGetPhysicalDeviceMetalFeaturesMVK( return mvkCopy(pMetalFeatures, mvkPD->getMetalFeatures(), pMetalFeaturesSize); } -MVK_PUBLIC_SYMBOL VkResult vkGetPerformanceStatisticsMVK( +MVK_PUBLIC_VULKAN_SYMBOL VkResult vkGetPerformanceStatisticsMVK( VkDevice device, MVKPerformanceStatistics* pPerf, size_t* pPerfSize) { @@ -105,7 +105,7 @@ MVK_PUBLIC_SYMBOL void vkGetVersionStringsMVK( pVulkanVersionStringBuffer[len] = 0; // terminator } -MVK_PUBLIC_SYMBOL void vkGetMTLDeviceMVK( +MVK_PUBLIC_VULKAN_SYMBOL void vkGetMTLDeviceMVK( VkPhysicalDevice physicalDevice, id* pMTLDevice) { @@ -113,7 +113,7 @@ MVK_PUBLIC_SYMBOL void vkGetMTLDeviceMVK( *pMTLDevice = mvkPD->getMTLDevice(); } -MVK_PUBLIC_SYMBOL VkResult vkSetMTLTextureMVK( +MVK_PUBLIC_VULKAN_SYMBOL VkResult vkSetMTLTextureMVK( VkImage image, id mtlTexture) { @@ -121,7 +121,7 @@ MVK_PUBLIC_SYMBOL VkResult vkSetMTLTextureMVK( return mvkImg->setMTLTexture(0, mtlTexture); } -MVK_PUBLIC_SYMBOL void vkGetMTLTextureMVK( +MVK_PUBLIC_VULKAN_SYMBOL void vkGetMTLTextureMVK( VkImage image, id* pMTLTexture) { @@ -129,7 +129,7 @@ MVK_PUBLIC_SYMBOL void vkGetMTLTextureMVK( *pMTLTexture = mvkImg->getMTLTexture(0); } -MVK_PUBLIC_SYMBOL void vkGetMTLBufferMVK( +MVK_PUBLIC_VULKAN_SYMBOL void vkGetMTLBufferMVK( VkBuffer buffer, id* pMTLBuffer) { @@ -137,7 +137,7 @@ MVK_PUBLIC_SYMBOL void vkGetMTLBufferMVK( *pMTLBuffer = mvkBuffer->getMTLBuffer(); } -MVK_PUBLIC_SYMBOL void vkGetMTLCommandQueueMVK( +MVK_PUBLIC_VULKAN_SYMBOL void vkGetMTLCommandQueueMVK( VkQueue queue, id* pMTLCommandQueue) { @@ -145,7 +145,7 @@ MVK_PUBLIC_SYMBOL void vkGetMTLCommandQueueMVK( *pMTLCommandQueue = mvkQueue->getMTLCommandQueue(); } -MVK_PUBLIC_SYMBOL VkResult vkUseIOSurfaceMVK( +MVK_PUBLIC_VULKAN_SYMBOL VkResult vkUseIOSurfaceMVK( VkImage image, IOSurfaceRef ioSurface) { @@ -153,7 +153,7 @@ MVK_PUBLIC_SYMBOL VkResult vkUseIOSurfaceMVK( return mvkImg->useIOSurface(ioSurface); } -MVK_PUBLIC_SYMBOL void vkGetIOSurfaceMVK( +MVK_PUBLIC_VULKAN_SYMBOL void vkGetIOSurfaceMVK( VkImage image, IOSurfaceRef* pIOSurface) { @@ -161,7 +161,7 @@ MVK_PUBLIC_SYMBOL void vkGetIOSurfaceMVK( *pIOSurface = mvkImg->getIOSurface(); } -MVK_PUBLIC_SYMBOL void vkSetWorkgroupSizeMVK( +MVK_PUBLIC_VULKAN_SYMBOL void vkSetWorkgroupSizeMVK( VkShaderModule shaderModule, uint32_t x, uint32_t y, diff --git a/MoltenVK/MoltenVK/Vulkan/vulkan.mm b/MoltenVK/MoltenVK/Vulkan/vulkan.mm index 56b5a1ce..5498e9de 100644 --- a/MoltenVK/MoltenVK/Vulkan/vulkan.mm +++ b/MoltenVK/MoltenVK/Vulkan/vulkan.mm @@ -162,7 +162,7 @@ static inline void MVKTraceVulkanCallEndImpl(const char* funcName, uint64_t star } // Define an extension call as an alias of a core call -#define MVK_PUBLIC_CORE_ALIAS(vkf) MVK_PUBLIC_ALIAS(vkf##KHR, vkf) +#define MVK_PUBLIC_VULKAN_CORE_ALIAS(vkf) MVK_PUBLIC_VULKAN_ALIAS(vkf##KHR, vkf) #pragma mark - @@ -2321,8 +2321,8 @@ MVK_PUBLIC_VULKAN_SYMBOL void vkCmdDispatchBase( #pragma mark - #pragma mark VK_KHR_bind_memory2 extension -MVK_PUBLIC_CORE_ALIAS(vkBindBufferMemory2); -MVK_PUBLIC_CORE_ALIAS(vkBindImageMemory2); +MVK_PUBLIC_VULKAN_CORE_ALIAS(vkBindBufferMemory2); +MVK_PUBLIC_VULKAN_CORE_ALIAS(vkBindImageMemory2); #pragma mark - @@ -2377,73 +2377,73 @@ MVK_PUBLIC_VULKAN_SYMBOL void vkCmdEndRenderPass2KHR( #pragma mark - #pragma mark VK_KHR_descriptor_update_template extension -MVK_PUBLIC_CORE_ALIAS(vkCreateDescriptorUpdateTemplate); -MVK_PUBLIC_CORE_ALIAS(vkDestroyDescriptorUpdateTemplate); -MVK_PUBLIC_CORE_ALIAS(vkUpdateDescriptorSetWithTemplate); +MVK_PUBLIC_VULKAN_CORE_ALIAS(vkCreateDescriptorUpdateTemplate); +MVK_PUBLIC_VULKAN_CORE_ALIAS(vkDestroyDescriptorUpdateTemplate); +MVK_PUBLIC_VULKAN_CORE_ALIAS(vkUpdateDescriptorSetWithTemplate); #pragma mark - #pragma mark VK_KHR_device_group extension -MVK_PUBLIC_CORE_ALIAS(vkGetDeviceGroupPeerMemoryFeatures); -MVK_PUBLIC_CORE_ALIAS(vkCmdSetDeviceMask); -MVK_PUBLIC_CORE_ALIAS(vkCmdDispatchBase); +MVK_PUBLIC_VULKAN_CORE_ALIAS(vkGetDeviceGroupPeerMemoryFeatures); +MVK_PUBLIC_VULKAN_CORE_ALIAS(vkCmdSetDeviceMask); +MVK_PUBLIC_VULKAN_CORE_ALIAS(vkCmdDispatchBase); #pragma mark - #pragma mark VK_KHR_device_group_creation extension -MVK_PUBLIC_CORE_ALIAS(vkEnumeratePhysicalDeviceGroups); +MVK_PUBLIC_VULKAN_CORE_ALIAS(vkEnumeratePhysicalDeviceGroups); #pragma mark - #pragma mark VK_KHR_external_fence_capabilities extension -MVK_PUBLIC_CORE_ALIAS(vkGetPhysicalDeviceExternalFenceProperties); +MVK_PUBLIC_VULKAN_CORE_ALIAS(vkGetPhysicalDeviceExternalFenceProperties); #pragma mark - #pragma mark VK_KHR_external_memory_capabilities extension -MVK_PUBLIC_CORE_ALIAS(vkGetPhysicalDeviceExternalBufferProperties); +MVK_PUBLIC_VULKAN_CORE_ALIAS(vkGetPhysicalDeviceExternalBufferProperties); #pragma mark - #pragma mark VK_KHR_external_semaphore_capabilities extension -MVK_PUBLIC_CORE_ALIAS(vkGetPhysicalDeviceExternalSemaphoreProperties); +MVK_PUBLIC_VULKAN_CORE_ALIAS(vkGetPhysicalDeviceExternalSemaphoreProperties); #pragma mark - #pragma mark VK_KHR_get_memory_requirements2 extension -MVK_PUBLIC_CORE_ALIAS(vkGetBufferMemoryRequirements2); -MVK_PUBLIC_CORE_ALIAS(vkGetImageMemoryRequirements2); -MVK_PUBLIC_CORE_ALIAS(vkGetImageSparseMemoryRequirements2); +MVK_PUBLIC_VULKAN_CORE_ALIAS(vkGetBufferMemoryRequirements2); +MVK_PUBLIC_VULKAN_CORE_ALIAS(vkGetImageMemoryRequirements2); +MVK_PUBLIC_VULKAN_CORE_ALIAS(vkGetImageSparseMemoryRequirements2); #pragma mark - #pragma mark VK_KHR_get_physical_device_properties2 extension -MVK_PUBLIC_CORE_ALIAS(vkGetPhysicalDeviceFeatures2); -MVK_PUBLIC_CORE_ALIAS(vkGetPhysicalDeviceProperties2); -MVK_PUBLIC_CORE_ALIAS(vkGetPhysicalDeviceFormatProperties2); -MVK_PUBLIC_CORE_ALIAS(vkGetPhysicalDeviceImageFormatProperties2); -MVK_PUBLIC_CORE_ALIAS(vkGetPhysicalDeviceQueueFamilyProperties2); -MVK_PUBLIC_CORE_ALIAS(vkGetPhysicalDeviceMemoryProperties2); -MVK_PUBLIC_CORE_ALIAS(vkGetPhysicalDeviceSparseImageFormatProperties2); +MVK_PUBLIC_VULKAN_CORE_ALIAS(vkGetPhysicalDeviceFeatures2); +MVK_PUBLIC_VULKAN_CORE_ALIAS(vkGetPhysicalDeviceProperties2); +MVK_PUBLIC_VULKAN_CORE_ALIAS(vkGetPhysicalDeviceFormatProperties2); +MVK_PUBLIC_VULKAN_CORE_ALIAS(vkGetPhysicalDeviceImageFormatProperties2); +MVK_PUBLIC_VULKAN_CORE_ALIAS(vkGetPhysicalDeviceQueueFamilyProperties2); +MVK_PUBLIC_VULKAN_CORE_ALIAS(vkGetPhysicalDeviceMemoryProperties2); +MVK_PUBLIC_VULKAN_CORE_ALIAS(vkGetPhysicalDeviceSparseImageFormatProperties2); #pragma mark - #pragma mark VK_KHR_maintenance1 extension -MVK_PUBLIC_CORE_ALIAS(vkTrimCommandPool); +MVK_PUBLIC_VULKAN_CORE_ALIAS(vkTrimCommandPool); #pragma mark - #pragma mark VK_KHR_maintenance3 extension -MVK_PUBLIC_CORE_ALIAS(vkGetDescriptorSetLayoutSupport); +MVK_PUBLIC_VULKAN_CORE_ALIAS(vkGetDescriptorSetLayoutSupport); #pragma mark - @@ -2478,8 +2478,8 @@ MVK_PUBLIC_VULKAN_SYMBOL void vkCmdPushDescriptorSetWithTemplateKHR( #pragma mark - #pragma mark VK_KHR_sampler_ycbcr_conversion extension -MVK_PUBLIC_CORE_ALIAS(vkCreateSamplerYcbcrConversion); -MVK_PUBLIC_CORE_ALIAS(vkDestroySamplerYcbcrConversion); +MVK_PUBLIC_VULKAN_CORE_ALIAS(vkCreateSamplerYcbcrConversion); +MVK_PUBLIC_VULKAN_CORE_ALIAS(vkDestroySamplerYcbcrConversion); #pragma mark -