Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(109)

Side by Side Diff: ui/gfx/compositor/compositor.h

Issue 9297041: Merge Compositor and CompositorCC (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: rebase Created 8 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « ui/aura/window.cc ('k') | ui/gfx/compositor/compositor.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #ifndef UI_GFX_COMPOSITOR_COMPOSITOR_H_ 5 #ifndef UI_GFX_COMPOSITOR_COMPOSITOR_H_
6 #define UI_GFX_COMPOSITOR_COMPOSITOR_H_ 6 #define UI_GFX_COMPOSITOR_COMPOSITOR_H_
7 #pragma once 7 #pragma once
8 8
9 #include "base/memory/ref_counted.h" 9 #include "base/memory/ref_counted.h"
10 #include "base/memory/singleton.h"
10 #include "base/observer_list.h" 11 #include "base/observer_list.h"
12 #include "third_party/WebKit/Source/WebKit/chromium/public/platform/WebLayer.h"
13 #include "third_party/WebKit/Source/WebKit/chromium/public/platform/WebLayerTree View.h"
14 #include "third_party/WebKit/Source/WebKit/chromium/public/platform/WebLayerTree ViewClient.h"
11 #include "ui/gfx/compositor/compositor_export.h" 15 #include "ui/gfx/compositor/compositor_export.h"
12 #include "ui/gfx/transform.h" 16 #include "ui/gfx/transform.h"
13 #include "ui/gfx/native_widget_types.h" 17 #include "ui/gfx/native_widget_types.h"
14 #include "ui/gfx/size.h" 18 #include "ui/gfx/size.h"
15 19
20
16 class SkBitmap; 21 class SkBitmap;
17 class SkCanvas; 22 class SkCanvas;
18 namespace gfx { 23 namespace gfx {
24 class GLContext;
25 class GLSurface;
26 class GLShareGroup;
19 class Point; 27 class Point;
20 class Rect; 28 class Rect;
21 class ScopedMakeCurrent; 29 class ScopedMakeCurrent;
22 } 30 }
23 31
24 namespace ui { 32 namespace ui {
25 33
26 class CompositorObserver; 34 class CompositorObserver;
27 class Layer; 35 class Layer;
28 36
29 class SharedResources { 37 class COMPOSITOR_EXPORT SharedResources {
30 public: 38 public:
31 virtual ~SharedResources() {} 39 static SharedResources* GetInstance();
32 40
33 // Creates an instance of ScopedMakeCurrent. 41 // Creates an instance of ScopedMakeCurrent.
34 // Note: Caller is responsible for managing lifetime of returned pointer. 42 // Note: Caller is responsible for managing lifetime of returned pointer.
35 virtual gfx::ScopedMakeCurrent* GetScopedMakeCurrent() = 0; 43 gfx::ScopedMakeCurrent* GetScopedMakeCurrent();
36 44
37 virtual void* GetDisplay() = 0; 45 void* GetDisplay();
46 gfx::GLShareGroup* GetShareGroup();
47
48 private:
49 friend struct DefaultSingletonTraits<SharedResources>;
50
51 SharedResources();
52 ~SharedResources();
53
54 bool Initialize();
55 void Destroy();
56
57 bool initialized_;
58
59 scoped_refptr<gfx::GLContext> context_;
60 scoped_refptr<gfx::GLSurface> surface_;
61
62 DISALLOW_COPY_AND_ASSIGN(SharedResources);
38 }; 63 };
39 64
40 struct TextureDrawParams { 65 // Texture provide an abstraction over the external texture that can be passed
41 TextureDrawParams(); 66 // to a layer.
42
43 // The transform to be applied to the texture.
44 ui::Transform transform;
45
46 // If this is true, then the texture is blended with the pixels behind it.
47 // Otherwise, the drawn pixels clobber the old pixels.
48 bool blend;
49
50 // If this is false, the alpha values for this texture should not be trusted.
51 bool has_valid_alpha_channel;
52
53 // This multiplier is applied to all pixels before blending. The intent is to
54 // allow alpha to be animated (for effects such as cross fades).
55 float opacity;
56
57 // Sometimes the texture is vertically flipped. In this case we have to
58 // draw the texture differently.
59 bool vertically_flipped;
60
61 // The size of the surface that the texture is drawn to.
62 gfx::Size compositor_size;
63
64 // Copy and assignment are allowed.
65 };
66
67 // Textures are created by a Compositor for managing an accelerated view.
68 // Any time a View with a texture needs to redraw itself it invokes SetCanvas().
69 // When the view is ready to be drawn Draw() is invoked.
70 //
71 // Texture is really a proxy to the gpu. Texture does not itself keep a copy of
72 // the bitmap.
73 //
74 // Views own the Texture.
75 class COMPOSITOR_EXPORT Texture : public base::RefCounted<Texture> { 67 class COMPOSITOR_EXPORT Texture : public base::RefCounted<Texture> {
76 public: 68 public:
77 // Sets the canvas of this texture. The origin is at |origin|. 69 Texture();
78 // |overall_size| gives the total size of texture. 70 virtual ~Texture();
79 virtual void SetCanvas(const SkCanvas& canvas,
80 const gfx::Point& origin,
81 const gfx::Size& overall_size) = 0;
82 71
83 // Draws the portion of the texture contained within clip_bounds 72 unsigned int texture_id() const { return texture_id_; }
84 virtual void Draw(const ui::TextureDrawParams& params, 73 bool flipped() const { return flipped_; }
85 const gfx::Rect& clip_bounds_in_texture) = 0; 74 gfx::Size size() const { return size_; }
86 75
87 protected: 76 protected:
88 virtual ~Texture() {} 77 unsigned int texture_id_;
78 bool flipped_;
79 gfx::Size size_;
89 80
90 private: 81 private:
91 friend class base::RefCounted<Texture>; 82 DISALLOW_COPY_AND_ASSIGN(Texture);
92 }; 83 };
93 84
94 // An interface to allow the compositor to communicate with its owner. 85 // An interface to allow the compositor to communicate with its owner.
95 class COMPOSITOR_EXPORT CompositorDelegate { 86 class COMPOSITOR_EXPORT CompositorDelegate {
96 public: 87 public:
97 // Requests the owner to schedule a redraw of the layer tree. 88 // Requests the owner to schedule a redraw of the layer tree.
98 virtual void ScheduleDraw() = 0; 89 virtual void ScheduleDraw() = 0;
99 90
100 protected: 91 protected:
101 virtual ~CompositorDelegate() {} 92 virtual ~CompositorDelegate() {}
102 }; 93 };
103 94
104 // Compositor object to take care of GPU painting. 95 // Compositor object to take care of GPU painting.
105 // A Browser compositor object is responsible for generating the final 96 // A Browser compositor object is responsible for generating the final
106 // displayable form of pixels comprising a single widget's contents. It draws an 97 // displayable form of pixels comprising a single widget's contents. It draws an
107 // appropriately transformed texture for each transformed view in the widget's 98 // appropriately transformed texture for each transformed view in the widget's
108 // view hierarchy. 99 // view hierarchy.
109 class COMPOSITOR_EXPORT Compositor : public base::RefCounted<Compositor> { 100 class COMPOSITOR_EXPORT Compositor
101 : public base::RefCounted<Compositor>,
102 NON_EXPORTED_BASE(public WebKit::WebLayerTreeViewClient) {
110 public: 103 public:
111 // Create a compositor from the provided handle. 104 Compositor(CompositorDelegate* delegate,
112 static Compositor* Create(CompositorDelegate* delegate, 105 gfx::AcceleratedWidget widget,
113 gfx::AcceleratedWidget widget, 106 const gfx::Size& size);
114 const gfx::Size& size); 107 virtual ~Compositor();
115 108
116 // Creates a new texture. The caller owns the returned object. 109 static void Initialize(bool useThread);
117 virtual Texture* CreateTexture() = 0; 110 static void Terminate();
118
119 // Blurs the specific region in the compositor.
120 virtual void Blur(const gfx::Rect& bounds) = 0;
121 111
122 // Schedules a redraw of the layer tree associated with this compositor. 112 // Schedules a redraw of the layer tree associated with this compositor.
123 virtual void ScheduleDraw(); 113 void ScheduleDraw();
124 114
125 // Sets the root of the layer tree drawn by this Compositor. The root layer 115 // Sets the root of the layer tree drawn by this Compositor. The root layer
126 // must have no parent. The compositor's root layer is reset if the root layer 116 // must have no parent. The compositor's root layer is reset if the root layer
127 // is destroyed. NULL can be passed to reset the root layer, in which case the 117 // is destroyed. NULL can be passed to reset the root layer, in which case the
128 // compositor will stop drawing anything. 118 // compositor will stop drawing anything.
129 // The Compositor does not own the root layer. 119 // The Compositor does not own the root layer.
130 const Layer* root_layer() const { return root_layer_; } 120 const Layer* root_layer() const { return root_layer_; }
131 Layer* root_layer() { return root_layer_; } 121 Layer* root_layer() { return root_layer_; }
132 void SetRootLayer(Layer* root_layer); 122 void SetRootLayer(Layer* root_layer);
133 123
134 // Draws the scene created by the layer tree and any visual effects. If 124 // Draws the scene created by the layer tree and any visual effects. If
135 // |force_clear| is true, this will cause the compositor to clear before 125 // |force_clear| is true, this will cause the compositor to clear before
136 // compositing. 126 // compositing.
137 void Draw(bool force_clear); 127 void Draw(bool force_clear);
138 128
139 // Reads the region |bounds| of the contents of the last rendered frame 129 // Reads the region |bounds| of the contents of the last rendered frame
140 // into the given bitmap. 130 // into the given bitmap.
141 // Returns false if the pixels could not be read. 131 // Returns false if the pixels could not be read.
142 virtual bool ReadPixels(SkBitmap* bitmap, const gfx::Rect& bounds) = 0; 132 bool ReadPixels(SkBitmap* bitmap, const gfx::Rect& bounds);
143 133
144 // Notifies the compositor that the size of the widget that it is 134 // Notifies the compositor that the size of the widget that it is
145 // drawing to has changed. 135 // drawing to has changed.
146 void WidgetSizeChanged(const gfx::Size& size) { 136 void WidgetSizeChanged(const gfx::Size& size);
147 if (size.IsEmpty())
148 return;
149 size_ = size;
150 OnWidgetSizeChanged();
151 }
152 137
153 // Returns the size of the widget that is being drawn to. 138 // Returns the size of the widget that is being drawn to.
154 const gfx::Size& size() { return size_; } 139 const gfx::Size& size() { return size_; }
155 140
156 // Compositor does not own observers. It is the responsibility of the 141 // Compositor does not own observers. It is the responsibility of the
157 // observer to remove itself when it is done observing. 142 // observer to remove itself when it is done observing.
158 void AddObserver(CompositorObserver* observer); 143 void AddObserver(CompositorObserver* observer);
159 void RemoveObserver(CompositorObserver* observer); 144 void RemoveObserver(CompositorObserver* observer);
160 bool HasObserver(CompositorObserver* observer); 145 bool HasObserver(CompositorObserver* observer);
161 146
162 protected: 147 // WebLayerTreeViewClient implementation.
163 Compositor(CompositorDelegate* delegate, const gfx::Size& size); 148 virtual void updateAnimations(double frameBeginTime);
164 virtual ~Compositor(); 149 virtual void layout();
150 virtual void applyScrollAndScale(const WebKit::WebSize& scrollDelta,
151 float scaleFactor);
152 virtual WebKit::WebGraphicsContext3D* createContext3D();
153 virtual void didCompleteSwapBuffers();
154 virtual void didRebindGraphicsContext(bool success);
155 virtual void scheduleComposite();
165 156
166 // Notifies the compositor that compositing is about to start. 157 private:
167 virtual void OnNotifyStart(bool clear) = 0;
168
169 // Notifies the compositor that compositing is complete.
170 virtual void OnNotifyEnd() = 0;
171
172 virtual void OnWidgetSizeChanged() = 0;
173 virtual void OnRootLayerChanged();
174 virtual void DrawTree();
175 virtual bool CompositesAsynchronously();
176
177 CompositorDelegate* delegate() { return delegate_; }
178
179 // When reading back pixel data we often get RGBA rather than BGRA pixels and 158 // When reading back pixel data we often get RGBA rather than BGRA pixels and
180 // and the image often needs to be flipped vertically. 159 // and the image often needs to be flipped vertically.
181 static void SwizzleRGBAToBGRAAndFlip(unsigned char* pixels, 160 static void SwizzleRGBAToBGRAAndFlip(unsigned char* pixels,
182 const gfx::Size& image_size); 161 const gfx::Size& image_size);
183 162
184 // Notifies the compositor that compositing is complete. 163 // Notifies the compositor that compositing is complete.
185 void NotifyEnd(); 164 void NotifyEnd();
186 165
187 private:
188 // Notifies the compositor that compositing is about to start. See Draw() for
189 // notes about |force_clear|.
190 void NotifyStart(bool force_clear);
191
192 CompositorDelegate* delegate_; 166 CompositorDelegate* delegate_;
193 gfx::Size size_; 167 gfx::Size size_;
194 168
195 // The root of the Layer tree drawn by this compositor. 169 // The root of the Layer tree drawn by this compositor.
196 Layer* root_layer_; 170 Layer* root_layer_;
197 171
198 ObserverList<CompositorObserver> observer_list_; 172 ObserverList<CompositorObserver> observer_list_;
199 173
174 gfx::AcceleratedWidget widget_;
175 WebKit::WebLayer root_web_layer_;
176 WebKit::WebLayerTreeView host_;
177
200 friend class base::RefCounted<Compositor>; 178 friend class base::RefCounted<Compositor>;
201 }; 179 };
202 180
203 } // namespace ui 181 } // namespace ui
204 182
205 #endif // UI_GFX_COMPOSITOR_COMPOSITOR_H_ 183 #endif // UI_GFX_COMPOSITOR_COMPOSITOR_H_
OLDNEW
« no previous file with comments | « ui/aura/window.cc ('k') | ui/gfx/compositor/compositor.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698