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

Side by Side Diff: content/renderer/browser_plugin/browser_plugin_compositing_helper.cc

Issue 11967013: Fixes issues when switching between software and compositing. (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: Created 7 years, 11 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
OLDNEW
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2013 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/renderer/browser_plugin/browser_plugin_compositing_helper.h" 5 #include "content/renderer/browser_plugin/browser_plugin_compositing_helper.h"
6 6
7 #include "cc/texture_layer.h" 7 #include "cc/texture_layer.h"
8 #include "content/common/browser_plugin_messages.h" 8 #include "content/common/browser_plugin_messages.h"
9 #include "content/renderer/render_thread_impl.h" 9 #include "content/renderer/render_thread_impl.h"
10 #include "third_party/khronos/GLES2/gl2.h"
11 #include "third_party/WebKit/Source/Platform/chromium/public/WebGraphicsContext3 D.h"
12 #include "third_party/WebKit/Source/Platform/chromium/public/WebSharedGraphicsCo ntext3D.h"
10 #include "third_party/WebKit/Source/WebKit/chromium/public/WebPluginContainer.h" 13 #include "third_party/WebKit/Source/WebKit/chromium/public/WebPluginContainer.h"
11 #include "webkit/compositor_bindings/web_layer_impl.h" 14 #include "webkit/compositor_bindings/web_layer_impl.h"
12 15
13 namespace content { 16 namespace content {
14 17
15 static void SendACK(const std::string& mailbox_name,
16 int host_route_id,
17 int gpu_route_id,
18 int gpu_host_id,
19 unsigned sync_point) {
20 RenderThread::Get()->Send(
21 new BrowserPluginHostMsg_BuffersSwappedACK(
22 host_route_id,
23 gpu_route_id,
24 gpu_host_id,
25 mailbox_name,
26 sync_point));
27 }
28
29 BrowserPluginCompositingHelper::BrowserPluginCompositingHelper( 18 BrowserPluginCompositingHelper::BrowserPluginCompositingHelper(
30 WebKit::WebPluginContainer* container, 19 WebKit::WebPluginContainer* container,
31 int host_routing_id) 20 int host_routing_id)
32 : host_routing_id_(host_routing_id), 21 : host_routing_id_(host_routing_id),
33 last_mailbox_valid_(false), 22 last_mailbox_valid_(false),
23 ack_pending_(true),
34 container_(container) { 24 container_(container) {
35 } 25 }
36 26
37 BrowserPluginCompositingHelper::~BrowserPluginCompositingHelper() { 27 BrowserPluginCompositingHelper::~BrowserPluginCompositingHelper() {
38 container_->setWebLayer(NULL);
39 } 28 }
40 29
41 void BrowserPluginCompositingHelper::EnableCompositing(bool enable) { 30 void BrowserPluginCompositingHelper::EnableCompositing(bool enable) {
42 if (enable && !texture_layer_) { 31 if (enable && !texture_layer_) {
43 texture_layer_ = cc::TextureLayer::createForMailbox(); 32 texture_layer_ = cc::TextureLayer::createForMailbox();
44 web_layer_.reset(new WebKit::WebLayerImpl(texture_layer_)); 33 web_layer_.reset(new WebKit::WebLayerImpl(texture_layer_));
45 } 34 }
46 35
47 container_->setWebLayer(enable ? web_layer_.get() : NULL); 36 container_->setWebLayer(enable ? web_layer_.get() : NULL);
48 } 37 }
49 38
39 void BrowserPluginCompositingHelper::FreeMailboxMemory(
40 const std::string& mailbox_name) {
41 WebKit::WebGraphicsContext3D *context =
42 WebKit::WebSharedGraphicsContext3D::mainThreadContext();
43 DCHECK(context);
44 unsigned texture_id = context->createTexture();
45 context->bindTexture(GL_TEXTURE_2D, texture_id);
46 context->consumeTextureCHROMIUM(
47 GL_TEXTURE_2D,
48 reinterpret_cast<const int8*>(mailbox_name.data()));
49 context->deleteTexture(texture_id);
50 }
51
52 void BrowserPluginCompositingHelper::MailboxReleased(
53 const std::string& mailbox_name,
54 int gpu_route_id,
55 int gpu_host_id,
56 unsigned sync_point) {
57 if (!ack_pending_) {
58 FreeMailboxMemory(mailbox_name);
59 last_mailbox_valid_ = false;
60 return;
61 }
62 ack_pending_ = false;
63 RenderThread::Get()->Send(
Fady Samuel 2013/01/16 16:22:22 Please use BrowserPluginManager to send messages f
64 new BrowserPluginHostMsg_BuffersSwappedACK(
65 host_routing_id_,
66 gpu_route_id,
67 gpu_host_id,
68 mailbox_name,
69 sync_point));
70 }
71
72 void BrowserPluginCompositingHelper::OnContainerDestroy() {
73 if (container_)
74 container_->setWebLayer(NULL);
75 container_ = NULL;
76
77 texture_layer_ = NULL;
78 web_layer_.reset();
79 }
80
50 void BrowserPluginCompositingHelper::OnBuffersSwapped( 81 void BrowserPluginCompositingHelper::OnBuffersSwapped(
51 const gfx::Size& size, 82 const gfx::Size& size,
52 const std::string& mailbox_name, 83 const std::string& mailbox_name,
53 int gpu_route_id, 84 int gpu_route_id,
54 int gpu_host_id) { 85 int gpu_host_id) {
86 ack_pending_ = true;
87 // Browser plugin getting destroyed, do a fast ACK.
88 if (!texture_layer_) {
89 MailboxReleased(mailbox_name, gpu_route_id, gpu_host_id, 0);
90 return;
91 }
92
55 if (buffer_size_ != size) { 93 if (buffer_size_ != size) {
56 buffer_size_ = size; 94 buffer_size_ = size;
57 UpdateUVRect(); 95 UpdateUVRect();
58 } 96 }
59 if (!last_mailbox_valid_)
60 SendACK(std::string(), host_routing_id_, gpu_route_id, gpu_host_id, 0);
61 97
62 bool current_mailbox_valid = !mailbox_name.empty(); 98 bool current_mailbox_valid = !mailbox_name.empty();
63 if (!current_mailbox_valid && !last_mailbox_valid_) 99 if (!last_mailbox_valid_) {
64 return; 100 MailboxReleased(std::string(), gpu_route_id, gpu_host_id, 0);
101 if (!current_mailbox_valid)
102 return;
103 }
65 104
66 cc::TextureLayer::MailboxCallback callback; 105 cc::TextureLayer::MailboxCallback callback;
67 if (current_mailbox_valid) { 106 if (current_mailbox_valid) {
68 callback = base::Bind(&SendACK, 107 scoped_refptr<BrowserPluginCompositingHelper> helper(this);
108 callback = base::Bind(&BrowserPluginCompositingHelper::MailboxReleased,
109 helper,
69 mailbox_name, 110 mailbox_name,
70 host_routing_id_,
71 gpu_route_id, 111 gpu_route_id,
72 gpu_host_id); 112 gpu_host_id);
73 } 113 }
114
74 texture_layer_->setTextureMailbox(mailbox_name, callback); 115 texture_layer_->setTextureMailbox(mailbox_name, callback);
75 last_mailbox_valid_ = current_mailbox_valid; 116 last_mailbox_valid_ = current_mailbox_valid;
76 } 117 }
77 118
78 void BrowserPluginCompositingHelper::SetContainerSize(const gfx::Size& size) { 119 void BrowserPluginCompositingHelper::SetContainerSize(const gfx::Size& size) {
79 if (container_size_ == size) 120 if (container_size_ == size)
80 return; 121 return;
81 122
82 container_size_ = size; 123 container_size_ = size;
83 UpdateUVRect(); 124 UpdateUVRect();
84 } 125 }
85 126
86 void BrowserPluginCompositingHelper::UpdateUVRect() { 127 void BrowserPluginCompositingHelper::UpdateUVRect() {
87 if (!texture_layer_) 128 if (!texture_layer_)
88 return; 129 return;
89 130
90 gfx::RectF uv_rect(0, 0, 1, 1); 131 gfx::RectF uv_rect(0, 0, 1, 1);
91 if (!buffer_size_.IsEmpty() && !container_size_.IsEmpty()) { 132 if (!buffer_size_.IsEmpty() && !container_size_.IsEmpty()) {
92 uv_rect.set_width(static_cast<float>(container_size_.width()) / 133 uv_rect.set_width(static_cast<float>(container_size_.width()) /
93 static_cast<float>(buffer_size_.width())); 134 static_cast<float>(buffer_size_.width()));
94 uv_rect.set_height(static_cast<float>(container_size_.height()) / 135 uv_rect.set_height(static_cast<float>(container_size_.height()) /
95 static_cast<float>(buffer_size_.height())); 136 static_cast<float>(buffer_size_.height()));
96 } 137 }
97 texture_layer_->setUVRect(uv_rect); 138 texture_layer_->setUVRect(uv_rect);
98 } 139 }
99 140
100 } // namespace content 141 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698