Changeset 112446 in webkit
- Timestamp:
- Mar 28, 2012 2:45:07 PM (12 years ago)
- Location:
- trunk/Source
- Files:
-
- 11 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r112445 r112446 1 2012-03-28 Nat Duca <nduca@chromium.org> 2 3 [chromium] Scheduler should not tell FrameRateController to begin a frame when we dont swap 4 https://bugs.webkit.org/show_bug.cgi?id=82516 5 6 Reviewed by James Robinson. 7 8 * platform/graphics/chromium/LayerRendererChromium.cpp: 9 (WebCore::LayerRendererChromium::swapBuffers): 10 * platform/graphics/chromium/LayerRendererChromium.h: 11 (LayerRendererChromium): 12 * platform/graphics/chromium/cc/CCLayerTreeHostImpl.cpp: 13 (WebCore::CCLayerTreeHostImpl::swapBuffers): 14 * platform/graphics/chromium/cc/CCLayerTreeHostImpl.h: 15 (CCLayerTreeHostImpl): 16 * platform/graphics/chromium/cc/CCScheduler.cpp: 17 (WebCore::CCScheduler::processScheduledActions): 18 * platform/graphics/chromium/cc/CCScheduler.h: 19 (WebCore::CCScheduledActionDrawAndSwapResult::CCScheduledActionDrawAndSwapResult): 20 (CCScheduledActionDrawAndSwapResult): 21 (WebCore): 22 (CCSchedulerClient): 23 * platform/graphics/chromium/cc/CCThreadProxy.cpp: 24 (WebCore::CCThreadProxy::scheduledActionDrawAndSwapInternal): 25 (WebCore::CCThreadProxy::scheduledActionDrawAndSwapIfPossible): 26 (WebCore::CCThreadProxy::scheduledActionDrawAndSwapForced): 27 * platform/graphics/chromium/cc/CCThreadProxy.h: 28 (CCThreadProxy): 29 1 30 2012-03-26 Eric Uhrhane <ericu@chromium.org> 2 31 -
trunk/Source/WebCore/platform/graphics/chromium/LayerRendererChromium.cpp
r112286 r112446 1074 1074 } 1075 1075 1076 voidLayerRendererChromium::swapBuffers(const IntRect& subBuffer)1076 bool LayerRendererChromium::swapBuffers(const IntRect& subBuffer) 1077 1077 { 1078 1078 // FIXME: Remove this once gpu process supports ignoring swap buffers command while framebuffer is discarded. … … 1080 1080 if (m_isFramebufferDiscarded) { 1081 1081 m_client->setFullRootLayerDamage(); 1082 return ;1082 return false; 1083 1083 } 1084 1084 … … 1099 1099 1100 1100 m_headsUpDisplay->onSwapBuffers(); 1101 return true; 1101 1102 } 1102 1103 -
trunk/Source/WebCore/platform/graphics/chromium/LayerRendererChromium.h
r112286 r112446 109 109 110 110 // puts backbuffer onscreen 111 voidswapBuffers(const IntRect& subBuffer);111 bool swapBuffers(const IntRect& subBuffer); 112 112 113 113 static void debugGLCall(GraphicsContext3D*, const char* command, const char* file, int line); -
trunk/Source/WebCore/platform/graphics/chromium/cc/CCLayerTreeHostImpl.cpp
r112439 r112446 435 435 } 436 436 437 voidCCLayerTreeHostImpl::swapBuffers()437 bool CCLayerTreeHostImpl::swapBuffers() 438 438 { 439 439 ASSERT(m_layerRenderer); 440 m_layerRenderer->swapBuffers(enclosingIntRect(m_rootDamageRect));440 return m_layerRenderer->swapBuffers(enclosingIntRect(m_rootDamageRect)); 441 441 } 442 442 -
trunk/Source/WebCore/platform/graphics/chromium/cc/CCLayerTreeHostImpl.h
r111805 r112446 115 115 TextureAllocator* contentsTextureAllocator() const; 116 116 117 voidswapBuffers();117 bool swapBuffers(); 118 118 119 119 void readback(void* pixels, const IntRect&); -
trunk/Source/WebCore/platform/graphics/chromium/cc/CCScheduler.cpp
r111805 r112446 164 164 break; 165 165 case CCSchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE: { 166 bool drawSuccess= m_client->scheduledActionDrawAndSwapIfPossible();167 m_stateMachine.didDrawIfPossibleCompleted( drawSuccess);168 if ( drawSuccess)166 CCScheduledActionDrawAndSwapResult result = m_client->scheduledActionDrawAndSwapIfPossible(); 167 m_stateMachine.didDrawIfPossibleCompleted(result.didDraw); 168 if (result.didSwap) 169 169 m_frameRateController->didBeginFrame(); 170 170 break; 171 171 } 172 case CCSchedulerStateMachine::ACTION_DRAW_FORCED: 173 m_client->scheduledActionDrawAndSwapForced(); 174 m_frameRateController->didBeginFrame(); 172 case CCSchedulerStateMachine::ACTION_DRAW_FORCED: { 173 CCScheduledActionDrawAndSwapResult result = m_client->scheduledActionDrawAndSwapForced(); 174 if (result.didSwap) 175 m_frameRateController->didBeginFrame(); 175 176 break; 176 case CCSchedulerStateMachine::ACTION_BEGIN_CONTEXT_RECREATION:177 } case CCSchedulerStateMachine::ACTION_BEGIN_CONTEXT_RECREATION: 177 178 m_client->scheduledActionBeginContextRecreation(); 178 179 break; -
trunk/Source/WebCore/platform/graphics/chromium/cc/CCScheduler.h
r111805 r112446 36 36 class CCThread; 37 37 38 struct CCScheduledActionDrawAndSwapResult { 39 CCScheduledActionDrawAndSwapResult() 40 : didDraw(false) 41 , didSwap(false) 42 { 43 } 44 CCScheduledActionDrawAndSwapResult(bool didDraw, bool didSwap) 45 : didDraw(didDraw) 46 , didSwap(didSwap) 47 { 48 } 49 bool didDraw; 50 bool didSwap; 51 }; 52 38 53 class CCSchedulerClient { 39 54 public: … … 42 57 43 58 virtual void scheduledActionBeginFrame() = 0; 44 virtual boolscheduledActionDrawAndSwapIfPossible() = 0;45 virtual voidscheduledActionDrawAndSwapForced() = 0;59 virtual CCScheduledActionDrawAndSwapResult scheduledActionDrawAndSwapIfPossible() = 0; 60 virtual CCScheduledActionDrawAndSwapResult scheduledActionDrawAndSwapForced() = 0; 46 61 virtual void scheduledActionUpdateMoreResources() = 0; 47 62 virtual void scheduledActionCommit() = 0; -
trunk/Source/WebCore/platform/graphics/chromium/cc/CCThreadProxy.cpp
r112360 r112446 562 562 } 563 563 564 boolCCThreadProxy::scheduledActionDrawAndSwapInternal(bool forcedDraw)564 CCScheduledActionDrawAndSwapResult CCThreadProxy::scheduledActionDrawAndSwapInternal(bool forcedDraw) 565 565 { 566 566 TRACE_EVENT("CCThreadProxy::scheduledActionDrawAndSwap", this, 0); 567 CCScheduledActionDrawAndSwapResult result; 568 result.didDraw = false; 569 result.didSwap = false; 567 570 ASSERT(isImplThread()); 568 571 ASSERT(m_layerTreeHostImpl); 569 572 if (!m_layerTreeHostImpl) 570 return false;573 return result; 571 574 572 575 // FIXME: compute the frame display time more intelligently … … 578 581 CCLayerTreeHostImpl::FrameData frame; 579 582 bool drawFrame = m_layerTreeHostImpl->prepareToDraw(frame) || forcedDraw; 580 if (drawFrame) 583 if (drawFrame) { 581 584 m_layerTreeHostImpl->drawLayers(frame); 585 result.didDraw = true; 586 } 582 587 583 588 // Check for a pending compositeAndReadback. … … 591 596 592 597 if (drawFrame) 593 m_layerTreeHostImpl->swapBuffers();598 result.didSwap = m_layerTreeHostImpl->swapBuffers(); 594 599 595 600 // Process any finish request … … 608 613 609 614 ASSERT(drawFrame || (!drawFrame && !forcedDraw)); 610 return drawFrame;611 } 612 613 boolCCThreadProxy::scheduledActionDrawAndSwapIfPossible()615 return result; 616 } 617 618 CCScheduledActionDrawAndSwapResult CCThreadProxy::scheduledActionDrawAndSwapIfPossible() 614 619 { 615 620 return scheduledActionDrawAndSwapInternal(false); 616 621 } 617 622 618 voidCCThreadProxy::scheduledActionDrawAndSwapForced()619 { 620 scheduledActionDrawAndSwapInternal(true);623 CCScheduledActionDrawAndSwapResult CCThreadProxy::scheduledActionDrawAndSwapForced() 624 { 625 return scheduledActionDrawAndSwapInternal(true); 621 626 } 622 627 -
trunk/Source/WebCore/platform/graphics/chromium/cc/CCThreadProxy.h
r112360 r112446 83 83 virtual bool hasMoreResourceUpdates() const; 84 84 virtual void scheduledActionBeginFrame(); 85 virtual boolscheduledActionDrawAndSwapIfPossible();86 virtual voidscheduledActionDrawAndSwapForced();85 virtual CCScheduledActionDrawAndSwapResult scheduledActionDrawAndSwapIfPossible(); 86 virtual CCScheduledActionDrawAndSwapResult scheduledActionDrawAndSwapForced(); 87 87 virtual void scheduledActionUpdateMoreResources(); 88 88 virtual void scheduledActionCommit(); … … 128 128 void setFullRootLayerDamageOnImplThread(); 129 129 void recreateContextOnImplThread(CCCompletionEvent*, GraphicsContext3D*, bool* recreateSucceeded, LayerRendererCapabilities*); 130 boolscheduledActionDrawAndSwapInternal(bool forcedDraw);130 CCScheduledActionDrawAndSwapResult scheduledActionDrawAndSwapInternal(bool forcedDraw); 131 131 132 132 // Accessed on main thread only. -
trunk/Source/WebKit/chromium/ChangeLog
r112436 r112446 1 2012-03-28 Nat Duca <nduca@chromium.org> 2 3 [chromium] Scheduler should not tell FrameRateController to begin a frame when we dont swap 4 https://bugs.webkit.org/show_bug.cgi?id=82516 5 6 Reviewed by James Robinson. 7 8 * tests/CCSchedulerTest.cpp: 9 (WebKitTests::FakeCCSchedulerClient::reset): 10 (WebKitTests::FakeCCSchedulerClient::hasAction): 11 (FakeCCSchedulerClient): 12 (WebKitTests::FakeCCSchedulerClient::scheduledActionDrawAndSwapIfPossible): 13 (WebKitTests::FakeCCSchedulerClient::scheduledActionDrawAndSwapForced): 14 (WebKitTests::FakeCCSchedulerClient::setDrawWillHappen): 15 (WebKitTests::FakeCCSchedulerClient::setSwapWillHappenIfDrawHappens): 16 (WebKitTests::SchedulerClientThatSetNeedsDrawInsideDraw::scheduledActionDrawAndSwapIfPossible): 17 (WebKitTests::SchedulerClientThatSetNeedsDrawInsideDraw::scheduledActionDrawAndSwapForced): 18 (SchedulerClientThatSetNeedsDrawInsideDraw): 19 (WebKitTests::TEST): 20 (WebKitTests::SchedulerClientThatSetNeedsCommitInsideDraw::scheduledActionDrawAndSwapIfPossible): 21 (WebKitTests::SchedulerClientThatSetNeedsCommitInsideDraw::scheduledActionDrawAndSwapForced): 22 (SchedulerClientThatSetNeedsCommitInsideDraw): 23 (WebKitTests): 24 1 25 2012-03-26 Shawn Singh <shawnsingh@chromium.org> 2 26 -
trunk/Source/WebKit/chromium/tests/CCSchedulerTest.cpp
r111805 r112446 46 46 m_hasMoreResourceUpdates = false; 47 47 m_canDraw = true; 48 m_drawSuccess = true; 48 m_drawWillHappen = true; 49 m_swapWillHappenIfDrawHappens = true; 49 50 m_numDraws = 0; 50 51 } … … 57 58 const char* action(int i) const { return m_actions[i]; } 58 59 60 bool hasAction(const char* action) const 61 { 62 for (size_t i = 0; i < m_actions.size(); i++) 63 if (!strcmp(m_actions[i], action)) 64 return true; 65 return false; 66 } 67 59 68 virtual bool canDraw() { return m_canDraw; } 60 69 virtual bool hasMoreResourceUpdates() const { return m_hasMoreResourceUpdates; } 61 70 virtual void scheduledActionBeginFrame() { m_actions.push_back("scheduledActionBeginFrame"); } 62 virtual boolscheduledActionDrawAndSwapIfPossible()71 virtual CCScheduledActionDrawAndSwapResult scheduledActionDrawAndSwapIfPossible() 63 72 { 64 73 m_actions.push_back("scheduledActionDrawAndSwapIfPossible"); 65 74 m_numDraws++; 66 return m_drawSuccess;67 } 68 69 virtual voidscheduledActionDrawAndSwapForced()75 return CCScheduledActionDrawAndSwapResult(m_drawWillHappen, m_drawWillHappen && m_swapWillHappenIfDrawHappens); 76 } 77 78 virtual CCScheduledActionDrawAndSwapResult scheduledActionDrawAndSwapForced() 70 79 { 71 80 m_actions.push_back("scheduledActionDrawAndSwapForced"); 72 m_numDraws++;81 return CCScheduledActionDrawAndSwapResult(true, m_swapWillHappenIfDrawHappens); 73 82 } 74 83 … … 77 86 virtual void scheduledActionBeginContextRecreation() { m_actions.push_back("scheduledActionBeginContextRecreation"); } 78 87 79 void setDrawSuccess(bool drawSuccess) { m_drawSuccess = drawSuccess; } 88 void setDrawWillHappen(bool drawWillHappen) { m_drawWillHappen = drawWillHappen; } 89 void setSwapWillHappenIfDrawHappens(bool swapWillHappenIfDrawHappens) { m_swapWillHappenIfDrawHappens = swapWillHappenIfDrawHappens; } 80 90 81 91 protected: 82 92 bool m_hasMoreResourceUpdates; 83 93 bool m_canDraw; 84 bool m_drawSuccess; 94 bool m_drawWillHappen; 95 bool m_swapWillHappenIfDrawHappens; 85 96 int m_numDraws; 86 97 std::vector<const char*> m_actions; … … 164 175 165 176 virtual void scheduledActionBeginFrame() { } 166 virtual boolscheduledActionDrawAndSwapIfPossible()177 virtual CCScheduledActionDrawAndSwapResult scheduledActionDrawAndSwapIfPossible() 167 178 { 168 179 // Only setNeedsRedraw the first time this is called … … 172 183 } 173 184 174 virtual void scheduledActionDrawAndSwapForced() { } 185 virtual CCScheduledActionDrawAndSwapResult scheduledActionDrawAndSwapForced() 186 { 187 ASSERT_NOT_REACHED(); 188 return CCScheduledActionDrawAndSwapResult(true, true); 189 } 190 175 191 virtual void scheduledActionUpdateMoreResources() { } 176 192 virtual void scheduledActionCommit() { } … … 217 233 client.setScheduler(scheduler.get()); 218 234 scheduler->setVisible(true); 219 client.setDraw Success(false);235 client.setDrawWillHappen(false); 220 236 221 237 scheduler->setNeedsRedraw(); … … 241 257 242 258 // Draw successfully. 243 client.setDraw Success(true);259 client.setDrawWillHappen(true); 244 260 timeSource->tick(); 245 261 EXPECT_EQ(3, client.numDraws()); … … 257 273 258 274 virtual void scheduledActionBeginFrame() { } 259 virtual boolscheduledActionDrawAndSwapIfPossible()275 virtual CCScheduledActionDrawAndSwapResult scheduledActionDrawAndSwapIfPossible() 260 276 { 261 277 // Only setNeedsCommit the first time this is called … … 265 281 } 266 282 267 virtual void scheduledActionDrawAndSwapForced() { } 283 virtual CCScheduledActionDrawAndSwapResult scheduledActionDrawAndSwapForced() 284 { 285 ASSERT_NOT_REACHED(); 286 return CCScheduledActionDrawAndSwapResult(true, true); 287 } 288 268 289 virtual void scheduledActionUpdateMoreResources() { } 269 290 virtual void scheduledActionCommit() { } … … 309 330 client.setScheduler(scheduler.get()); 310 331 scheduler->setVisible(true); 311 client.setDraw Success(false);332 client.setDrawWillHappen(false); 312 333 313 334 scheduler->setNeedsRedraw(); … … 333 354 334 355 // Draw successfully. 335 client.setDraw Success(true);356 client.setDrawWillHappen(true); 336 357 timeSource->tick(); 337 358 EXPECT_EQ(3, client.numDraws()); … … 381 402 382 403 // Fail to draw, this should not start a frame. 383 client.setDraw Success(false);404 client.setDrawWillHappen(false); 384 405 timeSource->tick(); 385 406 EXPECT_EQ(3, client.numDraws()); … … 387 408 } 388 409 389 } 410 TEST(CCSchedulerTest, NoBeginFrameWhenSwapFailsDuringForcedCommit) 411 { 412 RefPtr<FakeCCTimeSource> timeSource = adoptRef(new FakeCCTimeSource()); 413 FakeCCSchedulerClient client; 414 OwnPtr<FakeCCFrameRateController> controller = adoptPtr(new FakeCCFrameRateController(timeSource)); 415 FakeCCFrameRateController* controllerPtr = controller.get(); 416 OwnPtr<CCScheduler> scheduler = CCScheduler::create(&client, controller.release()); 417 418 EXPECT_EQ(0, controllerPtr->numFramesPending()); 419 420 // Tell the client that it will fail to swap. 421 client.setDrawWillHappen(true); 422 client.setSwapWillHappenIfDrawHappens(false); 423 424 // Get the compositor to do a scheduledActionDrawAndSwapForced. 425 scheduler->setNeedsRedraw(); 426 scheduler->setNeedsForcedRedraw(); 427 EXPECT_TRUE(client.hasAction("scheduledActionDrawAndSwapForced")); 428 429 // We should not have told the frame rate controller that we began a frame. 430 EXPECT_EQ(0, controllerPtr->numFramesPending()); 431 } 432 433 }
Note: See TracChangeset
for help on using the changeset viewer.