diff options
Diffstat (limited to 'power-660.c')
-rw-r--r-- | power-660.c | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/power-660.c b/power-660.c index e1b74de..5696718 100644 --- a/power-660.c +++ b/power-660.c @@ -36,6 +36,7 @@ #include <string.h> #include <sys/stat.h> #include <sys/types.h> +#include <time.h> #include <unistd.h> #define LOG_TAG "QTI PowerHAL" @@ -51,6 +52,10 @@ static int video_encode_hint_sent; +const int kMinInteractiveDuration = 400; /* ms */ +const int kMaxInteractiveDuration = 5000; /* ms */ +const int kMaxLaunchDuration = 5000; /* ms */ + /** * Returns true if the target is SDM630/SDM455. */ @@ -140,12 +145,74 @@ static int process_video_encode_hint(void* metadata) { return HINT_NONE; } +static void process_interaction_hint(void* data) { + static struct timespec s_previous_boost_timespec; + static int s_previous_duration = 0; + + struct timespec cur_boost_timespec; + long long elapsed_time; + int duration = kMinInteractiveDuration; + + if (data) { + int input_duration = *((int*)data); + if (input_duration > duration) { + duration = (input_duration > kMaxInteractiveDuration) ? kMaxInteractiveDuration + : input_duration; + } + } + + clock_gettime(CLOCK_MONOTONIC, &cur_boost_timespec); + + elapsed_time = calc_timespan_us(s_previous_boost_timespec, cur_boost_timespec); + // don't hint if previous hint's duration covers this hint's duration + if ((s_previous_duration * 1000) > (elapsed_time + duration * 1000)) { + return; + } + s_previous_boost_timespec = cur_boost_timespec; + s_previous_duration = duration; + + perf_hint_enable_with_type(VENDOR_HINT_SCROLL_BOOST, duration, SCROLL_VERTICAL); +} + +static int process_activity_launch_hint(void* data) { + static int launch_handle = -1; + static int launch_mode = 0; + + // release lock early if launch has finished + if (!data) { + if (CHECK_HANDLE(launch_handle)) { + release_request(launch_handle); + launch_handle = -1; + } + launch_mode = 0; + return HINT_HANDLED; + } + + if (!launch_mode) { + launch_handle = perf_hint_enable_with_type(VENDOR_HINT_FIRST_LAUNCH_BOOST, + kMaxLaunchDuration, LAUNCH_BOOST_V1); + if (!CHECK_HANDLE(launch_handle)) { + ALOGE("Failed to perform launch boost"); + return HINT_NONE; + } + launch_mode = 1; + } + return HINT_HANDLED; +} + int power_hint_override(power_hint_t hint, void* data) { int ret_val = HINT_NONE; switch (hint) { case POWER_HINT_VIDEO_ENCODE: ret_val = process_video_encode_hint(data); break; + case POWER_HINT_INTERACTION: + process_interaction_hint(data); + ret_val = HINT_HANDLED; + break; + case POWER_HINT_LAUNCH: + ret_val = process_activity_launch_hint(data); + break; default: break; } |