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
3 // found in the LICENSE file.
5 #include "content/common/cc_messages.h"
7 #include "cc/output/compositor_frame.h"
8 #include "cc/output/filter_operations.h"
9 #include "cc/quads/largest_draw_quad.h"
10 #include "content/public/common/common_param_traits.h"
11 #include "third_party/skia/include/core/SkData.h"
12 #include "third_party/skia/include/core/SkFlattenableSerialization.h"
13 #include "ui/gfx/transform.h"
17 void ParamTraits
<cc::FilterOperation
>::Write(
18 Message
* m
, const param_type
& p
) {
19 WriteParam(m
, p
.type());
21 case cc::FilterOperation::GRAYSCALE
:
22 case cc::FilterOperation::SEPIA
:
23 case cc::FilterOperation::SATURATE
:
24 case cc::FilterOperation::HUE_ROTATE
:
25 case cc::FilterOperation::INVERT
:
26 case cc::FilterOperation::BRIGHTNESS
:
27 case cc::FilterOperation::SATURATING_BRIGHTNESS
:
28 case cc::FilterOperation::CONTRAST
:
29 case cc::FilterOperation::OPACITY
:
30 case cc::FilterOperation::BLUR
:
31 WriteParam(m
, p
.amount());
33 case cc::FilterOperation::DROP_SHADOW
:
34 WriteParam(m
, p
.drop_shadow_offset());
35 WriteParam(m
, p
.amount());
36 WriteParam(m
, p
.drop_shadow_color());
38 case cc::FilterOperation::COLOR_MATRIX
:
39 for (int i
= 0; i
< 20; ++i
)
40 WriteParam(m
, p
.matrix()[i
]);
42 case cc::FilterOperation::ZOOM
:
43 WriteParam(m
, p
.amount());
44 WriteParam(m
, p
.zoom_inset());
46 case cc::FilterOperation::REFERENCE
:
47 WriteParam(m
, p
.image_filter());
49 case cc::FilterOperation::ALPHA_THRESHOLD
:
55 bool ParamTraits
<cc::FilterOperation
>::Read(
56 const Message
* m
, PickleIterator
* iter
, param_type
* r
) {
57 cc::FilterOperation::FilterType type
;
59 gfx::Point drop_shadow_offset
;
60 SkColor drop_shadow_color
;
64 if (!ReadParam(m
, iter
, &type
))
70 case cc::FilterOperation::GRAYSCALE
:
71 case cc::FilterOperation::SEPIA
:
72 case cc::FilterOperation::SATURATE
:
73 case cc::FilterOperation::HUE_ROTATE
:
74 case cc::FilterOperation::INVERT
:
75 case cc::FilterOperation::BRIGHTNESS
:
76 case cc::FilterOperation::SATURATING_BRIGHTNESS
:
77 case cc::FilterOperation::CONTRAST
:
78 case cc::FilterOperation::OPACITY
:
79 case cc::FilterOperation::BLUR
:
80 if (ReadParam(m
, iter
, &amount
)) {
81 r
->set_amount(amount
);
85 case cc::FilterOperation::DROP_SHADOW
:
86 if (ReadParam(m
, iter
, &drop_shadow_offset
) &&
87 ReadParam(m
, iter
, &amount
) &&
88 ReadParam(m
, iter
, &drop_shadow_color
)) {
89 r
->set_drop_shadow_offset(drop_shadow_offset
);
90 r
->set_amount(amount
);
91 r
->set_drop_shadow_color(drop_shadow_color
);
95 case cc::FilterOperation::COLOR_MATRIX
: {
97 for (i
= 0; i
< 20; ++i
) {
98 if (!ReadParam(m
, iter
, &matrix
[i
]))
102 r
->set_matrix(matrix
);
107 case cc::FilterOperation::ZOOM
:
108 if (ReadParam(m
, iter
, &amount
) &&
109 ReadParam(m
, iter
, &zoom_inset
) &&
112 r
->set_amount(amount
);
113 r
->set_zoom_inset(zoom_inset
);
117 case cc::FilterOperation::REFERENCE
: {
118 skia::RefPtr
<SkImageFilter
> filter
;
119 if (!ReadParam(m
, iter
, &filter
)) {
123 r
->set_image_filter(filter
);
127 case cc::FilterOperation::ALPHA_THRESHOLD
:
133 void ParamTraits
<cc::FilterOperation
>::Log(
134 const param_type
& p
, std::string
* l
) {
136 LogParam(static_cast<unsigned>(p
.type()), l
);
140 case cc::FilterOperation::GRAYSCALE
:
141 case cc::FilterOperation::SEPIA
:
142 case cc::FilterOperation::SATURATE
:
143 case cc::FilterOperation::HUE_ROTATE
:
144 case cc::FilterOperation::INVERT
:
145 case cc::FilterOperation::BRIGHTNESS
:
146 case cc::FilterOperation::SATURATING_BRIGHTNESS
:
147 case cc::FilterOperation::CONTRAST
:
148 case cc::FilterOperation::OPACITY
:
149 case cc::FilterOperation::BLUR
:
150 LogParam(p
.amount(), l
);
152 case cc::FilterOperation::DROP_SHADOW
:
153 LogParam(p
.drop_shadow_offset(), l
);
155 LogParam(p
.amount(), l
);
157 LogParam(p
.drop_shadow_color(), l
);
159 case cc::FilterOperation::COLOR_MATRIX
:
160 for (int i
= 0; i
< 20; ++i
) {
163 LogParam(p
.matrix()[i
], l
);
166 case cc::FilterOperation::ZOOM
:
167 LogParam(p
.amount(), l
);
169 LogParam(p
.zoom_inset(), l
);
171 case cc::FilterOperation::REFERENCE
:
172 LogParam(p
.image_filter(), l
);
174 case cc::FilterOperation::ALPHA_THRESHOLD
:
181 void ParamTraits
<cc::FilterOperations
>::Write(
182 Message
* m
, const param_type
& p
) {
183 WriteParam(m
, p
.size());
184 for (std::size_t i
= 0; i
< p
.size(); ++i
) {
185 WriteParam(m
, p
.at(i
));
189 bool ParamTraits
<cc::FilterOperations
>::Read(
190 const Message
* m
, PickleIterator
* iter
, param_type
* r
) {
192 if (!ReadParam(m
, iter
, &count
))
195 for (std::size_t i
= 0; i
< count
; ++i
) {
196 cc::FilterOperation op
= cc::FilterOperation::CreateEmptyFilter();
197 if (!ReadParam(m
, iter
, &op
))
204 void ParamTraits
<cc::FilterOperations
>::Log(
205 const param_type
& p
, std::string
* l
) {
207 for (std::size_t i
= 0; i
< p
.size(); ++i
) {
210 LogParam(p
.at(i
), l
);
215 void ParamTraits
<skia::RefPtr
<SkImageFilter
> >::Write(
216 Message
* m
, const param_type
& p
) {
217 SkImageFilter
* filter
= p
.get();
219 skia::RefPtr
<SkData
> data
=
220 skia::AdoptRef(SkValidatingSerializeFlattenable(filter
));
221 m
->WriteData(static_cast<const char*>(data
->data()), data
->size());
227 bool ParamTraits
<skia::RefPtr
<SkImageFilter
> >::Read(
228 const Message
* m
, PickleIterator
* iter
, param_type
* r
) {
229 const char* data
= 0;
231 if (!m
->ReadData(iter
, &data
, &length
))
234 SkFlattenable
* flattenable
= SkValidatingDeserializeFlattenable(
235 data
, length
, SkImageFilter::GetFlattenableType());
236 *r
= skia::AdoptRef(static_cast<SkImageFilter
*>(flattenable
));
243 void ParamTraits
<skia::RefPtr
<SkImageFilter
> >::Log(
244 const param_type
& p
, std::string
* l
) {
246 LogParam(p
.get() ? p
->countInputs() : 0, l
);
250 void ParamTraits
<gfx::Transform
>::Write(
251 Message
* m
, const param_type
& p
) {
252 #ifdef SK_MSCALAR_IS_FLOAT
253 float column_major_data
[16];
254 p
.matrix().asColMajorf(column_major_data
);
256 double column_major_data
[16];
257 p
.matrix().asColMajord(column_major_data
);
259 m
->WriteBytes(&column_major_data
, sizeof(SkMScalar
) * 16);
262 bool ParamTraits
<gfx::Transform
>::Read(
263 const Message
* m
, PickleIterator
* iter
, param_type
* r
) {
264 const char* column_major_data
;
265 if (!m
->ReadBytes(iter
, &column_major_data
, sizeof(SkMScalar
) * 16))
267 r
->matrix().setColMajor(
268 reinterpret_cast<const SkMScalar
*>(column_major_data
));
272 void ParamTraits
<gfx::Transform
>::Log(
273 const param_type
& p
, std::string
* l
) {
274 #ifdef SK_MSCALAR_IS_FLOAT
275 float row_major_data
[16];
276 p
.matrix().asRowMajorf(row_major_data
);
278 double row_major_data
[16];
279 p
.matrix().asRowMajord(row_major_data
);
282 for (int i
= 0; i
< 16; ++i
) {
285 LogParam(row_major_data
[i
], l
);
290 void ParamTraits
<cc::RenderPass
>::Write(
291 Message
* m
, const param_type
& p
) {
293 WriteParam(m
, p
.output_rect
);
294 WriteParam(m
, p
.damage_rect
);
295 WriteParam(m
, p
.transform_to_root_target
);
296 WriteParam(m
, p
.has_transparent_background
);
297 WriteParam(m
, p
.shared_quad_state_list
.size());
298 WriteParam(m
, p
.quad_list
.size());
300 size_t shared_quad_state_index
= 0;
301 size_t last_shared_quad_state_index
= kuint32max
;
302 for (size_t i
= 0; i
< p
.quad_list
.size(); ++i
) {
303 const cc::DrawQuad
* quad
= p
.quad_list
[i
];
304 DCHECK(quad
->rect
.Contains(quad
->visible_rect
))
305 << quad
->material
<< " rect: " << quad
->rect
.ToString()
306 << " visible_rect: " << quad
->visible_rect
.ToString();
307 DCHECK(quad
->opaque_rect
.IsEmpty() ||
308 quad
->rect
.Contains(quad
->opaque_rect
))
309 << quad
->material
<< " rect: " << quad
->rect
.ToString()
310 << " opaque_rect: " << quad
->opaque_rect
.ToString();
312 switch (quad
->material
) {
313 case cc::DrawQuad::CHECKERBOARD
:
314 WriteParam(m
, *cc::CheckerboardDrawQuad::MaterialCast(quad
));
316 case cc::DrawQuad::DEBUG_BORDER
:
317 WriteParam(m
, *cc::DebugBorderDrawQuad::MaterialCast(quad
));
319 case cc::DrawQuad::IO_SURFACE_CONTENT
:
320 WriteParam(m
, *cc::IOSurfaceDrawQuad::MaterialCast(quad
));
322 case cc::DrawQuad::PICTURE_CONTENT
:
325 case cc::DrawQuad::TEXTURE_CONTENT
:
326 WriteParam(m
, *cc::TextureDrawQuad::MaterialCast(quad
));
328 case cc::DrawQuad::RENDER_PASS
:
329 WriteParam(m
, *cc::RenderPassDrawQuad::MaterialCast(quad
));
331 case cc::DrawQuad::SOLID_COLOR
:
332 WriteParam(m
, *cc::SolidColorDrawQuad::MaterialCast(quad
));
334 case cc::DrawQuad::SURFACE_CONTENT
:
335 WriteParam(m
, *cc::SurfaceDrawQuad::MaterialCast(quad
));
337 case cc::DrawQuad::TILED_CONTENT
:
338 WriteParam(m
, *cc::TileDrawQuad::MaterialCast(quad
));
340 case cc::DrawQuad::STREAM_VIDEO_CONTENT
:
341 WriteParam(m
, *cc::StreamVideoDrawQuad::MaterialCast(quad
));
343 case cc::DrawQuad::YUV_VIDEO_CONTENT
:
344 WriteParam(m
, *cc::YUVVideoDrawQuad::MaterialCast(quad
));
346 case cc::DrawQuad::INVALID
:
350 const cc::ScopedPtrVector
<cc::SharedQuadState
>& sqs_list
=
351 p
.shared_quad_state_list
;
353 // This is an invalid index.
354 size_t bad_index
= sqs_list
.size();
356 // Null shared quad states should not occur.
357 DCHECK(quad
->shared_quad_state
);
358 if (!quad
->shared_quad_state
) {
359 WriteParam(m
, bad_index
);
363 // SharedQuadStates should appear in the order they are used by DrawQuads.
364 // Find the SharedQuadState for this DrawQuad.
365 while (shared_quad_state_index
< sqs_list
.size() &&
366 quad
->shared_quad_state
!= sqs_list
[shared_quad_state_index
])
367 ++shared_quad_state_index
;
369 DCHECK_LT(shared_quad_state_index
, sqs_list
.size());
370 if (shared_quad_state_index
>= sqs_list
.size()) {
371 WriteParam(m
, bad_index
);
375 WriteParam(m
, shared_quad_state_index
);
376 if (shared_quad_state_index
!= last_shared_quad_state_index
) {
377 WriteParam(m
, *sqs_list
[shared_quad_state_index
]);
378 last_shared_quad_state_index
= shared_quad_state_index
;
383 static size_t ReserveSizeForRenderPassWrite(const cc::RenderPass
& p
) {
384 size_t to_reserve
= sizeof(cc::RenderPass
);
386 to_reserve
+= p
.shared_quad_state_list
.size() * sizeof(cc::SharedQuadState
);
388 // The shared_quad_state_index for each quad.
389 to_reserve
+= p
.quad_list
.size() * sizeof(size_t);
391 // The largest quad type, verified by a unit test.
392 to_reserve
+= p
.quad_list
.size() * sizeof(cc::kLargestDrawQuad
);
396 template<typename QuadType
>
397 static scoped_ptr
<cc::DrawQuad
> ReadDrawQuad(const Message
* m
,
398 PickleIterator
* iter
) {
399 scoped_ptr
<QuadType
> quad(new QuadType
);
400 if (!ReadParam(m
, iter
, quad
.get()))
401 return scoped_ptr
<QuadType
>().template PassAs
<cc::DrawQuad
>();
402 return quad
.template PassAs
<cc::DrawQuad
>();
405 bool ParamTraits
<cc::RenderPass
>::Read(
406 const Message
* m
, PickleIterator
* iter
, param_type
* p
) {
407 cc::RenderPassId
id(-1, -1);
408 gfx::Rect output_rect
;
409 gfx::Rect damage_rect
;
410 gfx::Transform transform_to_root_target
;
411 bool has_transparent_background
;
412 size_t shared_quad_state_list_size
;
413 size_t quad_list_size
;
415 if (!ReadParam(m
, iter
, &id
) ||
416 !ReadParam(m
, iter
, &output_rect
) ||
417 !ReadParam(m
, iter
, &damage_rect
) ||
418 !ReadParam(m
, iter
, &transform_to_root_target
) ||
419 !ReadParam(m
, iter
, &has_transparent_background
) ||
420 !ReadParam(m
, iter
, &shared_quad_state_list_size
) ||
421 !ReadParam(m
, iter
, &quad_list_size
))
427 transform_to_root_target
,
428 has_transparent_background
);
430 size_t last_shared_quad_state_index
= kuint32max
;
431 for (size_t i
= 0; i
< quad_list_size
; ++i
) {
432 cc::DrawQuad::Material material
;
433 PickleIterator temp_iter
= *iter
;
434 if (!ReadParam(m
, &temp_iter
, &material
))
437 scoped_ptr
<cc::DrawQuad
> draw_quad
;
439 case cc::DrawQuad::CHECKERBOARD
:
440 draw_quad
= ReadDrawQuad
<cc::CheckerboardDrawQuad
>(m
, iter
);
442 case cc::DrawQuad::DEBUG_BORDER
:
443 draw_quad
= ReadDrawQuad
<cc::DebugBorderDrawQuad
>(m
, iter
);
445 case cc::DrawQuad::IO_SURFACE_CONTENT
:
446 draw_quad
= ReadDrawQuad
<cc::IOSurfaceDrawQuad
>(m
, iter
);
448 case cc::DrawQuad::PICTURE_CONTENT
:
451 case cc::DrawQuad::SURFACE_CONTENT
:
452 draw_quad
= ReadDrawQuad
<cc::SurfaceDrawQuad
>(m
, iter
);
454 case cc::DrawQuad::TEXTURE_CONTENT
:
455 draw_quad
= ReadDrawQuad
<cc::TextureDrawQuad
>(m
, iter
);
457 case cc::DrawQuad::RENDER_PASS
:
458 draw_quad
= ReadDrawQuad
<cc::RenderPassDrawQuad
>(m
, iter
);
460 case cc::DrawQuad::SOLID_COLOR
:
461 draw_quad
= ReadDrawQuad
<cc::SolidColorDrawQuad
>(m
, iter
);
463 case cc::DrawQuad::TILED_CONTENT
:
464 draw_quad
= ReadDrawQuad
<cc::TileDrawQuad
>(m
, iter
);
466 case cc::DrawQuad::STREAM_VIDEO_CONTENT
:
467 draw_quad
= ReadDrawQuad
<cc::StreamVideoDrawQuad
>(m
, iter
);
469 case cc::DrawQuad::YUV_VIDEO_CONTENT
:
470 draw_quad
= ReadDrawQuad
<cc::YUVVideoDrawQuad
>(m
, iter
);
472 case cc::DrawQuad::INVALID
:
477 if (!draw_quad
->rect
.Contains(draw_quad
->visible_rect
)) {
478 LOG(ERROR
) << "Quad with invalid visible rect " << draw_quad
->material
479 << " rect: " << draw_quad
->rect
.ToString()
480 << " visible_rect: " << draw_quad
->visible_rect
.ToString();
483 if (!draw_quad
->opaque_rect
.IsEmpty() &&
484 !draw_quad
->rect
.Contains(draw_quad
->opaque_rect
)) {
485 LOG(ERROR
) << "Quad with invalid opaque rect " << draw_quad
->material
486 << " rect: " << draw_quad
->rect
.ToString()
487 << " opaque_rect: " << draw_quad
->opaque_rect
.ToString();
491 size_t shared_quad_state_index
;
492 if (!ReadParam(m
, iter
, &shared_quad_state_index
))
494 if (shared_quad_state_index
>= shared_quad_state_list_size
)
496 // SharedQuadState indexes should be in ascending order.
497 if (last_shared_quad_state_index
!= kuint32max
&&
498 shared_quad_state_index
< last_shared_quad_state_index
)
501 // If the quad has a new shared quad state, read it in.
502 if (last_shared_quad_state_index
!= shared_quad_state_index
) {
503 cc::SharedQuadState
* state
= p
->CreateAndAppendSharedQuadState();
504 if (!ReadParam(m
, iter
, state
))
506 last_shared_quad_state_index
= shared_quad_state_index
;
509 draw_quad
->shared_quad_state
= p
->shared_quad_state_list
.back();
510 p
->quad_list
.push_back(draw_quad
.Pass());
516 void ParamTraits
<cc::RenderPass
>::Log(
517 const param_type
& p
, std::string
* l
) {
518 l
->append("RenderPass((");
521 LogParam(p
.output_rect
, l
);
523 LogParam(p
.damage_rect
, l
);
525 LogParam(p
.transform_to_root_target
, l
);
527 LogParam(p
.has_transparent_background
, l
);
531 for (size_t i
= 0; i
< p
.shared_quad_state_list
.size(); ++i
) {
534 LogParam(*p
.shared_quad_state_list
[i
], l
);
537 for (size_t i
= 0; i
< p
.quad_list
.size(); ++i
) {
540 const cc::DrawQuad
* quad
= p
.quad_list
[i
];
541 switch (quad
->material
) {
542 case cc::DrawQuad::CHECKERBOARD
:
543 LogParam(*cc::CheckerboardDrawQuad::MaterialCast(quad
), l
);
545 case cc::DrawQuad::DEBUG_BORDER
:
546 LogParam(*cc::DebugBorderDrawQuad::MaterialCast(quad
), l
);
548 case cc::DrawQuad::IO_SURFACE_CONTENT
:
549 LogParam(*cc::IOSurfaceDrawQuad::MaterialCast(quad
), l
);
551 case cc::DrawQuad::PICTURE_CONTENT
:
554 case cc::DrawQuad::TEXTURE_CONTENT
:
555 LogParam(*cc::TextureDrawQuad::MaterialCast(quad
), l
);
557 case cc::DrawQuad::RENDER_PASS
:
558 LogParam(*cc::RenderPassDrawQuad::MaterialCast(quad
), l
);
560 case cc::DrawQuad::SOLID_COLOR
:
561 LogParam(*cc::SolidColorDrawQuad::MaterialCast(quad
), l
);
563 case cc::DrawQuad::SURFACE_CONTENT
:
564 LogParam(*cc::SurfaceDrawQuad::MaterialCast(quad
), l
);
566 case cc::DrawQuad::TILED_CONTENT
:
567 LogParam(*cc::TileDrawQuad::MaterialCast(quad
), l
);
569 case cc::DrawQuad::STREAM_VIDEO_CONTENT
:
570 LogParam(*cc::StreamVideoDrawQuad::MaterialCast(quad
), l
);
572 case cc::DrawQuad::YUV_VIDEO_CONTENT
:
573 LogParam(*cc::YUVVideoDrawQuad::MaterialCast(quad
), l
);
575 case cc::DrawQuad::INVALID
:
583 enum CompositorFrameType
{
591 void ParamTraits
<cc::CompositorFrame
>::Write(Message
* m
,
592 const param_type
& p
) {
593 WriteParam(m
, p
.metadata
);
594 if (p
.delegated_frame_data
) {
595 DCHECK(!p
.gl_frame_data
);
596 DCHECK(!p
.software_frame_data
);
597 WriteParam(m
, static_cast<int>(DELEGATED_FRAME
));
598 WriteParam(m
, *p
.delegated_frame_data
);
599 } else if (p
.gl_frame_data
) {
600 DCHECK(!p
.software_frame_data
);
601 WriteParam(m
, static_cast<int>(GL_FRAME
));
602 WriteParam(m
, *p
.gl_frame_data
);
603 } else if (p
.software_frame_data
) {
604 WriteParam(m
, static_cast<int>(SOFTWARE_FRAME
));
605 WriteParam(m
, *p
.software_frame_data
);
607 WriteParam(m
, static_cast<int>(NO_FRAME
));
611 bool ParamTraits
<cc::CompositorFrame
>::Read(const Message
* m
,
612 PickleIterator
* iter
,
614 if (!ReadParam(m
, iter
, &p
->metadata
))
617 int compositor_frame_type
;
618 if (!ReadParam(m
, iter
, &compositor_frame_type
))
621 switch (compositor_frame_type
) {
622 case DELEGATED_FRAME
:
623 p
->delegated_frame_data
.reset(new cc::DelegatedFrameData());
624 if (!ReadParam(m
, iter
, p
->delegated_frame_data
.get()))
628 p
->gl_frame_data
.reset(new cc::GLFrameData());
629 if (!ReadParam(m
, iter
, p
->gl_frame_data
.get()))
633 p
->software_frame_data
.reset(new cc::SoftwareFrameData());
634 if (!ReadParam(m
, iter
, p
->software_frame_data
.get()))
645 void ParamTraits
<cc::CompositorFrame
>::Log(const param_type
& p
,
647 l
->append("CompositorFrame(");
648 LogParam(p
.metadata
, l
);
650 if (p
.delegated_frame_data
)
651 LogParam(*p
.delegated_frame_data
, l
);
652 else if (p
.gl_frame_data
)
653 LogParam(*p
.gl_frame_data
, l
);
654 else if (p
.software_frame_data
)
655 LogParam(*p
.software_frame_data
, l
);
659 void ParamTraits
<cc::CompositorFrameAck
>::Write(Message
* m
,
660 const param_type
& p
) {
661 WriteParam(m
, p
.resources
);
662 WriteParam(m
, p
.last_software_frame_id
);
663 if (p
.gl_frame_data
) {
664 WriteParam(m
, static_cast<int>(GL_FRAME
));
665 WriteParam(m
, *p
.gl_frame_data
);
667 WriteParam(m
, static_cast<int>(NO_FRAME
));
671 bool ParamTraits
<cc::CompositorFrameAck
>::Read(const Message
* m
,
672 PickleIterator
* iter
,
674 if (!ReadParam(m
, iter
, &p
->resources
))
677 if (!ReadParam(m
, iter
, &p
->last_software_frame_id
))
680 int compositor_frame_type
;
681 if (!ReadParam(m
, iter
, &compositor_frame_type
))
684 switch (compositor_frame_type
) {
688 p
->gl_frame_data
.reset(new cc::GLFrameData());
689 if (!ReadParam(m
, iter
, p
->gl_frame_data
.get()))
698 void ParamTraits
<cc::CompositorFrameAck
>::Log(const param_type
& p
,
700 l
->append("CompositorFrameAck(");
701 LogParam(p
.resources
, l
);
703 LogParam(p
.last_software_frame_id
, l
);
706 LogParam(*p
.gl_frame_data
, l
);
710 void ParamTraits
<cc::DelegatedFrameData
>::Write(Message
* m
,
711 const param_type
& p
) {
712 DCHECK_NE(0u, p
.render_pass_list
.size());
714 size_t to_reserve
= sizeof(p
.device_scale_factor
);
715 to_reserve
+= p
.resource_list
.size() * sizeof(cc::TransferableResource
);
716 for (size_t i
= 0; i
< p
.render_pass_list
.size(); ++i
) {
717 const cc::RenderPass
* pass
= p
.render_pass_list
[i
];
718 to_reserve
+= ReserveSizeForRenderPassWrite(*pass
);
720 m
->Reserve(to_reserve
);
722 WriteParam(m
, p
.device_scale_factor
);
723 WriteParam(m
, p
.resource_list
);
724 WriteParam(m
, p
.render_pass_list
.size());
725 for (size_t i
= 0; i
< p
.render_pass_list
.size(); ++i
)
726 WriteParam(m
, *p
.render_pass_list
[i
]);
729 bool ParamTraits
<cc::DelegatedFrameData
>::Read(const Message
* m
,
730 PickleIterator
* iter
,
732 if (!ReadParam(m
, iter
, &p
->device_scale_factor
))
735 const static size_t kMaxRenderPasses
= 10000;
737 size_t num_render_passes
;
738 if (!ReadParam(m
, iter
, &p
->resource_list
) ||
739 !ReadParam(m
, iter
, &num_render_passes
) ||
740 num_render_passes
> kMaxRenderPasses
|| num_render_passes
== 0)
742 for (size_t i
= 0; i
< num_render_passes
; ++i
) {
743 scoped_ptr
<cc::RenderPass
> render_pass
= cc::RenderPass::Create();
744 if (!ReadParam(m
, iter
, render_pass
.get()))
746 p
->render_pass_list
.push_back(render_pass
.Pass());
751 void ParamTraits
<cc::DelegatedFrameData
>::Log(const param_type
& p
,
753 l
->append("DelegatedFrameData(");
754 LogParam(p
.device_scale_factor
, l
);
755 LogParam(p
.resource_list
, l
);
757 for (size_t i
= 0; i
< p
.render_pass_list
.size(); ++i
) {
760 LogParam(*p
.render_pass_list
[i
], l
);
765 void ParamTraits
<cc::SoftwareFrameData
>::Write(Message
* m
,
766 const param_type
& p
) {
767 DCHECK(cc::SharedBitmap::VerifySizeInBytes(p
.size
));
769 m
->Reserve(sizeof(cc::SoftwareFrameData
));
771 WriteParam(m
, p
.size
);
772 WriteParam(m
, p
.damage_rect
);
773 WriteParam(m
, p
.bitmap_id
);
776 bool ParamTraits
<cc::SoftwareFrameData
>::Read(const Message
* m
,
777 PickleIterator
* iter
,
779 if (!ReadParam(m
, iter
, &p
->id
))
781 if (!ReadParam(m
, iter
, &p
->size
) ||
782 !cc::SharedBitmap::VerifySizeInBytes(p
->size
))
784 if (!ReadParam(m
, iter
, &p
->damage_rect
))
786 if (!ReadParam(m
, iter
, &p
->bitmap_id
))
791 void ParamTraits
<cc::SoftwareFrameData
>::Log(const param_type
& p
,
793 l
->append("SoftwareFrameData(");
798 LogParam(p
.damage_rect
, l
);
800 LogParam(p
.bitmap_id
, l
);