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

Side by Side Diff: content/renderer/pepper/pepper_compositor_host.cc

Issue 324983005: [PPAPI] Add browser tests for compositor API (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@compositor_api_impl_new
Patch Set: Rebase Created 6 years, 6 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 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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/pepper/pepper_compositor_host.h" 5 #include "content/renderer/pepper/pepper_compositor_host.h"
6 6
7 #include "base/logging.h" 7 #include "base/logging.h"
8 #include "base/memory/shared_memory.h" 8 #include "base/memory/shared_memory.h"
9 #include "cc/layers/layer.h" 9 #include "cc/layers/layer.h"
10 #include "cc/layers/solid_color_layer.h" 10 #include "cc/layers/solid_color_layer.h"
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after
112 if (!(*image_shm)->Map(desc.stride * desc.size.height)) { 112 if (!(*image_shm)->Map(desc.stride * desc.size.height)) {
113 image_shm->reset(); 113 image_shm->reset();
114 return PP_ERROR_NOMEMORY; 114 return PP_ERROR_NOMEMORY;
115 } 115 }
116 return PP_OK; 116 return PP_OK;
117 } 117 }
118 118
119 return PP_ERROR_BADARGUMENT; 119 return PP_ERROR_BADARGUMENT;
120 } 120 }
121 121
122 // cc::Layer::SetNeedsCommit() is a protected method, we have to use a subclass
123 // to make it assessable.
124 class ContainerLayer : public cc::Layer {
piman 2014/06/18 00:55:24 Please don't subclass cc::Layer outside of cc. Fo
Peng 2014/06/18 02:35:02 Done.
125 public:
126 static scoped_refptr<cc::Layer> Create();
127 void ForceToCommit();
128
129 private:
130 ContainerLayer() {};
131 virtual ~ContainerLayer() {};
132
133 DISALLOW_COPY_AND_ASSIGN(ContainerLayer);
134 };
135
136 scoped_refptr<cc::Layer> ContainerLayer::Create() {
137 return make_scoped_refptr(new ContainerLayer());
138 }
139
140 void ContainerLayer::ForceToCommit() {
141 SetNeedsCommit();
142 }
143
122 } // namespace 144 } // namespace
123 145
124 PepperCompositorHost::LayerData::LayerData( 146 PepperCompositorHost::LayerData::LayerData(
125 const scoped_refptr<cc::Layer>& cc, 147 const scoped_refptr<cc::Layer>& cc,
126 const ppapi::CompositorLayerData& pp) : cc_layer(cc), pp_layer(pp) {} 148 const ppapi::CompositorLayerData& pp) : cc_layer(cc), pp_layer(pp) {}
127 149
128 PepperCompositorHost::LayerData::~LayerData() {} 150 PepperCompositorHost::LayerData::~LayerData() {}
129 151
130 PepperCompositorHost::PepperCompositorHost( 152 PepperCompositorHost::PepperCompositorHost(
131 RendererPpapiHost* host, 153 RendererPpapiHost* host,
132 PP_Instance instance, 154 PP_Instance instance,
133 PP_Resource resource) 155 PP_Resource resource)
134 : ResourceHost(host->GetPpapiHost(), instance, resource), 156 : ResourceHost(host->GetPpapiHost(), instance, resource),
135 bound_instance_(NULL), 157 bound_instance_(NULL),
136 weak_factory_(this) { 158 weak_factory_(this) {
137 layer_ = cc::Layer::Create();
138 // TODO(penghuang): SetMasksToBounds() can be expensive if the layer is
139 // transformed. Possibly better could be to explicitly clip the child layers
140 // (by modifying their bounds).
141 layer_->SetMasksToBounds(true);
142 layer_->SetIsDrawable(true);
143 } 159 }
144 160
145 PepperCompositorHost::~PepperCompositorHost() { 161 PepperCompositorHost::~PepperCompositorHost() {
146 // Unbind from the instance when destroyed if we're still bound. 162 // Unbind from the instance when destroyed if we're still bound.
147 if (bound_instance_) 163 if (bound_instance_)
148 bound_instance_->BindGraphics(bound_instance_->pp_instance(), 0); 164 bound_instance_->BindGraphics(bound_instance_->pp_instance(), 0);
149 } 165 }
150 166
151 bool PepperCompositorHost::BindToInstance( 167 bool PepperCompositorHost::BindToInstance(
152 PepperPluginInstanceImpl* new_instance) { 168 PepperPluginInstanceImpl* new_instance) {
153 if (new_instance && new_instance->pp_instance() != pp_instance()) 169 if (new_instance && new_instance->pp_instance() != pp_instance())
154 return false; // Can't bind other instance's contexts. 170 return false; // Can't bind other instance's contexts.
155 if (bound_instance_ == new_instance) 171 if (bound_instance_ == new_instance)
156 return true; // Rebinding the same device, nothing to do. 172 return true; // Rebinding the same device, nothing to do.
157 if (bound_instance_ && new_instance) 173 if (bound_instance_ && new_instance)
158 return false; // Can't change a bound device. 174 return false; // Can't change a bound device.
159 bound_instance_ = new_instance; 175 bound_instance_ = new_instance;
176 layer_ = NULL;
177 layers_.clear();
178 if (bound_instance_) {
179 layer_ = ContainerLayer::Create();
180 // TODO(penghuang): SetMasksToBounds() can be expensive if the layer is
181 // transformed. Possibly better could be to explicitly clip the child layers
182 // (by modifying their bounds).
piman 2014/06/18 00:55:24 Note: what's expensive is not calling SetMasksToBo
Peng 2014/06/18 02:35:02 No. Without this change, the below code will crash
183 layer_->SetMasksToBounds(true);
184 layer_->SetIsDrawable(true);
185 }
160 return true; 186 return true;
187
161 } 188 }
162 189
163 void PepperCompositorHost::ViewInitiatedPaint() { 190 void PepperCompositorHost::ViewInitiatedPaint() {
164 if (!commit_layers_reply_context_.is_valid()) 191 if (!commit_layers_reply_context_.is_valid())
165 return; 192 return;
166 host()->SendReply(commit_layers_reply_context_, 193 host()->SendReply(commit_layers_reply_context_,
167 PpapiPluginMsg_Compositor_CommitLayersReply()); 194 PpapiPluginMsg_Compositor_CommitLayersReply());
168 commit_layers_reply_context_ = ppapi::host::ReplyMessageContext(); 195 commit_layers_reply_context_ = ppapi::host::ReplyMessageContext();
169 } 196 }
170 197
(...skipping 188 matching lines...) Expand 10 before | Expand all | Expand 10 after
359 } 386 }
360 387
361 UpdateLayer(cc_layer, old_layer, pp_layer, image_shms[i].Pass()); 388 UpdateLayer(cc_layer, old_layer, pp_layer, image_shms[i].Pass());
362 389
363 if (old_layer) 390 if (old_layer)
364 *old_layer = *pp_layer; 391 *old_layer = *pp_layer;
365 else 392 else
366 layers_.push_back(LayerData(cc_layer, *pp_layer)); 393 layers_.push_back(LayerData(cc_layer, *pp_layer));
367 } 394 }
368 395
396 // We need force to commit on the parent layer, so the ViewInitiatedPaint()
397 // will be always called, even if all layers are not changed from previous
398 // CommitLayers() call.
399 (static_cast<ContainerLayer*>(layer_.get()))->ForceToCommit();
369 return PP_OK_COMPLETIONPENDING; 400 return PP_OK_COMPLETIONPENDING;
370 } 401 }
371 402
372 } // namespace content 403 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698