Upstream version 10.39.225.0
[platform/framework/web/crosswalk.git] / src / content / browser / renderer_host / compositing_iosurface_mac.h
index d683558..21e33ce 100644 (file)
 #include <vector>
 
 #import <Cocoa/Cocoa.h>
+#include <IOSurface/IOSurfaceAPI.h>
 #include <QuartzCore/QuartzCore.h>
 
 #include "base/callback.h"
 #include "base/lazy_instance.h"
 #include "base/mac/scoped_cftyperef.h"
+#include "base/memory/ref_counted.h"
 #include "base/memory/scoped_ptr.h"
 #include "base/time/time.h"
 #include "base/timer/timer.h"
@@ -24,7 +26,6 @@
 #include "ui/gfx/rect_conversions.h"
 #include "ui/gfx/size.h"
 
-class IOSurfaceSupport;
 class SkBitmap;
 
 namespace gfx {
@@ -34,24 +35,22 @@ class Rect;
 namespace content {
 
 class CompositingIOSurfaceContext;
-class CompositingIOSurfaceShaderPrograms;
-class CompositingIOSurfaceTransformer;
 class RenderWidgetHostViewFrameSubscriber;
 class RenderWidgetHostViewMac;
 
 // This class manages an OpenGL context and IOSurface for the accelerated
 // compositing code path. The GL context is attached to
 // RenderWidgetHostViewCocoa for blitting the IOSurface.
-class CompositingIOSurfaceMac {
+class CompositingIOSurfaceMac
+    : public base::RefCounted<CompositingIOSurfaceMac> {
  public:
-  // Returns NULL if IOSurface support is missing or GL APIs fail.
-  static CompositingIOSurfaceMac* Create();
-  ~CompositingIOSurfaceMac();
+  // Returns NULL if IOSurface or GL API calls fail.
+  static scoped_refptr<CompositingIOSurfaceMac> Create();
 
   // Set IOSurface that will be drawn on the next NSView drawRect.
   bool SetIOSurfaceWithContextCurrent(
       scoped_refptr<CompositingIOSurfaceContext> current_context,
-      uint64 io_surface_handle,
+      IOSurfaceID io_surface_handle,
       const gfx::Size& size,
       float scale_factor) WARN_UNUSED_RESULT;
 
@@ -65,8 +64,7 @@ class CompositingIOSurfaceMac {
   bool DrawIOSurface(
       scoped_refptr<CompositingIOSurfaceContext> drawing_context,
       const gfx::Rect& window_rect,
-      float window_scale_factor,
-      bool flush_drawable) WARN_UNUSED_RESULT;
+      float window_scale_factor) WARN_UNUSED_RESULT;
 
   // Copy the data of the "live" OpenGL texture referring to this IOSurfaceRef
   // into |out|. The copied region is specified with |src_pixel_subrect| and
@@ -113,6 +111,8 @@ class CompositingIOSurfaceMac {
   bool HasBeenPoisoned() const;
 
  private:
+  friend class base::RefCounted<CompositingIOSurfaceMac>;
+
   // Vertex structure for use in glDraw calls.
   struct SurfaceVertex {
     SurfaceVertex() : x_(0.0f), y_(0.0f), tx_(0.0f), ty_(0.0f) { }
@@ -167,119 +167,33 @@ class CompositingIOSurfaceMac {
     SurfaceVertex verts_[4];
   };
 
-  // Keeps track of states and buffers for readback of IOSurface.
-  //
-  // TODO(miu): Major code refactoring is badly needed!  To be done in a
-  // soon-upcoming change.  For now, we blatantly violate the style guide with
-  // respect to struct vs. class usage:
-  struct CopyContext {
-    explicit CopyContext(const scoped_refptr<CompositingIOSurfaceContext>& ctx);
-    ~CopyContext();
-
-    // Delete any references to owned OpenGL objects.  This must be called
-    // within the OpenGL context just before destruction.
-    void ReleaseCachedGLObjects();
-
-    // The following two methods assume |num_outputs| has been set, and are
-    // being called within the OpenGL context.
-    void PrepareReadbackFramebuffers();
-    void PrepareForAsynchronousReadback();
-
-    const scoped_ptr<CompositingIOSurfaceTransformer> transformer;
-    GLenum output_readback_format;
-    int num_outputs;
-    GLuint output_textures[3];  // Not owned.
-    // Note: For YUV, the |output_texture_sizes| widths are in terms of 4-byte
-    // quads, not pixels.
-    gfx::Size output_texture_sizes[3];
-    GLuint frame_buffers[3];
-    GLuint pixel_buffers[3];
-    GLuint fence;  // When non-zero, doing an asynchronous copy.
-    int cycles_elapsed;
-    base::Callback<bool(const void*, int)> map_buffer_callback;
-    base::Callback<void(bool)> done_callback;
-  };
-
   CompositingIOSurfaceMac(
-      IOSurfaceSupport* io_surface_support,
       const scoped_refptr<CompositingIOSurfaceContext>& context);
-
-  // If this IOSurface has moved to a different window, use that window's
-  // GL context (if multiple visible windows are using the same GL context
-  // then call to setView call can stall and prevent reaching 60fps).
-  void SwitchToContextOnNewWindow(NSView* view,
-                                  int window_number);
+  ~CompositingIOSurfaceMac();
 
   // Returns true if IOSurface is ready to render. False otherwise.
   bool MapIOSurfaceToTextureWithContextCurrent(
       const scoped_refptr<CompositingIOSurfaceContext>& current_context,
       const gfx::Size pixel_size,
       float scale_factor,
-      uint64 io_surface_handle) WARN_UNUSED_RESULT;
+      IOSurfaceID io_surface_handle) WARN_UNUSED_RESULT;
 
   void UnrefIOSurfaceWithContextCurrent();
 
   void DrawQuad(const SurfaceQuad& quad);
 
-  // Copy current frame to |target| video frame. This method must be called
-  // within a CGL context. Returns a callback that should be called outside
-  // of the CGL context.
-  // If |called_within_draw| is true this method is called within a drawing
-  // operations. This allow certain optimizations.
-  base::Closure CopyToVideoFrameWithinContext(
-      const gfx::Rect& src_subrect,
-      bool called_within_draw,
-      const scoped_refptr<media::VideoFrame>& target,
-      const base::Callback<void(bool)>& callback);
-
-  // Common GPU-readback copy path.  Only one of |bitmap_output| or
-  // |video_frame_output| may be specified: Either ARGB is written to
-  // |bitmap_output| or letter-boxed YV12 is written to |video_frame_output|.
-  base::Closure CopyToSelectedOutputWithinContext(
-      const gfx::Rect& src_pixel_subrect,
-      const gfx::Rect& dst_pixel_rect,
-      bool called_within_draw,
-      const SkBitmap* bitmap_output,
-      const scoped_refptr<media::VideoFrame>& video_frame_output,
-      const base::Callback<void(bool)>& done_callback);
-
-  // TODO(hclam): These two methods should be static.
-  void AsynchronousReadbackForCopy(
-      const gfx::Rect& dst_pixel_rect,
-      bool called_within_draw,
-      CopyContext* copy_context,
-      const SkBitmap* bitmap_output,
-      const scoped_refptr<media::VideoFrame>& video_frame_output);
-  bool SynchronousReadbackForCopy(
-      const gfx::Rect& dst_pixel_rect,
-      CopyContext* copy_context,
-      const SkBitmap* bitmap_output,
-      const scoped_refptr<media::VideoFrame>& video_frame_output);
-
-  void CheckIfAllCopiesAreFinishedWithinContext(
-      bool block_until_finished,
-      std::vector<base::Closure>* done_callbacks);
-
-  void FailAllCopies();
-  void DestroyAllCopyContextsWithinContext();
-
   // Check for GL errors and store the result in error_. Only return new
   // errors
   GLenum GetAndSaveGLError();
 
-  gfx::Rect IntersectWithIOSurface(const gfx::Rect& rect) const;
-
-  // Cached pointer to IOSurfaceSupport Singleton.
-  IOSurfaceSupport* io_surface_support_;
-
   // Offscreen context used for all operations other than drawing to the
   // screen. This is in the same share group as the contexts used for
   // drawing, and is the same for all IOSurfaces in all windows.
   scoped_refptr<CompositingIOSurfaceContext> offscreen_context_;
 
   // IOSurface data.
-  uint64 io_surface_handle_;
-  base::ScopedCFTypeRef<CFTypeRef> io_surface_;
+  IOSurfaceID io_surface_handle_;
+  base::ScopedCFTypeRef<IOSurfaceRef> io_surface_;
 
   // The width and height of the io surface.
   gfx::Size pixel_io_surface_size_;  // In pixels.
@@ -293,16 +207,6 @@ class CompositingIOSurfaceMac {
   // with it.
   GLuint texture_;
 
-  // A pool of CopyContexts with OpenGL objects ready for re-use.  Prefer to
-  // pull one from the pool before creating a new CopyContext.
-  std::vector<CopyContext*> copy_context_pool_;
-
-  // CopyContexts being used for in-flight copy operations.
-  std::deque<CopyContext*> copy_requests_;
-
-  // Timer for finishing a copy operation.
-  base::Timer finish_copy_timer_;
-
   // Error saved by GetAndSaveGLError
   GLint gl_error_;