Merge pull request #6506 from ReinUsesLisp/master-semaphore-jthread
vk_master_semaphore: Use jthread for debug thread
This commit is contained in:
commit
faf57c183f
|
@ -2,8 +2,7 @@
|
||||||
// Licensed under GPLv2 or any later version
|
// Licensed under GPLv2 or any later version
|
||||||
// Refer to the license.txt file included.
|
// Refer to the license.txt file included.
|
||||||
|
|
||||||
#include <atomic>
|
#include <thread>
|
||||||
#include <chrono>
|
|
||||||
|
|
||||||
#include "common/settings.h"
|
#include "common/settings.h"
|
||||||
#include "video_core/renderer_vulkan/vk_master_semaphore.h"
|
#include "video_core/renderer_vulkan/vk_master_semaphore.h"
|
||||||
|
@ -12,8 +11,6 @@
|
||||||
|
|
||||||
namespace Vulkan {
|
namespace Vulkan {
|
||||||
|
|
||||||
using namespace std::chrono_literals;
|
|
||||||
|
|
||||||
MasterSemaphore::MasterSemaphore(const Device& device) {
|
MasterSemaphore::MasterSemaphore(const Device& device) {
|
||||||
static constexpr VkSemaphoreTypeCreateInfoKHR semaphore_type_ci{
|
static constexpr VkSemaphoreTypeCreateInfoKHR semaphore_type_ci{
|
||||||
.sType = VK_STRUCTURE_TYPE_SEMAPHORE_TYPE_CREATE_INFO_KHR,
|
.sType = VK_STRUCTURE_TYPE_SEMAPHORE_TYPE_CREATE_INFO_KHR,
|
||||||
|
@ -34,9 +31,9 @@ MasterSemaphore::MasterSemaphore(const Device& device) {
|
||||||
// Validation layers have a bug where they fail to track resource usage when using timeline
|
// Validation layers have a bug where they fail to track resource usage when using timeline
|
||||||
// semaphores and synchronizing with GetSemaphoreCounterValueKHR. To workaround this issue, have
|
// semaphores and synchronizing with GetSemaphoreCounterValueKHR. To workaround this issue, have
|
||||||
// a separate thread waiting for each timeline semaphore value.
|
// a separate thread waiting for each timeline semaphore value.
|
||||||
debug_thread = std::thread([this] {
|
debug_thread = std::jthread([this](std::stop_token stop_token) {
|
||||||
u64 counter = 0;
|
u64 counter = 0;
|
||||||
while (!shutdown) {
|
while (!stop_token.stop_requested()) {
|
||||||
if (semaphore.Wait(counter, 10'000'000)) {
|
if (semaphore.Wait(counter, 10'000'000)) {
|
||||||
++counter;
|
++counter;
|
||||||
}
|
}
|
||||||
|
@ -44,13 +41,6 @@ MasterSemaphore::MasterSemaphore(const Device& device) {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
MasterSemaphore::~MasterSemaphore() {
|
MasterSemaphore::~MasterSemaphore() = default;
|
||||||
shutdown = true;
|
|
||||||
|
|
||||||
// This thread might not be started
|
|
||||||
if (debug_thread.joinable()) {
|
|
||||||
debug_thread.join();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace Vulkan
|
} // namespace Vulkan
|
||||||
|
|
|
@ -65,11 +65,10 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
vk::Semaphore semaphore; ///< Timeline semaphore.
|
vk::Semaphore semaphore; ///< Timeline semaphore.
|
||||||
std::atomic<u64> gpu_tick{0}; ///< Current known GPU tick.
|
std::atomic<u64> gpu_tick{0}; ///< Current known GPU tick.
|
||||||
std::atomic<u64> current_tick{1}; ///< Current logical tick.
|
std::atomic<u64> current_tick{1}; ///< Current logical tick.
|
||||||
std::atomic<bool> shutdown{false}; ///< True when the object is being destroyed.
|
std::jthread debug_thread; ///< Debug thread to workaround validation layer bugs.
|
||||||
std::thread debug_thread; ///< Debug thread to workaround validation layer bugs.
|
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace Vulkan
|
} // namespace Vulkan
|
||||||
|
|
Loading…
Reference in New Issue