Merge pull request #1890 from billhollings/fix-display-timing-race-condition
Fix race condition when updating values in VkPastPresentationTimingGOOGLE.
This commit is contained in:
commit
dfc0af84aa
@ -24,6 +24,7 @@ Released TBD
|
|||||||
- Support separate depth and stencil attachments during dynamic rendering.
|
- Support separate depth and stencil attachments during dynamic rendering.
|
||||||
- Deprecate the obsolete and non-standard `VK_MVK_moltenvk` extension.
|
- Deprecate the obsolete and non-standard `VK_MVK_moltenvk` extension.
|
||||||
- Fix memory leak when waiting on timeline semaphores.
|
- Fix memory leak when waiting on timeline semaphores.
|
||||||
|
- Fix race condition when updating values in `VkPastPresentationTimingGOOGLE`.
|
||||||
- Ensure shaders that use `PhysicalStorageBufferAddresses` encode the use of the associated `MTLBuffer`.
|
- Ensure shaders that use `PhysicalStorageBufferAddresses` encode the use of the associated `MTLBuffer`.
|
||||||
- Disable pipeline cache compression prior to macOS 10.15 and iOS/tvOS 13.0.
|
- Disable pipeline cache compression prior to macOS 10.15 and iOS/tvOS 13.0.
|
||||||
- Add `MVK_ENABLE_EXPLICIT_LOD_WORKAROUND` environment variable to selectively
|
- Add `MVK_ENABLE_EXPLICIT_LOD_WORKAROUND` environment variable to selectively
|
||||||
|
@ -449,7 +449,7 @@ public:
|
|||||||
#pragma mark Metal
|
#pragma mark Metal
|
||||||
|
|
||||||
/** Presents the contained drawable to the OS. */
|
/** Presents the contained drawable to the OS. */
|
||||||
void presentCAMetalDrawable(id<MTLCommandBuffer> mtlCmdBuff, MVKImagePresentInfo& presentInfo);
|
void presentCAMetalDrawable(id<MTLCommandBuffer> mtlCmdBuff, MVKImagePresentInfo presentInfo);
|
||||||
|
|
||||||
|
|
||||||
#pragma mark Construction
|
#pragma mark Construction
|
||||||
@ -463,7 +463,7 @@ protected:
|
|||||||
friend MVKSwapchain;
|
friend MVKSwapchain;
|
||||||
|
|
||||||
id<CAMetalDrawable> getCAMetalDrawable() override;
|
id<CAMetalDrawable> getCAMetalDrawable() override;
|
||||||
void addPresentedHandler(id<CAMetalDrawable> mtlDrawable, MVKImagePresentInfo& presentInfo);
|
void addPresentedHandler(id<CAMetalDrawable> mtlDrawable, MVKImagePresentInfo presentInfo);
|
||||||
void releaseMetalDrawable();
|
void releaseMetalDrawable();
|
||||||
MVKSwapchainImageAvailability getAvailability();
|
MVKSwapchainImageAvailability getAvailability();
|
||||||
void makeAvailable(const MVKSwapchainSignaler& signaler);
|
void makeAvailable(const MVKSwapchainSignaler& signaler);
|
||||||
|
@ -1294,8 +1294,9 @@ id<CAMetalDrawable> MVKPresentableSwapchainImage::getCAMetalDrawable() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Present the drawable and make myself available only once the command buffer has completed.
|
// Present the drawable and make myself available only once the command buffer has completed.
|
||||||
|
// Pass MVKImagePresentInfo by value because it may not exist when the callback runs.
|
||||||
void MVKPresentableSwapchainImage::presentCAMetalDrawable(id<MTLCommandBuffer> mtlCmdBuff,
|
void MVKPresentableSwapchainImage::presentCAMetalDrawable(id<MTLCommandBuffer> mtlCmdBuff,
|
||||||
MVKImagePresentInfo& presentInfo) {
|
MVKImagePresentInfo presentInfo) {
|
||||||
lock_guard<mutex> lock(_availabilityLock);
|
lock_guard<mutex> lock(_availabilityLock);
|
||||||
|
|
||||||
_swapchain->willPresentSurface(getMTLTexture(0), mtlCmdBuff);
|
_swapchain->willPresentSurface(getMTLTexture(0), mtlCmdBuff);
|
||||||
@ -1357,8 +1358,9 @@ void MVKPresentableSwapchainImage::presentCAMetalDrawable(id<MTLCommandBuffer> m
|
|||||||
signalPresentationSemaphore(signaler, mtlCmdBuff);
|
signalPresentationSemaphore(signaler, mtlCmdBuff);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Pass MVKImagePresentInfo by value because it may not exist when the callback runs.
|
||||||
void MVKPresentableSwapchainImage::addPresentedHandler(id<CAMetalDrawable> mtlDrawable,
|
void MVKPresentableSwapchainImage::addPresentedHandler(id<CAMetalDrawable> mtlDrawable,
|
||||||
MVKImagePresentInfo& presentInfo) {
|
MVKImagePresentInfo presentInfo) {
|
||||||
#if !MVK_OS_SIMULATOR
|
#if !MVK_OS_SIMULATOR
|
||||||
if ([mtlDrawable respondsToSelector: @selector(addPresentedHandler:)]) {
|
if ([mtlDrawable respondsToSelector: @selector(addPresentedHandler:)]) {
|
||||||
retain(); // Ensure this image is not destroyed while awaiting presentation
|
retain(); // Ensure this image is not destroyed while awaiting presentation
|
||||||
|
@ -121,7 +121,7 @@ protected:
|
|||||||
void willPresentSurface(id<MTLTexture> mtlTexture, id<MTLCommandBuffer> mtlCmdBuff);
|
void willPresentSurface(id<MTLTexture> mtlTexture, id<MTLCommandBuffer> mtlCmdBuff);
|
||||||
void renderWatermark(id<MTLTexture> mtlTexture, id<MTLCommandBuffer> mtlCmdBuff);
|
void renderWatermark(id<MTLTexture> mtlTexture, id<MTLCommandBuffer> mtlCmdBuff);
|
||||||
void markFrameInterval();
|
void markFrameInterval();
|
||||||
void recordPresentTime(MVKImagePresentInfo& presentInfo, uint64_t actualPresentTime = 0);
|
void recordPresentTime(const MVKImagePresentInfo& presentInfo, uint64_t actualPresentTime = 0);
|
||||||
|
|
||||||
CAMetalLayer* _mtlLayer = nil;
|
CAMetalLayer* _mtlLayer = nil;
|
||||||
MVKWatermark* _licenseWatermark = nullptr;
|
MVKWatermark* _licenseWatermark = nullptr;
|
||||||
|
@ -557,7 +557,7 @@ VkResult MVKSwapchain::getPastPresentationTiming(uint32_t *pCount, VkPastPresent
|
|||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
void MVKSwapchain::recordPresentTime(MVKImagePresentInfo& presentInfo, uint64_t actualPresentTime) {
|
void MVKSwapchain::recordPresentTime(const MVKImagePresentInfo& presentInfo, uint64_t actualPresentTime) {
|
||||||
std::lock_guard<std::mutex> lock(_presentHistoryLock);
|
std::lock_guard<std::mutex> lock(_presentHistoryLock);
|
||||||
if (_presentHistoryCount < kMaxPresentationHistory) {
|
if (_presentHistoryCount < kMaxPresentationHistory) {
|
||||||
_presentHistoryCount++;
|
_presentHistoryCount++;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user