SharedFramebufferVMObject.h 4.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. /*
  2. * Copyright (c) 2022, Liav A. <liavalb@hotmail.co.il>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #pragma once
  7. #include <Kernel/Forward.h>
  8. #include <Kernel/Memory/AllocationStrategy.h>
  9. #include <Kernel/Memory/AnonymousVMObject.h>
  10. #include <Kernel/Memory/MemoryManager.h>
  11. #include <Kernel/Memory/PageFaultResponse.h>
  12. #include <Kernel/PhysicalAddress.h>
  13. namespace Kernel::Memory {
  14. class SharedFramebufferVMObject final : public VMObject {
  15. public:
  16. class FakeWritesFramebufferVMObject final : public VMObject {
  17. public:
  18. static ErrorOr<NonnullRefPtr<FakeWritesFramebufferVMObject>> try_create(Badge<SharedFramebufferVMObject>, SharedFramebufferVMObject const& parent_object);
  19. private:
  20. FakeWritesFramebufferVMObject(SharedFramebufferVMObject const& parent_object, FixedArray<RefPtr<PhysicalPage>>&& new_physical_pages)
  21. : VMObject(move(new_physical_pages))
  22. , m_parent_object(parent_object)
  23. {
  24. }
  25. virtual StringView class_name() const override { return "FakeWritesFramebufferVMObject"sv; }
  26. virtual ErrorOr<NonnullRefPtr<VMObject>> try_clone() override { return Error::from_errno(ENOTIMPL); }
  27. virtual Span<RefPtr<PhysicalPage> const> physical_pages() const override { return m_parent_object->fake_sink_framebuffer_physical_pages(); }
  28. virtual Span<RefPtr<PhysicalPage>> physical_pages() override { return m_parent_object->fake_sink_framebuffer_physical_pages(); }
  29. NonnullRefPtr<SharedFramebufferVMObject> m_parent_object;
  30. };
  31. class RealWritesFramebufferVMObject final : public VMObject {
  32. public:
  33. static ErrorOr<NonnullRefPtr<RealWritesFramebufferVMObject>> try_create(Badge<SharedFramebufferVMObject>, SharedFramebufferVMObject const& parent_object);
  34. private:
  35. RealWritesFramebufferVMObject(SharedFramebufferVMObject const& parent_object, FixedArray<RefPtr<PhysicalPage>>&& new_physical_pages)
  36. : VMObject(move(new_physical_pages))
  37. , m_parent_object(parent_object)
  38. {
  39. }
  40. virtual StringView class_name() const override { return "RealWritesFramebufferVMObject"sv; }
  41. virtual ErrorOr<NonnullRefPtr<VMObject>> try_clone() override { return Error::from_errno(ENOTIMPL); }
  42. virtual Span<RefPtr<PhysicalPage> const> physical_pages() const override { return m_parent_object->real_framebuffer_physical_pages(); }
  43. virtual Span<RefPtr<PhysicalPage>> physical_pages() override { return m_parent_object->real_framebuffer_physical_pages(); }
  44. NonnullRefPtr<SharedFramebufferVMObject> m_parent_object;
  45. };
  46. virtual ~SharedFramebufferVMObject() override = default;
  47. static ErrorOr<NonnullRefPtr<SharedFramebufferVMObject>> try_create_for_physical_range(PhysicalAddress paddr, size_t size);
  48. static ErrorOr<NonnullRefPtr<SharedFramebufferVMObject>> try_create_at_arbitrary_physical_range(size_t size);
  49. virtual ErrorOr<NonnullRefPtr<VMObject>> try_clone() override { return Error::from_errno(ENOTIMPL); }
  50. void switch_to_fake_sink_framebuffer_writes(Badge<Kernel::DisplayConnector>);
  51. void switch_to_real_framebuffer_writes(Badge<Kernel::DisplayConnector>);
  52. virtual Span<RefPtr<PhysicalPage> const> physical_pages() const override;
  53. virtual Span<RefPtr<PhysicalPage>> physical_pages() override;
  54. Span<RefPtr<PhysicalPage>> fake_sink_framebuffer_physical_pages();
  55. Span<RefPtr<PhysicalPage> const> fake_sink_framebuffer_physical_pages() const;
  56. Span<RefPtr<PhysicalPage>> real_framebuffer_physical_pages();
  57. Span<RefPtr<PhysicalPage> const> real_framebuffer_physical_pages() const;
  58. FakeWritesFramebufferVMObject const& fake_writes_framebuffer_vmobject() const { return *m_fake_writes_framebuffer_vmobject; }
  59. FakeWritesFramebufferVMObject& fake_writes_framebuffer_vmobject() { return *m_fake_writes_framebuffer_vmobject; }
  60. RealWritesFramebufferVMObject const& real_writes_framebuffer_vmobject() const { return *m_real_writes_framebuffer_vmobject; }
  61. RealWritesFramebufferVMObject& real_writes_framebuffer_vmobject() { return *m_real_writes_framebuffer_vmobject; }
  62. private:
  63. SharedFramebufferVMObject(FixedArray<RefPtr<PhysicalPage>>&& new_physical_pages, CommittedPhysicalPageSet, AnonymousVMObject& real_framebuffer_vmobject);
  64. virtual StringView class_name() const override { return "SharedFramebufferVMObject"sv; }
  65. ErrorOr<void> create_fake_writes_framebuffer_vm_object();
  66. ErrorOr<void> create_real_writes_framebuffer_vm_object();
  67. NonnullRefPtr<AnonymousVMObject> m_real_framebuffer_vmobject;
  68. RefPtr<FakeWritesFramebufferVMObject> m_fake_writes_framebuffer_vmobject;
  69. RefPtr<RealWritesFramebufferVMObject> m_real_writes_framebuffer_vmobject;
  70. bool m_writes_are_faked { false };
  71. mutable RecursiveSpinlock m_writes_state_lock;
  72. CommittedPhysicalPageSet m_committed_pages;
  73. };
  74. }