Index: content/common/cc_messages.cc |
diff --git a/content/common/cc_messages.cc b/content/common/cc_messages.cc |
index b1c34be339a5ccb402dc99231479a5947c17743f..e2bd7a819c33e2f2ef47fb4de26dcc243286e419 100644 |
--- a/content/common/cc_messages.cc |
+++ b/content/common/cc_messages.cc |
@@ -294,90 +294,75 @@ void ParamTraits<cc::RenderPass>::Write( |
WriteParam(m, p.damage_rect); |
WriteParam(m, p.transform_to_root_target); |
WriteParam(m, p.has_transparent_background); |
- WriteParam(m, p.shared_quad_state_list.size()); |
WriteParam(m, p.quad_list.size()); |
- size_t shared_quad_state_index = 0; |
- size_t last_shared_quad_state_index = kuint32max; |
- for (cc::QuadList::ConstIterator iter = p.quad_list.begin(); |
- iter != p.quad_list.end(); |
- ++iter) { |
- const cc::DrawQuad* quad = &*iter; |
- DCHECK(quad->rect.Contains(quad->visible_rect)) |
- << quad->material << " rect: " << quad->rect.ToString() |
- << " visible_rect: " << quad->visible_rect.ToString(); |
- DCHECK(quad->opaque_rect.IsEmpty() || |
- quad->rect.Contains(quad->opaque_rect)) |
- << quad->material << " rect: " << quad->rect.ToString() |
- << " opaque_rect: " << quad->opaque_rect.ToString(); |
+ cc::SharedQuadStateList::ConstIterator shared_quad_state_iter = |
+ p.shared_quad_state_list.begin(); |
+ cc::SharedQuadStateList::ConstIterator last_shared_quad_state_iter = |
+ p.shared_quad_state_list.end(); |
+ for (const auto& quad : p.quad_list) { |
+ DCHECK(quad.rect.Contains(quad.visible_rect)) |
+ << quad.material << " rect: " << quad.rect.ToString() |
+ << " visible_rect: " << quad.visible_rect.ToString(); |
+ DCHECK(quad.opaque_rect.IsEmpty() || quad.rect.Contains(quad.opaque_rect)) |
+ << quad.material << " rect: " << quad.rect.ToString() |
+ << " opaque_rect: " << quad.opaque_rect.ToString(); |
- switch (quad->material) { |
+ switch (quad.material) { |
case cc::DrawQuad::CHECKERBOARD: |
- WriteParam(m, *cc::CheckerboardDrawQuad::MaterialCast(quad)); |
+ WriteParam(m, *cc::CheckerboardDrawQuad::MaterialCast(&quad)); |
break; |
case cc::DrawQuad::DEBUG_BORDER: |
- WriteParam(m, *cc::DebugBorderDrawQuad::MaterialCast(quad)); |
+ WriteParam(m, *cc::DebugBorderDrawQuad::MaterialCast(&quad)); |
break; |
case cc::DrawQuad::IO_SURFACE_CONTENT: |
- WriteParam(m, *cc::IOSurfaceDrawQuad::MaterialCast(quad)); |
+ WriteParam(m, *cc::IOSurfaceDrawQuad::MaterialCast(&quad)); |
break; |
case cc::DrawQuad::PICTURE_CONTENT: |
NOTREACHED(); |
break; |
case cc::DrawQuad::TEXTURE_CONTENT: |
- WriteParam(m, *cc::TextureDrawQuad::MaterialCast(quad)); |
+ WriteParam(m, *cc::TextureDrawQuad::MaterialCast(&quad)); |
break; |
case cc::DrawQuad::RENDER_PASS: |
- WriteParam(m, *cc::RenderPassDrawQuad::MaterialCast(quad)); |
+ WriteParam(m, *cc::RenderPassDrawQuad::MaterialCast(&quad)); |
break; |
case cc::DrawQuad::SOLID_COLOR: |
- WriteParam(m, *cc::SolidColorDrawQuad::MaterialCast(quad)); |
+ WriteParam(m, *cc::SolidColorDrawQuad::MaterialCast(&quad)); |
break; |
case cc::DrawQuad::SURFACE_CONTENT: |
- WriteParam(m, *cc::SurfaceDrawQuad::MaterialCast(quad)); |
+ WriteParam(m, *cc::SurfaceDrawQuad::MaterialCast(&quad)); |
break; |
case cc::DrawQuad::TILED_CONTENT: |
- WriteParam(m, *cc::TileDrawQuad::MaterialCast(quad)); |
+ WriteParam(m, *cc::TileDrawQuad::MaterialCast(&quad)); |
break; |
case cc::DrawQuad::STREAM_VIDEO_CONTENT: |
- WriteParam(m, *cc::StreamVideoDrawQuad::MaterialCast(quad)); |
+ WriteParam(m, *cc::StreamVideoDrawQuad::MaterialCast(&quad)); |
break; |
case cc::DrawQuad::YUV_VIDEO_CONTENT: |
- WriteParam(m, *cc::YUVVideoDrawQuad::MaterialCast(quad)); |
+ WriteParam(m, *cc::YUVVideoDrawQuad::MaterialCast(&quad)); |
break; |
case cc::DrawQuad::INVALID: |
break; |
} |
- const cc::ScopedPtrVector<cc::SharedQuadState>& sqs_list = |
- p.shared_quad_state_list; |
- |
- // This is an invalid index. |
- size_t bad_index = sqs_list.size(); |
- |
// Null shared quad states should not occur. |
- DCHECK(quad->shared_quad_state); |
- if (!quad->shared_quad_state) { |
- WriteParam(m, bad_index); |
- continue; |
- } |
+ DCHECK(quad.shared_quad_state); |
// SharedQuadStates should appear in the order they are used by DrawQuads. |
// Find the SharedQuadState for this DrawQuad. |
- while (shared_quad_state_index < sqs_list.size() && |
- quad->shared_quad_state != sqs_list[shared_quad_state_index]) |
- ++shared_quad_state_index; |
+ while (shared_quad_state_iter != p.shared_quad_state_list.end() && |
+ quad.shared_quad_state != &*shared_quad_state_iter) |
+ ++shared_quad_state_iter; |
- DCHECK_LT(shared_quad_state_index, sqs_list.size()); |
- if (shared_quad_state_index >= sqs_list.size()) { |
- WriteParam(m, bad_index); |
- continue; |
- } |
+ DCHECK(shared_quad_state_iter != p.shared_quad_state_list.end()); |
- WriteParam(m, shared_quad_state_index); |
- if (shared_quad_state_index != last_shared_quad_state_index) { |
- WriteParam(m, *sqs_list[shared_quad_state_index]); |
- last_shared_quad_state_index = shared_quad_state_index; |
+ if (shared_quad_state_iter != last_shared_quad_state_iter) { |
+ WriteParam(m, true); |
+ WriteParam(m, *shared_quad_state_iter); |
+ last_shared_quad_state_iter = shared_quad_state_iter; |
+ } else { |
+ WriteParam(m, false); |
} |
} |
} |
@@ -385,11 +370,13 @@ void ParamTraits<cc::RenderPass>::Write( |
static size_t ReserveSizeForRenderPassWrite(const cc::RenderPass& p) { |
size_t to_reserve = sizeof(cc::RenderPass); |
+ // Whether the quad points to a new shared quad state for each quad. |
+ to_reserve += p.quad_list.size() * sizeof(bool); |
+ |
+ // Shared quad state is only written when a quad contains a shared quad state |
+ // that has not been written. |
to_reserve += p.shared_quad_state_list.size() * sizeof(cc::SharedQuadState); |
- // The shared_quad_state_index for each quad. |
- to_reserve += p.quad_list.size() * sizeof(size_t); |
- |
// The largest quad type, verified by a unit test. |
to_reserve += p.quad_list.size() * sizeof(cc::kLargestDrawQuad); |
return to_reserve; |
@@ -412,7 +399,6 @@ bool ParamTraits<cc::RenderPass>::Read( |
gfx::Rect damage_rect; |
gfx::Transform transform_to_root_target; |
bool has_transparent_background; |
- size_t shared_quad_state_list_size; |
size_t quad_list_size; |
if (!ReadParam(m, iter, &id) || |
@@ -420,7 +406,6 @@ bool ParamTraits<cc::RenderPass>::Read( |
!ReadParam(m, iter, &damage_rect) || |
!ReadParam(m, iter, &transform_to_root_target) || |
!ReadParam(m, iter, &has_transparent_background) || |
- !ReadParam(m, iter, &shared_quad_state_list_size) || |
!ReadParam(m, iter, &quad_list_size)) |
return false; |
@@ -430,7 +415,6 @@ bool ParamTraits<cc::RenderPass>::Read( |
transform_to_root_target, |
has_transparent_background); |
- size_t last_shared_quad_state_index = kuint32max; |
for (size_t i = 0; i < quad_list_size; ++i) { |
cc::DrawQuad::Material material; |
PickleIterator temp_iter = *iter; |
@@ -491,22 +475,15 @@ bool ParamTraits<cc::RenderPass>::Read( |
return false; |
} |
- size_t shared_quad_state_index; |
- if (!ReadParam(m, iter, &shared_quad_state_index)) |
- return false; |
- if (shared_quad_state_index >= shared_quad_state_list_size) |
- return false; |
- // SharedQuadState indexes should be in ascending order. |
- if (last_shared_quad_state_index != kuint32max && |
- shared_quad_state_index < last_shared_quad_state_index) |
+ bool has_new_shared_quad_state; |
+ if (!ReadParam(m, iter, &has_new_shared_quad_state)) |
return false; |
// If the quad has a new shared quad state, read it in. |
- if (last_shared_quad_state_index != shared_quad_state_index) { |
+ if (has_new_shared_quad_state) { |
cc::SharedQuadState* state = p->CreateAndAppendSharedQuadState(); |
if (!ReadParam(m, iter, state)) |
return false; |
- last_shared_quad_state_index = shared_quad_state_index; |
} |
draw_quad->shared_quad_state = p->shared_quad_state_list.back(); |
@@ -530,51 +507,48 @@ void ParamTraits<cc::RenderPass>::Log( |
l->append(", "); |
l->append("["); |
- for (size_t i = 0; i < p.shared_quad_state_list.size(); ++i) { |
- if (i) |
+ for (const auto& shared_quad_state : p.shared_quad_state_list) { |
+ if (&shared_quad_state != p.shared_quad_state_list.front()) |
l->append(", "); |
- LogParam(*p.shared_quad_state_list[i], l); |
+ LogParam(shared_quad_state, l); |
} |
l->append("], ["); |
- for (cc::QuadList::ConstIterator iter = p.quad_list.begin(); |
- iter != p.quad_list.end(); |
- ++iter) { |
- if (iter != p.quad_list.begin()) |
+ for (const auto& quad : p.quad_list) { |
+ if (&quad != p.quad_list.front()) |
l->append(", "); |
- const cc::DrawQuad* quad = &*iter; |
- switch (quad->material) { |
+ switch (quad.material) { |
case cc::DrawQuad::CHECKERBOARD: |
- LogParam(*cc::CheckerboardDrawQuad::MaterialCast(quad), l); |
+ LogParam(*cc::CheckerboardDrawQuad::MaterialCast(&quad), l); |
break; |
case cc::DrawQuad::DEBUG_BORDER: |
- LogParam(*cc::DebugBorderDrawQuad::MaterialCast(quad), l); |
+ LogParam(*cc::DebugBorderDrawQuad::MaterialCast(&quad), l); |
break; |
case cc::DrawQuad::IO_SURFACE_CONTENT: |
- LogParam(*cc::IOSurfaceDrawQuad::MaterialCast(quad), l); |
+ LogParam(*cc::IOSurfaceDrawQuad::MaterialCast(&quad), l); |
break; |
case cc::DrawQuad::PICTURE_CONTENT: |
NOTREACHED(); |
break; |
case cc::DrawQuad::TEXTURE_CONTENT: |
- LogParam(*cc::TextureDrawQuad::MaterialCast(quad), l); |
+ LogParam(*cc::TextureDrawQuad::MaterialCast(&quad), l); |
break; |
case cc::DrawQuad::RENDER_PASS: |
- LogParam(*cc::RenderPassDrawQuad::MaterialCast(quad), l); |
+ LogParam(*cc::RenderPassDrawQuad::MaterialCast(&quad), l); |
break; |
case cc::DrawQuad::SOLID_COLOR: |
- LogParam(*cc::SolidColorDrawQuad::MaterialCast(quad), l); |
+ LogParam(*cc::SolidColorDrawQuad::MaterialCast(&quad), l); |
break; |
case cc::DrawQuad::SURFACE_CONTENT: |
- LogParam(*cc::SurfaceDrawQuad::MaterialCast(quad), l); |
+ LogParam(*cc::SurfaceDrawQuad::MaterialCast(&quad), l); |
break; |
case cc::DrawQuad::TILED_CONTENT: |
- LogParam(*cc::TileDrawQuad::MaterialCast(quad), l); |
+ LogParam(*cc::TileDrawQuad::MaterialCast(&quad), l); |
break; |
case cc::DrawQuad::STREAM_VIDEO_CONTENT: |
- LogParam(*cc::StreamVideoDrawQuad::MaterialCast(quad), l); |
+ LogParam(*cc::StreamVideoDrawQuad::MaterialCast(&quad), l); |
break; |
case cc::DrawQuad::YUV_VIDEO_CONTENT: |
- LogParam(*cc::YUVVideoDrawQuad::MaterialCast(quad), l); |
+ LogParam(*cc::YUVVideoDrawQuad::MaterialCast(&quad), l); |
break; |
case cc::DrawQuad::INVALID: |
break; |
@@ -719,6 +693,7 @@ void ParamTraits<cc::DelegatedFrameData>::Write(Message* m, |
to_reserve += p.resource_list.size() * sizeof(cc::TransferableResource); |
for (size_t i = 0; i < p.render_pass_list.size(); ++i) { |
const cc::RenderPass* pass = p.render_pass_list[i]; |
+ to_reserve += sizeof(size_t) * 2; |
to_reserve += ReserveSizeForRenderPassWrite(*pass); |
} |
m->Reserve(to_reserve); |
@@ -726,8 +701,11 @@ void ParamTraits<cc::DelegatedFrameData>::Write(Message* m, |
WriteParam(m, p.device_scale_factor); |
WriteParam(m, p.resource_list); |
WriteParam(m, p.render_pass_list.size()); |
- for (size_t i = 0; i < p.render_pass_list.size(); ++i) |
+ for (size_t i = 0; i < p.render_pass_list.size(); ++i) { |
+ WriteParam(m, p.render_pass_list[i]->quad_list.size()); |
+ WriteParam(m, p.render_pass_list[i]->shared_quad_state_list.size()); |
WriteParam(m, *p.render_pass_list[i]); |
+ } |
} |
bool ParamTraits<cc::DelegatedFrameData>::Read(const Message* m, |
@@ -737,6 +715,8 @@ bool ParamTraits<cc::DelegatedFrameData>::Read(const Message* m, |
return false; |
const static size_t kMaxRenderPasses = 10000; |
+ const static size_t kMaxSharedQuadStateListSize = 100000; |
+ const static size_t kMaxQuadListSize = 100000; |
danakj
2014/10/02 15:32:48
actually i wonder if this is too few for webview,
danakj
2014/10/03 15:39:49
Missed this one?
|
size_t num_render_passes; |
if (!ReadParam(m, iter, &p->resource_list) || |
@@ -744,7 +724,15 @@ bool ParamTraits<cc::DelegatedFrameData>::Read(const Message* m, |
num_render_passes > kMaxRenderPasses || num_render_passes == 0) |
return false; |
for (size_t i = 0; i < num_render_passes; ++i) { |
- scoped_ptr<cc::RenderPass> render_pass = cc::RenderPass::Create(); |
+ size_t quad_list_size; |
+ size_t shared_quad_state_list_size; |
+ if (!ReadParam(m, iter, &quad_list_size) || |
+ !ReadParam(m, iter, &shared_quad_state_list_size) || |
+ quad_list_size > kMaxQuadListSize || |
+ shared_quad_state_list_size > kMaxSharedQuadStateListSize) |
+ return false; |
+ scoped_ptr<cc::RenderPass> render_pass = |
+ cc::RenderPass::Create(shared_quad_state_list_size, quad_list_size); |
if (!ReadParam(m, iter, render_pass.get())) |
return false; |
p->render_pass_list.push_back(render_pass.Pass()); |