diff --git a/libgralloc/Android.mk b/libgralloc/Android.mk old mode 100755 new mode 100644 index 168932f..a8cc183 --- a/libgralloc/Android.mk +++ b/libgralloc/Android.mk @@ -20,9 +20,11 @@ LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_PRELINK_MODULE := false LOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRARIES)/hw -LOCAL_SHARED_LIBRARIES := liblog libcutils libGLESv1_CM libutils libmemalloc +LOCAL_SHARED_LIBRARIES := liblog libcutils libGLESv1_CM libutils libmemalloc libQcomUI LOCAL_SHARED_LIBRARIES += libgenlock + LOCAL_C_INCLUDES += hardware/qcom/display/libgenlock +LOCAL_C_INCLUDES += hardware/qcom/display/libqcomui LOCAL_SRC_FILES := framebuffer.cpp \ gpu.cpp \ gralloc.cpp \ diff --git a/libgralloc/framebuffer.cpp b/libgralloc/framebuffer.cpp index 92f07a5..517fc96 100644 --- a/libgralloc/framebuffer.cpp +++ b/libgralloc/framebuffer.cpp @@ -49,6 +49,8 @@ #include #endif +#include + #define FB_DEBUG 0 #if defined(HDMI_DUAL_DISPLAY) @@ -79,50 +81,6 @@ static inline size_t ALIGN(size_t x, size_t align) { char framebufferStateName[] = {'S', 'R', 'A'}; -#ifdef DEBUG_CALC_FPS - -#define MAX_FPS_CALC_PERIOD_IN_FRAMES 128 -#define MAX_FRAMARRIVAL_STEPS 50 -#define 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_FRAMARRIVAL_STEPS]; -}; - -#endif - /*****************************************************************************/ enum { @@ -144,11 +102,6 @@ struct fb_context_t { static int neworientation; -#ifdef DEBUG_CALC_FPS -static debug_fps_metadata_t debug_fps_metadata; -static unsigned int debug_fps_level = 0; -#endif - /*****************************************************************************/ static void @@ -189,132 +142,6 @@ static int fb_setUpdateRect(struct framebuffer_device_t* dev, return 0; } -#ifdef DEBUG_CALC_FPS - -static void 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_FRAMARRIVAL_STEPS) { - debug_fps_metadata.framearrival_steps = MAX_FRAMARRIVAL_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 (int i = 0; i < MAX_FRAMARRIVAL_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); -} - -static void 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; -} - -static void 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; - } - - 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 // DEBUG_CALC_FPS - static void *disp_loop(void *ptr) { struct qbuf_t nxtBuf; @@ -360,10 +187,7 @@ static void *disp_loop(void *ptr) pthread_cond_signal(&m->bufferPostCond); pthread_mutex_unlock(&m->bufferPostLock); #endif - -#ifdef DEBUG_CALC_FPS - if (debug_fps_level > 0) calc_fps(ns2us(systemTime())); -#endif + CALC_FPS(); if (cur_buf == -1) { int nxtAvail = ((nxtBuf.idx + 1) % m->numBuffers); @@ -972,18 +796,7 @@ int mapFrameBufferLocked(struct private_module_t* module) module->swapInterval = 1; #endif -#ifdef DEBUG_CALC_FPS - 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(); -#endif + CALC_INIT(); module->currentIdx = -1; pthread_cond_init(&(module->qpost), NULL); diff --git a/libhwcomposer/Android.mk b/libhwcomposer/Android.mk old mode 100755 new mode 100644 index 0a23157..80fe5b0 --- a/libhwcomposer/Android.mk +++ b/libhwcomposer/Android.mk @@ -6,13 +6,13 @@ include $(CLEAR_VARS) LOCAL_PRELINK_MODULE := false LOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRARIES)/hw LOCAL_SHARED_LIBRARIES := liblog libcutils libEGL libhardware libutils liboverlay -LOCAL_SHARED_LIBRARIES += libgenlock libui +LOCAL_SHARED_LIBRARIES += libgenlock libui libQcomUI LOCAL_SRC_FILES := \ hwcomposer.cpp LOCAL_MODULE := hwcomposer.$(TARGET_BOARD_PLATFORM) -LOCAL_CFLAGS:= -DLOG_TAG=\"$(TARGET_BOARD_PLATFORM).hwcomposer\" +LOCAL_CFLAGS:= -DLOG_TAG=\"$(TARGET_BOARD_PLATFORM).hwcomposer\" -DDEBUG_CALC_FPS LOCAL_CFLAGS += -DQCOM_HARDWARE LOCAL_C_INCLUDES += hardware/qcom/display/libgralloc diff --git a/libhwcomposer/hwcomposer.cpp b/libhwcomposer/hwcomposer.cpp old mode 100755 new mode 100644 index c2f37db..5cd6423 --- a/libhwcomposer/hwcomposer.cpp +++ b/libhwcomposer/hwcomposer.cpp @@ -1256,6 +1256,9 @@ static int hwc_set(hwc_composer_device_t *dev, LOGE("eglSwapBuffers() failed in %s", __FUNCTION__); } } + else { + CALC_FPS(); + } #ifdef COMPOSITION_BYPASS if(ctx->bypassState == BYPASS_OFF_PENDING) { //Close channels only after fb content is displayed. @@ -1367,6 +1370,8 @@ static int hwc_module_initialize(struct private_hwc_module_t* hwcModule) } } + CALC_INIT(); + return 0; } diff --git a/libqcomui/Android.mk b/libqcomui/Android.mk index 656591d..666ed9b 100644 --- a/libqcomui/Android.mk +++ b/libqcomui/Android.mk @@ -19,6 +19,7 @@ LOCAL_SHARED_LIBRARIES := \ LOCAL_C_INCLUDES := $(TOP)/hardware/qcom/display/libgralloc \ LOCAL_CFLAGS := -DLOG_TAG=\"libQcomUI\" LOCAL_CFLAGS += -DQCOM_HARDWARE +LOCAL_CFLAGS += -DDEBUG_CALC_FPS LOCAL_MODULE := libQcomUI LOCAL_MODULE_TAGS := optional include $(BUILD_SHARED_LIBRARY) diff --git a/libqcomui/qcom_ui.cpp b/libqcomui/qcom_ui.cpp index 9e0a593..4e20ed4 100644 --- a/libqcomui/qcom_ui.cpp +++ b/libqcomui/qcom_ui.cpp @@ -477,3 +477,156 @@ int qcomuiClearRegion(Region region, EGLDisplay dpy, EGLSurface sur) return 0; } +#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 c79286d..8d90f7b 100644 --- a/libqcomui/qcom_ui.h +++ b/libqcomui/qcom_ui.h @@ -35,6 +35,7 @@ #include #include #include +#include using namespace android; using android::sp; @@ -101,6 +102,74 @@ 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 + /* * Function to check if the allocated buffer is of the correct size. * Reallocate the buffer with the correct size, if the size doesn't