| // 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 <CoreFoundation/CoreFoundation.h> |
| #include <OpenGL/OpenGL.h> |
| |
| #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<CFTypeRef> 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<TransportDIB> 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_ |