blob: 227bbad092cd9669e0010c0474e469277204d777 [file] [log] [blame]
// 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_