| // Copyright 2014 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef UI_OZONE_PLATFORM_DRM_GPU_HARDWARE_DISPLAY_PLANE_MANAGER_H_ |
| #define UI_OZONE_PLATFORM_DRM_GPU_HARDWARE_DISPLAY_PLANE_MANAGER_H_ |
| |
| #include <stddef.h> |
| #include <stdint.h> |
| #include <xf86drmMode.h> |
| #include <vector> |
| |
| #include "base/basictypes.h" |
| #include "base/memory/scoped_vector.h" |
| #include "ui/ozone/ozone_export.h" |
| #include "ui/ozone/platform/drm/common/scoped_drm_types.h" |
| #include "ui/ozone/platform/drm/gpu/hardware_display_plane.h" |
| #include "ui/ozone/platform/drm/gpu/overlay_plane.h" |
| |
| namespace gfx { |
| class Rect; |
| } // namespace gfx |
| |
| namespace ui { |
| |
| class CrtcController; |
| class DrmDevice; |
| |
| // This contains the list of planes controlled by one HDC on a given DRM fd. |
| // It is owned by the HDC and filled by the CrtcController. |
| struct OZONE_EXPORT HardwareDisplayPlaneList { |
| HardwareDisplayPlaneList(); |
| ~HardwareDisplayPlaneList(); |
| |
| // This is the list of planes to be committed this time. |
| std::vector<HardwareDisplayPlane*> plane_list; |
| // This is the list of planes that was committed last time. |
| std::vector<HardwareDisplayPlane*> old_plane_list; |
| |
| struct PageFlipInfo { |
| PageFlipInfo(uint32_t crtc_id, uint32_t framebuffer, CrtcController* crtc); |
| ~PageFlipInfo(); |
| |
| uint32_t crtc_id; |
| uint32_t framebuffer; |
| CrtcController* crtc; |
| |
| struct Plane { |
| Plane(int plane, |
| int framebuffer, |
| const gfx::Rect& bounds, |
| const gfx::Rect& src_rect); |
| ~Plane(); |
| int plane; |
| int framebuffer; |
| gfx::Rect bounds; |
| gfx::Rect src_rect; |
| }; |
| std::vector<Plane> planes; |
| }; |
| // In the case of non-atomic operation, this info will be used for |
| // pageflipping. |
| std::vector<PageFlipInfo> legacy_page_flips; |
| |
| #if defined(USE_DRM_ATOMIC) |
| ScopedDrmPropertySetPtr atomic_property_set; |
| #endif // defined(USE_DRM_ATOMIC) |
| }; |
| |
| class OZONE_EXPORT HardwareDisplayPlaneManager { |
| public: |
| HardwareDisplayPlaneManager(); |
| virtual ~HardwareDisplayPlaneManager(); |
| |
| // This parses information from the drm driver, adding any new planes |
| // or crtcs found. |
| bool Initialize(DrmDevice* drm); |
| |
| // Clears old frame state out. Must be called before any AssignOverlayPlanes |
| // calls. |
| void BeginFrame(HardwareDisplayPlaneList* plane_list); |
| |
| // Assign hardware planes from the |planes_| list to |overlay_list| entries, |
| // recording the plane IDs in the |plane_list|. Only planes compatible with |
| // |crtc_id| will be used. |overlay_list| must be sorted bottom-to-top. |
| virtual bool AssignOverlayPlanes(HardwareDisplayPlaneList* plane_list, |
| const OverlayPlaneList& overlay_list, |
| uint32_t crtc_id, |
| CrtcController* crtc); |
| |
| // Commit the plane states in |plane_list|. |
| virtual bool Commit(HardwareDisplayPlaneList* plane_list, |
| bool is_sync, |
| bool test_only) = 0; |
| |
| // Set all planes in |plane_list| owned by |crtc_id| to free. |
| static void ResetPlanes(HardwareDisplayPlaneList* plane_list, |
| uint32_t crtc_id); |
| |
| const ScopedVector<HardwareDisplayPlane>& planes() { return planes_; } |
| |
| protected: |
| virtual bool SetPlaneData(HardwareDisplayPlaneList* plane_list, |
| HardwareDisplayPlane* hw_plane, |
| const OverlayPlane& overlay, |
| uint32_t crtc_id, |
| const gfx::Rect& src_rect, |
| CrtcController* crtc) = 0; |
| |
| virtual scoped_ptr<HardwareDisplayPlane> CreatePlane(uint32_t plane_id, |
| uint32_t possible_crtcs); |
| |
| // Finds the plane located at or after |*index| that is not in use and can |
| // be used with |crtc_index|. |
| HardwareDisplayPlane* FindNextUnusedPlane(size_t* index, uint32_t crtc_index); |
| |
| // Convert |crtc_id| into an index, returning -1 if the ID couldn't be found. |
| int LookupCrtcIndex(uint32_t crtc_id); |
| |
| // Object containing the connection to the graphics device and wraps the API |
| // calls to control it. Not owned. |
| DrmDevice* drm_; |
| |
| ScopedVector<HardwareDisplayPlane> planes_; |
| std::vector<uint32_t> crtcs_; |
| |
| DISALLOW_COPY_AND_ASSIGN(HardwareDisplayPlaneManager); |
| }; |
| |
| } // namespace ui |
| |
| #endif // UI_OZONE_PLATFORM_DRM_GPU_HARDWARE_DISPLAY_PLANE_MANAGER_H_ |