OLD | NEW |
---|---|
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/common/cc_messages.h" | 5 #include "content/common/cc_messages.h" |
6 | 6 |
7 #include "cc/output/compositor_frame.h" | 7 #include "cc/output/compositor_frame.h" |
8 #include "cc/output/filter_operations.h" | 8 #include "cc/output/filter_operations.h" |
9 #include "cc/quads/largest_draw_quad.h" | 9 #include "cc/quads/largest_draw_quad.h" |
10 #include "content/public/common/common_param_traits.h" | 10 #include "content/public/common/common_param_traits.h" |
(...skipping 276 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
287 l->append(") "); | 287 l->append(") "); |
288 } | 288 } |
289 | 289 |
290 void ParamTraits<cc::RenderPass>::Write( | 290 void ParamTraits<cc::RenderPass>::Write( |
291 Message* m, const param_type& p) { | 291 Message* m, const param_type& p) { |
292 WriteParam(m, p.id); | 292 WriteParam(m, p.id); |
293 WriteParam(m, p.output_rect); | 293 WriteParam(m, p.output_rect); |
294 WriteParam(m, p.damage_rect); | 294 WriteParam(m, p.damage_rect); |
295 WriteParam(m, p.transform_to_root_target); | 295 WriteParam(m, p.transform_to_root_target); |
296 WriteParam(m, p.has_transparent_background); | 296 WriteParam(m, p.has_transparent_background); |
297 WriteParam(m, p.shared_quad_state_list.size()); | |
298 WriteParam(m, p.quad_list.size()); | 297 WriteParam(m, p.quad_list.size()); |
299 | 298 |
300 size_t shared_quad_state_index = 0; | 299 cc::SharedQuadStateList::ConstIterator shared_quad_state_index = |
danakj
2014/09/26 20:40:55
this isn't an index, it's an iterator, so let's na
weiliangc
2014/10/01 23:02:00
Done.
| |
301 size_t last_shared_quad_state_index = kuint32max; | 300 p.shared_quad_state_list.begin(); |
301 cc::SharedQuadStateList::ConstIterator last_shared_quad_state_index = | |
danakj
2014/09/26 20:40:55
same
weiliangc
2014/10/01 23:02:00
Done.
| |
302 p.shared_quad_state_list.end(); | |
302 for (cc::QuadList::ConstIterator iter = p.quad_list.begin(); | 303 for (cc::QuadList::ConstIterator iter = p.quad_list.begin(); |
303 iter != p.quad_list.end(); | 304 iter != p.quad_list.end(); |
304 ++iter) { | 305 ++iter) { |
305 const cc::DrawQuad* quad = &*iter; | 306 const cc::DrawQuad* quad = &*iter; |
306 DCHECK(quad->rect.Contains(quad->visible_rect)) | 307 DCHECK(quad->rect.Contains(quad->visible_rect)) |
307 << quad->material << " rect: " << quad->rect.ToString() | 308 << quad->material << " rect: " << quad->rect.ToString() |
308 << " visible_rect: " << quad->visible_rect.ToString(); | 309 << " visible_rect: " << quad->visible_rect.ToString(); |
309 DCHECK(quad->opaque_rect.IsEmpty() || | 310 DCHECK(quad->opaque_rect.IsEmpty() || |
310 quad->rect.Contains(quad->opaque_rect)) | 311 quad->rect.Contains(quad->opaque_rect)) |
311 << quad->material << " rect: " << quad->rect.ToString() | 312 << quad->material << " rect: " << quad->rect.ToString() |
(...skipping 30 matching lines...) Expand all Loading... | |
342 case cc::DrawQuad::STREAM_VIDEO_CONTENT: | 343 case cc::DrawQuad::STREAM_VIDEO_CONTENT: |
343 WriteParam(m, *cc::StreamVideoDrawQuad::MaterialCast(quad)); | 344 WriteParam(m, *cc::StreamVideoDrawQuad::MaterialCast(quad)); |
344 break; | 345 break; |
345 case cc::DrawQuad::YUV_VIDEO_CONTENT: | 346 case cc::DrawQuad::YUV_VIDEO_CONTENT: |
346 WriteParam(m, *cc::YUVVideoDrawQuad::MaterialCast(quad)); | 347 WriteParam(m, *cc::YUVVideoDrawQuad::MaterialCast(quad)); |
347 break; | 348 break; |
348 case cc::DrawQuad::INVALID: | 349 case cc::DrawQuad::INVALID: |
349 break; | 350 break; |
350 } | 351 } |
351 | 352 |
352 const cc::ScopedPtrVector<cc::SharedQuadState>& sqs_list = | |
353 p.shared_quad_state_list; | |
354 | |
355 // This is an invalid index. | |
356 size_t bad_index = sqs_list.size(); | |
357 | |
358 // Null shared quad states should not occur. | 353 // Null shared quad states should not occur. |
359 DCHECK(quad->shared_quad_state); | 354 DCHECK(quad->shared_quad_state); |
360 if (!quad->shared_quad_state) { | |
361 WriteParam(m, bad_index); | |
362 continue; | |
363 } | |
364 | 355 |
365 // SharedQuadStates should appear in the order they are used by DrawQuads. | 356 // SharedQuadStates should appear in the order they are used by DrawQuads. |
366 // Find the SharedQuadState for this DrawQuad. | 357 // Find the SharedQuadState for this DrawQuad. |
367 while (shared_quad_state_index < sqs_list.size() && | 358 while (shared_quad_state_index != p.shared_quad_state_list.end() && |
368 quad->shared_quad_state != sqs_list[shared_quad_state_index]) | 359 quad->shared_quad_state != &(*shared_quad_state_index)) |
danakj
2014/09/26 20:40:55
&*?
weiliangc
2014/10/01 23:02:00
Done.
| |
369 ++shared_quad_state_index; | 360 ++shared_quad_state_index; |
370 | 361 |
371 DCHECK_LT(shared_quad_state_index, sqs_list.size()); | 362 DCHECK(shared_quad_state_index != p.shared_quad_state_list.end()); |
372 if (shared_quad_state_index >= sqs_list.size()) { | |
373 WriteParam(m, bad_index); | |
374 continue; | |
375 } | |
376 | 363 |
377 WriteParam(m, shared_quad_state_index); | |
378 if (shared_quad_state_index != last_shared_quad_state_index) { | 364 if (shared_quad_state_index != last_shared_quad_state_index) { |
379 WriteParam(m, *sqs_list[shared_quad_state_index]); | 365 WriteParam(m, true); |
366 WriteParam(m, *shared_quad_state_index); | |
380 last_shared_quad_state_index = shared_quad_state_index; | 367 last_shared_quad_state_index = shared_quad_state_index; |
368 } else { | |
369 WriteParam(m, false); | |
381 } | 370 } |
382 } | 371 } |
383 } | 372 } |
384 | 373 |
385 static size_t ReserveSizeForRenderPassWrite(const cc::RenderPass& p) { | 374 static size_t ReserveSizeForRenderPassWrite(const cc::RenderPass& p) { |
386 size_t to_reserve = sizeof(cc::RenderPass); | 375 size_t to_reserve = sizeof(cc::RenderPass); |
387 | 376 |
388 to_reserve += p.shared_quad_state_list.size() * sizeof(cc::SharedQuadState); | 377 to_reserve += p.shared_quad_state_list.size() * sizeof(cc::SharedQuadState); |
389 | 378 |
390 // The shared_quad_state_index for each quad. | 379 // The shared_quad_state_index for each quad. |
danakj
2014/09/26 20:40:55
update this
weiliangc
2014/10/01 23:02:50
I think the logic is correct, but I add more comme
| |
391 to_reserve += p.quad_list.size() * sizeof(size_t); | 380 to_reserve += p.quad_list.size() * sizeof(bool); |
392 | 381 |
393 // The largest quad type, verified by a unit test. | 382 // The largest quad type, verified by a unit test. |
394 to_reserve += p.quad_list.size() * sizeof(cc::kLargestDrawQuad); | 383 to_reserve += p.quad_list.size() * sizeof(cc::kLargestDrawQuad); |
395 return to_reserve; | 384 return to_reserve; |
396 } | 385 } |
397 | 386 |
398 template <typename QuadType> | 387 template <typename QuadType> |
399 static cc::DrawQuad* ReadDrawQuad(const Message* m, | 388 static cc::DrawQuad* ReadDrawQuad(const Message* m, |
400 PickleIterator* iter, | 389 PickleIterator* iter, |
401 cc::RenderPass* render_pass) { | 390 cc::RenderPass* render_pass) { |
402 QuadType* quad = render_pass->CreateAndAppendDrawQuad<QuadType>(); | 391 QuadType* quad = render_pass->CreateAndAppendDrawQuad<QuadType>(); |
403 if (!ReadParam(m, iter, quad)) | 392 if (!ReadParam(m, iter, quad)) |
404 return NULL; | 393 return NULL; |
405 return quad; | 394 return quad; |
406 } | 395 } |
407 | 396 |
408 bool ParamTraits<cc::RenderPass>::Read( | 397 bool ParamTraits<cc::RenderPass>::Read( |
409 const Message* m, PickleIterator* iter, param_type* p) { | 398 const Message* m, PickleIterator* iter, param_type* p) { |
410 cc::RenderPassId id(-1, -1); | 399 cc::RenderPassId id(-1, -1); |
411 gfx::Rect output_rect; | 400 gfx::Rect output_rect; |
412 gfx::Rect damage_rect; | 401 gfx::Rect damage_rect; |
413 gfx::Transform transform_to_root_target; | 402 gfx::Transform transform_to_root_target; |
414 bool has_transparent_background; | 403 bool has_transparent_background; |
415 size_t shared_quad_state_list_size; | |
416 size_t quad_list_size; | 404 size_t quad_list_size; |
417 | 405 |
418 if (!ReadParam(m, iter, &id) || | 406 if (!ReadParam(m, iter, &id) || |
419 !ReadParam(m, iter, &output_rect) || | 407 !ReadParam(m, iter, &output_rect) || |
420 !ReadParam(m, iter, &damage_rect) || | 408 !ReadParam(m, iter, &damage_rect) || |
421 !ReadParam(m, iter, &transform_to_root_target) || | 409 !ReadParam(m, iter, &transform_to_root_target) || |
422 !ReadParam(m, iter, &has_transparent_background) || | 410 !ReadParam(m, iter, &has_transparent_background) || |
423 !ReadParam(m, iter, &shared_quad_state_list_size) || | |
424 !ReadParam(m, iter, &quad_list_size)) | 411 !ReadParam(m, iter, &quad_list_size)) |
425 return false; | 412 return false; |
426 | 413 |
427 p->SetAll(id, | 414 p->SetAll(id, |
428 output_rect, | 415 output_rect, |
429 damage_rect, | 416 damage_rect, |
430 transform_to_root_target, | 417 transform_to_root_target, |
431 has_transparent_background); | 418 has_transparent_background); |
432 | 419 |
433 size_t last_shared_quad_state_index = kuint32max; | |
434 for (size_t i = 0; i < quad_list_size; ++i) { | 420 for (size_t i = 0; i < quad_list_size; ++i) { |
435 cc::DrawQuad::Material material; | 421 cc::DrawQuad::Material material; |
436 PickleIterator temp_iter = *iter; | 422 PickleIterator temp_iter = *iter; |
437 if (!ReadParam(m, &temp_iter, &material)) | 423 if (!ReadParam(m, &temp_iter, &material)) |
438 return false; | 424 return false; |
439 | 425 |
440 cc::DrawQuad* draw_quad = NULL; | 426 cc::DrawQuad* draw_quad = NULL; |
441 switch (material) { | 427 switch (material) { |
442 case cc::DrawQuad::CHECKERBOARD: | 428 case cc::DrawQuad::CHECKERBOARD: |
443 draw_quad = ReadDrawQuad<cc::CheckerboardDrawQuad>(m, iter, p); | 429 draw_quad = ReadDrawQuad<cc::CheckerboardDrawQuad>(m, iter, p); |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
484 return false; | 470 return false; |
485 } | 471 } |
486 if (!draw_quad->opaque_rect.IsEmpty() && | 472 if (!draw_quad->opaque_rect.IsEmpty() && |
487 !draw_quad->rect.Contains(draw_quad->opaque_rect)) { | 473 !draw_quad->rect.Contains(draw_quad->opaque_rect)) { |
488 LOG(ERROR) << "Quad with invalid opaque rect " << draw_quad->material | 474 LOG(ERROR) << "Quad with invalid opaque rect " << draw_quad->material |
489 << " rect: " << draw_quad->rect.ToString() | 475 << " rect: " << draw_quad->rect.ToString() |
490 << " opaque_rect: " << draw_quad->opaque_rect.ToString(); | 476 << " opaque_rect: " << draw_quad->opaque_rect.ToString(); |
491 return false; | 477 return false; |
492 } | 478 } |
493 | 479 |
494 size_t shared_quad_state_index; | 480 bool has_new_shared_quad_state; |
495 if (!ReadParam(m, iter, &shared_quad_state_index)) | 481 if (!ReadParam(m, iter, &has_new_shared_quad_state)) |
496 return false; | |
497 if (shared_quad_state_index >= shared_quad_state_list_size) | |
498 return false; | |
499 // SharedQuadState indexes should be in ascending order. | |
500 if (last_shared_quad_state_index != kuint32max && | |
501 shared_quad_state_index < last_shared_quad_state_index) | |
502 return false; | 482 return false; |
503 | 483 |
504 // If the quad has a new shared quad state, read it in. | 484 // If the quad has a new shared quad state, read it in. |
505 if (last_shared_quad_state_index != shared_quad_state_index) { | 485 if (has_new_shared_quad_state) { |
506 cc::SharedQuadState* state = p->CreateAndAppendSharedQuadState(); | 486 cc::SharedQuadState* state = p->CreateAndAppendSharedQuadState(); |
507 if (!ReadParam(m, iter, state)) | 487 if (!ReadParam(m, iter, state)) |
508 return false; | 488 return false; |
509 last_shared_quad_state_index = shared_quad_state_index; | |
510 } | 489 } |
511 | 490 |
512 draw_quad->shared_quad_state = p->shared_quad_state_list.back(); | 491 draw_quad->shared_quad_state = p->shared_quad_state_list.back(); |
513 } | 492 } |
514 | 493 |
515 return true; | 494 return true; |
516 } | 495 } |
517 | 496 |
518 void ParamTraits<cc::RenderPass>::Log( | 497 void ParamTraits<cc::RenderPass>::Log( |
519 const param_type& p, std::string* l) { | 498 const param_type& p, std::string* l) { |
520 l->append("RenderPass(("); | 499 l->append("RenderPass(("); |
521 LogParam(p.id, l); | 500 LogParam(p.id, l); |
522 l->append("), "); | 501 l->append("), "); |
523 LogParam(p.output_rect, l); | 502 LogParam(p.output_rect, l); |
524 l->append(", "); | 503 l->append(", "); |
525 LogParam(p.damage_rect, l); | 504 LogParam(p.damage_rect, l); |
526 l->append(", "); | 505 l->append(", "); |
527 LogParam(p.transform_to_root_target, l); | 506 LogParam(p.transform_to_root_target, l); |
528 l->append(", "); | 507 l->append(", "); |
529 LogParam(p.has_transparent_background, l); | 508 LogParam(p.has_transparent_background, l); |
530 l->append(", "); | 509 l->append(", "); |
531 | 510 |
532 l->append("["); | 511 l->append("["); |
533 for (size_t i = 0; i < p.shared_quad_state_list.size(); ++i) { | 512 for (cc::SharedQuadStateList::ConstIterator iter = |
danakj
2014/09/26 20:40:55
Can you use auto and c++11 for loops in this CL? T
| |
534 if (i) | 513 p.shared_quad_state_list.begin(); |
514 iter != p.shared_quad_state_list.end(); | |
515 ++iter) { | |
516 if (iter != p.shared_quad_state_list.begin()) | |
535 l->append(", "); | 517 l->append(", "); |
536 LogParam(*p.shared_quad_state_list[i], l); | 518 LogParam(*(&(*iter)), l); |
danakj
2014/09/26 20:40:55
wat. you mean *iter?
weiliangc
2014/10/01 23:02:00
Done.
| |
537 } | 519 } |
538 l->append("], ["); | 520 l->append("], ["); |
539 for (cc::QuadList::ConstIterator iter = p.quad_list.begin(); | 521 for (cc::QuadList::ConstIterator iter = p.quad_list.begin(); |
540 iter != p.quad_list.end(); | 522 iter != p.quad_list.end(); |
541 ++iter) { | 523 ++iter) { |
542 if (iter != p.quad_list.begin()) | 524 if (iter != p.quad_list.begin()) |
543 l->append(", "); | 525 l->append(", "); |
544 const cc::DrawQuad* quad = &*iter; | 526 const cc::DrawQuad* quad = &*iter; |
545 switch (quad->material) { | 527 switch (quad->material) { |
546 case cc::DrawQuad::CHECKERBOARD: | 528 case cc::DrawQuad::CHECKERBOARD: |
(...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
712 } | 694 } |
713 | 695 |
714 void ParamTraits<cc::DelegatedFrameData>::Write(Message* m, | 696 void ParamTraits<cc::DelegatedFrameData>::Write(Message* m, |
715 const param_type& p) { | 697 const param_type& p) { |
716 DCHECK_NE(0u, p.render_pass_list.size()); | 698 DCHECK_NE(0u, p.render_pass_list.size()); |
717 | 699 |
718 size_t to_reserve = sizeof(p.device_scale_factor); | 700 size_t to_reserve = sizeof(p.device_scale_factor); |
719 to_reserve += p.resource_list.size() * sizeof(cc::TransferableResource); | 701 to_reserve += p.resource_list.size() * sizeof(cc::TransferableResource); |
720 for (size_t i = 0; i < p.render_pass_list.size(); ++i) { | 702 for (size_t i = 0; i < p.render_pass_list.size(); ++i) { |
721 const cc::RenderPass* pass = p.render_pass_list[i]; | 703 const cc::RenderPass* pass = p.render_pass_list[i]; |
704 to_reserve += sizeof(size_t); | |
danakj
2014/09/26 20:40:55
*2?
weiliangc
2014/10/01 23:02:00
Done.
| |
722 to_reserve += ReserveSizeForRenderPassWrite(*pass); | 705 to_reserve += ReserveSizeForRenderPassWrite(*pass); |
723 } | 706 } |
724 m->Reserve(to_reserve); | 707 m->Reserve(to_reserve); |
725 | 708 |
726 WriteParam(m, p.device_scale_factor); | 709 WriteParam(m, p.device_scale_factor); |
727 WriteParam(m, p.resource_list); | 710 WriteParam(m, p.resource_list); |
728 WriteParam(m, p.render_pass_list.size()); | 711 WriteParam(m, p.render_pass_list.size()); |
729 for (size_t i = 0; i < p.render_pass_list.size(); ++i) | 712 for (size_t i = 0; i < p.render_pass_list.size(); ++i) { |
713 WriteParam(m, p.render_pass_list[i]->quad_list.size()); | |
714 WriteParam(m, p.render_pass_list[i]->shared_quad_state_list.size()); | |
730 WriteParam(m, *p.render_pass_list[i]); | 715 WriteParam(m, *p.render_pass_list[i]); |
716 } | |
731 } | 717 } |
732 | 718 |
733 bool ParamTraits<cc::DelegatedFrameData>::Read(const Message* m, | 719 bool ParamTraits<cc::DelegatedFrameData>::Read(const Message* m, |
734 PickleIterator* iter, | 720 PickleIterator* iter, |
735 param_type* p) { | 721 param_type* p) { |
736 if (!ReadParam(m, iter, &p->device_scale_factor)) | 722 if (!ReadParam(m, iter, &p->device_scale_factor)) |
737 return false; | 723 return false; |
738 | 724 |
739 const static size_t kMaxRenderPasses = 10000; | 725 const static size_t kMaxRenderPasses = 10000; |
740 | 726 |
741 size_t num_render_passes; | 727 size_t num_render_passes; |
742 if (!ReadParam(m, iter, &p->resource_list) || | 728 if (!ReadParam(m, iter, &p->resource_list) || |
743 !ReadParam(m, iter, &num_render_passes) || | 729 !ReadParam(m, iter, &num_render_passes) || |
744 num_render_passes > kMaxRenderPasses || num_render_passes == 0) | 730 num_render_passes > kMaxRenderPasses || num_render_passes == 0) |
745 return false; | 731 return false; |
746 for (size_t i = 0; i < num_render_passes; ++i) { | 732 for (size_t i = 0; i < num_render_passes; ++i) { |
747 scoped_ptr<cc::RenderPass> render_pass = cc::RenderPass::Create(); | 733 size_t quad_list_size; |
734 size_t shared_quad_state_list_size; | |
735 if (!ReadParam(m, iter, &quad_list_size) || | |
danakj
2014/09/26 20:40:55
can you range check these things? like kMaxRenderP
weiliangc
2014/10/01 23:02:00
Done.
| |
736 !ReadParam(m, iter, &shared_quad_state_list_size)) | |
737 return false; | |
738 scoped_ptr<cc::RenderPass> render_pass = | |
739 cc::RenderPass::Create(shared_quad_state_list_size, quad_list_size); | |
748 if (!ReadParam(m, iter, render_pass.get())) | 740 if (!ReadParam(m, iter, render_pass.get())) |
749 return false; | 741 return false; |
750 p->render_pass_list.push_back(render_pass.Pass()); | 742 p->render_pass_list.push_back(render_pass.Pass()); |
751 } | 743 } |
752 return true; | 744 return true; |
753 } | 745 } |
754 | 746 |
755 void ParamTraits<cc::DelegatedFrameData>::Log(const param_type& p, | 747 void ParamTraits<cc::DelegatedFrameData>::Log(const param_type& p, |
756 std::string* l) { | 748 std::string* l) { |
757 l->append("DelegatedFrameData("); | 749 l->append("DelegatedFrameData("); |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
799 l->append(", "); | 791 l->append(", "); |
800 LogParam(p.size, l); | 792 LogParam(p.size, l); |
801 l->append(", "); | 793 l->append(", "); |
802 LogParam(p.damage_rect, l); | 794 LogParam(p.damage_rect, l); |
803 l->append(", "); | 795 l->append(", "); |
804 LogParam(p.bitmap_id, l); | 796 LogParam(p.bitmap_id, l); |
805 l->append(")"); | 797 l->append(")"); |
806 } | 798 } |
807 | 799 |
808 } // namespace IPC | 800 } // namespace IPC |
OLD | NEW |