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

Side by Side Diff: content/browser/renderer_host/image_transport_factory.cc

Issue 11194042: Implement TextureImageTransportSurface using texture mailbox (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 8 years, 1 month 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
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 #include "content/browser/renderer_host/image_transport_factory.h" 5 #include "content/browser/renderer_host/image_transport_factory.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <map> 8 #include <map>
9 9
10 #include "base/bind.h" 10 #include "base/bind.h"
11 #include "base/command_line.h" 11 #include "base/command_line.h"
12 #include "base/memory/ref_counted.h" 12 #include "base/memory/ref_counted.h"
13 #include "base/memory/scoped_ptr.h"
13 #include "base/observer_list.h" 14 #include "base/observer_list.h"
14 #include "content/browser/gpu/browser_gpu_channel_host_factory.h" 15 #include "content/browser/gpu/browser_gpu_channel_host_factory.h"
15 #include "content/browser/gpu/gpu_data_manager_impl.h" 16 #include "content/browser/gpu/gpu_data_manager_impl.h"
16 #include "content/browser/gpu/gpu_surface_tracker.h" 17 #include "content/browser/gpu/gpu_surface_tracker.h"
17 #include "content/common/gpu/client/gl_helper.h" 18 #include "content/common/gpu/client/gl_helper.h"
18 #include "content/common/gpu/client/gpu_channel_host.h" 19 #include "content/common/gpu/client/gpu_channel_host.h"
19 #include "content/common/gpu/client/webgraphicscontext3d_command_buffer_impl.h" 20 #include "content/common/gpu/client/webgraphicscontext3d_command_buffer_impl.h"
20 #include "content/common/gpu/gpu_process_launch_causes.h" 21 #include "content/common/gpu/gpu_process_launch_causes.h"
21 #include "content/common/webkitplatformsupport_impl.h" 22 #include "content/common/webkitplatformsupport_impl.h"
22 #include "content/public/common/content_switches.h" 23 #include "content/public/common/content_switches.h"
23 #include "gpu/ipc/command_buffer_proxy.h" 24 #include "gpu/ipc/command_buffer_proxy.h"
24 #include "third_party/WebKit/Source/WebKit/chromium/public/platform/WebGraphicsC ontext3D.h" 25 #include "third_party/WebKit/Source/WebKit/chromium/public/platform/WebGraphicsC ontext3D.h"
25 #include "ui/compositor/compositor.h" 26 #include "ui/compositor/compositor.h"
26 #include "ui/compositor/compositor_setup.h" 27 #include "ui/compositor/compositor_setup.h"
27 #include "ui/compositor/test_web_graphics_context_3d.h" 28 #include "ui/compositor/test_web_graphics_context_3d.h"
28 #include "ui/gfx/native_widget_types.h" 29 #include "ui/gfx/native_widget_types.h"
29 #include "ui/gfx/size.h" 30 #include "ui/gfx/size.h"
31 #include "third_party/khronos/GLES2/gl2.h"
32 #include "third_party/khronos/GLES2/gl2ext.h"
30 33
31 #if defined(OS_WIN) 34 #if defined(OS_WIN)
32 #include "ui/surface/accelerated_surface_win.h" 35 #include "ui/surface/accelerated_surface_win.h"
33 #endif 36 #endif
34 37
35 using content::BrowserGpuChannelHostFactory; 38 using content::BrowserGpuChannelHostFactory;
36 using content::GLHelper; 39 using content::GLHelper;
37 using content::GpuChannelHostFactory; 40 using content::GpuChannelHostFactory;
38 using content::GpuSurfaceTracker; 41 using content::GpuSurfaceTracker;
39 using content::WebGraphicsContext3DCommandBufferImpl; 42 using content::WebGraphicsContext3DCommandBufferImpl;
(...skipping 19 matching lines...) Expand all
59 return gfx::GLSurfaceHandle(); 62 return gfx::GLSurfaceHandle();
60 } 63 }
61 64
62 virtual void DestroySharedSurfaceHandle( 65 virtual void DestroySharedSurfaceHandle(
63 gfx::GLSurfaceHandle surface) OVERRIDE { 66 gfx::GLSurfaceHandle surface) OVERRIDE {
64 } 67 }
65 68
66 virtual scoped_refptr<ui::Texture> CreateTransportClient( 69 virtual scoped_refptr<ui::Texture> CreateTransportClient(
67 const gfx::Size& size, 70 const gfx::Size& size,
68 float device_scale_factor, 71 float device_scale_factor,
69 uint64 transport_handle) OVERRIDE { 72 const std::vector<signed char>& mailbox_name) OVERRIDE {
70 return NULL; 73 return NULL;
71 } 74 }
72 75
73 virtual scoped_refptr<ui::Texture> CreateOwnedTexture( 76 virtual scoped_refptr<ui::Texture> CreateOwnedTexture(
74 const gfx::Size& size, 77 const gfx::Size& size,
75 float device_scale_factor, 78 float device_scale_factor,
76 unsigned int texture_id) OVERRIDE { 79 unsigned int texture_id) OVERRIDE {
77 return NULL; 80 return NULL;
78 } 81 }
79 82
(...skipping 11 matching lines...) Expand all
91 } 94 }
92 95
93 virtual void RemoveObserver( 96 virtual void RemoveObserver(
94 ImageTransportFactoryObserver* observer) OVERRIDE { 97 ImageTransportFactoryObserver* observer) OVERRIDE {
95 } 98 }
96 99
97 private: 100 private:
98 DISALLOW_COPY_AND_ASSIGN(DefaultTransportFactory); 101 DISALLOW_COPY_AND_ASSIGN(DefaultTransportFactory);
99 }; 102 };
100 103
101 class ImageTransportClientTexture : public ui::Texture {
102 public:
103 ImageTransportClientTexture(
104 WebKit::WebGraphicsContext3D* host_context,
105 const gfx::Size& size,
106 float device_scale_factor,
107 uint64 surface_id)
108 : ui::Texture(true, size, device_scale_factor),
109 host_context_(host_context),
110 texture_id_(surface_id) {
111 }
112
113 // ui::Texture overrides:
114 virtual unsigned int PrepareTexture() OVERRIDE {
115 return texture_id_;
116 }
117
118 virtual WebKit::WebGraphicsContext3D* HostContext3D() OVERRIDE {
119 return host_context_;
120 }
121
122 protected:
123 virtual ~ImageTransportClientTexture() {}
124
125 private:
126 // A raw pointer. This |ImageTransportClientTexture| will be destroyed
127 // before the |host_context_| via
128 // |ImageTransportFactoryObserver::OnLostContext()| handlers.
129 WebKit::WebGraphicsContext3D* host_context_;
130 unsigned texture_id_;
131
132 DISALLOW_COPY_AND_ASSIGN(ImageTransportClientTexture);
133 };
134
135 class OwnedTexture : public ui::Texture, ImageTransportFactoryObserver { 104 class OwnedTexture : public ui::Texture, ImageTransportFactoryObserver {
136 public: 105 public:
137 OwnedTexture(WebKit::WebGraphicsContext3D* host_context, 106 OwnedTexture(WebKit::WebGraphicsContext3D* host_context,
138 const gfx::Size& size, 107 const gfx::Size& size,
139 float device_scale_factor, 108 float device_scale_factor,
140 unsigned int texture_id) 109 unsigned int texture_id)
141 : ui::Texture(true, size, device_scale_factor), 110 : ui::Texture(true, size, device_scale_factor),
142 host_context_(host_context), 111 host_context_(host_context),
143 texture_id_(texture_id) { 112 texture_id_(texture_id) {
144 ImageTransportFactory::GetInstance()->AddObserver(this); 113 ImageTransportFactory::GetInstance()->AddObserver(this);
(...skipping 12 matching lines...) Expand all
157 virtual void OnLostResources() OVERRIDE { 126 virtual void OnLostResources() OVERRIDE {
158 DeleteTexture(); 127 DeleteTexture();
159 } 128 }
160 129
161 protected: 130 protected:
162 virtual ~OwnedTexture() { 131 virtual ~OwnedTexture() {
163 ImageTransportFactory::GetInstance()->RemoveObserver(this); 132 ImageTransportFactory::GetInstance()->RemoveObserver(this);
164 DeleteTexture(); 133 DeleteTexture();
165 } 134 }
166 135
167 private: 136 protected:
168 void DeleteTexture() { 137 void DeleteTexture() {
169 if (texture_id_) { 138 if (texture_id_) {
170 host_context_->deleteTexture(texture_id_); 139 host_context_->deleteTexture(texture_id_);
171 texture_id_ = 0; 140 texture_id_ = 0;
172 } 141 }
173 } 142 }
174 143
175 // A raw pointer. This |ImageTransportClientTexture| will be destroyed 144 // A raw pointer. This |ImageTransportClientTexture| will be destroyed
176 // before the |host_context_| via 145 // before the |host_context_| via
177 // |ImageTransportFactoryObserver::OnLostContext()| handlers. 146 // |ImageTransportFactoryObserver::OnLostContext()| handlers.
178 WebKit::WebGraphicsContext3D* host_context_; 147 WebKit::WebGraphicsContext3D* host_context_;
179 unsigned texture_id_; 148 unsigned texture_id_;
180 149
181 DISALLOW_COPY_AND_ASSIGN(OwnedTexture); 150 DISALLOW_COPY_AND_ASSIGN(OwnedTexture);
182 }; 151 };
183 152
153 class ImageTransportClientTexture : public OwnedTexture {
154 public:
155 ImageTransportClientTexture(
156 WebKit::WebGraphicsContext3D* host_context,
157 const gfx::Size& size,
158 float device_scale_factor,
159 const std::vector<signed char>& mailbox_name)
160 : OwnedTexture(host_context,
161 size,
162 device_scale_factor,
163 host_context->createTexture()),
164 mailbox_name_(mailbox_name) {
165 DCHECK(mailbox_name.size() == GL_MAILBOX_SIZE_CHROMIUM);
166 }
167
168 virtual void Consume(const gfx::Size& new_size) OVERRIDE {
169 if (host_context_) {
170 DCHECK(texture_id_);
171 host_context_->bindTexture(GL_TEXTURE_2D, texture_id_);
172 host_context_->consumeTextureCHROMIUM(
173 GL_TEXTURE_2D, mailbox_name_.data());
174 size_ = new_size;
175 }
176 }
177
178 virtual void Produce() OVERRIDE {
179 if (host_context_) {
180 DCHECK(texture_id_);
181 host_context_->bindTexture(GL_TEXTURE_2D, texture_id_);
182 host_context_->produceTextureCHROMIUM(
183 GL_TEXTURE_2D, mailbox_name_.data());
jonathan.backer 2012/11/12 16:52:14 cppreference.com says that std::vector::data is a
184 }
185 }
186
187 protected:
188 virtual ~ImageTransportClientTexture() {}
189
190 private:
191 std::vector<signed char> mailbox_name_;
192 DISALLOW_COPY_AND_ASSIGN(ImageTransportClientTexture);
193 };
194
184 class GpuProcessTransportFactory; 195 class GpuProcessTransportFactory;
185 196
186 class CompositorSwapClient 197 class CompositorSwapClient
187 : public base::SupportsWeakPtr<CompositorSwapClient>, 198 : public base::SupportsWeakPtr<CompositorSwapClient>,
188 public WebGraphicsContext3DSwapBuffersClient { 199 public WebGraphicsContext3DSwapBuffersClient {
189 public: 200 public:
190 CompositorSwapClient(ui::Compositor* compositor, 201 CompositorSwapClient(ui::Compositor* compositor,
191 GpuProcessTransportFactory* factory) 202 GpuProcessTransportFactory* factory)
192 : compositor_(compositor), 203 : compositor_(compositor),
193 factory_(factory) { 204 factory_(factory) {
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
266 277
267 virtual ui::ContextFactory* AsContextFactory() OVERRIDE { 278 virtual ui::ContextFactory* AsContextFactory() OVERRIDE {
268 return this; 279 return this;
269 } 280 }
270 281
271 virtual gfx::GLSurfaceHandle CreateSharedSurfaceHandle() OVERRIDE { 282 virtual gfx::GLSurfaceHandle CreateSharedSurfaceHandle() OVERRIDE {
272 CreateSharedContextLazy(); 283 CreateSharedContextLazy();
273 gfx::GLSurfaceHandle handle = gfx::GLSurfaceHandle( 284 gfx::GLSurfaceHandle handle = gfx::GLSurfaceHandle(
274 gfx::kNullPluginWindow, true); 285 gfx::kNullPluginWindow, true);
275 handle.parent_gpu_process_id = shared_context_->GetGPUProcessID(); 286 handle.parent_gpu_process_id = shared_context_->GetGPUProcessID();
276 handle.parent_client_id = shared_context_->GetChannelID();
277 handle.parent_context_id = shared_context_->GetContextID();
278 handle.parent_texture_id[0] = shared_context_->createTexture();
279 handle.parent_texture_id[1] = shared_context_->createTexture();
280 handle.sync_point = shared_context_->insertSyncPoint();
281 287
282 return handle; 288 return handle;
283 } 289 }
284 290
285 virtual void DestroySharedSurfaceHandle( 291 virtual void DestroySharedSurfaceHandle(
286 gfx::GLSurfaceHandle surface) OVERRIDE { 292 gfx::GLSurfaceHandle surface) OVERRIDE {
287 if (!shared_context_.get())
288 return;
289 uint32 channel_id = shared_context_->GetChannelID();
290 uint32 context_id = shared_context_->GetContextID();
291 if (surface.parent_gpu_process_id != shared_context_->GetGPUProcessID() ||
292 surface.parent_client_id != channel_id ||
293 surface.parent_context_id != context_id)
294 return;
295
296 shared_context_->deleteTexture(surface.parent_texture_id[0]);
297 shared_context_->deleteTexture(surface.parent_texture_id[1]);
298 shared_context_->flush();
299 } 293 }
300 294
301 virtual scoped_refptr<ui::Texture> CreateTransportClient( 295 virtual scoped_refptr<ui::Texture> CreateTransportClient(
302 const gfx::Size& size, 296 const gfx::Size& size,
303 float device_scale_factor, 297 float device_scale_factor,
304 uint64 transport_handle) { 298 const std::vector<signed char>& mailbox_name) {
305 if (!shared_context_.get()) 299 if (!shared_context_.get())
306 return NULL; 300 return NULL;
307 scoped_refptr<ImageTransportClientTexture> image( 301 scoped_refptr<ImageTransportClientTexture> image(
308 new ImageTransportClientTexture(shared_context_.get(), 302 new ImageTransportClientTexture(shared_context_.get(),
309 size, device_scale_factor, 303 size, device_scale_factor,
310 transport_handle)); 304 mailbox_name));
311 return image; 305 return image;
312 } 306 }
313 307
314 virtual scoped_refptr<ui::Texture> CreateOwnedTexture( 308 virtual scoped_refptr<ui::Texture> CreateOwnedTexture(
315 const gfx::Size& size, 309 const gfx::Size& size,
316 float device_scale_factor, 310 float device_scale_factor,
317 unsigned int texture_id) OVERRIDE { 311 unsigned int texture_id) OVERRIDE {
318 if (!shared_context_.get()) 312 if (!shared_context_.get())
319 return NULL; 313 return NULL;
320 scoped_refptr<OwnedTexture> image( 314 scoped_refptr<OwnedTexture> image(
(...skipping 185 matching lines...) Expand 10 before | Expand all | Expand 10 after
506 void ImageTransportFactory::Terminate() { 500 void ImageTransportFactory::Terminate() {
507 ui::ContextFactory::SetInstance(NULL); 501 ui::ContextFactory::SetInstance(NULL);
508 delete g_factory; 502 delete g_factory;
509 g_factory = NULL; 503 g_factory = NULL;
510 } 504 }
511 505
512 // static 506 // static
513 ImageTransportFactory* ImageTransportFactory::GetInstance() { 507 ImageTransportFactory* ImageTransportFactory::GetInstance() {
514 return g_factory; 508 return g_factory;
515 } 509 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698