OLD | NEW |
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 <stddef.h> | 7 #include <stddef.h> |
8 #include <limits> | 8 #include <limits> |
9 #include <utility> | 9 #include <utility> |
10 | 10 |
(...skipping 30 matching lines...) Expand all Loading... |
41 namespace { | 41 namespace { |
42 | 42 |
43 bool CheckPPFloatRect(const PP_FloatRect& rect, float width, float height) { | 43 bool CheckPPFloatRect(const PP_FloatRect& rect, float width, float height) { |
44 const float kEpsilon = std::numeric_limits<float>::epsilon(); | 44 const float kEpsilon = std::numeric_limits<float>::epsilon(); |
45 return (rect.point.x >= -kEpsilon && | 45 return (rect.point.x >= -kEpsilon && |
46 rect.point.y >= -kEpsilon && | 46 rect.point.y >= -kEpsilon && |
47 rect.point.x + rect.size.width <= width + kEpsilon && | 47 rect.point.x + rect.size.width <= width + kEpsilon && |
48 rect.point.y + rect.size.height <= height + kEpsilon); | 48 rect.point.y + rect.size.height <= height + kEpsilon); |
49 } | 49 } |
50 | 50 |
51 int32_t VerifyCommittedLayer( | 51 int32_t VerifyCommittedLayer(const ppapi::CompositorLayerData* old_layer, |
52 const ppapi::CompositorLayerData* old_layer, | 52 const ppapi::CompositorLayerData* new_layer, |
53 const ppapi::CompositorLayerData* new_layer, | 53 std::unique_ptr<base::SharedMemory>* image_shm) { |
54 scoped_ptr<base::SharedMemory>* image_shm) { | |
55 if (!new_layer->is_valid()) | 54 if (!new_layer->is_valid()) |
56 return PP_ERROR_BADARGUMENT; | 55 return PP_ERROR_BADARGUMENT; |
57 | 56 |
58 if (new_layer->color) { | 57 if (new_layer->color) { |
59 // Make sure the old layer is a color layer too. | 58 // Make sure the old layer is a color layer too. |
60 if (old_layer && !old_layer->color) | 59 if (old_layer && !old_layer->color) |
61 return PP_ERROR_BADARGUMENT; | 60 return PP_ERROR_BADARGUMENT; |
62 return PP_OK; | 61 return PP_OK; |
63 } | 62 } |
64 | 63 |
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
184 | 183 |
185 return true; | 184 return true; |
186 } | 185 } |
187 | 186 |
188 void PepperCompositorHost::ViewInitiatedPaint() { | 187 void PepperCompositorHost::ViewInitiatedPaint() { |
189 SendCommitLayersReplyIfNecessary(); | 188 SendCommitLayersReplyIfNecessary(); |
190 } | 189 } |
191 | 190 |
192 void PepperCompositorHost::ImageReleased( | 191 void PepperCompositorHost::ImageReleased( |
193 int32_t id, | 192 int32_t id, |
194 scoped_ptr<base::SharedMemory> shared_memory, | 193 std::unique_ptr<base::SharedMemory> shared_memory, |
195 scoped_ptr<cc::SharedBitmap> bitmap, | 194 std::unique_ptr<cc::SharedBitmap> bitmap, |
196 const gpu::SyncToken& sync_token, | 195 const gpu::SyncToken& sync_token, |
197 bool is_lost) { | 196 bool is_lost) { |
198 bitmap.reset(); | 197 bitmap.reset(); |
199 shared_memory.reset(); | 198 shared_memory.reset(); |
200 ResourceReleased(id, sync_token, is_lost); | 199 ResourceReleased(id, sync_token, is_lost); |
201 } | 200 } |
202 | 201 |
203 void PepperCompositorHost::ResourceReleased(int32_t id, | 202 void PepperCompositorHost::ResourceReleased(int32_t id, |
204 const gpu::SyncToken& sync_token, | 203 const gpu::SyncToken& sync_token, |
205 bool is_lost) { | 204 bool is_lost) { |
206 host()->SendUnsolicitedReply( | 205 host()->SendUnsolicitedReply( |
207 pp_resource(), | 206 pp_resource(), |
208 PpapiPluginMsg_Compositor_ReleaseResource(id, sync_token, is_lost)); | 207 PpapiPluginMsg_Compositor_ReleaseResource(id, sync_token, is_lost)); |
209 } | 208 } |
210 | 209 |
211 void PepperCompositorHost::SendCommitLayersReplyIfNecessary() { | 210 void PepperCompositorHost::SendCommitLayersReplyIfNecessary() { |
212 if (!commit_layers_reply_context_.is_valid()) | 211 if (!commit_layers_reply_context_.is_valid()) |
213 return; | 212 return; |
214 host()->SendReply(commit_layers_reply_context_, | 213 host()->SendReply(commit_layers_reply_context_, |
215 PpapiPluginMsg_Compositor_CommitLayersReply()); | 214 PpapiPluginMsg_Compositor_CommitLayersReply()); |
216 commit_layers_reply_context_ = ppapi::host::ReplyMessageContext(); | 215 commit_layers_reply_context_ = ppapi::host::ReplyMessageContext(); |
217 } | 216 } |
218 | 217 |
219 void PepperCompositorHost::UpdateLayer( | 218 void PepperCompositorHost::UpdateLayer( |
220 const scoped_refptr<cc::Layer>& layer, | 219 const scoped_refptr<cc::Layer>& layer, |
221 const ppapi::CompositorLayerData* old_layer, | 220 const ppapi::CompositorLayerData* old_layer, |
222 const ppapi::CompositorLayerData* new_layer, | 221 const ppapi::CompositorLayerData* new_layer, |
223 scoped_ptr<base::SharedMemory> image_shm) { | 222 std::unique_ptr<base::SharedMemory> image_shm) { |
224 // Always update properties on cc::Layer, because cc::Layer | 223 // Always update properties on cc::Layer, because cc::Layer |
225 // will ignore any setting with unchanged value. | 224 // will ignore any setting with unchanged value. |
226 layer->SetIsDrawable(true); | 225 layer->SetIsDrawable(true); |
227 layer->SetBlendMode(SkXfermode::kSrcOver_Mode); | 226 layer->SetBlendMode(SkXfermode::kSrcOver_Mode); |
228 layer->SetOpacity(new_layer->common.opacity); | 227 layer->SetOpacity(new_layer->common.opacity); |
229 layer->SetBounds(PP_ToGfxSize(new_layer->common.size)); | 228 layer->SetBounds(PP_ToGfxSize(new_layer->common.size)); |
230 layer->SetTransformOrigin(gfx::Point3F(new_layer->common.size.width / 2, | 229 layer->SetTransformOrigin(gfx::Point3F(new_layer->common.size.width / 2, |
231 new_layer->common.size.height / 2, | 230 new_layer->common.size.height / 2, |
232 0.0f)); | 231 0.0f)); |
233 | 232 |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
300 EnterResourceNoLock<PPB_ImageData_API> enter(new_layer->image->resource, | 299 EnterResourceNoLock<PPB_ImageData_API> enter(new_layer->image->resource, |
301 true); | 300 true); |
302 DCHECK(enter.succeeded()); | 301 DCHECK(enter.succeeded()); |
303 | 302 |
304 // TODO(penghuang): support all kinds of image. | 303 // TODO(penghuang): support all kinds of image. |
305 PP_ImageDataDesc desc; | 304 PP_ImageDataDesc desc; |
306 PP_Bool rv = enter.object()->Describe(&desc); | 305 PP_Bool rv = enter.object()->Describe(&desc); |
307 DCHECK_EQ(rv, PP_TRUE); | 306 DCHECK_EQ(rv, PP_TRUE); |
308 DCHECK_EQ(desc.stride, desc.size.width * 4); | 307 DCHECK_EQ(desc.stride, desc.size.width * 4); |
309 DCHECK_EQ(desc.format, PP_IMAGEDATAFORMAT_RGBA_PREMUL); | 308 DCHECK_EQ(desc.format, PP_IMAGEDATAFORMAT_RGBA_PREMUL); |
310 scoped_ptr<cc::SharedBitmap> bitmap = | 309 std::unique_ptr<cc::SharedBitmap> bitmap = |
311 ChildThreadImpl::current() | 310 ChildThreadImpl::current() |
312 ->shared_bitmap_manager() | 311 ->shared_bitmap_manager() |
313 ->GetBitmapForSharedMemory(image_shm.get()); | 312 ->GetBitmapForSharedMemory(image_shm.get()); |
314 | 313 |
315 cc::TextureMailbox mailbox(bitmap.get(), PP_ToGfxSize(desc.size)); | 314 cc::TextureMailbox mailbox(bitmap.get(), PP_ToGfxSize(desc.size)); |
316 image_layer->SetTextureMailbox( | 315 image_layer->SetTextureMailbox( |
317 mailbox, | 316 mailbox, |
318 cc::SingleReleaseCallback::Create(base::Bind( | 317 cc::SingleReleaseCallback::Create(base::Bind( |
319 &PepperCompositorHost::ImageReleased, weak_factory_.GetWeakPtr(), | 318 &PepperCompositorHost::ImageReleased, weak_factory_.GetWeakPtr(), |
320 new_layer->common.resource_id, base::Passed(&image_shm), | 319 new_layer->common.resource_id, base::Passed(&image_shm), |
(...skipping 25 matching lines...) Expand all Loading... |
346 return true; | 345 return true; |
347 } | 346 } |
348 | 347 |
349 int32_t PepperCompositorHost::OnHostMsgCommitLayers( | 348 int32_t PepperCompositorHost::OnHostMsgCommitLayers( |
350 HostMessageContext* context, | 349 HostMessageContext* context, |
351 const std::vector<ppapi::CompositorLayerData>& layers, | 350 const std::vector<ppapi::CompositorLayerData>& layers, |
352 bool reset) { | 351 bool reset) { |
353 if (commit_layers_reply_context_.is_valid()) | 352 if (commit_layers_reply_context_.is_valid()) |
354 return PP_ERROR_INPROGRESS; | 353 return PP_ERROR_INPROGRESS; |
355 | 354 |
356 scoped_ptr<scoped_ptr<base::SharedMemory>[]> image_shms; | 355 std::unique_ptr<std::unique_ptr<base::SharedMemory>[]> image_shms; |
357 if (layers.size() > 0) { | 356 if (layers.size() > 0) { |
358 image_shms.reset(new scoped_ptr<base::SharedMemory>[layers.size()]); | 357 image_shms.reset(new std::unique_ptr<base::SharedMemory>[layers.size()]); |
359 if (!image_shms) | 358 if (!image_shms) |
360 return PP_ERROR_NOMEMORY; | 359 return PP_ERROR_NOMEMORY; |
361 // Verfiy the layers first, if an error happens, we will return the error to | 360 // Verfiy the layers first, if an error happens, we will return the error to |
362 // plugin and keep current layers set by the previous CommitLayers() | 361 // plugin and keep current layers set by the previous CommitLayers() |
363 // unchanged. | 362 // unchanged. |
364 for (size_t i = 0; i < layers.size(); ++i) { | 363 for (size_t i = 0; i < layers.size(); ++i) { |
365 const ppapi::CompositorLayerData* old_layer = NULL; | 364 const ppapi::CompositorLayerData* old_layer = NULL; |
366 if (!reset && i < layers_.size()) | 365 if (!reset && i < layers_.size()) |
367 old_layer = &layers_[i].pp_layer; | 366 old_layer = &layers_[i].pp_layer; |
368 int32_t rv = VerifyCommittedLayer(old_layer, &layers[i], &image_shms[i]); | 367 int32_t rv = VerifyCommittedLayer(old_layer, &layers[i], &image_shms[i]); |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
408 | 407 |
409 // If the host is not bound to the instance, return PP_OK immediately. | 408 // If the host is not bound to the instance, return PP_OK immediately. |
410 if (!bound_instance_) | 409 if (!bound_instance_) |
411 return PP_OK; | 410 return PP_OK; |
412 | 411 |
413 commit_layers_reply_context_ = context->MakeReplyMessageContext(); | 412 commit_layers_reply_context_ = context->MakeReplyMessageContext(); |
414 return PP_OK_COMPLETIONPENDING; | 413 return PP_OK_COMPLETIONPENDING; |
415 } | 414 } |
416 | 415 |
417 } // namespace content | 416 } // namespace content |
OLD | NEW |