From dad009be4ae15cae7b1ae9cecdf816a21bb7c5f9 Mon Sep 17 00:00:00 2001 From: "commit-bot@chromium.org" Date: Thu, 27 Mar 2014 15:48:52 +0000 Subject: [PATCH] Making SkDeferredCanvas::silentFlush trigger a skippedPendingDrawCommands callback The bug was preventing Canvas2DLayerBridge from properly tracking changes in memory consumption that were triggered by calls to silentFlush. BUG=344666 TEST=DeferredCanvas unit test R=senorblanco@google.com, senorblanco@chromium.org Author: junov@chromium.org Review URL: https://codereview.chromium.org/214803002 git-svn-id: http://skia.googlecode.com/svn/trunk@13965 2bbb7eff-a529-9590-31e7-b0007b416f81 --- src/utils/SkDeferredCanvas.cpp | 12 +++++++----- tests/DeferredCanvasTest.cpp | 14 ++++++++++++++ 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/src/utils/SkDeferredCanvas.cpp b/src/utils/SkDeferredCanvas.cpp index 2c5e530..4836cd7 100644 --- a/src/utils/SkDeferredCanvas.cpp +++ b/src/utils/SkDeferredCanvas.cpp @@ -324,9 +324,6 @@ void SkDeferredDevice::skipPendingCommands() { if (fPipeController.hasPendingCommands()) { fFreshFrame = true; flushPendingCommands(kSilent_PlaybackMode); - if (fNotificationClient) { - fNotificationClient->skippedPendingDrawCommands(); - } } } } @@ -363,9 +360,14 @@ void SkDeferredDevice::flushPendingCommands(PlaybackMode playbackMode) { } fPipeWriter.flushRecording(true); fPipeController.playback(kSilent_PlaybackMode == playbackMode); - if (playbackMode == kNormal_PlaybackMode && fNotificationClient) { - fNotificationClient->flushedDrawCommands(); + if (fNotificationClient) { + if (playbackMode == kSilent_PlaybackMode) { + fNotificationClient->skippedPendingDrawCommands(); + } else { + fNotificationClient->flushedDrawCommands(); + } } + fPreviousStorageAllocated = storageAllocatedForRecording(); } diff --git a/tests/DeferredCanvasTest.cpp b/tests/DeferredCanvasTest.cpp index 0af0c51..13758a7 100644 --- a/tests/DeferredCanvasTest.cpp +++ b/tests/DeferredCanvasTest.cpp @@ -496,6 +496,19 @@ static void TestDeferredCanvasMemoryLimit(skiatest::Reporter* reporter) { REPORTER_ASSERT(reporter, 1 == notificationCounter.fFlushedDrawCommandsCount); } +static void TestDeferredCanvasSilentFlush(skiatest::Reporter* reporter) { + SkAutoTUnref surface(createSurface(0)); + SkAutoTUnref canvas(SkDeferredCanvas::Create(surface.get())); + + NotificationCounter notificationCounter; + canvas->setNotificationClient(¬ificationCounter); + + canvas->silentFlush(); // will skip the initial clear that was recorded in createSurface + + REPORTER_ASSERT(reporter, 0 == notificationCounter.fFlushedDrawCommandsCount); + REPORTER_ASSERT(reporter, 1 == notificationCounter.fSkippedPendingDrawCommandsCount); +} + static void TestDeferredCanvasBitmapCaching(skiatest::Reporter* reporter) { SkAutoTUnref surface(SkSurface::NewRasterPMColor(100, 100)); SkAutoTUnref canvas(SkDeferredCanvas::Create(surface.get())); @@ -806,6 +819,7 @@ static void TestDeferredCanvasCreateCompatibleDevice(skiatest::Reporter* reporte DEF_GPUTEST(DeferredCanvas, reporter, factory) { TestDeferredCanvasBitmapAccess(reporter); TestDeferredCanvasFlush(reporter); + TestDeferredCanvasSilentFlush(reporter); TestDeferredCanvasFreshFrame(reporter); TestDeferredCanvasMemoryLimit(reporter); TestDeferredCanvasBitmapCaching(reporter); -- 2.7.4