Support VK_PRESENT_MODE_IMMEDIATE_KHR if VkPresentTimeGOOGLE::desiredPresentTime is zero.

- [MTLDrawable presentAtTime:] syncs to display vsync. To support
  VK_PRESENT_MODE_IMMEDIATE_KHR while using VkPresentTimeGOOGLE::presentID,
  only call presentAtTime: if VkPresentTimeGOOGLE::desiredPresentTime has
  been explicitly set to a non-zero value.
- Clarify initially clearing MVKImagePresentInfo to all zeros.
This commit is contained in:
Bill Hollings 2023-06-05 19:17:10 -04:00
parent 0332055cff
commit 6fb53471b1
3 changed files with 4 additions and 4 deletions

View File

@ -19,6 +19,7 @@ MoltenVK 1.2.5
Released TBD Released TBD
- Ensure non-dispatch compute commands don't interfere with compute encoding state used by dispatch commands. - Ensure non-dispatch compute commands don't interfere with compute encoding state used by dispatch commands.
- Support `VK_PRESENT_MODE_IMMEDIATE_KHR` if `VkPresentTimeGOOGLE::desiredPresentTime` is zero.
- Add support for `VK_PRESENT_MODE_IMMEDIATE_KHR` to macOS Cube demo. - Add support for `VK_PRESENT_MODE_IMMEDIATE_KHR` to macOS Cube demo.

View File

@ -1313,8 +1313,9 @@ void MVKPresentableSwapchainImage::presentCAMetalDrawable(id<MTLCommandBuffer> m
mtlDrwbl.layer.displaySyncEnabledMVK = (presentInfo.presentMode != VK_PRESENT_MODE_IMMEDIATE_KHR); mtlDrwbl.layer.displaySyncEnabledMVK = (presentInfo.presentMode != VK_PRESENT_MODE_IMMEDIATE_KHR);
} }
if (presentInfo.hasPresentTime) { if (presentInfo.hasPresentTime) {
// Convert from nsecs to seconds for Metal
addPresentedHandler(mtlDrwbl, presentInfo); addPresentedHandler(mtlDrwbl, presentInfo);
}
if (presentInfo.desiredPresentTime) {
[mtlDrwbl presentAtTime: (double)presentInfo.desiredPresentTime * 1.0e-9]; [mtlDrwbl presentAtTime: (double)presentInfo.desiredPresentTime * 1.0e-9];
} else { } else {
[mtlDrwbl present]; [mtlDrwbl present];

View File

@ -621,7 +621,7 @@ MVKQueuePresentSurfaceSubmission::MVKQueuePresentSurfaceSubmission(MVKQueue* que
_presentInfo.reserve(scCnt); _presentInfo.reserve(scCnt);
for (uint32_t scIdx = 0; scIdx < scCnt; scIdx++) { for (uint32_t scIdx = 0; scIdx < scCnt; scIdx++) {
MVKSwapchain* mvkSC = (MVKSwapchain*)pPresentInfo->pSwapchains[scIdx]; MVKSwapchain* mvkSC = (MVKSwapchain*)pPresentInfo->pSwapchains[scIdx];
MVKImagePresentInfo presentInfo = {}; MVKImagePresentInfo presentInfo = {}; // Start with everything zeroed
presentInfo.presentableImage = mvkSC->getPresentableImage(pPresentInfo->pImageIndices[scIdx]); presentInfo.presentableImage = mvkSC->getPresentableImage(pPresentInfo->pImageIndices[scIdx]);
presentInfo.presentMode = pPresentModes ? pPresentModes[scIdx] : VK_PRESENT_MODE_MAX_ENUM_KHR; presentInfo.presentMode = pPresentModes ? pPresentModes[scIdx] : VK_PRESENT_MODE_MAX_ENUM_KHR;
presentInfo.fence = pFences ? (MVKFence*)pFences[scIdx] : nullptr; presentInfo.fence = pFences ? (MVKFence*)pFences[scIdx] : nullptr;
@ -629,8 +629,6 @@ MVKQueuePresentSurfaceSubmission::MVKQueuePresentSurfaceSubmission(MVKQueue* que
presentInfo.hasPresentTime = true; presentInfo.hasPresentTime = true;
presentInfo.presentID = pPresentTimes[scIdx].presentID; presentInfo.presentID = pPresentTimes[scIdx].presentID;
presentInfo.desiredPresentTime = pPresentTimes[scIdx].desiredPresentTime; presentInfo.desiredPresentTime = pPresentTimes[scIdx].desiredPresentTime;
} else {
presentInfo.hasPresentTime = false;
} }
_presentInfo.push_back(presentInfo); _presentInfo.push_back(presentInfo);
VkResult scRslt = mvkSC->getSurfaceStatus(); VkResult scRslt = mvkSC->getSurfaceStatus();