forked from suyu/suyu
99ceb03a1c
This formats all copyright comments according to SPDX formatting guidelines. Additionally, this resolves the remaining GPLv2 only licensed files by relicensing them to GPLv2.0-or-later.
45 lines
1.5 KiB
C++
45 lines
1.5 KiB
C++
// SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project
|
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
|
|
|
#include <thread>
|
|
|
|
#include "common/settings.h"
|
|
#include "video_core/renderer_vulkan/vk_master_semaphore.h"
|
|
#include "video_core/vulkan_common/vulkan_device.h"
|
|
#include "video_core/vulkan_common/vulkan_wrapper.h"
|
|
|
|
namespace Vulkan {
|
|
|
|
MasterSemaphore::MasterSemaphore(const Device& device) {
|
|
static constexpr VkSemaphoreTypeCreateInfoKHR semaphore_type_ci{
|
|
.sType = VK_STRUCTURE_TYPE_SEMAPHORE_TYPE_CREATE_INFO_KHR,
|
|
.pNext = nullptr,
|
|
.semaphoreType = VK_SEMAPHORE_TYPE_TIMELINE_KHR,
|
|
.initialValue = 0,
|
|
};
|
|
static constexpr VkSemaphoreCreateInfo semaphore_ci{
|
|
.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO,
|
|
.pNext = &semaphore_type_ci,
|
|
.flags = 0,
|
|
};
|
|
semaphore = device.GetLogical().CreateSemaphore(semaphore_ci);
|
|
|
|
if (!Settings::values.renderer_debug) {
|
|
return;
|
|
}
|
|
// 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
|
|
// a separate thread waiting for each timeline semaphore value.
|
|
debug_thread = std::jthread([this](std::stop_token stop_token) {
|
|
u64 counter = 0;
|
|
while (!stop_token.stop_requested()) {
|
|
if (semaphore.Wait(counter, 10'000'000)) {
|
|
++counter;
|
|
}
|
|
}
|
|
});
|
|
}
|
|
|
|
MasterSemaphore::~MasterSemaphore() = default;
|
|
|
|
} // namespace Vulkan
|