// Copyright (c) 2012 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 CONTENT_BROWSER_RENDERER_HOST_ACCELERATED_SURFACE_CONTAINER_MAC_H_ #define CONTENT_BROWSER_RENDERER_HOST_ACCELERATED_SURFACE_CONTAINER_MAC_H_ // The "GPU plugin" is currently implemented as a special kind of // NPAPI plugin to provide high-performance on-screen 3D rendering for // Pepper 3D. // // On Windows and X11 platforms the GPU plugin relies on cross-process // parenting of windows, which is not supported via any public APIs in // the Mac OS X window system. // // To achieve full hardware acceleration we use the new IOSurface APIs // introduced in Mac OS X 10.6. The GPU plugin's process produces an // IOSurface and renders into it using OpenGL. It uses the // IOSurfaceGetID and IOSurfaceLookup APIs to pass a reference to this // surface to the browser process for on-screen rendering. The GPU // plugin essentially looks like a windowless plugin; the browser // process gets all of the mouse events, because the plugin process // does not have an on-screen window. // // This class encapsulates some of the management of these data // structures, in conjunction with the AcceleratedSurfaceContainerManagerMac. #include #include #include "base/basictypes.h" #include "base/mac/scoped_cftyperef.h" #include "base/memory/scoped_ptr.h" #include "ui/gfx/native_widget_types.h" #include "ui/gfx/rect.h" #include "ui/surface/transport_dib.h" namespace webkit { namespace npapi { struct WebPluginGeometry; } } class AcceleratedSurfaceContainerManagerMac; class AcceleratedSurfaceContainerMac { public: AcceleratedSurfaceContainerMac( AcceleratedSurfaceContainerManagerMac* manager, bool opaque); virtual ~AcceleratedSurfaceContainerMac(); // Sets the backing store and size of this accelerated surface container. // There are two versions: the IOSurface version is used on systems where the // IOSurface API is supported (Mac OS X 10.6 and later); the TransportDIB is // used on Mac OS X 10.5 and earlier. void SetSizeAndIOSurface(int32 width, int32 height, uint64 io_surface_identifier); void SetSizeAndTransportDIB(int32 width, int32 height, TransportDIB::Handle transport_dib); // Tells the accelerated surface container that its geometry has changed, // for example because of a scroll event. (Note that the container // currently only pays attention to the clip width and height, since the // view in which it is hosted is responsible for positioning it on the // page.) void SetGeometry(const webkit::npapi::WebPluginGeometry& geom); // Draws this accelerated surface's contents, texture mapped onto a quad in // the given OpenGL context. TODO(kbr): figure out and define exactly how the // coordinate system will work out. void Draw(CGLContextObj context); // Causes the next Draw call to trigger a texture upload. Should be called any // time the drawing context has changed. void ForceTextureReload() { texture_needs_upload_ = true; } // Returns if the surface should be shown. bool ShouldBeVisible() const; // Notifies the the container that its surface was painted to. void set_was_painted_to(uint64 surface_handle); void set_was_painted_to(uint64 surface_handle, const gfx::Rect& update_rect); // Notifies the container that its surface is invalid. void set_surface_invalid() { was_painted_to_ = false; } private: // Enqueue our texture for later deletion. void EnqueueTextureForDeletion(); void set_was_painted_to_common(uint64 surface_handle); // The manager of this accelerated surface container. AcceleratedSurfaceContainerManagerMac* manager_; // Whether this accelerated surface's content is supposed to be opaque. bool opaque_; // The IOSurfaceRef, if any, that has been handed from the GPU // plugin process back to the browser process for drawing. // This is held as a CFTypeRef because we can't refer to the // IOSurfaceRef type when building on 10.5. base::mac::ScopedCFTypeRef surface_; // The handle of |surface_|, or 0 if |surface_| is NULL. uint64 surface_handle_; // The width and height of the io surface. During resizing, this is different // from |width_| and |height_|. int32 surface_width_; int32 surface_height_; // The TransportDIB which is used in pre-10.6 systems where the IOSurface // API is not supported. This is a weak reference to the actual TransportDIB // whic is owned by the GPU process. scoped_ptr transport_dib_; // The width and height of the container. int32 width_; int32 height_; // The clip rectangle, relative to the (x_, y_) origin. gfx::Rect clip_rect_; // The "live" OpenGL texture referring to this IOSurfaceRef. Note // that per the CGLTexImageIOSurface2D API we do not need to // explicitly update this texture's contents once created. All we // need to do is ensure it is re-bound before attempting to draw // with it. GLuint texture_; // True if we need to upload the texture again during the next draw. bool texture_needs_upload_; // The region that was updated via a partial update. |update_rect_.IsEmpty()| // indicates that the whole region was updated. gfx::Rect update_rect_; // This may refer to an old version of the texture if the container is // resized, for example. GLuint texture_pending_deletion_; // Stores if the plugin has a visible state. bool visible_; // Stores if the plugin's IOSurface has been swapped before. Used to not show // it before it hasn't been painted to at least once. bool was_painted_to_; DISALLOW_COPY_AND_ASSIGN(AcceleratedSurfaceContainerMac); }; #endif // CONTENT_BROWSER_RENDERER_HOST_ACCELERATED_SURFACE_CONTAINER_MAC_H_