Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(29)

Side by Side Diff: cc/quads/render_pass.cc

Issue 551013002: Use Custome ListContainer to Allocate SharedQuadState (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@DQAllo
Patch Set: use ElementAt for unittest Created 6 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698