From 7d787b4722eaeb79cab42c36060336e092b77b5f Mon Sep 17 00:00:00 2001 From: Jason Sams Date: Sun, 15 Nov 2009 12:14:26 -0800 Subject: Add setPriority to allow wallpapers to run at lower cpu priority than default. --- .../java/android/renderscript/RenderScript.java | 16 ++++++++++ graphics/jni/android_renderscript_RenderScript.cpp | 11 +++++++ libs/rs/rs.spec | 2 +- libs/rs/rsContext.cpp | 34 ++++++++++++++++++---- libs/rs/rsContext.h | 2 ++ 5 files changed, 59 insertions(+), 6 deletions(-) diff --git a/graphics/java/android/renderscript/RenderScript.java b/graphics/java/android/renderscript/RenderScript.java index ea11882..a5bceb6 100644 --- a/graphics/java/android/renderscript/RenderScript.java +++ b/graphics/java/android/renderscript/RenderScript.java @@ -67,6 +67,7 @@ public class RenderScript { native int nContextCreate(int dev, int ver, boolean useDepth); native void nContextDestroy(int con); native void nContextSetSurface(int w, int h, Surface sur); + native void nContextSetPriority(int p); native void nContextBindRootScript(int script); native void nContextBindSampler(int sampler, int slot); @@ -218,6 +219,7 @@ public class RenderScript { Element mElement_XY_F32; Element mElement_XYZ_F32; + /////////////////////////////////////////////////////////////////////////////////// // @@ -229,6 +231,20 @@ public class RenderScript { } public RSMessage mMessageCallback = null; + public enum Priority { + LOW (5), //ANDROID_PRIORITY_BACKGROUND + 5 + NORMAL (-4); //ANDROID_PRIORITY_DISPLAY + + int mID; + Priority(int id) { + mID = id; + } + } + + public void contextSetPriority(Priority p) { + nContextSetPriority(p.mID); + } + private static class MessageThread extends Thread { RenderScript mRS; boolean mRun = true; diff --git a/graphics/jni/android_renderscript_RenderScript.cpp b/graphics/jni/android_renderscript_RenderScript.cpp index 709cb97..d311c33 100644 --- a/graphics/jni/android_renderscript_RenderScript.cpp +++ b/graphics/jni/android_renderscript_RenderScript.cpp @@ -158,6 +158,16 @@ nContextCreate(JNIEnv *_env, jobject _this, jint dev, jint ver, jboolean useDept } static void +nContextSetPriority(JNIEnv *_env, jobject _this, jint p) +{ + RsContext con = (RsContext)(_env->GetIntField(_this, gContextId)); + LOG_API("ContextSetPriority, con(%p), priority(%i)", con, p); + rsContextSetPriority(con, p); +} + + + +static void nContextSetSurface(JNIEnv *_env, jobject _this, jint width, jint height, jobject wnd) { RsContext con = (RsContext)(_env->GetIntField(_this, gContextId)); @@ -1333,6 +1343,7 @@ static JNINativeMethod methods[] = { {"nDeviceDestroy", "(I)V", (void*)nDeviceDestroy }, {"nDeviceSetConfig", "(III)V", (void*)nDeviceSetConfig }, {"nContextCreate", "(IIZ)I", (void*)nContextCreate }, +{"nContextSetPriority", "(I)V", (void*)nContextSetPriority }, {"nContextSetSurface", "(IILandroid/view/Surface;)V", (void*)nContextSetSurface }, {"nContextDestroy", "(I)V", (void*)nContextDestroy }, {"nContextPause", "()V", (void*)nContextPause }, diff --git a/libs/rs/rs.spec b/libs/rs/rs.spec index da25a27..be988e7 100644 --- a/libs/rs/rs.spec +++ b/libs/rs/rs.spec @@ -43,7 +43,7 @@ ContextSetSurface { } ContextSetPriority { - param uint32_t priority + param int32_t priority } AssignName { diff --git a/libs/rs/rsContext.cpp b/libs/rs/rsContext.cpp index c835dda..deb9592 100644 --- a/libs/rs/rsContext.cpp +++ b/libs/rs/rsContext.cpp @@ -20,11 +20,16 @@ #include #include +#include +#include + #include #include #include +#include + using namespace android; using namespace android::renderscript; @@ -234,6 +239,9 @@ static bool getProp(const char *str) void * Context::threadProc(void *vrsc) { Context *rsc = static_cast(vrsc); + rsc->mNativeThreadId = gettid(); + + setpriority(PRIO_PROCESS, rsc->mNativeThreadId, ANDROID_PRIORITY_DISPLAY); rsc->props.mLogTimes = getProp("debug.rs.profile"); rsc->props.mLogScripts = getProp("debug.rs.script"); @@ -316,6 +324,25 @@ void * Context::threadProc(void *vrsc) return NULL; } +void Context::setPriority(int32_t p) +{ + // Note: If we put this in the proper "background" policy + // the wallpapers can become completly unresponsive at times. + // This is probably not what we want for something the user is actively + // looking at. +#if 0 + SchedPolicy pol = SP_FOREGROUND; + if (p > 0) { + pol = SP_BACKGROUND; + } + if (!set_sched_policy(mNativeThreadId, pol)) { + // success; reset the priority as well + } +#else + setpriority(PRIO_PROCESS, mNativeThreadId, p); +#endif +} + Context::Context(Device *dev, bool useDepth) { pthread_mutex_lock(&gInitMutex); @@ -351,10 +378,6 @@ Context::Context(Device *dev, bool useDepth) return; } - sched_param sparam; - sparam.sched_priority = ANDROID_PRIORITY_DISPLAY; - pthread_attr_setschedparam(&threadAttr, &sparam); - mWndSurface = NULL; objDestroyOOBInit(); @@ -791,8 +814,9 @@ void rsi_ContextSetSurface(Context *rsc, uint32_t w, uint32_t h, void *sur) rsc->setSurface(w, h, (Surface *)sur); } -void rsi_ContextSetPriority(Context *rsc, uint32_t p) +void rsi_ContextSetPriority(Context *rsc, int32_t p) { + rsc->setPriority(p); } } diff --git a/libs/rs/rsContext.h b/libs/rs/rsContext.h index f3803a5..fb878eb 100644 --- a/libs/rs/rsContext.h +++ b/libs/rs/rsContext.h @@ -95,6 +95,7 @@ public: void pause(); void resume(); void setSurface(uint32_t w, uint32_t h, Surface *sur); + void setPriority(int32_t p); void assignName(ObjectBase *obj, const char *name, uint32_t len); void removeName(ObjectBase *obj); @@ -198,6 +199,7 @@ protected: bool mPaused; pthread_t mThreadId; + pid_t mNativeThreadId; ObjectBaseRef