Index: ui/ozone/platform/drm/gpu/drm_window.h |
diff --git a/ui/ozone/platform/drm/gpu/drm_window.h b/ui/ozone/platform/drm/gpu/drm_window.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..fa5e5bdbc8c44ed6d5b02c569509f43a5bb6135a |
--- /dev/null |
+++ b/ui/ozone/platform/drm/gpu/drm_window.h |
@@ -0,0 +1,139 @@ |
+// 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_DRM_WINDOW_H_ |
+#define UI_OZONE_PLATFORM_DRM_GPU_DRM_WINDOW_H_ |
+ |
+#include <vector> |
+ |
+#include "base/timer/timer.h" |
+#include "ui/gfx/geometry/point.h" |
+#include "ui/gfx/geometry/rect.h" |
+#include "ui/gfx/native_widget_types.h" |
+#include "ui/gfx/swap_result.h" |
+#include "ui/ozone/ozone_export.h" |
+#include "ui/ozone/platform/drm/gpu/overlay_plane.h" |
+#include "ui/ozone/platform/drm/gpu/page_flip_request.h" |
+#include "ui/ozone/public/surface_ozone_egl.h" |
+ |
+class SkBitmap; |
+ |
+namespace gfx { |
+class Point; |
+class Rect; |
+} // namespace gfx |
+ |
+namespace ui { |
+ |
+class DrmBuffer; |
+class DrmDeviceManager; |
+class HardwareDisplayController; |
+struct OverlayCheck_Params; |
+class ScanoutBufferGenerator; |
+class ScreenManager; |
+ |
+// A delegate of the platform window (DrmWindow) on the GPU process. This is |
+// used to keep track of window state changes such that each platform window is |
+// correctly associated with a display. |
+// A window is associated with the display whose bounds contains the window |
+// bounds. If there's no suitable display, the window is disconnected and its |
+// contents will not be visible. |
+class OZONE_EXPORT DrmWindow { |
+ public: |
+ DrmWindow(gfx::AcceleratedWidget widget, |
+ DrmDeviceManager* device_manager, |
+ ScreenManager* screen_manager); |
+ |
+ ~DrmWindow(); |
+ |
+ gfx::Rect bounds() const { return bounds_; } |
+ |
+ void Initialize(); |
+ |
+ void Shutdown(); |
+ |
+ // Returns the accelerated widget associated with the delegate. |
+ gfx::AcceleratedWidget GetAcceleratedWidget(); |
+ |
+ // Returns the current controller the window is displaying on. Callers should |
+ // not cache the result as the controller may change as the window is moved. |
+ HardwareDisplayController* GetController(); |
+ |
+ void SetController(HardwareDisplayController* controller); |
+ |
+ // Called when the window is resized/moved. |
+ void OnBoundsChanged(const gfx::Rect& bounds); |
+ |
+ // Update the HW cursor bitmap & move to specified location. If |
+ // the bitmap is empty, the cursor is hidden. |
+ void SetCursor(const std::vector<SkBitmap>& bitmaps, |
+ const gfx::Point& location, |
+ int frame_delay_ms); |
+ |
+ // Update the HW cursor bitmap & move to specified location. If |
+ // the bitmap is empty, the cursor is hidden. |
+ void SetCursorWithoutAnimations(const std::vector<SkBitmap>& bitmaps, |
+ const gfx::Point& location); |
+ |
+ // Move the HW cursor to the specified location. |
+ void MoveCursor(const gfx::Point& location); |
+ |
+ // Queue overlay planes and page flips. |
+ // If hardware display controller is available, forward the information |
+ // immediately, otherwise queue up on the window and forward when the hardware |
+ // is once again ready. |
+ void QueueOverlayPlane(const OverlayPlane& plane); |
+ |
+ bool SchedulePageFlip(bool is_sync, const SwapCompletionCallback& callback); |
+ bool TestPageFlip(const std::vector<OverlayCheck_Params>& planes, |
+ ScanoutBufferGenerator* buffer_generator); |
+ |
+ // Returns the last buffer associated with this window. |
+ const OverlayPlane* GetLastModesetBuffer(); |
+ |
+ private: |
+ // Draw the last set cursor & update the cursor plane. |
+ void ResetCursor(bool bitmap_only); |
+ |
+ // Draw next frame in an animated cursor. |
+ void OnCursorAnimationTimeout(); |
+ |
+ // When |controller_| changes this is called to reallocate the cursor buffers |
+ // since the allocation DRM device may have changed. |
+ void UpdateCursorBuffers(); |
+ |
+ gfx::AcceleratedWidget widget_; |
+ |
+ DrmDeviceManager* device_manager_; // Not owned. |
+ ScreenManager* screen_manager_; // Not owned. |
+ |
+ // The current bounds of the window. |
+ gfx::Rect bounds_; |
+ |
+ // The controller associated with the current window. This may be nullptr if |
+ // the window isn't over an active display. |
+ HardwareDisplayController* controller_ = nullptr; |
+ |
+ base::RepeatingTimer<DrmWindow> cursor_timer_; |
+ |
+ scoped_refptr<DrmBuffer> cursor_buffers_[2]; |
+ int cursor_frontbuffer_ = 0; |
+ |
+ std::vector<SkBitmap> cursor_bitmaps_; |
+ gfx::Point cursor_location_; |
+ int cursor_frame_ = 0; |
+ int cursor_frame_delay_ms_ = 0; |
+ |
+ // Planes and flips currently being queued in the absence of hardware display |
+ // controller. |
+ OverlayPlaneList pending_planes_; |
+ OverlayPlaneList last_submitted_planes_; |
+ bool last_swap_sync_ = false; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(DrmWindow); |
+}; |
+ |
+} // namespace ui |
+ |
+#endif // UI_OZONE_PLATFORM_DRM_GPU_DRM_WINDOW_H_ |