Index: ui/ozone/platform/dri/dri_wrapper.h |
diff --git a/ui/ozone/platform/dri/dri_wrapper.h b/ui/ozone/platform/dri/dri_wrapper.h |
index 8fb10e4c81b8a59647047f4b5bc72bb726a60c44..00f9e5dde0511d36cacc98309fddad8fc03e2f33 100644 |
--- a/ui/ozone/platform/dri/dri_wrapper.h |
+++ b/ui/ozone/platform/dri/dri_wrapper.h |
@@ -9,7 +9,10 @@ |
#include <vector> |
+#include "base/callback.h" |
#include "base/macros.h" |
+#include "base/memory/scoped_vector.h" |
+#include "base/threading/thread.h" |
#include "ui/gfx/geometry/rect.h" |
#include "ui/gfx/geometry/rect_f.h" |
#include "ui/gfx/overlay_transform.h" |
@@ -30,7 +33,11 @@ class HardwareDisplayPlaneManager; |
// would be called. In unit tests this interface would be stubbed. |
class DriWrapper { |
public: |
- DriWrapper(const char* device_path); |
+ typedef base::Callback<void(unsigned int /* frame */, |
+ unsigned int /* seconds */, |
+ unsigned int /* useconds */)> PageFlipCallback; |
+ |
+ DriWrapper(const char* device_path, bool software_mode); |
virtual ~DriWrapper(); |
// Open device. |
@@ -79,9 +86,10 @@ class DriWrapper { |
// Schedules a pageflip for CRTC |crtc_id|. This function will return |
// immediately. Upon completion of the pageflip event, the CRTC will be |
// displaying the buffer with ID |framebuffer| and will have a DRM event |
- // queued on |fd_|. |data| is a generic pointer to some information the user |
- // will receive when processing the pageflip event. |
- virtual bool PageFlip(uint32_t crtc_id, uint32_t framebuffer, void* data); |
+ // queued on |fd_|. |
+ virtual bool PageFlip(uint32_t crtc_id, |
+ uint32_t framebuffer, |
+ const PageFlipCallback& callback); |
// Schedule an overlay to be show during the page flip for CRTC |crtc_id|. |
// |source| location from |framebuffer| will be shown on overlay |
@@ -125,8 +133,6 @@ class DriWrapper { |
// Move the cursor on CRTC |crtc_id| to (x, y); |
virtual bool MoveCursor(uint32_t crtc_id, const gfx::Point& point); |
- virtual void HandleEvent(drmEventContext& event); |
- |
virtual bool CreateDumbBuffer(const SkImageInfo& info, |
uint32_t* handle, |
uint32_t* stride, |
@@ -146,16 +152,36 @@ class DriWrapper { |
HardwareDisplayPlaneManager* plane_manager() { return plane_manager_.get(); } |
protected: |
+ // Responsible for late initialization of the IO thread. This needs to happen |
+ // after the sandbox is up, thus the late initialization. |
+ virtual void InitializeIOWatcher(); |
+ |
// The file descriptor associated with this wrapper. All DRM operations will |
// be performed using this FD. |
+ // TODO(dnicoara) Make this a base::File |
int fd_; |
scoped_ptr<HardwareDisplayPlaneManager> plane_manager_; |
+ // If we're running in software mode this is true. In software mode we can't |
+ // use the async page flip callbacks, so we need to block until the kernel |
+ // responds to the page flip. |
+ bool software_mode_; |
+ |
private: |
+ class IOWatcher; |
+ |
// Path to DRM device. |
const char* device_path_; |
+ // Helper thread to perform IO listener operations. |
+ // TODO(dnicoara) This should really be supported by the main thread. |
+ // Alternatively we should have a way to access the IO thread's task runner. |
+ base::Thread io_thread_; |
+ |
+ // Watcher for |fd_| listening for page flip events. |
+ scoped_refptr<IOWatcher> watcher_; |
+ |
DISALLOW_COPY_AND_ASSIGN(DriWrapper); |
}; |