1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
|
// 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_
#pragma once
// 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_
|