diff options
author | alexst <alexst@chromium.org> | 2015-04-15 15:28:42 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-04-15 22:29:08 +0000 |
commit | b47c9f5fb6b669b27e055ab8b305309170849732 (patch) | |
tree | 96ba5c801cf9e15efe057b17ff4b632c1486c9c3 /ui/ozone/platform/drm/gpu/drm_window.h | |
parent | 3a725956aff76414de8ecec2dcaa773b21fc8fe5 (diff) | |
download | chromium_src-b47c9f5fb6b669b27e055ab8b305309170849732.zip chromium_src-b47c9f5fb6b669b27e055ab8b305309170849732.tar.gz chromium_src-b47c9f5fb6b669b27e055ab8b305309170849732.tar.bz2 |
[ozone] Keep track of pending frames on drm_window when hardware display controller is disabled or when in headless mode.
When display controller is disabled, it used to stop tracking which buffer was the considered front. Surface would fast ack all incoming buffers without presenting them, which means that any one of them could be getting painted into while display controller is off. Upon wakeup, the controller would grab what it thought was the last front buffer, but in practice it was not because of the fast acks. Net result is that it may try to modeset with the buffer GL is painting into, making it hang on a fence in the driver.
This patch removes all knowledge of front buffers from the display controller and explicitly sets it on the window, which tracks it while the controller is off.
BUG=473831
Review URL: https://codereview.chromium.org/1078183003
Cr-Commit-Position: refs/heads/master@{#325326}
Diffstat (limited to 'ui/ozone/platform/drm/gpu/drm_window.h')
-rw-r--r-- | ui/ozone/platform/drm/gpu/drm_window.h | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/ui/ozone/platform/drm/gpu/drm_window.h b/ui/ozone/platform/drm/gpu/drm_window.h index f655bbb..00f2cc0 100644 --- a/ui/ozone/platform/drm/gpu/drm_window.h +++ b/ui/ozone/platform/drm/gpu/drm_window.h @@ -12,6 +12,7 @@ #include "ui/gfx/geometry/rect.h" #include "ui/gfx/native_widget_types.h" #include "ui/ozone/ozone_export.h" +#include "ui/ozone/platform/drm/gpu/overlay_plane.h" class SkBitmap; @@ -73,6 +74,16 @@ class OZONE_EXPORT DrmWindow { // 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 base::Closure& callback); + + // About to enable hardware display controller, aquire pending frames. + bool PrepareController(HardwareDisplayController* controller); + private: // Draw the last set cursor & update the cursor plane. void ResetCursor(bool bitmap_only); @@ -106,6 +117,12 @@ class OZONE_EXPORT DrmWindow { int cursor_frame_; int cursor_frame_delay_ms_; + // Planes and flips currently being queued in the absence of hardware display + // controller. + OverlayPlaneList pending_planes_; + OverlayPlaneList last_submitted_planes_; + bool last_swap_sync_; + DISALLOW_COPY_AND_ASSIGN(DrmWindow); }; |