98 lines
2.0 KiB
C++
98 lines
2.0 KiB
C++
/* Copyright (c) 2019-2025, Arm Limited and Contributors
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 the "License";
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
#include "fence_pool.h"
|
|
|
|
#include "core/device.h"
|
|
|
|
namespace vkb
|
|
{
|
|
FencePool::FencePool(vkb::core::DeviceC &device) :
|
|
device{device}
|
|
{
|
|
}
|
|
|
|
FencePool::~FencePool()
|
|
{
|
|
wait();
|
|
reset();
|
|
|
|
// Destroy all fences
|
|
for (VkFence fence : fences)
|
|
{
|
|
vkDestroyFence(device.get_handle(), fence, nullptr);
|
|
}
|
|
|
|
fences.clear();
|
|
}
|
|
|
|
VkFence FencePool::request_fence()
|
|
{
|
|
// Check if there is an available fence
|
|
if (active_fence_count < fences.size())
|
|
{
|
|
return fences[active_fence_count++];
|
|
}
|
|
|
|
VkFence fence{VK_NULL_HANDLE};
|
|
|
|
VkFenceCreateInfo create_info{VK_STRUCTURE_TYPE_FENCE_CREATE_INFO};
|
|
|
|
VkResult result = vkCreateFence(device.get_handle(), &create_info, nullptr, &fence);
|
|
|
|
if (result != VK_SUCCESS)
|
|
{
|
|
throw std::runtime_error("Failed to create fence.");
|
|
}
|
|
|
|
fences.push_back(fence);
|
|
|
|
active_fence_count++;
|
|
|
|
return fences.back();
|
|
}
|
|
|
|
VkResult FencePool::wait(uint64_t timeout) const
|
|
{
|
|
if (active_fence_count < 1 || fences.empty())
|
|
{
|
|
return VK_SUCCESS;
|
|
}
|
|
|
|
return vkWaitForFences(device.get_handle(), active_fence_count, fences.data(), true, timeout);
|
|
}
|
|
|
|
VkResult FencePool::reset()
|
|
{
|
|
if (active_fence_count < 1 || fences.empty())
|
|
{
|
|
return VK_SUCCESS;
|
|
}
|
|
|
|
VkResult result = vkResetFences(device.get_handle(), active_fence_count, fences.data());
|
|
|
|
if (result != VK_SUCCESS)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
active_fence_count = 0;
|
|
|
|
return VK_SUCCESS;
|
|
}
|
|
} // namespace vkb
|