DisplayConnector.cpp 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. /*
  2. * Copyright (c) 2022, Liav A. <liavalb@hotmail.co.il>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include <Kernel/Debug.h>
  7. #include <Kernel/Devices/DeviceManagement.h>
  8. #include <Kernel/Graphics/Console/ContiguousFramebufferConsole.h>
  9. #include <Kernel/Graphics/Generic/DisplayConnector.h>
  10. #include <Kernel/Graphics/GraphicsManagement.h>
  11. namespace Kernel {
  12. NonnullLockRefPtr<GenericDisplayConnector> GenericDisplayConnector::must_create_with_preset_resolution(PhysicalAddress framebuffer_address, size_t width, size_t height, size_t pitch)
  13. {
  14. auto device_or_error = DeviceManagement::try_create_device<GenericDisplayConnector>(framebuffer_address, width, height, pitch);
  15. VERIFY(!device_or_error.is_error());
  16. auto connector = device_or_error.release_value();
  17. MUST(connector->create_attached_framebuffer_console());
  18. MUST(connector->initialize_edid_for_generic_monitor({}));
  19. return connector;
  20. }
  21. GenericDisplayConnector::GenericDisplayConnector(PhysicalAddress framebuffer_address, size_t width, size_t height, size_t pitch)
  22. : DisplayConnector(framebuffer_address, height * pitch, true)
  23. {
  24. m_current_mode_setting.horizontal_active = width;
  25. m_current_mode_setting.vertical_active = height;
  26. m_current_mode_setting.horizontal_stride = pitch;
  27. }
  28. ErrorOr<void> GenericDisplayConnector::create_attached_framebuffer_console()
  29. {
  30. auto width = m_current_mode_setting.horizontal_active;
  31. auto height = m_current_mode_setting.vertical_active;
  32. auto pitch = m_current_mode_setting.horizontal_stride;
  33. m_framebuffer_console = Graphics::ContiguousFramebufferConsole::initialize(m_framebuffer_address.value(), width, height, pitch);
  34. GraphicsManagement::the().set_console(*m_framebuffer_console);
  35. return {};
  36. }
  37. void GenericDisplayConnector::enable_console()
  38. {
  39. VERIFY(m_control_lock.is_locked());
  40. VERIFY(m_framebuffer_console);
  41. m_framebuffer_console->enable();
  42. }
  43. void GenericDisplayConnector::disable_console()
  44. {
  45. VERIFY(m_control_lock.is_locked());
  46. VERIFY(m_framebuffer_console);
  47. m_framebuffer_console->disable();
  48. }
  49. ErrorOr<void> GenericDisplayConnector::flush_first_surface()
  50. {
  51. return Error::from_errno(ENOTSUP);
  52. }
  53. }