resource_manager.h 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
  2. // SPDX-License-Identifier: GPL-3.0-or-later
  3. #pragma once
  4. #include <chrono>
  5. #include "core/core.h"
  6. #include "core/hle/service/hid/controllers/controller_base.h"
  7. #include "core/hle/service/kernel_helpers.h"
  8. #include "core/hle/service/service.h"
  9. namespace Core::Timing {
  10. struct EventType;
  11. }
  12. namespace Core::HID {
  13. class HIDCore;
  14. }
  15. namespace Service::HID {
  16. enum class HidController : std::size_t {
  17. DebugPad,
  18. Touchscreen,
  19. Mouse,
  20. Keyboard,
  21. XPad,
  22. HomeButton,
  23. SleepButton,
  24. CaptureButton,
  25. InputDetector,
  26. UniquePad,
  27. NPad,
  28. Gesture,
  29. ConsoleSixAxisSensor,
  30. DebugMouse,
  31. Palma,
  32. MaxControllers,
  33. };
  34. class ResourceManager {
  35. public:
  36. explicit ResourceManager(Core::System& system_);
  37. ~ResourceManager();
  38. template <typename T>
  39. T& GetController(HidController controller) {
  40. return static_cast<T&>(*controllers[static_cast<size_t>(controller)]);
  41. }
  42. template <typename T>
  43. const T& GetController(HidController controller) const {
  44. return static_cast<T&>(*controllers[static_cast<size_t>(controller)]);
  45. }
  46. void Initialize();
  47. void UpdateControllers(std::uintptr_t user_data, std::chrono::nanoseconds ns_late);
  48. void UpdateNpad(std::uintptr_t user_data, std::chrono::nanoseconds ns_late);
  49. void UpdateMouseKeyboard(std::uintptr_t user_data, std::chrono::nanoseconds ns_late);
  50. void UpdateMotion(std::uintptr_t user_data, std::chrono::nanoseconds ns_late);
  51. private:
  52. template <typename T>
  53. void MakeController(HidController controller, u8* shared_memory) {
  54. if constexpr (std::is_constructible_v<T, Core::System&, u8*>) {
  55. controllers[static_cast<std::size_t>(controller)] =
  56. std::make_unique<T>(system, shared_memory);
  57. } else {
  58. controllers[static_cast<std::size_t>(controller)] =
  59. std::make_unique<T>(system.HIDCore(), shared_memory);
  60. }
  61. }
  62. template <typename T>
  63. void MakeControllerWithServiceContext(HidController controller, u8* shared_memory) {
  64. controllers[static_cast<std::size_t>(controller)] =
  65. std::make_unique<T>(system.HIDCore(), shared_memory, service_context);
  66. }
  67. bool is_initialized{false};
  68. std::array<std::unique_ptr<ControllerBase>, static_cast<size_t>(HidController::MaxControllers)>
  69. controllers{};
  70. Core::System& system;
  71. KernelHelpers::ServiceContext service_context;
  72. };
  73. class IAppletResource final : public ServiceFramework<IAppletResource> {
  74. public:
  75. explicit IAppletResource(Core::System& system_, std::shared_ptr<ResourceManager> resource);
  76. ~IAppletResource() override;
  77. private:
  78. void GetSharedMemoryHandle(HLERequestContext& ctx);
  79. std::shared_ptr<Core::Timing::EventType> npad_update_event;
  80. std::shared_ptr<Core::Timing::EventType> default_update_event;
  81. std::shared_ptr<Core::Timing::EventType> mouse_keyboard_update_event;
  82. std::shared_ptr<Core::Timing::EventType> motion_update_event;
  83. };
  84. } // namespace Service::HID