Incrased the number of image available semapores to parallel frames + 1 to fix VUID-vkAcquireNextImageKHR-semaphore-01779 due to semaphores still being in use when acquiring the next image.

This commit is contained in:
Patrick 2024-06-27 20:39:33 +02:00
parent d41e3588fd
commit 473a3aafab
2 changed files with 9 additions and 5 deletions

View File

@ -34,6 +34,7 @@ private:
std::uint32_t mCurrentImageIdx = INVALID_IMAGE_INDEX;
unsigned mCurrentFrameIdx = 0;
unsigned mCurrentSemaphoreIdx = 0;
ObjectPtr<Window> mWindow;
std::vector<ObjectPtr<Image>> mImages;
std::vector<ObjectPtr<Semaphore>> mImageAvailableSemaphores;
@ -45,8 +46,8 @@ public:
~Swapchain() noexcept override;
[[nodiscard]] const ObjectPtr<Window>& getWindow() const noexcept { return mWindow; }
[[nodiscard]] std::size_t getNumParallelFrames() const noexcept { return mImageAvailableSemaphores.size(); }
[[nodiscard]] const ObjectPtr<Semaphore>& getCurrentAvailableSemaphore() const noexcept { return mImageAvailableSemaphores[mCurrentFrameIdx]; }
[[nodiscard]] std::size_t getNumParallelFrames() const noexcept { return mImageAvailableSemaphores.size() - 1; }
[[nodiscard]] const ObjectPtr<Semaphore>& getCurrentAvailableSemaphore() const noexcept { return mImageAvailableSemaphores[mCurrentSemaphoreIdx]; }
[[nodiscard]] unsigned getCurrentFrameIdx() const noexcept { return mCurrentFrameIdx; }
[[nodiscard]] const std::vector<ObjectPtr<Image>>& getImages() const noexcept { return mImages; }
[[nodiscard]] std::uint32_t getCurrentImageIdx() const noexcept { return mCurrentImageIdx; }

View File

@ -97,8 +97,9 @@ Swapchain::Swapchain(ObjectPtr<Device> owner, SwapchainCreationArgs args)
: super_t(std::move(owner)), mWindow(std::move(args.window)), mImageUsage(args.imageUsage)
{
MIJIN_ASSERT(mWindow, "Invalid SwapchainCreationArgs: window cannot be NULL.");
MIJIN_ASSERT_FATAL(args.parallelFrames > 0, "Invalid SwapchainCreationArgs: parallelFrames must be > 0.");
mImageAvailableSemaphores.resize(args.parallelFrames);
mImageAvailableSemaphores.resize(args.parallelFrames - 1);
recreate();
}
Swapchain::~Swapchain() noexcept
@ -131,6 +132,8 @@ mijin::Task<> Swapchain::c_present(const PresentArgs& args)
// next image, please
mCurrentFrameIdx = (mCurrentFrameIdx + 1) % static_cast<int>(getNumParallelFrames());
mCurrentSemaphoreIdx = (mCurrentSemaphoreIdx + 1) % static_cast<int>(mImageAvailableSemaphores.size());
// logMsg("frame: {}, semaphore: {}", mCurrentFrameIdx, mCurrentSemaphoreIdx);
if (result == vk::Result::eSuccess) {
co_await c_acquireImage();
}
@ -280,7 +283,7 @@ void Swapchain::acquireImage()
try
{
const vk::ResultValue<std::uint32_t> result = getOwner()->getVkHandle().acquireNextImageKHR(mHandle, std::numeric_limits<std::uint64_t>::max(), *mImageAvailableSemaphores[mCurrentFrameIdx]);
const vk::ResultValue<std::uint32_t> result = getOwner()->getVkHandle().acquireNextImageKHR(mHandle, std::numeric_limits<std::uint64_t>::max(), *getCurrentAvailableSemaphore());
if (result.result != vk::Result::eSuccess)
{
assert(result.result == vk::Result::eSuboptimalKHR);
@ -302,7 +305,7 @@ mijin::Task<> Swapchain::c_acquireImage()
vk::ResultValue<std::uint32_t> result = vk::ResultValue<std::uint32_t>(vk::Result::eTimeout, 0);
while(true)
{
result = getOwner()->getVkHandle().acquireNextImageKHR(mHandle, 0, *mImageAvailableSemaphores[mCurrentFrameIdx]);
result = getOwner()->getVkHandle().acquireNextImageKHR(mHandle, 0, *getCurrentAvailableSemaphore());
if (result.result != vk::Result::eTimeout && result.result != vk::Result::eNotReady) {
break;
}