 Chromium Code Reviews
 Chromium Code Reviews Issue 393233005:
  [Ozone-DRI] Convert HardwareDisplayController to use scanout buffers  (Closed) 
  Base URL: svn://svn.chromium.org/chrome/trunk/src
    
  
    Issue 393233005:
  [Ozone-DRI] Convert HardwareDisplayController to use scanout buffers  (Closed) 
  Base URL: svn://svn.chromium.org/chrome/trunk/src| OLD | NEW | 
|---|---|
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be | 
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. | 
| 4 | 4 | 
| 5 #ifndef UI_OZONE_PLATFORM_DRI_HARDWARE_DISPLAY_CONTROLLER_H_ | 5 #ifndef UI_OZONE_PLATFORM_DRI_HARDWARE_DISPLAY_CONTROLLER_H_ | 
| 6 #define UI_OZONE_PLATFORM_DRI_HARDWARE_DISPLAY_CONTROLLER_H_ | 6 #define UI_OZONE_PLATFORM_DRI_HARDWARE_DISPLAY_CONTROLLER_H_ | 
| 7 | 7 | 
| 8 #include <stddef.h> | 8 #include <stddef.h> | 
| 9 #include <stdint.h> | 9 #include <stdint.h> | 
| 10 #include <xf86drmMode.h> | 10 #include <xf86drmMode.h> | 
| 11 #include <vector> | 11 #include <vector> | 
| 12 | 12 | 
| 13 #include "base/basictypes.h" | 13 #include "base/basictypes.h" | 
| 14 #include "base/memory/scoped_ptr.h" | 14 #include "base/memory/scoped_ptr.h" | 
| 15 #include "base/memory/weak_ptr.h" | 15 #include "base/memory/weak_ptr.h" | 
| 16 #include "ui/ozone/platform/dri/dri_wrapper.h" | 16 #include "ui/ozone/platform/dri/dri_wrapper.h" | 
| 17 | 17 | 
| 18 namespace gfx { | 18 namespace gfx { | 
| 19 class Point; | 19 class Point; | 
| 20 } | 20 } | 
| 21 | 21 | 
| 22 namespace ui { | 22 namespace ui { | 
| 23 | 23 | 
| 24 class NativePixmap; | |
| 25 class ScanoutBuffer; | 24 class ScanoutBuffer; | 
| 26 class ScanoutSurface; | |
| 27 | 25 | 
| 28 typedef std::vector<scoped_refptr<NativePixmap> > NativePixmapList; | 26 struct OverlayPlane { | 
| 27 // Simpler constructor for the primary plane. | |
| 28 OverlayPlane(scoped_refptr<ScanoutBuffer> buffer); | |
| 
alexst (slow to review)
2014/07/21 20:56:24
explicit
 
dnicoara
2014/07/21 21:02:12
Done.
 | |
| 29 | 29 | 
| 30 struct OzoneOverlayPlane { | 30 OverlayPlane(scoped_refptr<ScanoutBuffer> buffer, | 
| 31 OzoneOverlayPlane(ScanoutSurface* scanout, | 31 int z_order, | 
| 32 int z_order, | 32 gfx::OverlayTransform plane_transform, | 
| 33 gfx::OverlayTransform plane_transform, | 33 const gfx::Rect& display_bounds, | 
| 34 const gfx::Rect& display_bounds, | 34 const gfx::RectF& crop_rect); | 
| 35 const gfx::RectF& crop_rect); | |
| 36 | 35 | 
| 37 ScanoutSurface* scanout; | 36 ~OverlayPlane(); | 
| 37 | |
| 38 scoped_refptr<ScanoutBuffer> buffer; | |
| 38 int z_order; | 39 int z_order; | 
| 39 gfx::OverlayTransform plane_transform; | 40 gfx::OverlayTransform plane_transform; | 
| 40 gfx::Rect display_bounds; | 41 gfx::Rect display_bounds; | 
| 41 gfx::RectF crop_rect; | 42 gfx::RectF crop_rect; | 
| 42 int overlay_plane; | 43 int overlay_plane; | 
| 43 }; | 44 }; | 
| 44 | 45 | 
| 46 typedef std::vector<OverlayPlane> OverlayPlaneList; | |
| 47 | |
| 45 // The HDCOz will handle modesettings and scannout operations for hardware | 48 // The HDCOz will handle modesettings and scannout operations for hardware | 
| 46 // devices. | 49 // devices. | 
| 47 // | 50 // | 
| 48 // In the DRM world there are 3 components that need to be paired up to be able | 51 // In the DRM world there are 3 components that need to be paired up to be able | 
| 49 // to display an image to the monitor: CRTC (cathode ray tube controller), | 52 // to display an image to the monitor: CRTC (cathode ray tube controller), | 
| 50 // encoder and connector. The CRTC determines which framebuffer to read, when | 53 // encoder and connector. The CRTC determines which framebuffer to read, when | 
| 51 // to scanout and where to scanout. Encoders converts the stream from the CRTC | 54 // to scanout and where to scanout. Encoders converts the stream from the CRTC | 
| 52 // to the appropriate format for the connector. The connector is the physical | 55 // to the appropriate format for the connector. The connector is the physical | 
| 53 // connection that monitors connect to. | 56 // connection that monitors connect to. | 
| 54 // | 57 // | 
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 98 // connectors active if some use the same CRTC to mirror the display. | 101 // connectors active if some use the same CRTC to mirror the display. | 
| 99 class HardwareDisplayController | 102 class HardwareDisplayController | 
| 100 : public base::SupportsWeakPtr<HardwareDisplayController> { | 103 : public base::SupportsWeakPtr<HardwareDisplayController> { | 
| 101 public: | 104 public: | 
| 102 HardwareDisplayController(DriWrapper* drm, | 105 HardwareDisplayController(DriWrapper* drm, | 
| 103 uint32_t connector_id, | 106 uint32_t connector_id, | 
| 104 uint32_t crtc_id); | 107 uint32_t crtc_id); | 
| 105 | 108 | 
| 106 ~HardwareDisplayController(); | 109 ~HardwareDisplayController(); | 
| 107 | 110 | 
| 108 // Associate the HDCO with a surface implementation and initialize it. | 111 // Performs the initial CRTC configuration. If successful, it will display the | 
| 109 bool BindSurfaceToController(scoped_ptr<ScanoutSurface> surface, | 112 // framebuffer for |primary| with |mode|. | 
| 110 drmModeModeInfo mode); | 113 bool Modeset(const OverlayPlane& primary, | 
| 111 | 114 drmModeModeInfo mode); | 
| 112 void UnbindSurfaceFromController(); | |
| 113 | 115 | 
| 114 // Reconfigures the CRTC with the current surface and mode. | 116 // Reconfigures the CRTC with the current surface and mode. | 
| 115 bool Enable(); | 117 bool Enable(); | 
| 116 | 118 | 
| 117 // Disables the CRTC. | 119 // Disables the CRTC. | 
| 118 void Disable(); | 120 void Disable(); | 
| 119 | 121 | 
| 120 // Schedules the |surface_|'s framebuffer to be displayed on the next vsync | 122 // Schedules the |overlays|' framebuffers to be displayed on the next vsync | 
| 121 // event. The event will be posted on the graphics card file descriptor |fd_| | 123 // event. The event will be posted on the graphics card file descriptor |fd_| | 
| 122 // and it can be read and processed by |drmHandleEvent|. That function can | 124 // and it can be read and processed by |drmHandleEvent|. That function can | 
| 123 // define the callback for the page flip event. A generic data argument will | 125 // define the callback for the page flip event. A generic data argument will | 
| 124 // be presented to the callback. We use that argument to pass in the HDCO | 126 // be presented to the callback. We use that argument to pass in the HDCO | 
| 125 // object the event belongs to. | 127 // object the event belongs to. | 
| 126 // | 128 // | 
| 127 // Between this call and the callback, the framebuffer used in this call | 129 // Between this call and the callback, the framebuffers used in this call | 
| 128 // should not be modified in any way as it would cause screen tearing if the | 130 // should not be modified in any way as it would cause screen tearing if the | 
| 129 // hardware performed the flip. Note that the frontbuffer should also not | 131 // hardware performed the flip. Note that the frontbuffer should also not | 
| 130 // be modified as it could still be displayed. | 132 // be modified as it could still be displayed. | 
| 131 // | 133 // | 
| 132 // Note that this function does not block. Also, this function should not be | 134 // Note that this function does not block. Also, this function should not be | 
| 133 // called again before the page flip occurrs. | 135 // called again before the page flip occurrs. | 
| 134 // | 136 // | 
| 135 // Returns true if the page flip was successfully registered, false otherwise. | 137 // Returns true if the page flip was successfully registered, false otherwise. | 
| 136 bool SchedulePageFlip(const std::vector<OzoneOverlayPlane>& overlays, | 138 bool SchedulePageFlip(const OverlayPlaneList& overlays); | 
| 137 NativePixmapList* references); | |
| 138 | 139 | 
| 139 // TODO(dnicoara) This should be on the MessageLoop when Ozone can have | 140 // TODO(dnicoara) This should be on the MessageLoop when Ozone can have | 
| 140 // BeginFrame can be triggered explicitly by Ozone. | 141 // BeginFrame can be triggered explicitly by Ozone. | 
| 141 void WaitForPageFlipEvent(); | 142 void WaitForPageFlipEvent(); | 
| 142 | 143 | 
| 143 // Called when the page flip event occurred. The event is provided by the | 144 // Called when the page flip event occurred. The event is provided by the | 
| 144 // kernel when a VBlank event finished. This allows the controller to | 145 // kernel when a VBlank event finished. This allows the controller to | 
| 145 // update internal state and propagate the update to the surface. | 146 // update internal state and propagate the update to the surface. | 
| 146 // The tuple (seconds, useconds) represents the event timestamp. |seconds| | 147 // The tuple (seconds, useconds) represents the event timestamp. |seconds| | 
| 147 // represents the number of seconds while |useconds| represents the | 148 // represents the number of seconds while |useconds| represents the | 
| 148 // microseconds (< 1 second) in the timestamp. | 149 // microseconds (< 1 second) in the timestamp. | 
| 149 void OnPageFlipEvent(unsigned int frame, | 150 void OnPageFlipEvent(unsigned int frame, | 
| 150 unsigned int seconds, | 151 unsigned int seconds, | 
| 151 unsigned int useconds); | 152 unsigned int useconds); | 
| 152 | 153 | 
| 153 // Set the hardware cursor to show the contents of |surface|. | 154 // Set the hardware cursor to show the contents of |surface|. | 
| 154 bool SetCursor(scoped_refptr<ScanoutBuffer> buffer); | 155 bool SetCursor(scoped_refptr<ScanoutBuffer> buffer); | 
| 155 | 156 | 
| 156 bool UnsetCursor(); | 157 bool UnsetCursor(); | 
| 157 | 158 | 
| 158 // Moves the hardware cursor to |location|. | 159 // Moves the hardware cursor to |location|. | 
| 159 bool MoveCursor(const gfx::Point& location); | 160 bool MoveCursor(const gfx::Point& location); | 
| 160 | 161 | 
| 161 const drmModeModeInfo& get_mode() const { return mode_; }; | 162 const drmModeModeInfo& get_mode() const { return mode_; }; | 
| 162 uint32_t connector_id() const { return connector_id_; } | 163 uint32_t connector_id() const { return connector_id_; } | 
| 163 uint32_t crtc_id() const { return crtc_id_; } | 164 uint32_t crtc_id() const { return crtc_id_; } | 
| 164 ScanoutSurface* surface() const { | |
| 165 return surface_.get(); | |
| 166 }; | |
| 167 | 165 | 
| 168 uint64_t get_time_of_last_flip() const { | 166 uint64_t get_time_of_last_flip() const { | 
| 169 return time_of_last_flip_; | 167 return time_of_last_flip_; | 
| 170 }; | 168 }; | 
| 171 | 169 | 
| 172 private: | 170 private: | 
| 173 ScanoutSurface* GetPrimaryPlane( | 171 OverlayPlaneList current_planes_; | 
| 174 const std::vector<OzoneOverlayPlane>& overlays); | 172 OverlayPlaneList pending_planes_; | 
| 175 | |
| 176 NativePixmapList current_overlay_references_; | |
| 177 | 173 | 
| 178 // Object containing the connection to the graphics device and wraps the API | 174 // Object containing the connection to the graphics device and wraps the API | 
| 179 // calls to control it. | 175 // calls to control it. | 
| 180 DriWrapper* drm_; | 176 DriWrapper* drm_; | 
| 181 | 177 | 
| 182 // TODO(dnicoara) Need to allow a CRTC to have multiple connectors. | 178 // TODO(dnicoara) Need to allow a CRTC to have multiple connectors. | 
| 183 uint32_t connector_id_; | 179 uint32_t connector_id_; | 
| 184 | 180 | 
| 185 uint32_t crtc_id_; | 181 uint32_t crtc_id_; | 
| 186 | 182 | 
| 187 drmModeModeInfo mode_; | 183 drmModeModeInfo mode_; | 
| 188 | 184 | 
| 189 scoped_ptr<ScanoutSurface> surface_; | |
| 190 | |
| 191 scoped_refptr<ScanoutBuffer> cursor_buffer_; | 185 scoped_refptr<ScanoutBuffer> cursor_buffer_; | 
| 192 | 186 | 
| 193 uint64_t time_of_last_flip_; | 187 uint64_t time_of_last_flip_; | 
| 194 | 188 | 
| 195 // Keeps track of the CRTC state. If a surface has been bound, then the value | 189 // Keeps track of the CRTC state. If a surface has been bound, then the value | 
| 196 // is set to false. Otherwise it is true. | 190 // is set to false. Otherwise it is true. | 
| 197 bool is_disabled_; | 191 bool is_disabled_; | 
| 198 | 192 | 
| 199 // Store the state of the CRTC before we took over. Used to restore the CRTC | 193 // Store the state of the CRTC before we took over. Used to restore the CRTC | 
| 200 // once we no longer need it. | 194 // once we no longer need it. | 
| 201 ScopedDrmCrtcPtr saved_crtc_; | 195 ScopedDrmCrtcPtr saved_crtc_; | 
| 202 | 196 | 
| 203 DISALLOW_COPY_AND_ASSIGN(HardwareDisplayController); | 197 DISALLOW_COPY_AND_ASSIGN(HardwareDisplayController); | 
| 204 }; | 198 }; | 
| 205 | 199 | 
| 206 } // namespace ui | 200 } // namespace ui | 
| 207 | 201 | 
| 208 #endif // UI_OZONE_PLATFORM_DRI_HARDWARE_DISPLAY_CONTROLLER_H_ | 202 #endif // UI_OZONE_PLATFORM_DRI_HARDWARE_DISPLAY_CONTROLLER_H_ | 
| OLD | NEW |