mirror of
https://github.com/KytyPS5/KytyPS5.git
synced 2026-08-03 11:23:49 +00:00
44 lines
1.2 KiB
C++
44 lines
1.2 KiB
C++
#ifndef EMULATOR_SRC_GRAPHICS_HOST_GPU_RENDERER_MASTERSEMAPHORE_H_
|
|
#define EMULATOR_SRC_GRAPHICS_HOST_GPU_RENDERER_MASTERSEMAPHORE_H_
|
|
|
|
#include "common/common.h"
|
|
#include "graphics/host_gpu/vulkanCommon.h"
|
|
|
|
#include <atomic>
|
|
|
|
namespace Libs::Graphics {
|
|
|
|
struct GraphicContext;
|
|
|
|
class MasterSemaphore {
|
|
public:
|
|
explicit MasterSemaphore(GraphicContext& graphics);
|
|
~MasterSemaphore();
|
|
KYTY_CLASS_NO_COPY(MasterSemaphore);
|
|
|
|
[[nodiscard]] uint64_t CurrentTick() const noexcept {
|
|
return m_current_tick.load(std::memory_order_acquire);
|
|
}
|
|
[[nodiscard]] uint64_t KnownGpuTick() const noexcept {
|
|
return m_gpu_tick.load(std::memory_order_acquire);
|
|
}
|
|
[[nodiscard]] bool IsFree(uint64_t tick) const noexcept { return KnownGpuTick() >= tick; }
|
|
[[nodiscard]] uint64_t NextTick() noexcept {
|
|
return m_current_tick.fetch_add(1, std::memory_order_release);
|
|
}
|
|
[[nodiscard]] vk::Semaphore Handle() const noexcept { return m_semaphore; }
|
|
|
|
void Refresh();
|
|
void Wait(uint64_t tick);
|
|
|
|
private:
|
|
GraphicContext& m_graphics;
|
|
vk::Semaphore m_semaphore = nullptr;
|
|
std::atomic<uint64_t> m_gpu_tick {0};
|
|
std::atomic<uint64_t> m_current_tick {1};
|
|
};
|
|
|
|
} // namespace Libs::Graphics
|
|
|
|
#endif // EMULATOR_SRC_GRAPHICS_HOST_GPU_RENDERER_MASTERSEMAPHORE_H_
|