VK_EXT_metal_objects fix issue where timeline event incorrectly created.

- vkCreateSemaphore() create binary semaphore, unless timeline explicitly
  requested. Previously, timeline semaphore was always created when
  exportObjectType == VK_EXPORT_METAL_OBJECT_TYPE_METAL_SHARED_EVENT_BIT_EXT.
- vkCreateSemaphore() record error when MTLSharedEvent imported or marked for
  export, and MoltenVK configured for VkSemaphore using MTLFence or CPU emulation.
- MVKTimelineSemaphore elide unused constructor arguments.
diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKDevice.mm b/MoltenVK/MoltenVK/GPUObjects/MVKDevice.mm
index 1195cb9..0de3f13 100644
--- a/MoltenVK/MoltenVK/GPUObjects/MVKDevice.mm
+++ b/MoltenVK/MoltenVK/GPUObjects/MVKDevice.mm
@@ -3400,9 +3400,7 @@
 		}
 	}
 
-	if ((pTypeCreateInfo && pTypeCreateInfo->semaphoreType == VK_SEMAPHORE_TYPE_TIMELINE) ||
-		(pExportInfo && pExportInfo->exportObjectType == VK_EXPORT_METAL_OBJECT_TYPE_METAL_SHARED_EVENT_BIT_EXT) ||
-		 pImportInfo) {
+	if (pTypeCreateInfo && pTypeCreateInfo->semaphoreType == VK_SEMAPHORE_TYPE_TIMELINE) {
 		if (_pMetalFeatures->events) {
 			return new MVKTimelineSemaphoreMTLEvent(this, pCreateInfo, pTypeCreateInfo, pExportInfo, pImportInfo);
 		} else {
@@ -3410,9 +3408,9 @@
 		}
 	} else {
 		switch (_vkSemaphoreStyle) {
-			case MVKSemaphoreStyleUseMTLEvent:  return new MVKSemaphoreMTLEvent(this, pCreateInfo);
-			case MVKSemaphoreStyleUseMTLFence:  return new MVKSemaphoreMTLFence(this, pCreateInfo);
-			case MVKSemaphoreStyleUseEmulation: return new MVKSemaphoreEmulated(this, pCreateInfo);
+			case MVKSemaphoreStyleUseMTLEvent:  return new MVKSemaphoreMTLEvent(this, pCreateInfo, pExportInfo, pImportInfo);
+			case MVKSemaphoreStyleUseMTLFence:  return new MVKSemaphoreMTLFence(this, pCreateInfo, pExportInfo, pImportInfo);
+			case MVKSemaphoreStyleUseEmulation: return new MVKSemaphoreEmulated(this, pCreateInfo, pExportInfo, pImportInfo);
 		}
 	}
 }
diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKSync.h b/MoltenVK/MoltenVK/GPUObjects/MVKSync.h
index fdbaf4a..3562369 100644
--- a/MoltenVK/MoltenVK/GPUObjects/MVKSync.h
+++ b/MoltenVK/MoltenVK/GPUObjects/MVKSync.h
@@ -213,7 +213,10 @@
 	void encodeDeferredSignal(id<MTLCommandBuffer> mtlCmdBuff, uint64_t) override;
 	bool isUsingCommandEncoding() override { return true; }
 
-	MVKSemaphoreMTLFence(MVKDevice* device, const VkSemaphoreCreateInfo* pCreateInfo);
+	MVKSemaphoreMTLFence(MVKDevice* device,
+						 const VkSemaphoreCreateInfo* pCreateInfo,
+						 const VkExportMetalObjectCreateInfoEXT* pExportInfo,
+						 const VkImportMetalSharedEventInfoEXT* pImportInfo);
 
 	~MVKSemaphoreMTLFence() override;
 
@@ -235,7 +238,10 @@
 	void encodeDeferredSignal(id<MTLCommandBuffer> mtlCmdBuff, uint64_t deferToken) override;
 	bool isUsingCommandEncoding() override { return true; }
 
-	MVKSemaphoreMTLEvent(MVKDevice* device, const VkSemaphoreCreateInfo* pCreateInfo);
+	MVKSemaphoreMTLEvent(MVKDevice* device,
+						 const VkSemaphoreCreateInfo* pCreateInfo,
+						 const VkExportMetalObjectCreateInfoEXT* pExportInfo,
+						 const VkImportMetalSharedEventInfoEXT* pImportInfo);
 
 	~MVKSemaphoreMTLEvent() override;
 
