#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 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 m_gpu_tick {0}; std::atomic m_current_tick {1}; }; } // namespace Libs::Graphics #endif // EMULATOR_SRC_GRAPHICS_HOST_GPU_RENDERER_MASTERSEMAPHORE_H_