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 <algorithm> | |
8 | |
7 #include "base/debug/trace_event_argument.h" | 9 #include "base/debug/trace_event_argument.h" |
8 #include "base/values.h" | 10 #include "base/values.h" |
9 #include "cc/base/math_util.h" | 11 #include "cc/base/math_util.h" |
10 #include "cc/debug/traced_value.h" | 12 #include "cc/debug/traced_value.h" |
11 #include "cc/output/copy_output_request.h" | 13 #include "cc/output/copy_output_request.h" |
12 #include "cc/quads/checkerboard_draw_quad.h" | 14 #include "cc/quads/checkerboard_draw_quad.h" |
13 #include "cc/quads/debug_border_draw_quad.h" | 15 #include "cc/quads/debug_border_draw_quad.h" |
14 #include "cc/quads/draw_quad.h" | 16 #include "cc/quads/draw_quad.h" |
15 #include "cc/quads/io_surface_draw_quad.h" | 17 #include "cc/quads/io_surface_draw_quad.h" |
16 #include "cc/quads/largest_draw_quad.h" | 18 #include "cc/quads/largest_draw_quad.h" |
(...skipping 20 matching lines...) Expand all Loading... | |
37 } | 39 } |
38 | 40 |
39 scoped_ptr<RenderPass> RenderPass::Create() { | 41 scoped_ptr<RenderPass> RenderPass::Create() { |
40 return make_scoped_ptr(new RenderPass()); | 42 return make_scoped_ptr(new RenderPass()); |
41 } | 43 } |
42 | 44 |
43 scoped_ptr<RenderPass> RenderPass::Create(size_t num_layers) { | 45 scoped_ptr<RenderPass> RenderPass::Create(size_t num_layers) { |
44 return make_scoped_ptr(new RenderPass(num_layers)); | 46 return make_scoped_ptr(new RenderPass(num_layers)); |
45 } | 47 } |
46 | 48 |
49 scoped_ptr<RenderPass> RenderPass::Create(size_t shared_quad_state_list_size, | |
50 size_t quad_list_size) { | |
51 return make_scoped_ptr( | |
52 new RenderPass(shared_quad_state_list_size, quad_list_size)); | |
53 } | |
54 | |
47 RenderPass::RenderPass() | 55 RenderPass::RenderPass() |
48 : id(RenderPassId(-1, -1)), | 56 : id(RenderPassId(-1, -1)), |
49 has_transparent_background(true), | 57 has_transparent_background(true), |
50 quad_list(kDefaultNumQuadsToReserve) { | 58 quad_list(kDefaultNumQuadsToReserve), |
51 shared_quad_state_list.reserve(kDefaultNumSharedQuadStatesToReserve); | 59 shared_quad_state_list(sizeof(SharedQuadState), |
60 kDefaultNumSharedQuadStatesToReserve) { | |
52 } | 61 } |
53 | 62 |
63 // Each layer usually produces one shared quad state, so the number of layers | |
64 // is a good hint for what to reserve here. | |
54 RenderPass::RenderPass(size_t num_layers) | 65 RenderPass::RenderPass(size_t num_layers) |
55 : id(RenderPassId(-1, -1)), | 66 : id(RenderPassId(-1, -1)), |
56 has_transparent_background(true), | 67 has_transparent_background(true), |
57 quad_list(kDefaultNumQuadsToReserve) { | 68 quad_list(kDefaultNumQuadsToReserve), |
58 // Each layer usually produces one shared quad state, so the number of layers | 69 shared_quad_state_list(sizeof(SharedQuadState), num_layers) { |
59 // is a good hint for what to reserve here. | 70 } |
60 shared_quad_state_list.reserve(num_layers); | 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 (const auto& shared_quad_state : source->shared_quad_state_list) { |
96 SharedQuadState* copy_shared_quad_state = | 116 SharedQuadState* copy_shared_quad_state = |
97 copy_pass->CreateAndAppendSharedQuadState(); | 117 copy_pass->CreateAndAppendSharedQuadState(); |
98 copy_shared_quad_state->CopyFrom(source->shared_quad_state_list[i]); | 118 copy_shared_quad_state->CopyFrom(&shared_quad_state); |
99 } | 119 } |
100 size_t sqs_i = 0; | 120 SharedQuadStateList::Iterator sqs_iter = |
101 for (QuadList::Iterator iter = source->quad_list.begin(); | 121 source->shared_quad_state_list.begin(); |
102 iter != source->quad_list.end(); | 122 SharedQuadStateList::Iterator copy_sqs_iter = |
103 ++iter) { | 123 copy_pass->shared_quad_state_list.begin(); |
104 while (iter->shared_quad_state != source->shared_quad_state_list[sqs_i]) { | 124 for (auto& quad : source->quad_list) { |
danakj
2014/10/02 15:32:48
can this be const&?
weiliangc
2014/10/02 22:01:40
Done.
weiliangc
2014/10/02 22:01:40
Done.
| |
105 ++sqs_i; | 125 while (quad.shared_quad_state != &*sqs_iter) { |
106 DCHECK_LT(sqs_i, source->shared_quad_state_list.size()); | 126 ++sqs_iter; |
127 ++copy_sqs_iter; | |
128 DCHECK(sqs_iter != source->shared_quad_state_list.end()); | |
107 } | 129 } |
108 DCHECK(iter->shared_quad_state == source->shared_quad_state_list[sqs_i]); | 130 DCHECK(quad.shared_quad_state == &*sqs_iter); |
danakj
2014/10/02 15:32:48
drop the sqs_iter and just use ElementAt since it'
weiliangc
2014/10/02 22:01:40
Actually it is used to keep track of the original
| |
109 | 131 |
110 DrawQuad* quad = &*iter; | 132 SharedQuadState* copy_shared_quad_state = &*copy_sqs_iter; |
111 | 133 |
112 if (quad->material == DrawQuad::RENDER_PASS) { | 134 if (quad.material == DrawQuad::RENDER_PASS) { |
113 const RenderPassDrawQuad* pass_quad = | 135 const RenderPassDrawQuad* pass_quad = |
114 RenderPassDrawQuad::MaterialCast(quad); | 136 RenderPassDrawQuad::MaterialCast(&quad); |
115 copy_pass->CopyFromAndAppendRenderPassDrawQuad( | 137 copy_pass->CopyFromAndAppendRenderPassDrawQuad( |
116 pass_quad, | 138 pass_quad, copy_shared_quad_state, pass_quad->render_pass_id); |
117 copy_pass->shared_quad_state_list[sqs_i], | |
118 pass_quad->render_pass_id); | |
119 } else { | 139 } else { |
120 copy_pass->CopyFromAndAppendDrawQuad( | 140 copy_pass->CopyFromAndAppendDrawQuad(&quad, copy_shared_quad_state); |
121 quad, copy_pass->shared_quad_state_list[sqs_i]); | |
122 } | 141 } |
123 } | 142 } |
124 out->push_back(copy_pass.Pass()); | 143 out->push_back(copy_pass.Pass()); |
125 } | 144 } |
126 } | 145 } |
127 | 146 |
128 void RenderPass::SetNew(RenderPassId id, | 147 void RenderPass::SetNew(RenderPassId id, |
129 const gfx::Rect& output_rect, | 148 const gfx::Rect& output_rect, |
130 const gfx::Rect& damage_rect, | 149 const gfx::Rect& damage_rect, |
131 const gfx::Transform& transform_to_root_target) { | 150 const gfx::Transform& transform_to_root_target) { |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
168 value->EndArray(); | 187 value->EndArray(); |
169 | 188 |
170 value->BeginArray("damage_rect"); | 189 value->BeginArray("damage_rect"); |
171 MathUtil::AddToTracedValue(damage_rect, value); | 190 MathUtil::AddToTracedValue(damage_rect, value); |
172 value->EndArray(); | 191 value->EndArray(); |
173 | 192 |
174 value->SetBoolean("has_transparent_background", has_transparent_background); | 193 value->SetBoolean("has_transparent_background", has_transparent_background); |
175 value->SetInteger("copy_requests", copy_requests.size()); | 194 value->SetInteger("copy_requests", copy_requests.size()); |
176 | 195 |
177 value->BeginArray("shared_quad_state_list"); | 196 value->BeginArray("shared_quad_state_list"); |
178 for (size_t i = 0; i < shared_quad_state_list.size(); ++i) { | 197 for (const auto& shared_quad_state : shared_quad_state_list) { |
179 value->BeginDictionary(); | 198 value->BeginDictionary(); |
180 shared_quad_state_list[i]->AsValueInto(value); | 199 shared_quad_state.AsValueInto(value); |
181 value->EndDictionary(); | 200 value->EndDictionary(); |
182 } | 201 } |
183 value->EndArray(); | 202 value->EndArray(); |
184 | 203 |
185 value->BeginArray("quad_list"); | 204 value->BeginArray("quad_list"); |
186 for (QuadList::ConstIterator iter = quad_list.begin(); | 205 for (const auto& quad : quad_list) { |
187 iter != quad_list.end(); | |
188 ++iter) { | |
189 value->BeginDictionary(); | 206 value->BeginDictionary(); |
190 iter->AsValueInto(value); | 207 quad.AsValueInto(value); |
191 value->EndDictionary(); | 208 value->EndDictionary(); |
192 } | 209 } |
193 value->EndArray(); | 210 value->EndArray(); |
194 | 211 |
195 TracedValue::MakeDictIntoImplicitSnapshotWithCategory( | 212 TracedValue::MakeDictIntoImplicitSnapshotWithCategory( |
196 TRACE_DISABLED_BY_DEFAULT("cc.debug.quads"), | 213 TRACE_DISABLED_BY_DEFAULT("cc.debug.quads"), |
197 value, | 214 value, |
198 "cc::RenderPass", | 215 "cc::RenderPass", |
199 id.AsTracingId()); | 216 id.AsTracingId()); |
200 } | 217 } |
201 | 218 |
202 SharedQuadState* RenderPass::CreateAndAppendSharedQuadState() { | 219 SharedQuadState* RenderPass::CreateAndAppendSharedQuadState() { |
203 shared_quad_state_list.push_back(make_scoped_ptr(new SharedQuadState)); | 220 return shared_quad_state_list.AllocateAndConstruct<SharedQuadState>(); |
204 return shared_quad_state_list.back(); | |
205 } | 221 } |
206 | 222 |
207 RenderPassDrawQuad* RenderPass::CopyFromAndAppendRenderPassDrawQuad( | 223 RenderPassDrawQuad* RenderPass::CopyFromAndAppendRenderPassDrawQuad( |
208 const RenderPassDrawQuad* quad, | 224 const RenderPassDrawQuad* quad, |
209 const SharedQuadState* shared_quad_state, | 225 const SharedQuadState* shared_quad_state, |
210 RenderPassId render_pass_id) { | 226 RenderPassId render_pass_id) { |
211 RenderPassDrawQuad* copy_quad = | 227 RenderPassDrawQuad* copy_quad = |
212 CopyFromAndAppendTypedDrawQuad<RenderPassDrawQuad>(quad); | 228 CopyFromAndAppendTypedDrawQuad<RenderPassDrawQuad>(quad); |
213 copy_quad->shared_quad_state = shared_quad_state; | 229 copy_quad->shared_quad_state = shared_quad_state; |
214 copy_quad->render_pass_id = render_pass_id; | 230 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: | 269 case DrawQuad::RENDER_PASS: |
254 case DrawQuad::INVALID: | 270 case DrawQuad::INVALID: |
255 LOG(FATAL) << "Invalid DrawQuad material " << quad->material; | 271 LOG(FATAL) << "Invalid DrawQuad material " << quad->material; |
256 break; | 272 break; |
257 } | 273 } |
258 quad_list.back()->shared_quad_state = shared_quad_state; | 274 quad_list.back()->shared_quad_state = shared_quad_state; |
259 return quad_list.back(); | 275 return quad_list.back(); |
260 } | 276 } |
261 | 277 |
262 } // namespace cc | 278 } // namespace cc |
OLD | NEW |