@@ -258,7 +264,10 @@
 	void encodeDeferredSignal(id<MTLCommandBuffer> mtlCmdBuff, uint64_t) override;
 	bool isUsingCommandEncoding() override { return false; }
 
-	MVKSemaphoreEmulated(MVKDevice* device, const VkSemaphoreCreateInfo* pCreateInfo);
+	MVKSemaphoreEmulated(MVKDevice* device,
+						 const VkSemaphoreCreateInfo* pCreateInfo,
+						 const VkExportMetalObjectCreateInfoEXT* pExportInfo,
+						 const VkImportMetalSharedEventInfoEXT* pImportInfo);
 
 protected:
 	MVKSemaphoreImpl _blocker;
@@ -296,12 +305,7 @@
 
 #pragma mark Construction
 
-	MVKTimelineSemaphore(MVKDevice* device,
-						 const VkSemaphoreCreateInfo* pCreateInfo,
-						 const VkSemaphoreTypeCreateInfo* pTypeCreateInfo,
-						 const VkExportMetalObjectCreateInfoEXT* pExportInfo,
-						 const VkImportMetalSharedEventInfoEXT* pImportInfo)
-        : MVKSemaphore(device, pCreateInfo) {}
+	MVKTimelineSemaphore(MVKDevice* device, const VkSemaphoreCreateInfo* pCreateInfo) : MVKSemaphore(device, pCreateInfo) {}
 
 };
 
diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKSync.mm b/MoltenVK/MoltenVK/GPUObjects/MVKSync.mm
index 60af66b..29d36d3 100644
--- a/MoltenVK/MoltenVK/GPUObjects/MVKSync.mm
+++ b/MoltenVK/MoltenVK/GPUObjects/MVKSync.mm
@@ -103,9 +103,17 @@
 	encodeSignal(mtlCmdBuff, 0);
 }
 
-MVKSemaphoreMTLFence::MVKSemaphoreMTLFence(MVKDevice* device, const VkSemaphoreCreateInfo* pCreateInfo) :
-	MVKSemaphore(device, pCreateInfo),
-	_mtlFence([device->getMTLDevice() newFence]) {}		//retained
+MVKSemaphoreMTLFence::MVKSemaphoreMTLFence(MVKDevice* device,
+										   const VkSemaphoreCreateInfo* pCreateInfo,
+										   const VkExportMetalObjectCreateInfoEXT* pExportInfo,
+										   const VkImportMetalSharedEventInfoEXT* pImportInfo) : MVKSemaphore(device, pCreateInfo) {
+
+	_mtlFence = [device->getMTLDevice() newFence];		//retained
+
+	if ((pImportInfo && pImportInfo->mtlSharedEvent) || (pExportInfo && pExportInfo->exportObjectType == VK_EXPORT_METAL_OBJECT_TYPE_METAL_SHARED_EVENT_BIT_EXT)) {
+		setConfigurationResult(reportError(VK_ERROR_INITIALIZATION_FAILED, "vkCreateEvent(): MTLSharedEvent is not available with VkSemaphores that use MTLFence."));
+	}
+}
 
 MVKSemaphoreMTLFence::~MVKSemaphoreMTLFence() {
 	[_mtlFence release];
@@ -131,10 +139,23 @@
 	if (mtlCmdBuff) { [mtlCmdBuff encodeSignalEvent: _mtlEvent value: deferToken]; }
 }
 
