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

Side by Side Diff: cc/trees/layer_tree_host_unittest_context.cc

Issue 131683005: cc: Make PrepareToDraw return an enum for why it aborts (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 10 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 | Annotate | Revision Log
OLDNEW
1 // Copyright 2012 The Chromium Authors. All rights reserved. 1 // Copyright 2012 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/trees/layer_tree_host.h" 5 #include "cc/trees/layer_tree_host.h"
6 6
7 #include "base/basictypes.h" 7 #include "base/basictypes.h"
8 #include "cc/layers/content_layer.h" 8 #include "cc/layers/content_layer.h"
9 #include "cc/layers/delegated_frame_provider.h" 9 #include "cc/layers/delegated_frame_provider.h"
10 #include "cc/layers/delegated_frame_resource_collection.h" 10 #include "cc/layers/delegated_frame_resource_collection.h"
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after
120 120
121 virtual scoped_refptr<ContextProvider> OffscreenContextProvider() OVERRIDE { 121 virtual scoped_refptr<ContextProvider> OffscreenContextProvider() OVERRIDE {
122 if (!offscreen_contexts_.get() || 122 if (!offscreen_contexts_.get() ||
123 offscreen_contexts_->DestroyedOnMainThread()) { 123 offscreen_contexts_->DestroyedOnMainThread()) {
124 offscreen_contexts_ = 124 offscreen_contexts_ =
125 TestContextProvider::Create(CreateOffscreenContext3d()); 125 TestContextProvider::Create(CreateOffscreenContext3d());
126 } 126 }
127 return offscreen_contexts_; 127 return offscreen_contexts_;
128 } 128 }
129 129
130 virtual bool PrepareToDrawOnThread(LayerTreeHostImpl* host_impl, 130 virtual DrawSwapReadbackResult::DrawResult PrepareToDrawOnThread(
131 LayerTreeHostImpl::FrameData* frame, 131 LayerTreeHostImpl* host_impl,
132 bool result) OVERRIDE { 132 LayerTreeHostImpl::FrameData* frame,
133 EXPECT_TRUE(result); 133 DrawSwapReadbackResult::DrawResult draw_result) OVERRIDE {
134 EXPECT_EQ(DrawSwapReadbackResult::DID_DRAW, draw_result);
134 if (!times_to_lose_during_draw_) 135 if (!times_to_lose_during_draw_)
135 return result; 136 return draw_result;
136 137
137 --times_to_lose_during_draw_; 138 --times_to_lose_during_draw_;
138 LoseContext(); 139 LoseContext();
139 140
140 times_to_fail_create_ = times_to_fail_recreate_; 141 times_to_fail_create_ = times_to_fail_recreate_;
141 times_to_fail_recreate_ = 0; 142 times_to_fail_recreate_ = 0;
142 times_to_fail_create_offscreen_ = times_to_fail_recreate_offscreen_; 143 times_to_fail_create_offscreen_ = times_to_fail_recreate_offscreen_;
143 times_to_fail_recreate_offscreen_ = 0; 144 times_to_fail_recreate_offscreen_ = 0;
144 145
145 return result; 146 return draw_result;
146 } 147 }
147 148
148 virtual void CommitCompleteOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { 149 virtual void CommitCompleteOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
149 committed_at_least_once_ = true; 150 committed_at_least_once_ = true;
150 151
151 if (!times_to_lose_during_commit_) 152 if (!times_to_lose_during_commit_)
152 return; 153 return;
153 --times_to_lose_during_commit_; 154 --times_to_lose_during_commit_;
154 LoseContext(); 155 LoseContext();
155 156
(...skipping 951 matching lines...) Expand 10 before | Expand all | Expand 10 after
1107 1108
1108 if (host_impl->active_tree()->source_frame_number() == 3) { 1109 if (host_impl->active_tree()->source_frame_number() == 3) {
1109 // On the third commit we're recovering from context loss. Hardware 1110 // On the third commit we're recovering from context loss. Hardware
1110 // video frames should not be reused by the VideoFrameProvider, but 1111 // video frames should not be reused by the VideoFrameProvider, but
1111 // software frames can be. 1112 // software frames can be.
1112 hw_frame_provider_.set_frame(NULL); 1113 hw_frame_provider_.set_frame(NULL);
1113 scaled_hw_frame_provider_.set_frame(NULL); 1114 scaled_hw_frame_provider_.set_frame(NULL);
1114 } 1115 }
1115 } 1116 }
1116 1117
1117 virtual bool PrepareToDrawOnThread(LayerTreeHostImpl* host_impl, 1118 virtual DrawSwapReadbackResult::DrawResult PrepareToDrawOnThread(
1118 LayerTreeHostImpl::FrameData* frame, 1119 LayerTreeHostImpl* host_impl,
1119 bool result) OVERRIDE { 1120 LayerTreeHostImpl::FrameData* frame,
1121 DrawSwapReadbackResult::DrawResult draw_result) OVERRIDE {
1120 if (host_impl->active_tree()->source_frame_number() == 2) { 1122 if (host_impl->active_tree()->source_frame_number() == 2) {
1121 // Lose the context during draw on the second commit. This will cause 1123 // Lose the context during draw on the second commit. This will cause
1122 // a third commit to recover. 1124 // a third commit to recover.
1123 context3d_->set_times_bind_texture_succeeds(0); 1125 context3d_->set_times_bind_texture_succeeds(0);
1124 } 1126 }
1125 return true; 1127 return DrawSwapReadbackResult::DID_DRAW;
1126 } 1128 }
1127 1129
1128 virtual scoped_ptr<OutputSurface> CreateOutputSurface(bool fallback) 1130 virtual scoped_ptr<OutputSurface> CreateOutputSurface(bool fallback)
1129 OVERRIDE { 1131 OVERRIDE {
1130 // This will get called twice: 1132 // This will get called twice:
1131 // First when we create the initial output surface... 1133 // First when we create the initial output surface...
1132 if (layer_tree_host()->source_frame_number() > 0) { 1134 if (layer_tree_host()->source_frame_number() > 0) {
1133 // ... and then again after we forced the context to be lost on the third 1135 // ... and then again after we forced the context to be lost on the third
1134 // frame. Verify this assumption here. 1136 // frame. Verify this assumption here.
1135 lost_context_ = true; 1137 lost_context_ = true;
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
1202 } 1204 }
1203 1205
1204 virtual void DidCommitAndDrawFrame() OVERRIDE { EndTest(); } 1206 virtual void DidCommitAndDrawFrame() OVERRIDE { EndTest(); }
1205 1207
1206 virtual void AfterTest() OVERRIDE { 1208 virtual void AfterTest() OVERRIDE {
1207 // Should not try to create output surface again after successfully 1209 // Should not try to create output surface again after successfully
1208 // created by CompositeAndReadback. 1210 // created by CompositeAndReadback.
1209 EXPECT_EQ(1, times_output_surface_created_); 1211 EXPECT_EQ(1, times_output_surface_created_);
1210 } 1212 }
1211 1213
1212 virtual bool PrepareToDrawOnThread(LayerTreeHostImpl* host_impl, 1214 virtual DrawSwapReadbackResult::DrawResult PrepareToDrawOnThread(
1213 LayerTreeHostImpl::FrameData* frame_data, 1215 LayerTreeHostImpl* host_impl,
1214 bool result) OVERRIDE { 1216 LayerTreeHostImpl::FrameData* frame_data,
1217 DrawSwapReadbackResult::DrawResult draw_result) OVERRIDE {
1215 EXPECT_GE(host_impl->active_tree()->source_frame_number(), 0); 1218 EXPECT_GE(host_impl->active_tree()->source_frame_number(), 0);
1216 EXPECT_LE(host_impl->active_tree()->source_frame_number(), 1); 1219 EXPECT_LE(host_impl->active_tree()->source_frame_number(), 1);
1217 return true; 1220 return DrawSwapReadbackResult::DID_DRAW;
1218 } 1221 }
1219 1222
1220 virtual void DrawLayersOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { 1223 virtual void DrawLayersOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
1221 // We should only draw for the readback and the replacement commit. 1224 // We should only draw for the readback and the replacement commit.
1222 // The replacement commit will also be the first commit after output 1225 // The replacement commit will also be the first commit after output
1223 // surface initialization. 1226 // surface initialization.
1224 EXPECT_GE(host_impl->active_tree()->source_frame_number(), 0); 1227 EXPECT_GE(host_impl->active_tree()->source_frame_number(), 0);
1225 EXPECT_LE(host_impl->active_tree()->source_frame_number(), 1); 1228 EXPECT_LE(host_impl->active_tree()->source_frame_number(), 1);
1226 } 1229 }
1227 1230
(...skipping 25 matching lines...) Expand all
1253 : did_react_to_first_commit_(false) {} 1256 : did_react_to_first_commit_(false) {}
1254 1257
1255 virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE { 1258 virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE {
1256 // This enables forced draws after a single prepare to draw failure. 1259 // This enables forced draws after a single prepare to draw failure.
1257 settings->timeout_and_draw_when_animation_checkerboards = true; 1260 settings->timeout_and_draw_when_animation_checkerboards = true;
1258 settings->maximum_number_of_failed_draws_before_draw_is_forced_ = 1; 1261 settings->maximum_number_of_failed_draws_before_draw_is_forced_ = 1;
1259 } 1262 }
1260 1263
1261 virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); } 1264 virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); }
1262 1265
1263 virtual bool PrepareToDrawOnThread(LayerTreeHostImpl* host_impl, 1266 virtual DrawSwapReadbackResult::DrawResult PrepareToDrawOnThread(
1264 LayerTreeHostImpl::FrameData* frame_data, 1267 LayerTreeHostImpl* host_impl,
1265 bool result) OVERRIDE { 1268 LayerTreeHostImpl::FrameData* frame_data,
1269 DrawSwapReadbackResult::DrawResult draw_result) OVERRIDE {
1266 int sfn = host_impl->active_tree()->source_frame_number(); 1270 int sfn = host_impl->active_tree()->source_frame_number();
1267 EXPECT_TRUE(sfn == kFirstOutputSurfaceInitSourceFrameNumber || 1271 EXPECT_TRUE(sfn == kFirstOutputSurfaceInitSourceFrameNumber ||
1268 sfn == kSecondOutputSurfaceInitSourceFrameNumber || 1272 sfn == kSecondOutputSurfaceInitSourceFrameNumber ||
1269 sfn == kReadbackSourceFrameNumber) 1273 sfn == kReadbackSourceFrameNumber)
1270 << sfn; 1274 << sfn;
1271 1275
1272 // Before we react to the failed draw by initiating the forced draw 1276 // Before we react to the failed draw by initiating the forced draw
1273 // sequence, start a readback on the main thread and then lose the context 1277 // sequence, start a readback on the main thread and then lose the context
1274 // to start output surface initialization all at the same time. 1278 // to start output surface initialization all at the same time.
1275 if (sfn == kFirstOutputSurfaceInitSourceFrameNumber && 1279 if (sfn == kFirstOutputSurfaceInitSourceFrameNumber &&
1276 !did_react_to_first_commit_) { 1280 !did_react_to_first_commit_) {
1277 did_react_to_first_commit_ = true; 1281 did_react_to_first_commit_ = true;
1278 PostReadbackToMainThread(); 1282 PostReadbackToMainThread();
1279 LoseContext(); 1283 LoseContext();
1280 } 1284 }
1281 1285
1282 return false; 1286 return DrawSwapReadbackResult::DRAW_ABORTED_CHECKERBOARD_ANIMATIONS;
1283 } 1287 }
1284 1288
1285 virtual void InitializedRendererOnThread(LayerTreeHostImpl* host_impl, 1289 virtual void InitializedRendererOnThread(LayerTreeHostImpl* host_impl,
1286 bool success) OVERRIDE { 1290 bool success) OVERRIDE {
1287 // -1 is for the first output surface initialization. 1291 // -1 is for the first output surface initialization.
1288 int sfn = host_impl->active_tree()->source_frame_number(); 1292 int sfn = host_impl->active_tree()->source_frame_number();
1289 EXPECT_TRUE(sfn == -1 || sfn == kReadbackReplacementSourceFrameNumber) 1293 EXPECT_TRUE(sfn == -1 || sfn == kReadbackReplacementSourceFrameNumber)
1290 << sfn; 1294 << sfn;
1291 } 1295 }
1292 1296
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
1331 : did_lose_context_(false) {} 1335 : did_lose_context_(false) {}
1332 1336
1333 virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE { 1337 virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE {
1334 // This enables forced draws after a single prepare to draw failure. 1338 // This enables forced draws after a single prepare to draw failure.
1335 settings->timeout_and_draw_when_animation_checkerboards = true; 1339 settings->timeout_and_draw_when_animation_checkerboards = true;
1336 settings->maximum_number_of_failed_draws_before_draw_is_forced_ = 1; 1340 settings->maximum_number_of_failed_draws_before_draw_is_forced_ = 1;
1337 } 1341 }
1338 1342
1339 virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); } 1343 virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); }
1340 1344
1341 virtual bool PrepareToDrawOnThread(LayerTreeHostImpl* host_impl, 1345 virtual DrawSwapReadbackResult::DrawResult PrepareToDrawOnThread(
1342 LayerTreeHostImpl::FrameData* frame_data, 1346 LayerTreeHostImpl* host_impl,
1343 bool result) OVERRIDE { 1347 LayerTreeHostImpl::FrameData* frame_data,
1348 DrawSwapReadbackResult::DrawResult draw_result) OVERRIDE {
1344 int sfn = host_impl->active_tree()->source_frame_number(); 1349 int sfn = host_impl->active_tree()->source_frame_number();
1345 EXPECT_TRUE(sfn == kFirstOutputSurfaceInitSourceFrameNumber || 1350 EXPECT_TRUE(sfn == kFirstOutputSurfaceInitSourceFrameNumber ||
1346 sfn == kSecondOutputSurfaceInitSourceFrameNumber || 1351 sfn == kSecondOutputSurfaceInitSourceFrameNumber ||
1347 sfn == kReadbackSourceFrameNumber) 1352 sfn == kReadbackSourceFrameNumber)
1348 << sfn; 1353 << sfn;
1349 1354
1350 // Before we react to the failed draw by initiating the forced draw 1355 // Before we react to the failed draw by initiating the forced draw
1351 // sequence, start a readback on the main thread and then lose the context 1356 // sequence, start a readback on the main thread and then lose the context
1352 // to start output surface initialization all at the same time. 1357 // to start output surface initialization all at the same time.
1353 if (sfn == kFirstOutputSurfaceInitSourceFrameNumber && !did_lose_context_) { 1358 if (sfn == kFirstOutputSurfaceInitSourceFrameNumber && !did_lose_context_) {
1354 did_lose_context_ = true; 1359 did_lose_context_ = true;
1355 LoseContext(); 1360 LoseContext();
1356 } 1361 }
1357 1362
1358 // Returning false will result in a forced draw. 1363 // Returning false will result in a forced draw.
1359 return false; 1364 return DrawSwapReadbackResult::DRAW_ABORTED_CHECKERBOARD_ANIMATIONS;
1360 } 1365 }
1361 1366
1362 virtual void DidInitializeOutputSurface(bool succeeded) OVERRIDE { 1367 virtual void DidInitializeOutputSurface(bool succeeded) OVERRIDE {
1363 EXPECT_TRUE(succeeded); 1368 EXPECT_TRUE(succeeded);
1364 if (layer_tree_host()->source_frame_number() > 0) { 1369 if (layer_tree_host()->source_frame_number() > 0) {
1365 // Perform a readback right after the second output surface 1370 // Perform a readback right after the second output surface
1366 // initialization. 1371 // initialization.
1367 char pixels[4]; 1372 char pixels[4];
1368 layer_tree_host()->CompositeAndReadback(&pixels, gfx::Rect(0, 0, 1, 1)); 1373 layer_tree_host()->CompositeAndReadback(&pixels, gfx::Rect(0, 0, 1, 1));
1369 } 1374 }
(...skipping 609 matching lines...) Expand 10 before | Expand all | Expand 10 after
1979 1984
1980 protected: 1985 protected:
1981 FakeContentLayerClient client_; 1986 FakeContentLayerClient client_;
1982 scoped_refptr<FakeContentLayer> layer_; 1987 scoped_refptr<FakeContentLayer> layer_;
1983 }; 1988 };
1984 1989
1985 SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostContextTestSurfaceCreateCallback); 1990 SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostContextTestSurfaceCreateCallback);
1986 1991
1987 } // namespace 1992 } // namespace
1988 } // namespace cc 1993 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698