Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2011 The Chromium Authors. All rights reserved. | 1 // Copyright 2011 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 "cc/quads/render_pass.h" | 5 #include "cc/quads/render_pass.h" |
| 6 | 6 |
| 7 #include "base/debug/trace_event_argument.h" | 7 #include "base/debug/trace_event_argument.h" |
| 8 #include "base/values.h" | 8 #include "base/values.h" |
| 9 #include "cc/base/math_util.h" | 9 #include "cc/base/math_util.h" |
| 10 #include "cc/debug/traced_value.h" | 10 #include "cc/debug/traced_value.h" |
| (...skipping 26 matching lines...) Expand all Loading... | |
| 37 } | 37 } |
| 38 | 38 |
| 39 scoped_ptr<RenderPass> RenderPass::Create() { | 39 scoped_ptr<RenderPass> RenderPass::Create() { |
| 40 return make_scoped_ptr(new RenderPass()); | 40 return make_scoped_ptr(new RenderPass()); |
| 41 } | 41 } |
| 42 | 42 |
| 43 scoped_ptr<RenderPass> RenderPass::Create(size_t num_layers) { | 43 scoped_ptr<RenderPass> RenderPass::Create(size_t num_layers) { |
| 44 return make_scoped_ptr(new RenderPass(num_layers)); | 44 return make_scoped_ptr(new RenderPass(num_layers)); |
| 45 } | 45 } |
| 46 | 46 |
| 47 scoped_ptr<RenderPass> RenderPass::Create(size_t shared_quad_state_list_size, | |
| 48 size_t quad_list_size) { | |
| 49 return make_scoped_ptr( | |
| 50 new RenderPass(shared_quad_state_list_size, quad_list_size)); | |
| 51 } | |
| 52 | |
| 47 RenderPass::RenderPass() | 53 RenderPass::RenderPass() |
| 48 : id(RenderPassId(-1, -1)), | 54 : id(RenderPassId(-1, -1)), |
| 49 has_transparent_background(true), | 55 has_transparent_background(true), |
| 50 quad_list(kDefaultNumQuadsToReserve) { | 56 quad_list(kDefaultNumQuadsToReserve), |
| 51 shared_quad_state_list.reserve(kDefaultNumSharedQuadStatesToReserve); | 57 shared_quad_state_list(sizeof(SharedQuadState), |
| 58 kDefaultNumSharedQuadStatesToReserve) { | |
| 52 } | 59 } |
| 53 | 60 |
| 61 // Each layer usually produces one shared quad state, so the number of layers | |
| 62 // is a good hint for what to reserve here. | |
| 54 RenderPass::RenderPass(size_t num_layers) | 63 RenderPass::RenderPass(size_t num_layers) |
| 55 : id(RenderPassId(-1, -1)), | 64 : id(RenderPassId(-1, -1)), |
| 56 has_transparent_background(true), | 65 has_transparent_background(true), |
| 57 quad_list(kDefaultNumQuadsToReserve) { | 66 quad_list(kDefaultNumQuadsToReserve), |
| 58 // Each layer usually produces one shared quad state, so the number of layers | 67 shared_quad_state_list( |
| 59 // is a good hint for what to reserve here. | 68 sizeof(SharedQuadState), |
| 60 shared_quad_state_list.reserve(num_layers); | 69 num_layers ? num_layers : kDefaultNumSharedQuadStatesToReserve) { |
|
danakj
2014/09/26 20:40:55
can num_layers be 0? Can the ListContainer not han
weiliangc
2014/09/26 21:48:02
num_layer can be 0 in unittests.
Yeah you are rig
| |
| 70 } | |
| 71 | |
| 72 RenderPass::RenderPass(size_t shared_quad_state_list_size, | |
| 73 size_t quad_list_size) | |
| 74 : id(RenderPassId(-1, -1)), | |
| 75 has_transparent_background(true), | |
| 76 quad_list(quad_list_size), | |
| 77 shared_quad_state_list(sizeof(SharedQuadState), | |
| 78 shared_quad_state_list_size) { | |
| 61 } | 79 } |
| 62 | 80 |
| 63 RenderPass::~RenderPass() { | 81 RenderPass::~RenderPass() { |
| 64 TRACE_EVENT_OBJECT_DELETED_WITH_ID( | 82 TRACE_EVENT_OBJECT_DELETED_WITH_ID( |
| 65 TRACE_DISABLED_BY_DEFAULT("cc.debug.quads"), | 83 TRACE_DISABLED_BY_DEFAULT("cc.debug.quads"), |
| 66 "cc::RenderPass", id.AsTracingId()); | 84 "cc::RenderPass", id.AsTracingId()); |
| 67 } | 85 } |
| 68 | 86 |
| 69 scoped_ptr<RenderPass> RenderPass::Copy(RenderPassId new_id) const { | 87 scoped_ptr<RenderPass> RenderPass::Copy(RenderPassId new_id) const { |
| 70 scoped_ptr<RenderPass> copy_pass(Create()); | 88 scoped_ptr<RenderPass> copy_pass( |
| 89 Create(shared_quad_state_list.size(), quad_list.size())); | |
| 71 copy_pass->SetAll(new_id, | 90 copy_pass->SetAll(new_id, |
| 72 output_rect, | 91 output_rect, |
| 73 damage_rect, | 92 damage_rect, |
| 74 transform_to_root_target, | 93 transform_to_root_target, |
| 75 has_transparent_background); | 94 has_transparent_background); |
| 76 return copy_pass.Pass(); | 95 return copy_pass.Pass(); |
| 77 } | 96 } |
| 78 | 97 |
| 79 // static | 98 // static |
| 80 void RenderPass::CopyAll(const ScopedPtrVector<RenderPass>& in, | 99 void RenderPass::CopyAll(const ScopedPtrVector<RenderPass>& in, |
| 81 ScopedPtrVector<RenderPass>* out) { | 100 ScopedPtrVector<RenderPass>* out) { |
| 82 for (size_t i = 0; i < in.size(); ++i) { | 101 for (size_t i = 0; i < in.size(); ++i) { |
| 83 RenderPass* source = in[i]; | 102 RenderPass* source = in[i]; |
| 84 | 103 |
| 85 // Since we can't copy these, it's wrong to use CopyAll in a situation where | 104 // Since we can't copy these, it's wrong to use CopyAll in a situation where |
| 86 // you may have copy_requests present. | 105 // you may have copy_requests present. |
| 87 DCHECK_EQ(source->copy_requests.size(), 0u); | 106 DCHECK_EQ(source->copy_requests.size(), 0u); |
| 88 | 107 |
| 89 scoped_ptr<RenderPass> copy_pass(Create()); | 108 scoped_ptr<RenderPass> copy_pass(Create( |
| 109 source->shared_quad_state_list.size(), source->quad_list.size())); | |
| 90 copy_pass->SetAll(source->id, | 110 copy_pass->SetAll(source->id, |
| 91 source->output_rect, | 111 source->output_rect, |
| 92 source->damage_rect, | 112 source->damage_rect, |
| 93 source->transform_to_root_target, | 113 source->transform_to_root_target, |
| 94 source->has_transparent_background); | 114 source->has_transparent_background); |
| 95 for (size_t i = 0; i < source->shared_quad_state_list.size(); ++i) { | 115 for (SharedQuadStateList::ConstIterator iter = |
| 116 source->shared_quad_state_list.begin(); | |
| 117 iter != source->shared_quad_state_list.end(); | |
| 118 ++iter) { | |
| 96 SharedQuadState* copy_shared_quad_state = | 119 SharedQuadState* copy_shared_quad_state = |
| 97 copy_pass->CreateAndAppendSharedQuadState(); | 120 copy_pass->CreateAndAppendSharedQuadState(); |
| 98 copy_shared_quad_state->CopyFrom(source->shared_quad_state_list[i]); | 121 copy_shared_quad_state->CopyFrom(&(*iter)); |
|
danakj
2014/09/26 20:40:55
you didn't use &(*a) just &*a in other patches, wh
weiliangc
2014/09/26 21:48:02
...I used &*a in ListContainer and its unittest.
| |
| 99 } | 122 } |
| 100 size_t sqs_i = 0; | 123 SharedQuadStateList::Iterator sqs_iter = |
| 124 source->shared_quad_state_list.begin(); | |
| 125 SharedQuadStateList::Iterator copy_sqs_iter = | |
| 126 copy_pass->shared_quad_state_list.begin(); | |
| 101 for (QuadList::Iterator iter = source->quad_list.begin(); | 127 for (QuadList::Iterator iter = source->quad_list.begin(); |
| 102 iter != source->quad_list.end(); | 128 iter != source->quad_list.end(); |
| 103 ++iter) { | 129 ++iter) { |
| 104 while (iter->shared_quad_state != source->shared_quad_state_list[sqs_i]) { | 130 while (iter->shared_quad_state != &(*sqs_iter)) { |
|
danakj
2014/09/26 20:40:55
&*?
weiliangc
2014/10/01 23:02:00
Done.
| |
| 105 ++sqs_i; | 131 ++sqs_iter; |
| 106 DCHECK_LT(sqs_i, source->shared_quad_state_list.size()); | 132 ++copy_sqs_iter; |
| 133 DCHECK(sqs_iter != source->shared_quad_state_list.end()); | |
| 107 } | 134 } |
| 108 DCHECK(iter->shared_quad_state == source->shared_quad_state_list[sqs_i]); | 135 DCHECK(iter->shared_quad_state == &(*sqs_iter)); |
|
danakj
2014/09/26 20:40:55
&*?
weiliangc
2014/10/01 23:02:00
Done.
| |
| 109 | 136 |
| 110 DrawQuad* quad = &*iter; | 137 DrawQuad* quad = &*iter; |
|
danakj
2014/09/26 20:40:55
can you put the copy SQS* into a variable here too
weiliangc
2014/10/01 23:02:00
Done.
| |
| 111 | 138 |
| 112 if (quad->material == DrawQuad::RENDER_PASS) { | 139 if (quad->material == DrawQuad::RENDER_PASS) { |
| 113 const RenderPassDrawQuad* pass_quad = | 140 const RenderPassDrawQuad* pass_quad = |
| 114 RenderPassDrawQuad::MaterialCast(quad); | 141 RenderPassDrawQuad::MaterialCast(quad); |
| 115 copy_pass->CopyFromAndAppendRenderPassDrawQuad( | 142 copy_pass->CopyFromAndAppendRenderPassDrawQuad( |
| 116 pass_quad, | 143 pass_quad, &*copy_sqs_iter, pass_quad->render_pass_id); |
| 117 copy_pass->shared_quad_state_list[sqs_i], | |
| 118 pass_quad->render_pass_id); | |
| 119 } else { | 144 } else { |
| 120 copy_pass->CopyFromAndAppendDrawQuad( | 145 copy_pass->CopyFromAndAppendDrawQuad(quad, &*copy_sqs_iter); |
| 121 quad, copy_pass->shared_quad_state_list[sqs_i]); | |
| 122 } | 146 } |
| 123 } | 147 } |
| 124 out->push_back(copy_pass.Pass()); | 148 out->push_back(copy_pass.Pass()); |
| 125 } | 149 } |
| 126 } | 150 } |
| 127 | 151 |
| 128 void RenderPass::SetNew(RenderPassId id, | 152 void RenderPass::SetNew(RenderPassId id, |
| 129 const gfx::Rect& output_rect, | 153 const gfx::Rect& output_rect, |
| 130 const gfx::Rect& damage_rect, | 154 const gfx::Rect& damage_rect, |
| 131 const gfx::Transform& transform_to_root_target) { | 155 const gfx::Transform& transform_to_root_target) { |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 168 value->EndArray(); | 192 value->EndArray(); |
| 169 | 193 |
| 170 value->BeginArray("damage_rect"); | 194 value->BeginArray("damage_rect"); |
| 171 MathUtil::AddToTracedValue(damage_rect, value); | 195 MathUtil::AddToTracedValue(damage_rect, value); |
| 172 value->EndArray(); | 196 value->EndArray(); |
| 173 | 197 |
| 174 value->SetBoolean("has_transparent_background", has_transparent_background); | 198 value->SetBoolean("has_transparent_background", has_transparent_background); |
| 175 value->SetInteger("copy_requests", copy_requests.size()); | 199 value->SetInteger("copy_requests", copy_requests.size()); |
| 176 | 200 |
| 177 value->BeginArray("shared_quad_state_list"); | 201 value->BeginArray("shared_quad_state_list"); |
| 178 for (size_t i = 0; i < shared_quad_state_list.size(); ++i) { | 202 for (SharedQuadStateList::ConstIterator iter = |
| 203 this->shared_quad_state_list.begin(); | |
| 204 iter != this->shared_quad_state_list.end(); | |
| 205 ++iter) { | |
| 179 value->BeginDictionary(); | 206 value->BeginDictionary(); |
| 180 shared_quad_state_list[i]->AsValueInto(value); | 207 iter->AsValueInto(value); |
| 181 value->EndDictionary(); | 208 value->EndDictionary(); |
| 182 } | 209 } |
| 183 value->EndArray(); | 210 value->EndArray(); |
| 184 | 211 |
| 185 value->BeginArray("quad_list"); | 212 value->BeginArray("quad_list"); |
| 186 for (QuadList::ConstIterator iter = quad_list.begin(); | 213 for (QuadList::ConstIterator iter = quad_list.begin(); |
| 187 iter != quad_list.end(); | 214 iter != quad_list.end(); |
| 188 ++iter) { | 215 ++iter) { |
| 189 value->BeginDictionary(); | 216 value->BeginDictionary(); |
| 190 iter->AsValueInto(value); | 217 iter->AsValueInto(value); |
| 191 value->EndDictionary(); | 218 value->EndDictionary(); |
| 192 } | 219 } |
| 193 value->EndArray(); | 220 value->EndArray(); |
| 194 | 221 |
| 195 TracedValue::MakeDictIntoImplicitSnapshotWithCategory( | 222 TracedValue::MakeDictIntoImplicitSnapshotWithCategory( |
| 196 TRACE_DISABLED_BY_DEFAULT("cc.debug.quads"), | 223 TRACE_DISABLED_BY_DEFAULT("cc.debug.quads"), |
| 197 value, | 224 value, |
| 198 "cc::RenderPass", | 225 "cc::RenderPass", |
| 199 id.AsTracingId()); | 226 id.AsTracingId()); |
| 200 } | 227 } |
| 201 | 228 |
| 202 SharedQuadState* RenderPass::CreateAndAppendSharedQuadState() { | 229 SharedQuadState* RenderPass::CreateAndAppendSharedQuadState() { |
| 203 shared_quad_state_list.push_back(make_scoped_ptr(new SharedQuadState)); | 230 return shared_quad_state_list.AllocateAndConstruct<SharedQuadState>(); |
| 204 return shared_quad_state_list.back(); | |
| 205 } | 231 } |
| 206 | 232 |
| 207 RenderPassDrawQuad* RenderPass::CopyFromAndAppendRenderPassDrawQuad( | 233 RenderPassDrawQuad* RenderPass::CopyFromAndAppendRenderPassDrawQuad( |
| 208 const RenderPassDrawQuad* quad, | 234 const RenderPassDrawQuad* quad, |
| 209 const SharedQuadState* shared_quad_state, | 235 const SharedQuadState* shared_quad_state, |
| 210 RenderPassId render_pass_id) { | 236 RenderPassId render_pass_id) { |
| 211 RenderPassDrawQuad* copy_quad = | 237 RenderPassDrawQuad* copy_quad = |
| 212 CopyFromAndAppendTypedDrawQuad<RenderPassDrawQuad>(quad); | 238 CopyFromAndAppendTypedDrawQuad<RenderPassDrawQuad>(quad); |
| 213 copy_quad->shared_quad_state = shared_quad_state; | 239 copy_quad->shared_quad_state = shared_quad_state; |
| 214 copy_quad->render_pass_id = render_pass_id; | 240 copy_quad->render_pass_id = render_pass_id; |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 253 case DrawQuad::RENDER_PASS: | 279 case DrawQuad::RENDER_PASS: |
| 254 case DrawQuad::INVALID: | 280 case DrawQuad::INVALID: |
| 255 LOG(FATAL) << "Invalid DrawQuad material " << quad->material; | 281 LOG(FATAL) << "Invalid DrawQuad material " << quad->material; |
| 256 break; | 282 break; |
| 257 } | 283 } |
| 258 quad_list.back()->shared_quad_state = shared_quad_state; | 284 quad_list.back()->shared_quad_state = shared_quad_state; |
| 259 return quad_list.back(); | 285 return quad_list.back(); |
| 260 } | 286 } |
| 261 | 287 |
| 262 } // namespace cc | 288 } // namespace cc |
| OLD | NEW |