Merge pull request #815 from Cry-Mory/master

Adds support for vkGetMTLBufferMVK 
diff --git a/MoltenVK/MoltenVK/API/vk_mvk_moltenvk.h b/MoltenVK/MoltenVK/API/vk_mvk_moltenvk.h
index 360f6aa..e203c43 100644
--- a/MoltenVK/MoltenVK/API/vk_mvk_moltenvk.h
+++ b/MoltenVK/MoltenVK/API/vk_mvk_moltenvk.h
@@ -656,6 +656,7 @@
 typedef void (VKAPI_PTR *PFN_vkGetMTLDeviceMVK)(VkPhysicalDevice physicalDevice, id<MTLDevice>* pMTLDevice);
 typedef VkResult (VKAPI_PTR *PFN_vkSetMTLTextureMVK)(VkImage image, id<MTLTexture> mtlTexture);
 typedef void (VKAPI_PTR *PFN_vkGetMTLTextureMVK)(VkImage image, id<MTLTexture>* pMTLTexture);
+typedef void (VKAPI_PTR *PFN_vkGetMTLBufferMVK)(VkBuffer buffer, id<MTLBuffer>* pMTLBuffer);
 typedef VkResult (VKAPI_PTR *PFN_vkUseIOSurfaceMVK)(VkImage image, IOSurfaceRef ioSurface);
 typedef void (VKAPI_PTR *PFN_vkGetIOSurfaceMVK)(VkImage image, IOSurfaceRef* pIOSurface);
 #endif // __OBJC__
@@ -928,6 +929,19 @@
     id<MTLTexture>*                             pMTLTexture);
 
 /**
+* 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.
+*/
+VKAPI_ATTR void VKAPI_CALL vkGetMTLBufferMVK(
+    VkBuffer                                    buffer,
+    id<MTLBuffer>*                              pMTLBuffer);
+
+/**
  * Indicates that a VkImage should use an IOSurface to underlay the Metal texture.
  *
  * If ioSurface is not null, it will be used as the IOSurface, and any differences
diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKInstance.mm b/MoltenVK/MoltenVK/GPUObjects/MVKInstance.mm
index a590426..12787cc 100644
--- a/MoltenVK/MoltenVK/GPUObjects/MVKInstance.mm
+++ b/MoltenVK/MoltenVK/GPUObjects/MVKInstance.mm
@@ -598,6 +598,7 @@
 	ADD_INST_EXT_ENTRY_POINT(vkGetMTLDeviceMVK, MVK_MOLTENVK);
 	ADD_INST_EXT_ENTRY_POINT(vkSetMTLTextureMVK, MVK_MOLTENVK);
 	ADD_INST_EXT_ENTRY_POINT(vkGetMTLTextureMVK, MVK_MOLTENVK);
+    ADD_INST_EXT_ENTRY_POINT(vkGetMTLBufferMVK, MVK_MOLTENVK);
 	ADD_INST_EXT_ENTRY_POINT(vkUseIOSurfaceMVK, MVK_MOLTENVK);
 	ADD_INST_EXT_ENTRY_POINT(vkGetIOSurfaceMVK, MVK_MOLTENVK);
 
diff --git a/MoltenVK/MoltenVK/Vulkan/vk_mvk_moltenvk.mm b/MoltenVK/MoltenVK/Vulkan/vk_mvk_moltenvk.mm
index b0af832..85e2b1b 100644
--- a/MoltenVK/MoltenVK/Vulkan/vk_mvk_moltenvk.mm
+++ b/MoltenVK/MoltenVK/Vulkan/vk_mvk_moltenvk.mm
@@ -22,6 +22,7 @@
 #include "MVKEnvironment.h"
 #include "MVKSwapchain.h"
 #include "MVKImage.h"
+#include "MVKBuffer.h"
 #include "MVKFoundation.h"
 #include "MVKShaderModule.h"
 #include <string>
@@ -133,6 +134,14 @@
     *pMTLTexture = mvkImg->getMTLTexture();
 }
 
+MVK_PUBLIC_SYMBOL void vkGetMTLBufferMVK(
+    VkBuffer                                    buffer,
+    id<MTLBuffer>*                              pMTLBuffer) {
+
+    MVKBuffer* mvkBuffer = (MVKBuffer*)buffer;
+    *pMTLBuffer = mvkBuffer->getMTLBuffer();
+}
+
 MVK_PUBLIC_SYMBOL VkResult vkUseIOSurfaceMVK(
     VkImage                                     image,
     IOSurfaceRef                                ioSurface) {