| Index: ui/ozone/platform/dri/scanout_surface.h
 | 
| diff --git a/ui/ozone/platform/dri/scanout_surface.h b/ui/ozone/platform/dri/scanout_surface.h
 | 
| new file mode 100644
 | 
| index 0000000000000000000000000000000000000000..d362ae18e812e306ee500e4f4f651bd83d322c19
 | 
| --- /dev/null
 | 
| +++ b/ui/ozone/platform/dri/scanout_surface.h
 | 
| @@ -0,0 +1,84 @@
 | 
| +// 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_DRI_SCANOUT_SURFACE_H_
 | 
| +#define UI_OZONE_PLATFORM_DRI_SCANOUT_SURFACE_H_
 | 
| +
 | 
| +#include <stdint.h>
 | 
| +
 | 
| +namespace gfx {
 | 
| +class Size;
 | 
| +}
 | 
| +
 | 
| +namespace ui {
 | 
| +
 | 
| +// ScanoutSurface is an interface for a surface that can be scanned out to a
 | 
| +// monitor using the DRM/KMS API. Implementations will store the internal state
 | 
| +// associated with the drawing surface. Implementations are also required to
 | 
| +// performs all the needed operations to initialize and update the drawing
 | 
| +// surface.
 | 
| +//
 | 
| +// The typical usage pattern is:
 | 
| +// -----------------------------------------------------------------------------
 | 
| +// HardwareDisplayController controller;
 | 
| +// // Initialize controller
 | 
| +//
 | 
| +// ScanoutSurface* surface = new ScanoutSurfaceImpl(size);
 | 
| +// surface.Initialize();
 | 
| +// controller.BindSurfaceToController(surface);
 | 
| +//
 | 
| +// while (true) {
 | 
| +//   DrawIntoSurface(surface);
 | 
| +//   controller.SchedulePageFlip();
 | 
| +//
 | 
| +//   Wait for page flip event. The DRM page flip handler will call
 | 
| +//   surface.SwapBuffers();
 | 
| +// }
 | 
| +//
 | 
| +// delete surface;
 | 
| +// -----------------------------------------------------------------------------
 | 
| +// In the above example the wait consists of reading a DRM pageflip event from
 | 
| +// the graphics card file descriptor. This is done by calling |drmHandleEvent|,
 | 
| +// which will read and process the event. |drmHandleEvent| will call a callback
 | 
| +// registered by |SchedulePageFlip| which will update the internal state.
 | 
| +//
 | 
| +// |SchedulePageFlip| can also be used to limit drawing to the screen's vsync
 | 
| +// since page flips only happen on vsync. In a threaded environment a message
 | 
| +// loop would listen on the graphics card file descriptor for an event and
 | 
| +// |drmHandleEvent| would be called from the message loop. The event handler
 | 
| +// would also be responsible for updating the renderer's state and signal that
 | 
| +// it is OK to start drawing the next frame.
 | 
| +class ScanoutSurface {
 | 
| + public:
 | 
| +  virtual ~ScanoutSurface() {}
 | 
| +
 | 
| +  // Used to allocate all necessary buffers for this surface. If the
 | 
| +  // initialization succeeds, the device is ready to be used for drawing
 | 
| +  // operations.
 | 
| +  // Returns true if the initialization is successful, false otherwise.
 | 
| +  virtual bool Initialize() = 0;
 | 
| +
 | 
| +  // Swaps the back buffer with the front buffer.
 | 
| +  virtual void SwapBuffers() = 0;
 | 
| +
 | 
| +  // Returns the ID of the current backbuffer.
 | 
| +  virtual uint32_t GetFramebufferId() const = 0;
 | 
| +
 | 
| +  // Returns the handle of the current backbuffer.
 | 
| +  virtual uint32_t GetHandle() const = 0;
 | 
| +
 | 
| +  // Returns the surface size.
 | 
| +  virtual gfx::Size Size() const = 0;
 | 
| +};
 | 
| +
 | 
| +class ScanoutSurfaceGenerator {
 | 
| + public:
 | 
| +  virtual ~ScanoutSurfaceGenerator() {}
 | 
| +
 | 
| +  virtual ScanoutSurface* Create(const gfx::Size& size) = 0;
 | 
| +};
 | 
| +
 | 
| +}  // namespace ui
 | 
| +
 | 
| +#endif  // UI_OZONE_PLATFORM_DRI_SCANOUT_SURFACE_H_
 | 
| 
 |