OLD | NEW |
| (Empty) |
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 | |
3 // found in the LICENSE file. | |
4 | |
5 #include "cc/quads/render_pass.h" | |
6 | |
7 #include <algorithm> | |
8 | |
9 #include "base/trace_event/trace_event_argument.h" | |
10 #include "base/values.h" | |
11 #include "cc/base/math_util.h" | |
12 #include "cc/debug/traced_value.h" | |
13 #include "cc/output/copy_output_request.h" | |
14 #include "cc/quads/checkerboard_draw_quad.h" | |
15 #include "cc/quads/debug_border_draw_quad.h" | |
16 #include "cc/quads/draw_quad.h" | |
17 #include "cc/quads/io_surface_draw_quad.h" | |
18 #include "cc/quads/largest_draw_quad.h" | |
19 #include "cc/quads/render_pass_draw_quad.h" | |
20 #include "cc/quads/shared_quad_state.h" | |
21 #include "cc/quads/solid_color_draw_quad.h" | |
22 #include "cc/quads/stream_video_draw_quad.h" | |
23 #include "cc/quads/surface_draw_quad.h" | |
24 #include "cc/quads/texture_draw_quad.h" | |
25 #include "cc/quads/tile_draw_quad.h" | |
26 #include "cc/quads/yuv_video_draw_quad.h" | |
27 | |
28 namespace { | |
29 const size_t kDefaultNumSharedQuadStatesToReserve = 32; | |
30 const size_t kDefaultNumQuadsToReserve = 128; | |
31 } | |
32 | |
33 namespace cc { | |
34 | |
35 QuadList::QuadList(size_t default_size_to_reserve) | |
36 : ListContainer<DrawQuad>(LargestDrawQuadSize(), default_size_to_reserve) { | |
37 } | |
38 | |
39 scoped_ptr<RenderPass> RenderPass::Create() { | |
40 return make_scoped_ptr(new RenderPass()); | |
41 } | |
42 | |
43 scoped_ptr<RenderPass> RenderPass::Create(size_t num_layers) { | |
44 return make_scoped_ptr(new RenderPass(num_layers)); | |
45 } | |
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 | |
53 RenderPass::RenderPass() | |
54 : id(RenderPassId(-1, -1)), | |
55 has_transparent_background(true), | |
56 quad_list(kDefaultNumQuadsToReserve), | |
57 shared_quad_state_list(sizeof(SharedQuadState), | |
58 kDefaultNumSharedQuadStatesToReserve) { | |
59 } | |
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. | |
63 RenderPass::RenderPass(size_t num_layers) | |
64 : id(RenderPassId(-1, -1)), | |
65 has_transparent_background(true), | |
66 quad_list(kDefaultNumQuadsToReserve), | |
67 shared_quad_state_list(sizeof(SharedQuadState), num_layers) { | |
68 } | |
69 | |
70 RenderPass::RenderPass(size_t shared_quad_state_list_size, | |
71 size_t quad_list_size) | |
72 : id(RenderPassId(-1, -1)), | |
73 has_transparent_background(true), | |
74 quad_list(quad_list_size), | |
75 shared_quad_state_list(sizeof(SharedQuadState), | |
76 shared_quad_state_list_size) { | |
77 } | |
78 | |
79 RenderPass::~RenderPass() { | |
80 TRACE_EVENT_OBJECT_DELETED_WITH_ID( | |
81 TRACE_DISABLED_BY_DEFAULT("cc.debug.quads"), | |
82 "cc::RenderPass", id.AsTracingId()); | |
83 } | |
84 | |
85 scoped_ptr<RenderPass> RenderPass::Copy(RenderPassId new_id) const { | |
86 scoped_ptr<RenderPass> copy_pass( | |
87 Create(shared_quad_state_list.size(), quad_list.size())); | |
88 copy_pass->SetAll(new_id, | |
89 output_rect, | |
90 damage_rect, | |
91 transform_to_root_target, | |
92 has_transparent_background); | |
93 return copy_pass.Pass(); | |
94 } | |
95 | |
96 // static | |
97 void RenderPass::CopyAll(const ScopedPtrVector<RenderPass>& in, | |
98 ScopedPtrVector<RenderPass>* out) { | |
99 for (size_t i = 0; i < in.size(); ++i) { | |
100 RenderPass* source = in[i]; | |
101 | |
102 // Since we can't copy these, it's wrong to use CopyAll in a situation where | |
103 // you may have copy_requests present. | |
104 DCHECK_EQ(source->copy_requests.size(), 0u); | |
105 | |
106 scoped_ptr<RenderPass> copy_pass(Create( | |
107 source->shared_quad_state_list.size(), source->quad_list.size())); | |
108 copy_pass->SetAll(source->id, | |
109 source->output_rect, | |
110 source->damage_rect, | |
111 source->transform_to_root_target, | |
112 source->has_transparent_background); | |
113 for (const auto& shared_quad_state : source->shared_quad_state_list) { | |
114 SharedQuadState* copy_shared_quad_state = | |
115 copy_pass->CreateAndAppendSharedQuadState(); | |
116 copy_shared_quad_state->CopyFrom(shared_quad_state); | |
117 } | |
118 SharedQuadStateList::Iterator sqs_iter = | |
119 source->shared_quad_state_list.begin(); | |
120 SharedQuadStateList::Iterator copy_sqs_iter = | |
121 copy_pass->shared_quad_state_list.begin(); | |
122 for (const auto& quad : source->quad_list) { | |
123 while (quad->shared_quad_state != *sqs_iter) { | |
124 ++sqs_iter; | |
125 ++copy_sqs_iter; | |
126 DCHECK(sqs_iter != source->shared_quad_state_list.end()); | |
127 } | |
128 DCHECK(quad->shared_quad_state == *sqs_iter); | |
129 | |
130 SharedQuadState* copy_shared_quad_state = *copy_sqs_iter; | |
131 | |
132 if (quad->material == DrawQuad::RENDER_PASS) { | |
133 const RenderPassDrawQuad* pass_quad = | |
134 RenderPassDrawQuad::MaterialCast(quad); | |
135 copy_pass->CopyFromAndAppendRenderPassDrawQuad( | |
136 pass_quad, copy_shared_quad_state, pass_quad->render_pass_id); | |
137 } else { | |
138 copy_pass->CopyFromAndAppendDrawQuad(quad, copy_shared_quad_state); | |
139 } | |
140 } | |
141 out->push_back(copy_pass.Pass()); | |
142 } | |
143 } | |
144 | |
145 void RenderPass::SetNew(RenderPassId id, | |
146 const gfx::Rect& output_rect, | |
147 const gfx::Rect& damage_rect, | |
148 const gfx::Transform& transform_to_root_target) { | |
149 DCHECK_GT(id.layer_id, 0); | |
150 DCHECK_GE(id.index, 0); | |
151 DCHECK(damage_rect.IsEmpty() || output_rect.Contains(damage_rect)) | |
152 << "damage_rect: " << damage_rect.ToString() | |
153 << " output_rect: " << output_rect.ToString(); | |
154 | |
155 this->id = id; | |
156 this->output_rect = output_rect; | |
157 this->damage_rect = damage_rect; | |
158 this->transform_to_root_target = transform_to_root_target; | |
159 | |
160 DCHECK(quad_list.empty()); | |
161 DCHECK(shared_quad_state_list.empty()); | |
162 } | |
163 | |
164 void RenderPass::SetAll(RenderPassId id, | |
165 const gfx::Rect& output_rect, | |
166 const gfx::Rect& damage_rect, | |
167 const gfx::Transform& transform_to_root_target, | |
168 bool has_transparent_background) { | |
169 DCHECK_GT(id.layer_id, 0); | |
170 DCHECK_GE(id.index, 0); | |
171 | |
172 this->id = id; | |
173 this->output_rect = output_rect; | |
174 this->damage_rect = damage_rect; | |
175 this->transform_to_root_target = transform_to_root_target; | |
176 this->has_transparent_background = has_transparent_background; | |
177 | |
178 DCHECK(quad_list.empty()); | |
179 DCHECK(shared_quad_state_list.empty()); | |
180 } | |
181 | |
182 void RenderPass::AsValueInto(base::trace_event::TracedValue* value) const { | |
183 MathUtil::AddToTracedValue("output_rect", output_rect, value); | |
184 MathUtil::AddToTracedValue("damage_rect", damage_rect, value); | |
185 | |
186 value->SetBoolean("has_transparent_background", has_transparent_background); | |
187 value->SetInteger("copy_requests", copy_requests.size()); | |
188 | |
189 value->BeginArray("shared_quad_state_list"); | |
190 for (const auto& shared_quad_state : shared_quad_state_list) { | |
191 value->BeginDictionary(); | |
192 shared_quad_state->AsValueInto(value); | |
193 value->EndDictionary(); | |
194 } | |
195 value->EndArray(); | |
196 | |
197 value->BeginArray("quad_list"); | |
198 for (const auto& quad : quad_list) { | |
199 value->BeginDictionary(); | |
200 quad->AsValueInto(value); | |
201 value->EndDictionary(); | |
202 } | |
203 value->EndArray(); | |
204 | |
205 TracedValue::MakeDictIntoImplicitSnapshotWithCategory( | |
206 TRACE_DISABLED_BY_DEFAULT("cc.debug.quads"), | |
207 value, | |
208 "cc::RenderPass", | |
209 id.AsTracingId()); | |
210 } | |
211 | |
212 SharedQuadState* RenderPass::CreateAndAppendSharedQuadState() { | |
213 return shared_quad_state_list.AllocateAndConstruct<SharedQuadState>(); | |
214 } | |
215 | |
216 RenderPassDrawQuad* RenderPass::CopyFromAndAppendRenderPassDrawQuad( | |
217 const RenderPassDrawQuad* quad, | |
218 const SharedQuadState* shared_quad_state, | |
219 RenderPassId render_pass_id) { | |
220 RenderPassDrawQuad* copy_quad = | |
221 CopyFromAndAppendTypedDrawQuad<RenderPassDrawQuad>(quad); | |
222 copy_quad->shared_quad_state = shared_quad_state; | |
223 copy_quad->render_pass_id = render_pass_id; | |
224 return copy_quad; | |
225 } | |
226 | |
227 DrawQuad* RenderPass::CopyFromAndAppendDrawQuad( | |
228 const DrawQuad* quad, | |
229 const SharedQuadState* shared_quad_state) { | |
230 switch (quad->material) { | |
231 case DrawQuad::CHECKERBOARD: | |
232 CopyFromAndAppendTypedDrawQuad<CheckerboardDrawQuad>(quad); | |
233 break; | |
234 case DrawQuad::DEBUG_BORDER: | |
235 CopyFromAndAppendTypedDrawQuad<DebugBorderDrawQuad>(quad); | |
236 break; | |
237 case DrawQuad::IO_SURFACE_CONTENT: | |
238 CopyFromAndAppendTypedDrawQuad<IOSurfaceDrawQuad>(quad); | |
239 break; | |
240 case DrawQuad::TEXTURE_CONTENT: | |
241 CopyFromAndAppendTypedDrawQuad<TextureDrawQuad>(quad); | |
242 break; | |
243 case DrawQuad::SOLID_COLOR: | |
244 CopyFromAndAppendTypedDrawQuad<SolidColorDrawQuad>(quad); | |
245 break; | |
246 case DrawQuad::TILED_CONTENT: | |
247 CopyFromAndAppendTypedDrawQuad<TileDrawQuad>(quad); | |
248 break; | |
249 case DrawQuad::STREAM_VIDEO_CONTENT: | |
250 CopyFromAndAppendTypedDrawQuad<StreamVideoDrawQuad>(quad); | |
251 break; | |
252 case DrawQuad::SURFACE_CONTENT: | |
253 CopyFromAndAppendTypedDrawQuad<SurfaceDrawQuad>(quad); | |
254 break; | |
255 case DrawQuad::YUV_VIDEO_CONTENT: | |
256 CopyFromAndAppendTypedDrawQuad<YUVVideoDrawQuad>(quad); | |
257 break; | |
258 // RenderPass quads need to use specific CopyFrom function. | |
259 case DrawQuad::RENDER_PASS: | |
260 case DrawQuad::INVALID: | |
261 case DrawQuad::UNUSED_SPACE_FOR_PICTURE_CONTENT: | |
262 LOG(FATAL) << "Invalid DrawQuad material " << quad->material; | |
263 break; | |
264 } | |
265 quad_list.back()->shared_quad_state = shared_quad_state; | |
266 return quad_list.back(); | |
267 } | |
268 | |
269 } // namespace cc | |
OLD | NEW |