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.
This commit is contained in:
parent
0548b750db
commit
e1b872479a
@ -3400,9 +3400,7 @@ MVKSemaphore* MVKDevice::createSemaphore(const VkSemaphoreCreateInfo* pCreateInf
|
||||
}
|
||||
}
|
||||
|
||||
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 @@ MVKSemaphore* MVKDevice::createSemaphore(const VkSemaphoreCreateInfo* pCreateInf
|
||||
}
|
||||
} 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -213,7 +213,10 @@ public:
|
||||
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 @@ public:
|
||||
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 @@ public:
|
||||
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 @@ public:
|
||||
|
||||
#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) {}
|
||||
|
||||
};
|
||||
|
||||
|
@ -103,9 +103,17 @@ void MVKSemaphoreMTLFence::encodeDeferredSignal(id<MTLCommandBuffer> mtlCmdBuff,
|
||||
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 @@ void MVKSemaphoreMTLEvent::encodeDeferredSignal(id<MTLCommandBuffer> mtlCmdBuff,
|
||||
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 @@ void MVKSemaphoreEmulated::encodeDeferredSignal(id<MTLCommandBuffer> mtlCmdBuff,
|
||||
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 @@ MVKTimelineSemaphoreMTLEvent::MVKTimelineSemaphoreMTLEvent(MVKDevice* device,
|
||||
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 @@ MVKTimelineSemaphoreEmulated::MVKTimelineSemaphoreEmulated(MVKDevice* device,
|
||||
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."));
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user