| 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_iter = |
| 301 size_t last_shared_quad_state_index = kuint32max; | 300 p.shared_quad_state_list.begin(); |
| 302 for (cc::QuadList::ConstIterator iter = p.quad_list.begin(); | 301 cc::SharedQuadStateList::ConstIterator last_shared_quad_state_iter = |
| 303 iter != p.quad_list.end(); | 302 p.shared_quad_state_list.end(); |
| 304 ++iter) { | 303 for (const auto& quad : p.quad_list) { |
| 305 const cc::DrawQuad* quad = &*iter; | 304 DCHECK(quad.rect.Contains(quad.visible_rect)) |
| 306 DCHECK(quad->rect.Contains(quad->visible_rect)) | 305 << quad.material << " rect: " << quad.rect.ToString() |
| 307 << quad->material << " rect: " << quad->rect.ToString() | 306 << " visible_rect: " << quad.visible_rect.ToString(); |
| 308 << " visible_rect: " << quad->visible_rect.ToString(); | 307 DCHECK(quad.opaque_rect.IsEmpty() || quad.rect.Contains(quad.opaque_rect)) |
| 309 DCHECK(quad->opaque_rect.IsEmpty() || | 308 << quad.material << " rect: " << quad.rect.ToString() |
| 310 quad->rect.Contains(quad->opaque_rect)) | 309 << " opaque_rect: " << quad.opaque_rect.ToString(); |
| 311 << quad->material << " rect: " << quad->rect.ToString() | |
| 312 << " opaque_rect: " << quad->opaque_rect.ToString(); | |
| 313 | 310 |
| 314 switch (quad->material) { | 311 switch (quad.material) { |
| 315 case cc::DrawQuad::CHECKERBOARD: | 312 case cc::DrawQuad::CHECKERBOARD: |
| 316 WriteParam(m, *cc::CheckerboardDrawQuad::MaterialCast(quad)); | 313 WriteParam(m, *cc::CheckerboardDrawQuad::MaterialCast(&quad)); |
| 317 break; | 314 break; |
| 318 case cc::DrawQuad::DEBUG_BORDER: | 315 case cc::DrawQuad::DEBUG_BORDER: |
| 319 WriteParam(m, *cc::DebugBorderDrawQuad::MaterialCast(quad)); | 316 WriteParam(m, *cc::DebugBorderDrawQuad::MaterialCast(&quad)); |
| 320 break; | 317 break; |
| 321 case cc::DrawQuad::IO_SURFACE_CONTENT: | 318 case cc::DrawQuad::IO_SURFACE_CONTENT: |
| 322 WriteParam(m, *cc::IOSurfaceDrawQuad::MaterialCast(quad)); | 319 WriteParam(m, *cc::IOSurfaceDrawQuad::MaterialCast(&quad)); |
| 323 break; | 320 break; |
| 324 case cc::DrawQuad::PICTURE_CONTENT: | 321 case cc::DrawQuad::PICTURE_CONTENT: |
| 325 NOTREACHED(); | 322 NOTREACHED(); |
| 326 break; | 323 break; |
| 327 case cc::DrawQuad::TEXTURE_CONTENT: | 324 case cc::DrawQuad::TEXTURE_CONTENT: |
| 328 WriteParam(m, *cc::TextureDrawQuad::MaterialCast(quad)); | 325 WriteParam(m, *cc::TextureDrawQuad::MaterialCast(&quad)); |
| 329 break; | 326 break; |
| 330 case cc::DrawQuad::RENDER_PASS: | 327 case cc::DrawQuad::RENDER_PASS: |
| 331 WriteParam(m, *cc::RenderPassDrawQuad::MaterialCast(quad)); | 328 WriteParam(m, *cc::RenderPassDrawQuad::MaterialCast(&quad)); |
| 332 break; | 329 break; |
| 333 case cc::DrawQuad::SOLID_COLOR: | 330 case cc::DrawQuad::SOLID_COLOR: |
| 334 WriteParam(m, *cc::SolidColorDrawQuad::MaterialCast(quad)); | 331 WriteParam(m, *cc::SolidColorDrawQuad::MaterialCast(&quad)); |
| 335 break; | 332 break; |
| 336 case cc::DrawQuad::SURFACE_CONTENT: | 333 case cc::DrawQuad::SURFACE_CONTENT: |
| 337 WriteParam(m, *cc::SurfaceDrawQuad::MaterialCast(quad)); | 334 WriteParam(m, *cc::SurfaceDrawQuad::MaterialCast(&quad)); |
| 338 break; | 335 break; |
| 339 case cc::DrawQuad::TILED_CONTENT: | 336 case cc::DrawQuad::TILED_CONTENT: |
| 340 WriteParam(m, *cc::TileDrawQuad::MaterialCast(quad)); | 337 WriteParam(m, *cc::TileDrawQuad::MaterialCast(&quad)); |
| 341 break; | 338 break; |
| 342 case cc::DrawQuad::STREAM_VIDEO_CONTENT: | 339 case cc::DrawQuad::STREAM_VIDEO_CONTENT: |
| 343 WriteParam(m, *cc::StreamVideoDrawQuad::MaterialCast(quad)); | 340 WriteParam(m, *cc::StreamVideoDrawQuad::MaterialCast(&quad)); |
| 344 break; | 341 break; |
| 345 case cc::DrawQuad::YUV_VIDEO_CONTENT: | 342 case cc::DrawQuad::YUV_VIDEO_CONTENT: |
| 346 WriteParam(m, *cc::YUVVideoDrawQuad::MaterialCast(quad)); | 343 WriteParam(m, *cc::YUVVideoDrawQuad::MaterialCast(&quad)); |
| 347 break; | 344 break; |
| 348 case cc::DrawQuad::INVALID: | 345 case cc::DrawQuad::INVALID: |
| 349 break; | 346 break; |
| 350 } | 347 } |
| 351 | 348 |
| 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. | 349 // Null shared quad states should not occur. |
| 359 DCHECK(quad->shared_quad_state); | 350 DCHECK(quad.shared_quad_state); |
| 360 if (!quad->shared_quad_state) { | |
| 361 WriteParam(m, bad_index); | |
| 362 continue; | |
| 363 } | |
| 364 | 351 |
| 365 // SharedQuadStates should appear in the order they are used by DrawQuads. | 352 // SharedQuadStates should appear in the order they are used by DrawQuads. |
| 366 // Find the SharedQuadState for this DrawQuad. | 353 // Find the SharedQuadState for this DrawQuad. |
| 367 while (shared_quad_state_index < sqs_list.size() && | 354 while (shared_quad_state_iter != p.shared_quad_state_list.end() && |
| 368 quad->shared_quad_state != sqs_list[shared_quad_state_index]) | 355 quad.shared_quad_state != &*shared_quad_state_iter) |
| 369 ++shared_quad_state_index; | 356 ++shared_quad_state_iter; |
| 370 | 357 |
| 371 DCHECK_LT(shared_quad_state_index, sqs_list.size()); | 358 DCHECK(shared_quad_state_iter != p.shared_quad_state_list.end()); |
| 372 if (shared_quad_state_index >= sqs_list.size()) { | |
| 373 WriteParam(m, bad_index); | |
| 374 continue; | |
| 375 } | |
| 376 | 359 |
| 377 WriteParam(m, shared_quad_state_index); | 360 if (shared_quad_state_iter != last_shared_quad_state_iter) { |
| 378 if (shared_quad_state_index != last_shared_quad_state_index) { | 361 WriteParam(m, true); |
| 379 WriteParam(m, *sqs_list[shared_quad_state_index]); | 362 WriteParam(m, *shared_quad_state_iter); |
| 380 last_shared_quad_state_index = shared_quad_state_index; | 363 last_shared_quad_state_iter = shared_quad_state_iter; |
| 364 } else { |
| 365 WriteParam(m, false); |
| 381 } | 366 } |
| 382 } | 367 } |
| 383 } | 368 } |
| 384 | 369 |
| 385 static size_t ReserveSizeForRenderPassWrite(const cc::RenderPass& p) { | 370 static size_t ReserveSizeForRenderPassWrite(const cc::RenderPass& p) { |
| 386 size_t to_reserve = sizeof(cc::RenderPass); | 371 size_t to_reserve = sizeof(cc::RenderPass); |
| 387 | 372 |
| 373 // Whether the quad points to a new shared quad state for each quad. |
| 374 to_reserve += p.quad_list.size() * sizeof(bool); |
| 375 |
| 376 // Shared quad state is only written when a quad contains a shared quad state |
| 377 // that has not been written. |
| 388 to_reserve += p.shared_quad_state_list.size() * sizeof(cc::SharedQuadState); | 378 to_reserve += p.shared_quad_state_list.size() * sizeof(cc::SharedQuadState); |
| 389 | 379 |
| 390 // The shared_quad_state_index for each quad. | |
| 391 to_reserve += p.quad_list.size() * sizeof(size_t); | |
| 392 | |
| 393 // The largest quad type, verified by a unit test. | 380 // The largest quad type, verified by a unit test. |
| 394 to_reserve += p.quad_list.size() * sizeof(cc::kLargestDrawQuad); | 381 to_reserve += p.quad_list.size() * sizeof(cc::kLargestDrawQuad); |
| 395 return to_reserve; | 382 return to_reserve; |
| 396 } | 383 } |
| 397 | 384 |
| 398 template <typename QuadType> | 385 template <typename QuadType> |
| 399 static cc::DrawQuad* ReadDrawQuad(const Message* m, | 386 static cc::DrawQuad* ReadDrawQuad(const Message* m, |
| 400 PickleIterator* iter, | 387 PickleIterator* iter, |
| 401 cc::RenderPass* render_pass) { | 388 cc::RenderPass* render_pass) { |
| 402 QuadType* quad = render_pass->CreateAndAppendDrawQuad<QuadType>(); | 389 QuadType* quad = render_pass->CreateAndAppendDrawQuad<QuadType>(); |
| 403 if (!ReadParam(m, iter, quad)) | 390 if (!ReadParam(m, iter, quad)) |
| 404 return NULL; | 391 return NULL; |
| 405 return quad; | 392 return quad; |
| 406 } | 393 } |
| 407 | 394 |
| 408 bool ParamTraits<cc::RenderPass>::Read( | 395 bool ParamTraits<cc::RenderPass>::Read( |
| 409 const Message* m, PickleIterator* iter, param_type* p) { | 396 const Message* m, PickleIterator* iter, param_type* p) { |
| 410 cc::RenderPassId id(-1, -1); | 397 cc::RenderPassId id(-1, -1); |
| 411 gfx::Rect output_rect; | 398 gfx::Rect output_rect; |
| 412 gfx::Rect damage_rect; | 399 gfx::Rect damage_rect; |
| 413 gfx::Transform transform_to_root_target; | 400 gfx::Transform transform_to_root_target; |
| 414 bool has_transparent_background; | 401 bool has_transparent_background; |
| 415 size_t shared_quad_state_list_size; | |
| 416 size_t quad_list_size; | 402 size_t quad_list_size; |
| 417 | 403 |
| 418 if (!ReadParam(m, iter, &id) || | 404 if (!ReadParam(m, iter, &id) || |
| 419 !ReadParam(m, iter, &output_rect) || | 405 !ReadParam(m, iter, &output_rect) || |
| 420 !ReadParam(m, iter, &damage_rect) || | 406 !ReadParam(m, iter, &damage_rect) || |
| 421 !ReadParam(m, iter, &transform_to_root_target) || | 407 !ReadParam(m, iter, &transform_to_root_target) || |
| 422 !ReadParam(m, iter, &has_transparent_background) || | 408 !ReadParam(m, iter, &has_transparent_background) || |
| 423 !ReadParam(m, iter, &shared_quad_state_list_size) || | |
| 424 !ReadParam(m, iter, &quad_list_size)) | 409 !ReadParam(m, iter, &quad_list_size)) |
| 425 return false; | 410 return false; |
| 426 | 411 |
| 427 p->SetAll(id, | 412 p->SetAll(id, |
| 428 output_rect, | 413 output_rect, |
| 429 damage_rect, | 414 damage_rect, |
| 430 transform_to_root_target, | 415 transform_to_root_target, |
| 431 has_transparent_background); | 416 has_transparent_background); |
| 432 | 417 |
| 433 size_t last_shared_quad_state_index = kuint32max; | |
| 434 for (size_t i = 0; i < quad_list_size; ++i) { | 418 for (size_t i = 0; i < quad_list_size; ++i) { |
| 435 cc::DrawQuad::Material material; | 419 cc::DrawQuad::Material material; |
| 436 PickleIterator temp_iter = *iter; | 420 PickleIterator temp_iter = *iter; |
| 437 if (!ReadParam(m, &temp_iter, &material)) | 421 if (!ReadParam(m, &temp_iter, &material)) |
| 438 return false; | 422 return false; |
| 439 | 423 |
| 440 cc::DrawQuad* draw_quad = NULL; | 424 cc::DrawQuad* draw_quad = NULL; |
| 441 switch (material) { | 425 switch (material) { |
| 442 case cc::DrawQuad::CHECKERBOARD: | 426 case cc::DrawQuad::CHECKERBOARD: |
| 443 draw_quad = ReadDrawQuad<cc::CheckerboardDrawQuad>(m, iter, p); | 427 draw_quad = ReadDrawQuad<cc::CheckerboardDrawQuad>(m, iter, p); |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 484 return false; | 468 return false; |
| 485 } | 469 } |
| 486 if (!draw_quad->opaque_rect.IsEmpty() && | 470 if (!draw_quad->opaque_rect.IsEmpty() && |
| 487 !draw_quad->rect.Contains(draw_quad->opaque_rect)) { | 471 !draw_quad->rect.Contains(draw_quad->opaque_rect)) { |
| 488 LOG(ERROR) << "Quad with invalid opaque rect " << draw_quad->material | 472 LOG(ERROR) << "Quad with invalid opaque rect " << draw_quad->material |
| 489 << " rect: " << draw_quad->rect.ToString() | 473 << " rect: " << draw_quad->rect.ToString() |
| 490 << " opaque_rect: " << draw_quad->opaque_rect.ToString(); | 474 << " opaque_rect: " << draw_quad->opaque_rect.ToString(); |
| 491 return false; | 475 return false; |
| 492 } | 476 } |
| 493 | 477 |
| 494 size_t shared_quad_state_index; | 478 bool has_new_shared_quad_state; |
| 495 if (!ReadParam(m, iter, &shared_quad_state_index)) | 479 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; | 480 return false; |
| 503 | 481 |
| 504 // If the quad has a new shared quad state, read it in. | 482 // If the quad has a new shared quad state, read it in. |
| 505 if (last_shared_quad_state_index != shared_quad_state_index) { | 483 if (has_new_shared_quad_state) { |
| 506 cc::SharedQuadState* state = p->CreateAndAppendSharedQuadState(); | 484 cc::SharedQuadState* state = p->CreateAndAppendSharedQuadState(); |
| 507 if (!ReadParam(m, iter, state)) | 485 if (!ReadParam(m, iter, state)) |
| 508 return false; | 486 return false; |
| 509 last_shared_quad_state_index = shared_quad_state_index; | |
| 510 } | 487 } |
| 511 | 488 |
| 512 draw_quad->shared_quad_state = p->shared_quad_state_list.back(); | 489 draw_quad->shared_quad_state = p->shared_quad_state_list.back(); |
| 513 } | 490 } |
| 514 | 491 |
| 515 return true; | 492 return true; |
| 516 } | 493 } |
| 517 | 494 |
| 518 void ParamTraits<cc::RenderPass>::Log( | 495 void ParamTraits<cc::RenderPass>::Log( |
| 519 const param_type& p, std::string* l) { | 496 const param_type& p, std::string* l) { |
| 520 l->append("RenderPass(("); | 497 l->append("RenderPass(("); |
| 521 LogParam(p.id, l); | 498 LogParam(p.id, l); |
| 522 l->append("), "); | 499 l->append("), "); |
| 523 LogParam(p.output_rect, l); | 500 LogParam(p.output_rect, l); |
| 524 l->append(", "); | 501 l->append(", "); |
| 525 LogParam(p.damage_rect, l); | 502 LogParam(p.damage_rect, l); |
| 526 l->append(", "); | 503 l->append(", "); |
| 527 LogParam(p.transform_to_root_target, l); | 504 LogParam(p.transform_to_root_target, l); |
| 528 l->append(", "); | 505 l->append(", "); |
| 529 LogParam(p.has_transparent_background, l); | 506 LogParam(p.has_transparent_background, l); |
| 530 l->append(", "); | 507 l->append(", "); |
| 531 | 508 |
| 532 l->append("["); | 509 l->append("["); |
| 533 for (size_t i = 0; i < p.shared_quad_state_list.size(); ++i) { | 510 for (const auto& shared_quad_state : p.shared_quad_state_list) { |
| 534 if (i) | 511 if (&shared_quad_state != p.shared_quad_state_list.front()) |
| 535 l->append(", "); | 512 l->append(", "); |
| 536 LogParam(*p.shared_quad_state_list[i], l); | 513 LogParam(shared_quad_state, l); |
| 537 } | 514 } |
| 538 l->append("], ["); | 515 l->append("], ["); |
| 539 for (cc::QuadList::ConstIterator iter = p.quad_list.begin(); | 516 for (const auto& quad : p.quad_list) { |
| 540 iter != p.quad_list.end(); | 517 if (&quad != p.quad_list.front()) |
| 541 ++iter) { | |
| 542 if (iter != p.quad_list.begin()) | |
| 543 l->append(", "); | 518 l->append(", "); |
| 544 const cc::DrawQuad* quad = &*iter; | 519 switch (quad.material) { |
| 545 switch (quad->material) { | |
| 546 case cc::DrawQuad::CHECKERBOARD: | 520 case cc::DrawQuad::CHECKERBOARD: |
| 547 LogParam(*cc::CheckerboardDrawQuad::MaterialCast(quad), l); | 521 LogParam(*cc::CheckerboardDrawQuad::MaterialCast(&quad), l); |
| 548 break; | 522 break; |
| 549 case cc::DrawQuad::DEBUG_BORDER: | 523 case cc::DrawQuad::DEBUG_BORDER: |
| 550 LogParam(*cc::DebugBorderDrawQuad::MaterialCast(quad), l); | 524 LogParam(*cc::DebugBorderDrawQuad::MaterialCast(&quad), l); |
| 551 break; | 525 break; |
| 552 case cc::DrawQuad::IO_SURFACE_CONTENT: | 526 case cc::DrawQuad::IO_SURFACE_CONTENT: |
| 553 LogParam(*cc::IOSurfaceDrawQuad::MaterialCast(quad), l); | 527 LogParam(*cc::IOSurfaceDrawQuad::MaterialCast(&quad), l); |
| 554 break; | 528 break; |
| 555 case cc::DrawQuad::PICTURE_CONTENT: | 529 case cc::DrawQuad::PICTURE_CONTENT: |
| 556 NOTREACHED(); | 530 NOTREACHED(); |
| 557 break; | 531 break; |
| 558 case cc::DrawQuad::TEXTURE_CONTENT: | 532 case cc::DrawQuad::TEXTURE_CONTENT: |
| 559 LogParam(*cc::TextureDrawQuad::MaterialCast(quad), l); | 533 LogParam(*cc::TextureDrawQuad::MaterialCast(&quad), l); |
| 560 break; | 534 break; |
| 561 case cc::DrawQuad::RENDER_PASS: | 535 case cc::DrawQuad::RENDER_PASS: |
| 562 LogParam(*cc::RenderPassDrawQuad::MaterialCast(quad), l); | 536 LogParam(*cc::RenderPassDrawQuad::MaterialCast(&quad), l); |
| 563 break; | 537 break; |
| 564 case cc::DrawQuad::SOLID_COLOR: | 538 case cc::DrawQuad::SOLID_COLOR: |
| 565 LogParam(*cc::SolidColorDrawQuad::MaterialCast(quad), l); | 539 LogParam(*cc::SolidColorDrawQuad::MaterialCast(&quad), l); |
| 566 break; | 540 break; |
| 567 case cc::DrawQuad::SURFACE_CONTENT: | 541 case cc::DrawQuad::SURFACE_CONTENT: |
| 568 LogParam(*cc::SurfaceDrawQuad::MaterialCast(quad), l); | 542 LogParam(*cc::SurfaceDrawQuad::MaterialCast(&quad), l); |
| 569 break; | 543 break; |
| 570 case cc::DrawQuad::TILED_CONTENT: | 544 case cc::DrawQuad::TILED_CONTENT: |
| 571 LogParam(*cc::TileDrawQuad::MaterialCast(quad), l); | 545 LogParam(*cc::TileDrawQuad::MaterialCast(&quad), l); |
| 572 break; | 546 break; |
| 573 case cc::DrawQuad::STREAM_VIDEO_CONTENT: | 547 case cc::DrawQuad::STREAM_VIDEO_CONTENT: |
| 574 LogParam(*cc::StreamVideoDrawQuad::MaterialCast(quad), l); | 548 LogParam(*cc::StreamVideoDrawQuad::MaterialCast(&quad), l); |
| 575 break; | 549 break; |
| 576 case cc::DrawQuad::YUV_VIDEO_CONTENT: | 550 case cc::DrawQuad::YUV_VIDEO_CONTENT: |
| 577 LogParam(*cc::YUVVideoDrawQuad::MaterialCast(quad), l); | 551 LogParam(*cc::YUVVideoDrawQuad::MaterialCast(&quad), l); |
| 578 break; | 552 break; |
| 579 case cc::DrawQuad::INVALID: | 553 case cc::DrawQuad::INVALID: |
| 580 break; | 554 break; |
| 581 } | 555 } |
| 582 } | 556 } |
| 583 l->append("])"); | 557 l->append("])"); |
| 584 } | 558 } |
| 585 | 559 |
| 586 namespace { | 560 namespace { |
| 587 enum CompositorFrameType { | 561 enum CompositorFrameType { |
| (...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 712 } | 686 } |
| 713 | 687 |
| 714 void ParamTraits<cc::DelegatedFrameData>::Write(Message* m, | 688 void ParamTraits<cc::DelegatedFrameData>::Write(Message* m, |
| 715 const param_type& p) { | 689 const param_type& p) { |
| 716 DCHECK_NE(0u, p.render_pass_list.size()); | 690 DCHECK_NE(0u, p.render_pass_list.size()); |
| 717 | 691 |
| 718 size_t to_reserve = sizeof(p.device_scale_factor); | 692 size_t to_reserve = sizeof(p.device_scale_factor); |
| 719 to_reserve += p.resource_list.size() * sizeof(cc::TransferableResource); | 693 to_reserve += p.resource_list.size() * sizeof(cc::TransferableResource); |
| 720 for (size_t i = 0; i < p.render_pass_list.size(); ++i) { | 694 for (size_t i = 0; i < p.render_pass_list.size(); ++i) { |
| 721 const cc::RenderPass* pass = p.render_pass_list[i]; | 695 const cc::RenderPass* pass = p.render_pass_list[i]; |
| 696 to_reserve += sizeof(size_t) * 2; |
| 722 to_reserve += ReserveSizeForRenderPassWrite(*pass); | 697 to_reserve += ReserveSizeForRenderPassWrite(*pass); |
| 723 } | 698 } |
| 724 m->Reserve(to_reserve); | 699 m->Reserve(to_reserve); |
| 725 | 700 |
| 726 WriteParam(m, p.device_scale_factor); | 701 WriteParam(m, p.device_scale_factor); |
| 727 WriteParam(m, p.resource_list); | 702 WriteParam(m, p.resource_list); |
| 728 WriteParam(m, p.render_pass_list.size()); | 703 WriteParam(m, p.render_pass_list.size()); |
| 729 for (size_t i = 0; i < p.render_pass_list.size(); ++i) | 704 for (size_t i = 0; i < p.render_pass_list.size(); ++i) { |
| 705 WriteParam(m, p.render_pass_list[i]->quad_list.size()); |
| 706 WriteParam(m, p.render_pass_list[i]->shared_quad_state_list.size()); |
| 730 WriteParam(m, *p.render_pass_list[i]); | 707 WriteParam(m, *p.render_pass_list[i]); |
| 708 } |
| 731 } | 709 } |
| 732 | 710 |
| 733 bool ParamTraits<cc::DelegatedFrameData>::Read(const Message* m, | 711 bool ParamTraits<cc::DelegatedFrameData>::Read(const Message* m, |
| 734 PickleIterator* iter, | 712 PickleIterator* iter, |
| 735 param_type* p) { | 713 param_type* p) { |
| 736 if (!ReadParam(m, iter, &p->device_scale_factor)) | 714 if (!ReadParam(m, iter, &p->device_scale_factor)) |
| 737 return false; | 715 return false; |
| 738 | 716 |
| 739 const static size_t kMaxRenderPasses = 10000; | 717 const static size_t kMaxRenderPasses = 10000; |
| 718 const static size_t kMaxSharedQuadStateListSize = 100000; |
| 719 const static size_t kMaxQuadListSize = 1000000; |
| 740 | 720 |
| 741 size_t num_render_passes; | 721 size_t num_render_passes; |
| 742 if (!ReadParam(m, iter, &p->resource_list) || | 722 if (!ReadParam(m, iter, &p->resource_list) || |
| 743 !ReadParam(m, iter, &num_render_passes) || | 723 !ReadParam(m, iter, &num_render_passes) || |
| 744 num_render_passes > kMaxRenderPasses || num_render_passes == 0) | 724 num_render_passes > kMaxRenderPasses || num_render_passes == 0) |
| 745 return false; | 725 return false; |
| 746 for (size_t i = 0; i < num_render_passes; ++i) { | 726 for (size_t i = 0; i < num_render_passes; ++i) { |
| 747 scoped_ptr<cc::RenderPass> render_pass = cc::RenderPass::Create(); | 727 size_t quad_list_size; |
| 728 size_t shared_quad_state_list_size; |
| 729 if (!ReadParam(m, iter, &quad_list_size) || |
| 730 !ReadParam(m, iter, &shared_quad_state_list_size) || |
| 731 quad_list_size > kMaxQuadListSize || |
| 732 shared_quad_state_list_size > kMaxSharedQuadStateListSize) |
| 733 return false; |
| 734 scoped_ptr<cc::RenderPass> render_pass = |
| 735 cc::RenderPass::Create(shared_quad_state_list_size, quad_list_size); |
| 748 if (!ReadParam(m, iter, render_pass.get())) | 736 if (!ReadParam(m, iter, render_pass.get())) |
| 749 return false; | 737 return false; |
| 750 p->render_pass_list.push_back(render_pass.Pass()); | 738 p->render_pass_list.push_back(render_pass.Pass()); |
| 751 } | 739 } |
| 752 return true; | 740 return true; |
| 753 } | 741 } |
| 754 | 742 |
| 755 void ParamTraits<cc::DelegatedFrameData>::Log(const param_type& p, | 743 void ParamTraits<cc::DelegatedFrameData>::Log(const param_type& p, |
| 756 std::string* l) { | 744 std::string* l) { |
| 757 l->append("DelegatedFrameData("); | 745 l->append("DelegatedFrameData("); |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 799 l->append(", "); | 787 l->append(", "); |
| 800 LogParam(p.size, l); | 788 LogParam(p.size, l); |
| 801 l->append(", "); | 789 l->append(", "); |
| 802 LogParam(p.damage_rect, l); | 790 LogParam(p.damage_rect, l); |
| 803 l->append(", "); | 791 l->append(", "); |
| 804 LogParam(p.bitmap_id, l); | 792 LogParam(p.bitmap_id, l); |
| 805 l->append(")"); | 793 l->append(")"); |
| 806 } | 794 } |
| 807 | 795 |
| 808 } // namespace IPC | 796 } // namespace IPC |
| OLD | NEW |