conductor.h 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
  2. // SPDX-License-Identifier: GPL-2.0-or-later
  3. #pragma once
  4. #include <memory>
  5. #include <unordered_map>
  6. #include "common/common_types.h"
  7. #include "common/polyfill_thread.h"
  8. #include "common/thread.h"
  9. #include "core/hle/service/vi/vsync_manager.h"
  10. namespace Core {
  11. class System;
  12. }
  13. namespace Core::Timing {
  14. struct EventType;
  15. }
  16. namespace Service {
  17. class Event;
  18. }
  19. namespace Service::VI {
  20. class Container;
  21. class DisplayList;
  22. class Conductor {
  23. public:
  24. explicit Conductor(Core::System& system, Container& container, DisplayList& displays);
  25. ~Conductor();
  26. void LinkVsyncEvent(u64 display_id, Event* event);
  27. void UnlinkVsyncEvent(u64 display_id, Event* event);
  28. private:
  29. void ProcessVsync();
  30. void VsyncThread(std::stop_token token);
  31. s64 GetNextTicks() const;
  32. private:
  33. Core::System& m_system;
  34. Container& m_container;
  35. std::unordered_map<u64, VsyncManager> m_vsync_managers;
  36. std::shared_ptr<Core::Timing::EventType> m_event;
  37. Common::Event m_signal;
  38. std::jthread m_thread;
  39. private:
  40. s32 m_swap_interval = 1;
  41. f32 m_compose_speed_scale = 1.0f;
  42. };
  43. } // namespace Service::VI