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."));
}
}