Fix crash when signalling swapchain semaphore using MTLEvent.
Clear out some dead swapchain image code.
This commit is contained in:
parent
a87ef6bc77
commit
98d59025f3
@ -28,6 +28,7 @@ Released TBD
|
|||||||
- Ensure Vulkan loader magic number is set every time before returning any dispatchable Vulkan handle.
|
- Ensure Vulkan loader magic number is set every time before returning any dispatchable Vulkan handle.
|
||||||
- Fix crash when `VkDeviceCreateInfo` specifies queue families out of numerical order.
|
- Fix crash when `VkDeviceCreateInfo` specifies queue families out of numerical order.
|
||||||
- Fix crash in `vkDestroyPipelineLayout()`.
|
- Fix crash in `vkDestroyPipelineLayout()`.
|
||||||
|
- Fix crash when signalling swapchain semaphore using `MTLEvent`.
|
||||||
- `vkCmdBlitImage()` support format component swizzling.
|
- `vkCmdBlitImage()` support format component swizzling.
|
||||||
- `vkCmdClearImage()` set error if attempt made to clear 1D image, and fix validation of depth attachment formats.
|
- `vkCmdClearImage()` set error if attempt made to clear 1D image, and fix validation of depth attachment formats.
|
||||||
- `vkCreateRenderPass()` return `VK_ERROR_FORMAT_NOT_SUPPORTED` if format not supported.
|
- `vkCreateRenderPass()` return `VK_ERROR_FORMAT_NOT_SUPPORTED` if format not supported.
|
||||||
|
@ -414,22 +414,6 @@ public:
|
|||||||
/** Binds this resource according to the specified bind information. */
|
/** Binds this resource according to the specified bind information. */
|
||||||
VkResult bindDeviceMemory2(const void* pBindInfo) override;
|
VkResult bindDeviceMemory2(const void* pBindInfo) override;
|
||||||
|
|
||||||
/** Returns the encompassing swapchain. */
|
|
||||||
inline MVKSwapchain* getSwapchain() { return _swapchain; }
|
|
||||||
|
|
||||||
/** Returns the index of this image within the encompassing swapchain. */
|
|
||||||
inline uint32_t getSwapchainIndex() { return _swapchainIndex; }
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Registers a semaphore and/or fence that will be signaled when this image becomes available.
|
|
||||||
* This function accepts both a semaphore and a fence, and either none, one, or both may be provided.
|
|
||||||
* If this image is available already, the semaphore and fence are immediately signaled.
|
|
||||||
*/
|
|
||||||
void signalWhenAvailable(MVKSemaphore* semaphore, MVKFence* fence);
|
|
||||||
|
|
||||||
/** Returns the availability status of this image, relative to other images in the swapchain. */
|
|
||||||
const MVKSwapchainImageAvailability* getAvailability();
|
|
||||||
|
|
||||||
|
|
||||||
#pragma mark Metal
|
#pragma mark Metal
|
||||||
|
|
||||||
|
@ -1259,14 +1259,6 @@ VkResult MVKSwapchainImage::bindDeviceMemory2(const void* pBindInfo) {
|
|||||||
return VK_SUCCESS;
|
return VK_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
void MVKSwapchainImage::signalWhenAvailable(MVKSemaphore* semaphore, MVKFence* fence) {
|
|
||||||
_swapchain->signalWhenAvailable( _swapchainIndex, semaphore, fence );
|
|
||||||
}
|
|
||||||
|
|
||||||
const MVKSwapchainImageAvailability* MVKSwapchainImage::getAvailability() {
|
|
||||||
return _swapchain->getAvailability( _swapchainIndex );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#pragma mark Metal
|
#pragma mark Metal
|
||||||
|
|
||||||
|
@ -87,9 +87,7 @@ public:
|
|||||||
*/
|
*/
|
||||||
void signalWhenAvailable(uint32_t imageIndex, MVKSemaphore* semaphore, MVKFence* fence);
|
void signalWhenAvailable(uint32_t imageIndex, MVKSemaphore* semaphore, MVKFence* fence);
|
||||||
|
|
||||||
/** Returns the availability status of the image at the given index, relative to other images in the swapchain. */
|
|
||||||
const MVKSwapchainImageAvailability* getAvailability(uint32_t imageIndex);
|
|
||||||
|
|
||||||
#pragma mark Metal
|
#pragma mark Metal
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -136,18 +136,18 @@ void MVKSwapchain::makeAvailable(uint32_t imgIdx) {
|
|||||||
|
|
||||||
MVKSwapchainSignaler signaler;
|
MVKSwapchainSignaler signaler;
|
||||||
if (availability.isAvailable) {
|
if (availability.isAvailable) {
|
||||||
// If this image is now available, signal the semaphore and fence that were associated
|
// If this image is available, signal the semaphore and fence that were associated
|
||||||
// with the last time this image was acquired while available. This is a workaround for
|
// with the last time this image was acquired while available. This is a workaround for
|
||||||
// when an app uses a single semaphore or fence for more than one swapchain image.
|
// when an app uses a single semaphore or fence for more than one swapchain image.
|
||||||
// Becuase the semaphore or fence will be signaled by more than one image, it will
|
// Becuase the semaphore or fence will be signaled by more than one image, it will
|
||||||
// get out of sync, and the final use of the image would not be signaled as a result.
|
// get out of sync, and the final use of the image would not be signaled as a result.
|
||||||
|
|
||||||
signaler = _imageAvailability[imgIdx].preSignaled;
|
signaler = _imageAvailability[imgIdx].preSignaled;
|
||||||
} else {
|
} else {
|
||||||
// If this image is not yet available, extract and signal the first semaphore and fence.
|
// If this image is not yet available, extract and signal the first semaphore and fence.
|
||||||
|
auto& imgSignalers = _imageAvailability[imgIdx].signalers;
|
||||||
signaler = _imageAvailability[imgIdx].signalers.front();
|
auto sigIter = imgSignalers.begin();
|
||||||
_imageAvailability[imgIdx].signalers.erase( _imageAvailability[imgIdx].signalers.begin() );
|
signaler = *sigIter;
|
||||||
|
imgSignalers.erase(sigIter);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Signal the semaphore and fence, and let them know they are no longer being tracked.
|
// Signal the semaphore and fence, and let them know they are no longer being tracked.
|
||||||
@ -191,8 +191,11 @@ void MVKSwapchain::signal(MVKSwapchainSignaler& signaler) {
|
|||||||
// If present, signal the semaphore for the first waiter for the given image.
|
// If present, signal the semaphore for the first waiter for the given image.
|
||||||
void MVKSwapchain::signalOnDevice(uint32_t imgIdx, id<MTLCommandBuffer> mtlCmdBuff) {
|
void MVKSwapchain::signalOnDevice(uint32_t imgIdx, id<MTLCommandBuffer> mtlCmdBuff) {
|
||||||
lock_guard<mutex> lock(_availabilityLock);
|
lock_guard<mutex> lock(_availabilityLock);
|
||||||
MVKSemaphore* mvkSem = _imageAvailability[imgIdx].signalers.front().first;
|
auto& imgSignalers = _imageAvailability[imgIdx].signalers;
|
||||||
if (mvkSem) { mvkSem->encodeSignal(mtlCmdBuff); }
|
if ( !imgSignalers.empty() ) {
|
||||||
|
MVKSemaphore* mvkSem = imgSignalers.front().first;
|
||||||
|
if (mvkSem) { mvkSem->encodeSignal(mtlCmdBuff); }
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Tell the semaphore and fence that they are being tracked for future signaling.
|
// Tell the semaphore and fence that they are being tracked for future signaling.
|
||||||
@ -207,13 +210,6 @@ void MVKSwapchain::unmarkAsTracked(MVKSwapchainSignaler& signaler) {
|
|||||||
if (signaler.second) { signaler.second->release(); }
|
if (signaler.second) { signaler.second->release(); }
|
||||||
}
|
}
|
||||||
|
|
||||||
const MVKSwapchainImageAvailability* MVKSwapchain::getAvailability(uint32_t imageIndex) {
|
|
||||||
lock_guard<mutex> lock(_availabilityLock);
|
|
||||||
auto& availability = _imageAvailability[imageIndex].status;
|
|
||||||
availability.waitCount = (uint32_t)_imageAvailability[imageIndex].signalers.size();
|
|
||||||
return &availability;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#pragma mark Rendering
|
#pragma mark Rendering
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user