VirtualScreenBackend.cpp 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. /*
  2. * Copyright (c) 2018-2020, the SerenityOS developers.
  3. * Copyright (c) 2022, kleines Filmröllchen <filmroellchen@serenityos.org>
  4. *
  5. * SPDX-License-Identifier: BSD-2-Clause
  6. */
  7. #include "VirtualScreenBackend.h"
  8. #include "ScreenBackend.h"
  9. #include <AK/Try.h>
  10. #include <AK/kmalloc.h>
  11. #include <LibGfx/Color.h>
  12. namespace WindowServer {
  13. VirtualScreenBackend::~VirtualScreenBackend()
  14. {
  15. MUST(unmap_framebuffer());
  16. }
  17. ErrorOr<void> VirtualScreenBackend::open()
  18. {
  19. m_can_device_flush_buffers = true;
  20. m_can_set_head_buffer = true;
  21. return {};
  22. }
  23. void VirtualScreenBackend::set_head_buffer(int index)
  24. {
  25. VERIFY(index <= 1 && index >= 0);
  26. m_first_buffer_active = index == 0;
  27. }
  28. ErrorOr<void> VirtualScreenBackend::set_safe_head_mode_setting()
  29. {
  30. return {};
  31. }
  32. ErrorOr<void> VirtualScreenBackend::set_head_mode_setting(GraphicsHeadModeSetting mode_setting)
  33. {
  34. m_height = mode_setting.vertical_active;
  35. if (mode_setting.horizontal_stride == 0)
  36. mode_setting.horizontal_stride = static_cast<int>(mode_setting.horizontal_active * sizeof(Gfx::ARGB32));
  37. m_pitch = mode_setting.horizontal_stride;
  38. if (static_cast<int>(mode_setting.horizontal_active * sizeof(Gfx::ARGB32)) != mode_setting.horizontal_stride)
  39. return Error::from_string_literal("Unsupported pitch");
  40. m_width = mode_setting.horizontal_active;
  41. return {};
  42. }
  43. ErrorOr<GraphicsHeadModeSetting> VirtualScreenBackend::get_head_mode_setting()
  44. {
  45. return GraphicsHeadModeSetting {
  46. .horizontal_stride = m_pitch,
  47. .pixel_clock_in_khz = 0,
  48. .horizontal_active = m_width,
  49. .horizontal_front_porch_pixels = 0,
  50. .horizontal_sync_time_pixels = 0,
  51. .horizontal_blank_pixels = 0,
  52. .vertical_active = m_height,
  53. .vertical_front_porch_lines = 0,
  54. .vertical_sync_time_lines = 0,
  55. .vertical_blank_lines = 0,
  56. .horizontal_offset = 0,
  57. .vertical_offset = 0,
  58. };
  59. }
  60. ErrorOr<void> VirtualScreenBackend::map_framebuffer()
  61. {
  62. m_size_in_bytes = static_cast<unsigned long>(m_pitch) * m_height * 2;
  63. m_framebuffer = new Gfx::ARGB32[static_cast<unsigned long>(m_width) * m_height * 2];
  64. if (m_framebuffer == nullptr)
  65. return Error::from_errno(ENOMEM);
  66. m_back_buffer_offset = m_size_in_bytes / 2;
  67. m_first_buffer_active = true;
  68. return {};
  69. }
  70. ErrorOr<void> VirtualScreenBackend::unmap_framebuffer()
  71. {
  72. delete[] m_framebuffer;
  73. return {};
  74. }
  75. }