From 2e510fd5b5a30f1315c272d44ae3aa4cba355498 Mon Sep 17 00:00:00 2001 From: Nicolas Roard Date: Fri, 6 Apr 2012 11:35:50 -0700 Subject: Reorganize platform/graphics/android Change-Id: Idc67155cfa99784dcd931e705336bfa063ecae46 --- .../graphics/android/rendering/TilesProfiler.cpp | 133 +++++++++++++++++++++ 1 file changed, 133 insertions(+) create mode 100644 Source/WebCore/platform/graphics/android/rendering/TilesProfiler.cpp (limited to 'Source/WebCore/platform/graphics/android/rendering/TilesProfiler.cpp') diff --git a/Source/WebCore/platform/graphics/android/rendering/TilesProfiler.cpp b/Source/WebCore/platform/graphics/android/rendering/TilesProfiler.cpp new file mode 100644 index 0000000..4f0c6b5 --- /dev/null +++ b/Source/WebCore/platform/graphics/android/rendering/TilesProfiler.cpp @@ -0,0 +1,133 @@ +/* + * Copyright 2010, The Android Open Source Project + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#define LOG_TAG "TilesProfiler" +#define LOG_NDEBUG 1 + +#include "config.h" +#include "TilesProfiler.h" + +#if USE(ACCELERATED_COMPOSITING) + +#include "AndroidLog.h" +#include "Tile.h" +#include "TilesManager.h" +#include + +// Hard limit on amount of frames (and thus memory) profiling can take +#define MAX_PROF_FRAMES 400 +#define INVAL_CODE -2 + +namespace WebCore { +TilesProfiler::TilesProfiler() + : m_enabled(false) +{ +} + +void TilesProfiler::start() +{ + m_enabled = true; + m_goodTiles = 0; + m_badTiles = 0; + m_records.clear(); + m_time = currentTimeMS(); + ALOGV("initializing tileprofiling"); +} + +float TilesProfiler::stop() +{ + m_enabled = false; + ALOGV("completed tile profiling, observed %d frames", m_records.size()); + return (1.0 * m_goodTiles) / (m_goodTiles + m_badTiles); +} + +void TilesProfiler::clear() +{ + ALOGV("clearing tile profiling of its %d frames", m_records.size()); + m_records.clear(); +} + +void TilesProfiler::nextFrame(int left, int top, int right, int bottom, float scale) +{ + if (!m_enabled || (m_records.size() > MAX_PROF_FRAMES)) + return; + + double currentTime = currentTimeMS(); + double timeDelta = currentTime - m_time; + m_time = currentTime; + +#ifdef DEBUG + if (m_records.size() != 0) { + ALOGD("completed tile profiling frame, observed %d tiles. %f ms since last", + m_records[0].size(), timeDelta); + } +#endif // DEBUG + + m_records.append(WTF::Vector()); + + //first record designates viewport + m_records.last().append(TileProfileRecord( + left, top, right, bottom, + scale, true, (int)(timeDelta * 1000))); +} + +void TilesProfiler::nextTile(Tile* tile, float scale, bool inView) +{ + if (!m_enabled || (m_records.size() > MAX_PROF_FRAMES) || (m_records.size() == 0)) + return; + + bool isReady = tile->isTileReady(); + int left = tile->x() * TilesManager::tileWidth(); + int top = tile->y() * TilesManager::tileWidth(); + int right = left + TilesManager::tileWidth(); + int bottom = top + TilesManager::tileWidth(); + + if (inView) { + if (isReady) + m_goodTiles++; + else + m_badTiles++; + } + m_records.last().append(TileProfileRecord( + left, top, right, bottom, + scale, isReady, (int)tile->drawCount())); + ALOGV("adding tile %d %d %d %d, scale %f", left, top, right, bottom, scale); +} + +void TilesProfiler::nextInval(const SkIRect& rect, float scale) +{ + if (!m_enabled || (m_records.size() > MAX_PROF_FRAMES) || (m_records.size() == 0)) + return; + + m_records.last().append(TileProfileRecord( + rect.x(), rect.y(), + rect.right(), rect.bottom(), scale, false, INVAL_CODE)); + ALOGV("adding inval region %d %d %d %d, scale %f", rect.x(), rect.y(), + rect.right(), rect.bottom(), scale); +} + +} // namespace WebCore + +#endif // USE(ACCELERATED_COMPOSITING) -- cgit v1.1