// 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 #include #include #include #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 plane_list; // This is the list of planes that was committed last time. std::vector 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 planes; }; // In the case of non-atomic operation, this info will be used for // pageflipping. std::vector 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& 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 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 planes_; std::vector crtcs_; DISALLOW_COPY_AND_ASSIGN(HardwareDisplayPlaneManager); }; } // namespace ui #endif // UI_OZONE_PLATFORM_DRM_GPU_HARDWARE_DISPLAY_PLANE_MANAGER_H_