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

Side by Side Diff: cc/scheduler_state_machine.cc

Issue 11879012: cc: Redraw incomplete frames when new texture uploads finish (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@decouple_draw3b
Patch Set: Created 7 years, 11 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/scheduler_state_machine.h" 5 #include "cc/scheduler_state_machine.h"
6 6
7 #include "base/logging.h" 7 #include "base/logging.h"
8 #include "base/stringprintf.h" 8 #include "base/stringprintf.h"
9 #include "cc/layer_tree_settings.h" 9 #include "cc/layer_tree_settings.h"
10 10
11 namespace cc { 11 namespace cc {
12 12
13 SchedulerStateMachine::SchedulerStateMachine(const LayerTreeSettings &layerTreeS ettings) 13 SchedulerStateMachine::SchedulerStateMachine(const LayerTreeSettings &layerTreeS ettings)
14 : m_layerTreeSettings(layerTreeSettings) 14 : m_layerTreeSettings(layerTreeSettings)
15 , m_commitState(COMMIT_STATE_IDLE) 15 , m_commitState(COMMIT_STATE_IDLE)
16 , m_currentFrameNumber(0) 16 , m_currentFrameNumber(0)
17 , m_lastFrameNumberWhereDrawWasCalled(-1) 17 , m_lastFrameNumberWhereDrawWasCalled(-1)
18 , m_lastFrameNumberWhereTreeActivationAttempted(-1) 18 , m_lastFrameNumberWhereTreeActivationAttempted(-1)
19 , m_lastFrameNumberWhereRedrawOnVisibleTextureUploadAttempted(-1)
19 , m_consecutiveFailedDraws(0) 20 , m_consecutiveFailedDraws(0)
20 , m_maximumNumberOfFailedDrawsBeforeDrawIsForced(3) 21 , m_maximumNumberOfFailedDrawsBeforeDrawIsForced(3)
21 , m_needsRedraw(false) 22 , m_needsRedraw(false)
23 , m_needsRedrawOnVisibleTextureUpload(false)
22 , m_needsForcedRedraw(false) 24 , m_needsForcedRedraw(false)
23 , m_needsForcedRedrawAfterNextCommit(false) 25 , m_needsForcedRedrawAfterNextCommit(false)
24 , m_needsCommit(false) 26 , m_needsCommit(false)
25 , m_needsForcedCommit(false) 27 , m_needsForcedCommit(false)
26 , m_expectImmediateBeginFrame(false) 28 , m_expectImmediateBeginFrame(false)
27 , m_mainThreadNeedsLayerTextures(false) 29 , m_mainThreadNeedsLayerTextures(false)
28 , m_insideVSync(false) 30 , m_insideVSync(false)
29 , m_visible(false) 31 , m_visible(false)
30 , m_canBeginFrame(false) 32 , m_canBeginFrame(false)
31 , m_canDraw(false) 33 , m_canDraw(false)
32 , m_hasPendingTree(false) 34 , m_hasPendingTree(false)
33 , m_drawIfPossibleFailed(false) 35 , m_drawIfPossibleFailed(false)
34 , m_textureState(LAYER_TEXTURE_STATE_UNLOCKED) 36 , m_textureState(LAYER_TEXTURE_STATE_UNLOCKED)
35 , m_outputSurfaceState(OUTPUT_SURFACE_ACTIVE) 37 , m_outputSurfaceState(OUTPUT_SURFACE_ACTIVE)
36 { 38 {
37 } 39 }
38 40
39 std::string SchedulerStateMachine::toString() 41 std::string SchedulerStateMachine::toString()
40 { 42 {
41 std::string str; 43 std::string str;
42 base::StringAppendF(&str, "m_commitState = %d; ", m_commitState); 44 base::StringAppendF(&str, "m_commitState = %d; ", m_commitState);
43 base::StringAppendF(&str, "m_currentFrameNumber = %d; ", m_currentFrameNumbe r); 45 base::StringAppendF(&str, "m_currentFrameNumber = %d; ", m_currentFrameNumbe r);
44 base::StringAppendF(&str, "m_lastFrameNumberWhereDrawWasCalled = %d; ", m_la stFrameNumberWhereDrawWasCalled); 46 base::StringAppendF(&str, "m_lastFrameNumberWhereDrawWasCalled = %d; ", m_la stFrameNumberWhereDrawWasCalled);
45 base::StringAppendF(&str, "m_consecutiveFailedDraws = %d; ", m_consecutiveFa iledDraws); 47 base::StringAppendF(&str, "m_consecutiveFailedDraws = %d; ", m_consecutiveFa iledDraws);
46 base::StringAppendF(&str, "m_maximumNumberOfFailedDrawsBeforeDrawIsForced = %d; ", m_maximumNumberOfFailedDrawsBeforeDrawIsForced); 48 base::StringAppendF(&str, "m_maximumNumberOfFailedDrawsBeforeDrawIsForced = %d; ", m_maximumNumberOfFailedDrawsBeforeDrawIsForced);
47 base::StringAppendF(&str, "m_needsRedraw = %d; ", m_needsRedraw); 49 base::StringAppendF(&str, "m_needsRedraw = %d; ", m_needsRedraw);
50 base::StringAppendF(&str, "m_needsRedrawOnVisibleTextureUpload = %d; ", m_ne edsRedrawOnVisibleTextureUpload);
48 base::StringAppendF(&str, "m_needsForcedRedraw = %d; ", m_needsForcedRedraw) ; 51 base::StringAppendF(&str, "m_needsForcedRedraw = %d; ", m_needsForcedRedraw) ;
49 base::StringAppendF(&str, "m_needsForcedRedrawAfterNextCommit = %d; ", m_nee dsForcedRedrawAfterNextCommit); 52 base::StringAppendF(&str, "m_needsForcedRedrawAfterNextCommit = %d; ", m_nee dsForcedRedrawAfterNextCommit);
50 base::StringAppendF(&str, "m_needsCommit = %d; ", m_needsCommit); 53 base::StringAppendF(&str, "m_needsCommit = %d; ", m_needsCommit);
51 base::StringAppendF(&str, "m_needsForcedCommit = %d; ", m_needsForcedCommit) ; 54 base::StringAppendF(&str, "m_needsForcedCommit = %d; ", m_needsForcedCommit) ;
52 base::StringAppendF(&str, "m_expectImmediateBeginFrame = %d; ", m_expectImme diateBeginFrame); 55 base::StringAppendF(&str, "m_expectImmediateBeginFrame = %d; ", m_expectImme diateBeginFrame);
53 base::StringAppendF(&str, "m_mainThreadNeedsLayerTextures = %d; ", m_mainThr eadNeedsLayerTextures); 56 base::StringAppendF(&str, "m_mainThreadNeedsLayerTextures = %d; ", m_mainThr eadNeedsLayerTextures);
54 base::StringAppendF(&str, "m_insideVSync = %d; ", m_insideVSync); 57 base::StringAppendF(&str, "m_insideVSync = %d; ", m_insideVSync);
55 base::StringAppendF(&str, "m_visible = %d; ", m_visible); 58 base::StringAppendF(&str, "m_visible = %d; ", m_visible);
56 base::StringAppendF(&str, "m_canBeginFrame = %d; ", m_canBeginFrame); 59 base::StringAppendF(&str, "m_canBeginFrame = %d; ", m_canBeginFrame);
57 base::StringAppendF(&str, "m_canDraw = %d; ", m_canDraw); 60 base::StringAppendF(&str, "m_canDraw = %d; ", m_canDraw);
58 base::StringAppendF(&str, "m_drawIfPossibleFailed = %d; ", m_drawIfPossibleF ailed); 61 base::StringAppendF(&str, "m_drawIfPossibleFailed = %d; ", m_drawIfPossibleF ailed);
59 base::StringAppendF(&str, "m_hasPendingTree = %d; ", m_hasPendingTree); 62 base::StringAppendF(&str, "m_hasPendingTree = %d; ", m_hasPendingTree);
60 base::StringAppendF(&str, "m_textureState = %d; ", m_textureState); 63 base::StringAppendF(&str, "m_textureState = %d; ", m_textureState);
61 base::StringAppendF(&str, "m_outputSurfaceState = %d; ", m_outputSurfaceStat e); 64 base::StringAppendF(&str, "m_outputSurfaceState = %d; ", m_outputSurfaceStat e);
62 return str; 65 return str;
63 } 66 }
64 67
65 bool SchedulerStateMachine::hasDrawnThisFrame() const 68 bool SchedulerStateMachine::hasDrawnThisFrame() const
66 { 69 {
67 return m_currentFrameNumber == m_lastFrameNumberWhereDrawWasCalled; 70 return m_currentFrameNumber == m_lastFrameNumberWhereDrawWasCalled;
68 } 71 }
69 72
70 bool SchedulerStateMachine::hasAttemptedTreeActivationThisFrame() const 73 bool SchedulerStateMachine::hasAttemptedTreeActivationThisFrame() const
71 { 74 {
72 return m_currentFrameNumber == m_lastFrameNumberWhereTreeActivationAttempted ; 75 return m_currentFrameNumber == m_lastFrameNumberWhereTreeActivationAttempted ;
73 } 76 }
74 77
78 bool SchedulerStateMachine::hasAttemptedRedrawOnVisibleTextureUploadThisFrame() const
79 {
80 return m_currentFrameNumber ==
81 m_lastFrameNumberWhereRedrawOnVisibleTextureUploadAttempted;
82 }
83
75 bool SchedulerStateMachine::drawSuspendedUntilCommit() const 84 bool SchedulerStateMachine::drawSuspendedUntilCommit() const
76 { 85 {
77 if (!m_canDraw) 86 if (!m_canDraw)
78 return true; 87 return true;
79 if (!m_visible) 88 if (!m_visible)
80 return true; 89 return true;
81 if (m_textureState == LAYER_TEXTURE_STATE_ACQUIRED_BY_MAIN_THREAD) 90 if (m_textureState == LAYER_TEXTURE_STATE_ACQUIRED_BY_MAIN_THREAD)
82 return true; 91 return true;
83 return false; 92 return false;
84 } 93 }
(...skipping 18 matching lines...) Expand all
103 return false; 112 return false;
104 if (hasDrawnThisFrame()) 113 if (hasDrawnThisFrame())
105 return false; 114 return false;
106 if (m_outputSurfaceState != OUTPUT_SURFACE_ACTIVE) 115 if (m_outputSurfaceState != OUTPUT_SURFACE_ACTIVE)
107 return false; 116 return false;
108 return true; 117 return true;
109 } 118 }
110 119
111 bool SchedulerStateMachine::shouldAttemptTreeActivation() const 120 bool SchedulerStateMachine::shouldAttemptTreeActivation() const
112 { 121 {
113 return m_hasPendingTree && m_insideVSync && !hasAttemptedTreeActivationThisFra me(); 122 return m_hasPendingTree && m_insideVSync && !hasAttemptedTreeActivationThisF rame();
123 }
124
125 bool SchedulerStateMachine::shouldAttemptRedrawOnVisibleTextureUpload() const
126 {
127 return m_needsRedrawOnVisibleTextureUpload &&
128 !hasAttemptedRedrawOnVisibleTextureUploadThisFrame() &&
129 !hasDrawnThisFrame();
114 } 130 }
115 131
116 bool SchedulerStateMachine::shouldAcquireLayerTexturesForMainThread() const 132 bool SchedulerStateMachine::shouldAcquireLayerTexturesForMainThread() const
117 { 133 {
118 if (!m_mainThreadNeedsLayerTextures) 134 if (!m_mainThreadNeedsLayerTextures)
119 return false; 135 return false;
120 if (m_textureState == LAYER_TEXTURE_STATE_UNLOCKED) 136 if (m_textureState == LAYER_TEXTURE_STATE_UNLOCKED)
121 return true; 137 return true;
122 DCHECK(m_textureState == LAYER_TEXTURE_STATE_ACQUIRED_BY_IMPL_THREAD); 138 DCHECK(m_textureState == LAYER_TEXTURE_STATE_ACQUIRED_BY_IMPL_THREAD);
123 // Transfer the lock from impl thread to main thread immediately if the 139 // Transfer the lock from impl thread to main thread immediately if the
(...skipping 18 matching lines...) Expand all
142 // TODO(enne): Should probably drop the active tree on force commit 158 // TODO(enne): Should probably drop the active tree on force commit
143 return m_hasPendingTree ? ACTION_NONE : ACTION_BEGIN_FRAME; 159 return m_hasPendingTree ? ACTION_NONE : ACTION_BEGIN_FRAME;
144 if (m_outputSurfaceState == OUTPUT_SURFACE_LOST) 160 if (m_outputSurfaceState == OUTPUT_SURFACE_LOST)
145 return ACTION_BEGIN_OUTPUT_SURFACE_RECREATION; 161 return ACTION_BEGIN_OUTPUT_SURFACE_RECREATION;
146 if (m_outputSurfaceState == OUTPUT_SURFACE_RECREATING) 162 if (m_outputSurfaceState == OUTPUT_SURFACE_RECREATING)
147 return ACTION_NONE; 163 return ACTION_NONE;
148 if (shouldAttemptTreeActivation()) 164 if (shouldAttemptTreeActivation())
149 return ACTION_ACTIVATE_PENDING_TREE_IF_NEEDED; 165 return ACTION_ACTIVATE_PENDING_TREE_IF_NEEDED;
150 if (shouldDraw()) 166 if (shouldDraw())
151 return m_needsForcedRedraw ? ACTION_DRAW_FORCED : ACTION_DRAW_IF_POS SIBLE; 167 return m_needsForcedRedraw ? ACTION_DRAW_FORCED : ACTION_DRAW_IF_POS SIBLE;
168 if (shouldAttemptRedrawOnVisibleTextureUpload())
169 return ACTION_CHECK_FOR_NEW_VISIBLE_TEXTURES;
152 if (m_needsCommit && ((m_visible && m_canBeginFrame) || m_needsForcedCom mit)) 170 if (m_needsCommit && ((m_visible && m_canBeginFrame) || m_needsForcedCom mit))
153 // TODO(enne): Should probably drop the active tree on force commit 171 // TODO(enne): Should probably drop the active tree on force commit
154 return m_hasPendingTree ? ACTION_NONE : ACTION_BEGIN_FRAME; 172 return m_hasPendingTree ? ACTION_NONE : ACTION_BEGIN_FRAME;
155 return ACTION_NONE; 173 return ACTION_NONE;
156 174
157 case COMMIT_STATE_FRAME_IN_PROGRESS: 175 case COMMIT_STATE_FRAME_IN_PROGRESS:
158 if (shouldAttemptTreeActivation()) 176 if (shouldAttemptTreeActivation())
159 return ACTION_ACTIVATE_PENDING_TREE_IF_NEEDED; 177 return ACTION_ACTIVATE_PENDING_TREE_IF_NEEDED;
160 if (shouldDraw()) 178 if (shouldDraw())
161 return m_needsForcedRedraw ? ACTION_DRAW_FORCED : ACTION_DRAW_IF_POS SIBLE; 179 return m_needsForcedRedraw ? ACTION_DRAW_FORCED : ACTION_DRAW_IF_POS SIBLE;
180 if (shouldAttemptRedrawOnVisibleTextureUpload())
181 return ACTION_CHECK_FOR_NEW_VISIBLE_TEXTURES;
162 return ACTION_NONE; 182 return ACTION_NONE;
163 183
164 case COMMIT_STATE_READY_TO_COMMIT: 184 case COMMIT_STATE_READY_TO_COMMIT:
165 return ACTION_COMMIT; 185 return ACTION_COMMIT;
166 186
167 case COMMIT_STATE_WAITING_FOR_FIRST_DRAW: { 187 case COMMIT_STATE_WAITING_FOR_FIRST_DRAW: {
168 if (shouldAttemptTreeActivation()) 188 if (shouldAttemptTreeActivation())
169 return ACTION_ACTIVATE_PENDING_TREE_IF_NEEDED; 189 return ACTION_ACTIVATE_PENDING_TREE_IF_NEEDED;
170 if (shouldDraw() || m_outputSurfaceState == OUTPUT_SURFACE_LOST) 190 if (shouldDraw() || m_outputSurfaceState == OUTPUT_SURFACE_LOST)
171 return m_needsForcedRedraw ? ACTION_DRAW_FORCED : ACTION_DRAW_IF_POS SIBLE; 191 return m_needsForcedRedraw ? ACTION_DRAW_FORCED : ACTION_DRAW_IF_POS SIBLE;
192 if (shouldAttemptRedrawOnVisibleTextureUpload())
193 return ACTION_CHECK_FOR_NEW_VISIBLE_TEXTURES;
172 // COMMIT_STATE_WAITING_FOR_FIRST_DRAW wants to enforce a draw. If m_can Draw is false 194 // COMMIT_STATE_WAITING_FOR_FIRST_DRAW wants to enforce a draw. If m_can Draw is false
173 // or textures are not available, proceed to the next step (similar as i n COMMIT_STATE_IDLE). 195 // or textures are not available, proceed to the next step (similar as i n COMMIT_STATE_IDLE).
174 bool canCommit = m_visible || m_needsForcedCommit; 196 bool canCommit = m_visible || m_needsForcedCommit;
175 if (m_needsCommit && canCommit && drawSuspendedUntilCommit()) 197 if (m_needsCommit && canCommit && drawSuspendedUntilCommit())
176 return m_hasPendingTree ? ACTION_NONE : ACTION_BEGIN_FRAME; 198 return m_hasPendingTree ? ACTION_NONE : ACTION_BEGIN_FRAME;
177 return ACTION_NONE; 199 return ACTION_NONE;
178 } 200 }
179 201
180 case COMMIT_STATE_WAITING_FOR_FIRST_FORCED_DRAW: 202 case COMMIT_STATE_WAITING_FOR_FIRST_FORCED_DRAW:
181 if (shouldAttemptTreeActivation()) 203 if (shouldAttemptTreeActivation())
182 return ACTION_ACTIVATE_PENDING_TREE_IF_NEEDED; 204 return ACTION_ACTIVATE_PENDING_TREE_IF_NEEDED;
183 if (m_needsForcedRedraw) 205 if (m_needsForcedRedraw)
184 return ACTION_DRAW_FORCED; 206 return ACTION_DRAW_FORCED;
207 if (shouldAttemptRedrawOnVisibleTextureUpload())
208 return ACTION_CHECK_FOR_NEW_VISIBLE_TEXTURES;
185 return ACTION_NONE; 209 return ACTION_NONE;
186 } 210 }
187 NOTREACHED(); 211 NOTREACHED();
188 return ACTION_NONE; 212 return ACTION_NONE;
189 } 213 }
190 214
191 void SchedulerStateMachine::updateState(Action action) 215 void SchedulerStateMachine::updateState(Action action)
192 { 216 {
193 switch (action) { 217 switch (action) {
194 case ACTION_NONE: 218 case ACTION_NONE:
195 return; 219 return;
196 220
197 case ACTION_ACTIVATE_PENDING_TREE_IF_NEEDED: 221 case ACTION_ACTIVATE_PENDING_TREE_IF_NEEDED:
198 m_lastFrameNumberWhereTreeActivationAttempted = m_currentFrameNumber; 222 m_lastFrameNumberWhereTreeActivationAttempted = m_currentFrameNumber;
199 return; 223 return;
200 224
225 case ACTION_CHECK_FOR_NEW_VISIBLE_TEXTURES:
226 // We set this false here and the caller must actively set this back
227 // to true for each frame that it still needs to check for uploads.
228 m_needsRedrawOnVisibleTextureUpload = false;
229 m_lastFrameNumberWhereRedrawOnVisibleTextureUploadAttempted = m_currentF rameNumber;
230 return;
231
201 case ACTION_BEGIN_FRAME: 232 case ACTION_BEGIN_FRAME:
202 DCHECK(!m_hasPendingTree); 233 DCHECK(!m_hasPendingTree);
203 DCHECK(m_visible || m_needsForcedCommit); 234 DCHECK(m_visible || m_needsForcedCommit);
204 m_commitState = COMMIT_STATE_FRAME_IN_PROGRESS; 235 m_commitState = COMMIT_STATE_FRAME_IN_PROGRESS;
205 m_needsCommit = false; 236 m_needsCommit = false;
206 m_needsForcedCommit = false; 237 m_needsForcedCommit = false;
207 return; 238 return;
208 239
209 case ACTION_COMMIT: 240 case ACTION_COMMIT:
210 if (m_expectImmediateBeginFrame) 241 if (m_expectImmediateBeginFrame)
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
270 if (m_hasPendingTree) 301 if (m_hasPendingTree)
271 return true; 302 return true;
272 303
273 // If we can't draw, don't tick until we are notified that we can draw again . 304 // If we can't draw, don't tick until we are notified that we can draw again .
274 if (!m_canDraw) 305 if (!m_canDraw)
275 return false; 306 return false;
276 307
277 if (m_needsForcedRedraw) 308 if (m_needsForcedRedraw)
278 return true; 309 return true;
279 310
311 if (m_visible && m_needsRedrawOnVisibleTextureUpload)
312 return true;
313
280 return m_needsRedraw && m_visible && m_outputSurfaceState == OUTPUT_SURFACE_ ACTIVE; 314 return m_needsRedraw && m_visible && m_outputSurfaceState == OUTPUT_SURFACE_ ACTIVE;
281 } 315 }
282 316
283 void SchedulerStateMachine::didEnterVSync() 317 void SchedulerStateMachine::didEnterVSync()
284 { 318 {
285 m_insideVSync = true; 319 m_insideVSync = true;
286 } 320 }
287 321
288 void SchedulerStateMachine::didLeaveVSync() 322 void SchedulerStateMachine::didLeaveVSync()
289 { 323 {
290 m_currentFrameNumber++; 324 m_currentFrameNumber++;
291 m_insideVSync = false; 325 m_insideVSync = false;
292 } 326 }
293 327
294 void SchedulerStateMachine::setVisible(bool visible) 328 void SchedulerStateMachine::setVisible(bool visible)
295 { 329 {
296 m_visible = visible; 330 m_visible = visible;
297 } 331 }
298 332
299 void SchedulerStateMachine::setNeedsRedraw() 333 void SchedulerStateMachine::setNeedsRedraw()
300 { 334 {
301 m_needsRedraw = true; 335 m_needsRedraw = true;
302 } 336 }
303 337
338 void SchedulerStateMachine::setNeedsRedrawOnVisibleTextureUpload()
339 {
340 m_needsRedrawOnVisibleTextureUpload = true;
341 }
342
304 void SchedulerStateMachine::setNeedsForcedRedraw() 343 void SchedulerStateMachine::setNeedsForcedRedraw()
305 { 344 {
306 m_needsForcedRedraw = true; 345 m_needsForcedRedraw = true;
307 } 346 }
308 347
309 void SchedulerStateMachine::didDrawIfPossibleCompleted(bool success) 348 void SchedulerStateMachine::didDrawIfPossibleCompleted(bool success)
310 { 349 {
311 m_drawIfPossibleFailed = !success; 350 m_drawIfPossibleFailed = !success;
312 if (m_drawIfPossibleFailed) { 351 if (m_drawIfPossibleFailed) {
313 m_needsRedraw = true; 352 m_needsRedraw = true;
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
375 m_outputSurfaceState = OUTPUT_SURFACE_ACTIVE; 414 m_outputSurfaceState = OUTPUT_SURFACE_ACTIVE;
376 setNeedsCommit(); 415 setNeedsCommit();
377 } 416 }
378 417
379 void SchedulerStateMachine::setMaximumNumberOfFailedDrawsBeforeDrawIsForced(int numDraws) 418 void SchedulerStateMachine::setMaximumNumberOfFailedDrawsBeforeDrawIsForced(int numDraws)
380 { 419 {
381 m_maximumNumberOfFailedDrawsBeforeDrawIsForced = numDraws; 420 m_maximumNumberOfFailedDrawsBeforeDrawIsForced = numDraws;
382 } 421 }
383 422
384 } // namespace cc 423 } // namespace cc
OLDNEW
« no previous file with comments | « cc/scheduler_state_machine.h ('k') | cc/single_thread_proxy.h » ('j') | cc/tile_manager.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698