-MVKSemaphoreMTLEvent::MVKSemaphoreMTLEvent(MVKDevice* device, const VkSemaphoreCreateInfo* pCreateInfo) :
-	MVKSemaphore(device, pCreateInfo),
-	_mtlEvent([device->getMTLDevice() newEvent]),	//retained
-	_mtlEventValue(1) {}
+MVKSemaphoreMTLEvent::MVKSemaphoreMTLEvent(MVKDevice* device,
+										   const VkSemaphoreCreateInfo* pCreateInfo,
+										   const VkExportMetalObjectCreateInfoEXT* pExportInfo,
+										   const VkImportMetalSharedEventInfoEXT* pImportInfo) : MVKSemaphore(device, pCreateInfo) {
+	// In order of preference, import a MTLSharedEvent,
+	// create a MTLSharedEvent, or create a MTLEvent.
+	if (pImportInfo && pImportInfo->mtlSharedEvent) {
+		_mtlEvent = [pImportInfo->mtlSharedEvent retain];		// retained
+		_mtlEventValue = pImportInfo->mtlSharedEvent.signaledValue + 1;
+	} else if (pExportInfo && pExportInfo->exportObjectType == VK_EXPORT_METAL_OBJECT_TYPE_METAL_SHARED_EVENT_BIT_EXT) {
+		_mtlEvent = [device->getMTLDevice() newSharedEvent];	//retained
+		_mtlEventValue = ((id<MTLSharedEvent>)_mtlEvent).signaledValue + 1;
+	} else {
+		_mtlEvent = [device->getMTLDevice() newEvent];			//retained
+		_mtlEventValue = 1;
+	}
+}
 
 MVKSemaphoreMTLEvent::~MVKSemaphoreMTLEvent() {
     [_mtlEvent release];
@@ -164,9 +185,17 @@
 	encodeSignal(mtlCmdBuff, 0);
 }
 
-MVKSemaphoreEmulated::MVKSemaphoreEmulated(MVKDevice* device, const VkSemaphoreCreateInfo* pCreateInfo) :
+MVKSemaphoreEmulated::MVKSemaphoreEmulated(MVKDevice* device,
+										   const VkSemaphoreCreateInfo* pCreateInfo,
+										   const VkExportMetalObjectCreateInfoEXT* pExportInfo,
+										   const VkImportMetalSharedEventInfoEXT* pImportInfo) :
 	MVKSemaphore(device, pCreateInfo),
-	_blocker(false, 1) {}
+	_blocker(false, 1) {
+
+	if ((pImportInfo && pImportInfo->mtlSharedEvent) || (pExportInfo && pExportInfo->exportObjectType == VK_EXPORT_METAL_OBJECT_TYPE_METAL_SHARED_EVENT_BIT_EXT)) {
+		setConfigurationResult(reportError(VK_ERROR_INITIALIZATION_FAILED, "vkCreateEvent(): MTLSharedEvent is not available with VkSemaphores that use CPU emulation."));
+	}
+}
 
 
 #pragma mark -
@@ -215,11 +244,10 @@
 														   const VkSemaphoreCreateInfo* pCreateInfo,
 														   const VkSemaphoreTypeCreateInfo* pTypeCreateInfo,
 														   const VkExportMetalObjectCreateInfoEXT* pExportInfo,
-														   const VkImportMetalSharedEventInfoEXT* pImportInfo) :
-	MVKTimelineSemaphore(device, pCreateInfo, pTypeCreateInfo, pExportInfo, pImportInfo) {
+														   const VkImportMetalSharedEventInfoEXT* pImportInfo) : MVKTimelineSemaphore(device, pCreateInfo) {
 
 	// Import or create a Metal event
-	_mtlEvent = (pImportInfo
+	_mtlEvent = (pImportInfo && pImportInfo->mtlSharedEvent
 				 ? [pImportInfo->mtlSharedEvent retain]
 				 : [device->getMTLDevice() newSharedEvent]);	//retained
 
@@ -299,10 +327,10 @@
 														   const VkSemaphoreTypeCreateInfo* pTypeCreateInfo,
 														   const VkExportMetalObjectCreateInfoEXT* pExportInfo,
 														   const VkImportMetalSharedEventInfoEXT* pImportInfo) :
-	MVKTimelineSemaphore(device, pCreateInfo, pTypeCreateInfo, pExportInfo, pImportInfo),
+	MVKTimelineSemaphore(device, pCreateInfo),
 	_value(pTypeCreateInfo ? pTypeCreateInfo->initialValue : 0) {
 
-	if (pExportInfo && pExportInfo->exportObjectType == VK_EXPORT_METAL_OBJECT_TYPE_METAL_SHARED_EVENT_BIT_EXT) {
+	if ((pImportInfo && pImportInfo->mtlSharedEvent) || (pExportInfo && pExportInfo->exportObjectType == VK_EXPORT_METAL_OBJECT_TYPE_METAL_SHARED_EVENT_BIT_EXT)) {
 		setConfigurationResult(reportError(VK_ERROR_INITIALIZATION_FAILED, "vkCreateEvent(): MTLSharedEvent is not available on this platform."));
 	}
 }