diff --git a/libgralloc/framebuffer.cpp b/libgralloc/framebuffer.cpp index d776f28..bb45c5c 100644 --- a/libgralloc/framebuffer.cpp +++ b/libgralloc/framebuffer.cpp @@ -49,7 +49,7 @@ #include #endif -#include +#include #define FB_DEBUG 0 diff --git a/libhwcomposer/hwcomposer.cpp b/libhwcomposer/hwcomposer.cpp index 8a1989f..a8fd856 100644 --- a/libhwcomposer/hwcomposer.cpp +++ b/libhwcomposer/hwcomposer.cpp @@ -40,6 +40,7 @@ #include #include #include +#include /*****************************************************************************/ #define ALIGN(x, align) (((x) + ((align)-1)) & ~((align)-1)) diff --git a/libqcomui/Android.mk b/libqcomui/Android.mk index f9b1422..9734813 100644 --- a/libqcomui/Android.mk +++ b/libqcomui/Android.mk @@ -2,7 +2,8 @@ LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_SRC_FILES := \ - qcom_ui.cpp + qcom_ui.cpp \ + utils/profiler.cpp ifeq ($(TARGET_BOARD_PLATFORM),qsd8k) # these are originally for 7x27a LOCAL_CFLAGS += -DCHECK_FOR_EXTERNAL_FORMAT diff --git a/libqcomui/qcom_ui.cpp b/libqcomui/qcom_ui.cpp index f1a7e6d..b6f16cb 100644 --- a/libqcomui/qcom_ui.cpp +++ b/libqcomui/qcom_ui.cpp @@ -814,156 +814,3 @@ void dumpLayer(int moduleCompositionType, int listFlags, size_t layerIndex, } } -#ifdef DEBUG_CALC_FPS -ANDROID_SINGLETON_STATIC_INSTANCE(CalcFps) ; - -CalcFps::CalcFps() { - debug_fps_level = 0; - Init(); -} - -CalcFps::~CalcFps() { -} - -void CalcFps::Init() { - char prop[PROPERTY_VALUE_MAX]; - property_get("debug.gr.calcfps", prop, "0"); - debug_fps_level = atoi(prop); - if (debug_fps_level > MAX_DEBUG_FPS_LEVEL) { - LOGW("out of range value for debug.gr.calcfps, using 0"); - debug_fps_level = 0; - } - - LOGE("DEBUG_CALC_FPS: %d", debug_fps_level); - populate_debug_fps_metadata(); -} - -void CalcFps::Fps() { - if (debug_fps_level > 0) - calc_fps(ns2us(systemTime())); -} - -void CalcFps::populate_debug_fps_metadata(void) -{ - char prop[PROPERTY_VALUE_MAX]; - - /*defaults calculation of fps to based on number of frames*/ - property_get("debug.gr.calcfps.type", prop, "0"); - debug_fps_metadata.type = (debug_fps_metadata_t::DfmType) atoi(prop); - - /*defaults to 1000ms*/ - property_get("debug.gr.calcfps.timeperiod", prop, "1000"); - debug_fps_metadata.time_period = atoi(prop); - - property_get("debug.gr.calcfps.period", prop, "10"); - debug_fps_metadata.period = atoi(prop); - - if (debug_fps_metadata.period > MAX_FPS_CALC_PERIOD_IN_FRAMES) { - debug_fps_metadata.period = MAX_FPS_CALC_PERIOD_IN_FRAMES; - } - - /* default ignorethresh_us: 500 milli seconds */ - property_get("debug.gr.calcfps.ignorethresh_us", prop, "500000"); - debug_fps_metadata.ignorethresh_us = atoi(prop); - - debug_fps_metadata.framearrival_steps = - (debug_fps_metadata.ignorethresh_us / 16666); - - if (debug_fps_metadata.framearrival_steps > MAX_FRAMEARRIVAL_STEPS) { - debug_fps_metadata.framearrival_steps = MAX_FRAMEARRIVAL_STEPS; - debug_fps_metadata.ignorethresh_us = - debug_fps_metadata.framearrival_steps * 16666; - } - - /* 2ms margin of error for the gettimeofday */ - debug_fps_metadata.margin_us = 2000; - - for (unsigned int i = 0; i < MAX_FRAMEARRIVAL_STEPS; i++) - debug_fps_metadata.accum_framearrivals[i] = 0; - - LOGE("period: %d", debug_fps_metadata.period); - LOGE("ignorethresh_us: %lld", debug_fps_metadata.ignorethresh_us); -} - -void CalcFps::print_fps(float fps) -{ - if (debug_fps_metadata_t::DFM_FRAMES == debug_fps_metadata.type) - LOGE("FPS for last %d frames: %3.2f", debug_fps_metadata.period, fps); - else - LOGE("FPS for last (%f ms, %d frames): %3.2f", - debug_fps_metadata.time_elapsed, - debug_fps_metadata.curr_frame, fps); - - debug_fps_metadata.curr_frame = 0; - debug_fps_metadata.time_elapsed = 0.0; - - if (debug_fps_level > 1) { - LOGE("Frame Arrival Distribution:"); - for (unsigned int i = 0; - i < ((debug_fps_metadata.framearrival_steps / 6) + 1); - i++) { - LOGE("%lld %lld %lld %lld %lld %lld", - debug_fps_metadata.accum_framearrivals[i*6], - debug_fps_metadata.accum_framearrivals[i*6+1], - debug_fps_metadata.accum_framearrivals[i*6+2], - debug_fps_metadata.accum_framearrivals[i*6+3], - debug_fps_metadata.accum_framearrivals[i*6+4], - debug_fps_metadata.accum_framearrivals[i*6+5]); - } - - /* We are done with displaying, now clear the stats */ - for (unsigned int i = 0; - i < debug_fps_metadata.framearrival_steps; - i++) - debug_fps_metadata.accum_framearrivals[i] = 0; - } - return; -} - -void CalcFps::calc_fps(nsecs_t currtime_us) -{ - static nsecs_t oldtime_us = 0; - - nsecs_t diff = currtime_us - oldtime_us; - - oldtime_us = currtime_us; - - if (debug_fps_metadata_t::DFM_FRAMES == debug_fps_metadata.type && - diff > debug_fps_metadata.ignorethresh_us) { - return; - } - - if (debug_fps_metadata.curr_frame < MAX_FPS_CALC_PERIOD_IN_FRAMES) { - debug_fps_metadata.framearrivals[debug_fps_metadata.curr_frame] = diff; - } - - debug_fps_metadata.curr_frame++; - - if (debug_fps_level > 1) { - unsigned int currstep = (diff + debug_fps_metadata.margin_us) / 16666; - - if (currstep < debug_fps_metadata.framearrival_steps) { - debug_fps_metadata.accum_framearrivals[currstep-1]++; - } - } - - if (debug_fps_metadata_t::DFM_FRAMES == debug_fps_metadata.type) { - if (debug_fps_metadata.curr_frame == debug_fps_metadata.period) { - /* time to calculate and display FPS */ - nsecs_t sum = 0; - for (unsigned int i = 0; i < debug_fps_metadata.period; i++) - sum += debug_fps_metadata.framearrivals[i]; - print_fps((debug_fps_metadata.period * float(1000000))/float(sum)); - } - } - else if (debug_fps_metadata_t::DFM_TIME == debug_fps_metadata.type) { - debug_fps_metadata.time_elapsed += ((float)diff/1000.0); - if (debug_fps_metadata.time_elapsed >= debug_fps_metadata.time_period) { - float fps = (1000.0 * debug_fps_metadata.curr_frame)/ - (float)debug_fps_metadata.time_elapsed; - print_fps(fps); - } - } - return; -} -#endif diff --git a/libqcomui/qcom_ui.h b/libqcomui/qcom_ui.h index 258ff27..eadfc9f 100644 --- a/libqcomui/qcom_ui.h +++ b/libqcomui/qcom_ui.h @@ -120,74 +120,6 @@ struct qBufGeometry { } }; -#ifndef DEBUG_CALC_FPS -#define CALC_FPS() ((void)0) -#define CALC_INIT() ((void)0) -#else -#define CALC_FPS() CalcFps::getInstance().Fps() -#define CALC_INIT() CalcFps::getInstance().Init() - -class CalcFps : public Singleton { -public: - CalcFps(); - ~CalcFps(); - - void Init(); - void Fps(); - -private: - static const unsigned int MAX_FPS_CALC_PERIOD_IN_FRAMES = 128; - static const unsigned int MAX_FRAMEARRIVAL_STEPS = 50; - static const unsigned int MAX_DEBUG_FPS_LEVEL = 2; - - struct debug_fps_metadata_t { - /*fps calculation based on time or number of frames*/ - enum DfmType { - DFM_FRAMES = 0, - DFM_TIME = 1, - }; - - DfmType type; - - /* indicates how much time do we wait till we calculate FPS */ - unsigned long time_period; - - /*indicates how much time elapsed since we report fps*/ - float time_elapsed; - - /* indicates how many frames do we wait till we calculate FPS */ - unsigned int period; - /* current frame, will go upto period, and then reset */ - unsigned int curr_frame; - /* frame will arrive at a multiple of 16666 us at the display. - This indicates how many steps to consider for our calculations. - For example, if framearrival_steps = 10, then the frame that arrived - after 166660 us or more will be ignored. - */ - unsigned int framearrival_steps; - /* ignorethresh_us = framearrival_steps * 16666 */ - nsecs_t ignorethresh_us; - /* used to calculate the actual frame arrival step, the times might not be - accurate - */ - unsigned int margin_us; - - /* actual data storage */ - nsecs_t framearrivals[MAX_FPS_CALC_PERIOD_IN_FRAMES]; - nsecs_t accum_framearrivals[MAX_FRAMEARRIVAL_STEPS]; - }; - -private: - void populate_debug_fps_metadata(void); - void print_fps(float fps); - void calc_fps(nsecs_t currtime_us); - -private: - debug_fps_metadata_t debug_fps_metadata; - unsigned int debug_fps_level; -}; -#endif - class QCBaseLayer { // int mS3DFormat; diff --git a/libqcomui/utils/profiler.cpp b/libqcomui/utils/profiler.cpp new file mode 100755 index 0000000..4424e7d --- /dev/null +++ b/libqcomui/utils/profiler.cpp @@ -0,0 +1,188 @@ +/* + * Copyright (c) 2011-2012, Code Aurora Forum. All rights reserved. + + * 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. + * * Neither the name of Code Aurora Forum, Inc. nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT + * 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. + */ + +#include "profiler.h" + +#ifdef DEBUG_CALC_FPS + +#define LOG_TAG "CALCFPS" +#define LOG_NDDEBUG 0 + +ANDROID_SINGLETON_STATIC_INSTANCE(CalcFps) ; + +CalcFps::CalcFps() { + debug_fps_level = 0; + Init(); +} + +CalcFps::~CalcFps() { +} + +void CalcFps::Init() { + char prop[PROPERTY_VALUE_MAX]; + property_get("debug.gr.calcfps", prop, "0"); + debug_fps_level = atoi(prop); + if (debug_fps_level > MAX_DEBUG_FPS_LEVEL) { + LOGW("out of range value for debug.gr.calcfps, using 0"); + debug_fps_level = 0; + } + + LOGD("DEBUG_CALC_FPS: %d", debug_fps_level); + populate_debug_fps_metadata(); +} + +void CalcFps::Fps() { + if (debug_fps_level > 0) + calc_fps(ns2us(systemTime())); +} + +void CalcFps::populate_debug_fps_metadata(void) +{ + char prop[PROPERTY_VALUE_MAX]; + + /*defaults calculation of fps to based on number of frames*/ + property_get("debug.gr.calcfps.type", prop, "0"); + debug_fps_metadata.type = (debug_fps_metadata_t::DfmType) atoi(prop); + + /*defaults to 1000ms*/ + property_get("debug.gr.calcfps.timeperiod", prop, "1000"); + debug_fps_metadata.time_period = atoi(prop); + + property_get("debug.gr.calcfps.period", prop, "10"); + debug_fps_metadata.period = atoi(prop); + + if (debug_fps_metadata.period > MAX_FPS_CALC_PERIOD_IN_FRAMES) { + debug_fps_metadata.period = MAX_FPS_CALC_PERIOD_IN_FRAMES; + } + + /* default ignorethresh_us: 500 milli seconds */ + property_get("debug.gr.calcfps.ignorethresh_us", prop, "500000"); + debug_fps_metadata.ignorethresh_us = atoi(prop); + + debug_fps_metadata.framearrival_steps = + (debug_fps_metadata.ignorethresh_us / 16666); + + if (debug_fps_metadata.framearrival_steps > MAX_FRAMEARRIVAL_STEPS) { + debug_fps_metadata.framearrival_steps = MAX_FRAMEARRIVAL_STEPS; + debug_fps_metadata.ignorethresh_us = + debug_fps_metadata.framearrival_steps * 16666; + } + + /* 2ms margin of error for the gettimeofday */ + debug_fps_metadata.margin_us = 2000; + + for (unsigned int i = 0; i < MAX_FRAMEARRIVAL_STEPS; i++) + debug_fps_metadata.accum_framearrivals[i] = 0; + + LOGD("period: %d", debug_fps_metadata.period); + LOGD("ignorethresh_us: %lld", debug_fps_metadata.ignorethresh_us); +} + +void CalcFps::print_fps(float fps) +{ + if (debug_fps_metadata_t::DFM_FRAMES == debug_fps_metadata.type) + LOGD("FPS for last %d frames: %3.2f", debug_fps_metadata.period, fps); + else + LOGD("FPS for last (%f ms, %d frames): %3.2f", + debug_fps_metadata.time_elapsed, + debug_fps_metadata.curr_frame, fps); + + debug_fps_metadata.curr_frame = 0; + debug_fps_metadata.time_elapsed = 0.0; + + if (debug_fps_level > 1) { + LOGD("Frame Arrival Distribution:"); + for (unsigned int i = 0; + i < ((debug_fps_metadata.framearrival_steps / 6) + 1); + i++) { + LOGD("%lld %lld %lld %lld %lld %lld", + debug_fps_metadata.accum_framearrivals[i*6], + debug_fps_metadata.accum_framearrivals[i*6+1], + debug_fps_metadata.accum_framearrivals[i*6+2], + debug_fps_metadata.accum_framearrivals[i*6+3], + debug_fps_metadata.accum_framearrivals[i*6+4], + debug_fps_metadata.accum_framearrivals[i*6+5]); + } + + /* We are done with displaying, now clear the stats */ + for (unsigned int i = 0; + i < debug_fps_metadata.framearrival_steps; + i++) + debug_fps_metadata.accum_framearrivals[i] = 0; + } + return; +} + +void CalcFps::calc_fps(nsecs_t currtime_us) +{ + static nsecs_t oldtime_us = 0; + + nsecs_t diff = currtime_us - oldtime_us; + + oldtime_us = currtime_us; + + if (debug_fps_metadata_t::DFM_FRAMES == debug_fps_metadata.type && + diff > debug_fps_metadata.ignorethresh_us) { + return; + } + + if (debug_fps_metadata.curr_frame < MAX_FPS_CALC_PERIOD_IN_FRAMES) { + debug_fps_metadata.framearrivals[debug_fps_metadata.curr_frame] = diff; + } + + debug_fps_metadata.curr_frame++; + + if (debug_fps_level > 1) { + unsigned int currstep = (diff + debug_fps_metadata.margin_us) / 16666; + + if (currstep < debug_fps_metadata.framearrival_steps) { + debug_fps_metadata.accum_framearrivals[currstep-1]++; + } + } + + if (debug_fps_metadata_t::DFM_FRAMES == debug_fps_metadata.type) { + if (debug_fps_metadata.curr_frame == debug_fps_metadata.period) { + /* time to calculate and display FPS */ + nsecs_t sum = 0; + for (unsigned int i = 0; i < debug_fps_metadata.period; i++) + sum += debug_fps_metadata.framearrivals[i]; + print_fps((debug_fps_metadata.period * float(1000000))/float(sum)); + } + } + else if (debug_fps_metadata_t::DFM_TIME == debug_fps_metadata.type) { + debug_fps_metadata.time_elapsed += ((float)diff/1000.0); + if (debug_fps_metadata.time_elapsed >= debug_fps_metadata.time_period) { + float fps = (1000.0 * debug_fps_metadata.curr_frame)/ + (float)debug_fps_metadata.time_elapsed; + print_fps(fps); + } + } + return; +} +#endif diff --git a/libqcomui/utils/profiler.h b/libqcomui/utils/profiler.h new file mode 100755 index 0000000..87f22d9 --- /dev/null +++ b/libqcomui/utils/profiler.h @@ -0,0 +1,107 @@ +/* + * Copyright (c) 2011-2012, Code Aurora Forum. All rights reserved. + + * 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. + * * Neither the name of Code Aurora Forum, Inc. nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT + * 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. + */ + +#ifndef INCLUDE_PROFILER +#define INCLUDE_PROFILER + +#include +#include +#include +#include +using namespace android; + +#ifndef DEBUG_CALC_FPS +#define CALC_FPS() ((void)0) +#define CALC_INIT() ((void)0) +#else +#define CALC_FPS() CalcFps::getInstance().Fps() +#define CALC_INIT() CalcFps::getInstance().Init() + +class CalcFps : public Singleton { +public: + CalcFps(); + ~CalcFps(); + + void Init(); + void Fps(); + +private: + static const unsigned int MAX_FPS_CALC_PERIOD_IN_FRAMES = 128; + static const unsigned int MAX_FRAMEARRIVAL_STEPS = 50; + static const unsigned int MAX_DEBUG_FPS_LEVEL = 2; + + struct debug_fps_metadata_t { + /*fps calculation based on time or number of frames*/ + enum DfmType { + DFM_FRAMES = 0, + DFM_TIME = 1, + }; + + DfmType type; + + /* indicates how much time do we wait till we calculate FPS */ + unsigned long time_period; + + /*indicates how much time elapsed since we report fps*/ + float time_elapsed; + + /* indicates how many frames do we wait till we calculate FPS */ + unsigned int period; + /* current frame, will go upto period, and then reset */ + unsigned int curr_frame; + /* frame will arrive at a multiple of 16666 us at the display. + This indicates how many steps to consider for our calculations. + For example, if framearrival_steps = 10, then the frame that arrived + after 166660 us or more will be ignored. + */ + unsigned int framearrival_steps; + /* ignorethresh_us = framearrival_steps * 16666 */ + nsecs_t ignorethresh_us; + /* used to calculate the actual frame arrival step, the times might not be + accurate + */ + unsigned int margin_us; + + /* actual data storage */ + nsecs_t framearrivals[MAX_FPS_CALC_PERIOD_IN_FRAMES]; + nsecs_t accum_framearrivals[MAX_FRAMEARRIVAL_STEPS]; + }; + +private: + void populate_debug_fps_metadata(void); + void print_fps(float fps); + void calc_fps(nsecs_t currtime_us); + +private: + debug_fps_metadata_t debug_fps_metadata; + unsigned int debug_fps_level; +}; +#endif + +#endif // INCLUDE_PROFILER