Index: ui/ozone/platform/drm/gpu/hardware_display_plane_manager.h |
diff --git a/ui/ozone/platform/drm/gpu/hardware_display_plane_manager.h b/ui/ozone/platform/drm/gpu/hardware_display_plane_manager.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..55afa9e1ceba1ab9e957c9031802d4d2cc80ef2a |
--- /dev/null |
+++ b/ui/ozone/platform/drm/gpu/hardware_display_plane_manager.h |
@@ -0,0 +1,132 @@ |
+// 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_ |