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/common/cc_messages.cc

Issue 551013002: Use Custome ListContainer to Allocate SharedQuadState (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@DQAllo
Patch Set: use ElementAt for unittest Created 6 years, 2 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) 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
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698