diff options
-rw-r--r-- | graphics/java/android/renderscript/RSSurfaceView.java | 16 | ||||
-rw-r--r-- | graphics/java/android/renderscript/RenderScript.java | 26 | ||||
-rw-r--r-- | graphics/jni/android_renderscript_RenderScript.cpp | 27 | ||||
-rw-r--r-- | libs/rs/RenderScript.h | 2 | ||||
-rw-r--r-- | libs/rs/java/ImageProcessing/src/com/android/rs/image/ImageProcessingActivity.java | 3 | ||||
-rw-r--r-- | libs/rs/rs.spec | 6 | ||||
-rw-r--r-- | libs/rs/rsContext.cpp | 98 | ||||
-rw-r--r-- | libs/rs/rsContext.h | 7 | ||||
-rw-r--r-- | libs/rs/rsLocklessFifo.cpp | 2 | ||||
-rw-r--r-- | libs/rs/rsUtils.h | 2 |
10 files changed, 106 insertions, 83 deletions
diff --git a/graphics/java/android/renderscript/RSSurfaceView.java b/graphics/java/android/renderscript/RSSurfaceView.java index 1bc03ac..ad1bb54 100644 --- a/graphics/java/android/renderscript/RSSurfaceView.java +++ b/graphics/java/android/renderscript/RSSurfaceView.java @@ -80,10 +80,10 @@ public class RSSurfaceView extends SurfaceView implements SurfaceHolder.Callback */ public void surfaceDestroyed(SurfaceHolder holder) { // Surface will be destroyed when we return + Log.v(RenderScript.LOG_TAG, "surfaceDestroyed"); if (mRS != null) { - mRS.contextSetSurface(null); + mRS.contextSetSurface(0, 0, null); } - //Log.v(RenderScript.LOG_TAG, "surfaceDestroyed"); } /** @@ -91,10 +91,10 @@ public class RSSurfaceView extends SurfaceView implements SurfaceHolder.Callback * not normally called or subclassed by clients of RSSurfaceView. */ public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { + Log.v(RenderScript.LOG_TAG, "surfaceChanged"); if (mRS != null) { - mRS.contextSetSurface(holder.getSurface()); + mRS.contextSetSurface(w, h, holder.getSurface()); } - //Log.v(RenderScript.LOG_TAG, "surfaceChanged"); } /** @@ -147,11 +147,8 @@ public class RSSurfaceView extends SurfaceView implements SurfaceHolder.Callback // ---------------------------------------------------------------------- public RenderScript createRenderScript(boolean useDepth, boolean forceSW) { - Surface sur = null; - while ((sur == null) || (mSurfaceHolder == null)) { - sur = getHolder().getSurface(); - } - mRS = new RenderScript(sur, useDepth, forceSW); + Log.v(RenderScript.LOG_TAG, "createRenderScript"); + mRS = new RenderScript(useDepth, forceSW); return mRS; } @@ -160,6 +157,7 @@ public class RSSurfaceView extends SurfaceView implements SurfaceHolder.Callback } public void destroyRenderScript() { + Log.v(RenderScript.LOG_TAG, "destroyRenderScript"); mRS.destroy(); mRS = null; } diff --git a/graphics/java/android/renderscript/RenderScript.java b/graphics/java/android/renderscript/RenderScript.java index f1e5af1..ea11882 100644 --- a/graphics/java/android/renderscript/RenderScript.java +++ b/graphics/java/android/renderscript/RenderScript.java @@ -30,10 +30,12 @@ import android.view.Surface; * **/ public class RenderScript { - static final String LOG_TAG = "libRS_jni"; + static final String LOG_TAG = "RenderScript_jni"; private static final boolean DEBUG = false; @SuppressWarnings({"UnusedDeclaration", "deprecation"}) private static final boolean LOG_ENABLED = DEBUG ? Config.LOGD : Config.LOGV; + int mWidth; + int mHeight; @@ -62,9 +64,9 @@ public class RenderScript { native int nDeviceCreate(); native void nDeviceDestroy(int dev); native void nDeviceSetConfig(int dev, int param, int value); - native int nContextCreate(int dev, Surface sur, int ver, boolean useDepth); + native int nContextCreate(int dev, int ver, boolean useDepth); native void nContextDestroy(int con); - native void nContextSetSurface(Surface sur); + native void nContextSetSurface(int w, int h, Surface sur); native void nContextBindRootScript(int script); native void nContextBindSampler(int sampler, int slot); @@ -259,27 +261,31 @@ public class RenderScript { mRS.mMessageCallback.mID = msg; mRS.mMessageCallback.run(); } - //Log.d("rs", "MessageThread msg " + msg + " v1 " + rbuf[0] + " v2 " + rbuf[1] + " v3 " +rbuf[2]); + //Log.d(LOG_TAG, "MessageThread msg " + msg + " v1 " + rbuf[0] + " v2 " + rbuf[1] + " v3 " +rbuf[2]); } - Log.d("rs", "MessageThread exiting."); + Log.d(LOG_TAG, "MessageThread exiting."); } } - public RenderScript(Surface sur, boolean useDepth, boolean forceSW) { - mSurface = sur; + public RenderScript(boolean useDepth, boolean forceSW) { + mSurface = null; + mWidth = 0; + mHeight = 0; mDev = nDeviceCreate(); if(forceSW) { nDeviceSetConfig(mDev, 0, 1); } - mContext = nContextCreate(mDev, mSurface, 0, useDepth); + mContext = nContextCreate(mDev, 0, useDepth); Element.initPredefined(this); mMessageThread = new MessageThread(this); mMessageThread.start(); } - public void contextSetSurface(Surface sur) { + public void contextSetSurface(int w, int h, Surface sur) { mSurface = sur; - nContextSetSurface(mSurface); + mWidth = w; + mHeight = h; + nContextSetSurface(w, h, mSurface); } public void destroy() { diff --git a/graphics/jni/android_renderscript_RenderScript.cpp b/graphics/jni/android_renderscript_RenderScript.cpp index f3dda41..709cb97 100644 --- a/graphics/jni/android_renderscript_RenderScript.cpp +++ b/graphics/jni/android_renderscript_RenderScript.cpp @@ -151,30 +151,17 @@ nDeviceSetConfig(JNIEnv *_env, jobject _this, jint dev, jint p, jint value) } static jint -nContextCreate(JNIEnv *_env, jobject _this, jint dev, jobject wnd, jint ver, jboolean useDepth) +nContextCreate(JNIEnv *_env, jobject _this, jint dev, jint ver, jboolean useDepth) { LOG_API("nContextCreate"); - - if (wnd == NULL) { - not_valid_surface: - doThrow(_env, "java/lang/IllegalArgumentException", - "Make sure the SurfaceView or associated SurfaceHolder has a valid Surface"); - return 0; - } - jclass surface_class = _env->FindClass("android/view/Surface"); - jfieldID surfaceFieldID = _env->GetFieldID(surface_class, "mSurface", "I"); - Surface * window = (Surface*)_env->GetIntField(wnd, surfaceFieldID); - if (window == NULL) - goto not_valid_surface; - - return (jint)rsContextCreate((RsDevice)dev, window, ver, useDepth); + return (jint)rsContextCreate((RsDevice)dev, ver, useDepth); } static void -nContextSetSurface(JNIEnv *_env, jobject _this, jobject wnd) +nContextSetSurface(JNIEnv *_env, jobject _this, jint width, jint height, jobject wnd) { RsContext con = (RsContext)(_env->GetIntField(_this, gContextId)); - LOG_API("nContextSetSurface, con(%p), surface(%p)", con, (Surface *)wnd); + LOG_API("nContextSetSurface, con(%p), width(%i), height(%i), surface(%p)", con, width, height, (Surface *)wnd); Surface * window = NULL; if (wnd == NULL) { @@ -185,7 +172,7 @@ nContextSetSurface(JNIEnv *_env, jobject _this, jobject wnd) window = (Surface*)_env->GetIntField(wnd, surfaceFieldID); } - rsContextSetSurface(con, window); + rsContextSetSurface(con, width, height, window); } static void @@ -1345,8 +1332,8 @@ static JNINativeMethod methods[] = { {"nDeviceCreate", "()I", (void*)nDeviceCreate }, {"nDeviceDestroy", "(I)V", (void*)nDeviceDestroy }, {"nDeviceSetConfig", "(III)V", (void*)nDeviceSetConfig }, -{"nContextCreate", "(ILandroid/view/Surface;IZ)I", (void*)nContextCreate }, -{"nContextSetSurface", "(Landroid/view/Surface;)V", (void*)nContextSetSurface }, +{"nContextCreate", "(IIZ)I", (void*)nContextCreate }, +{"nContextSetSurface", "(IILandroid/view/Surface;)V", (void*)nContextSetSurface }, {"nContextDestroy", "(I)V", (void*)nContextDestroy }, {"nContextPause", "()V", (void*)nContextPause }, {"nContextResume", "()V", (void*)nContextResume }, diff --git a/libs/rs/RenderScript.h b/libs/rs/RenderScript.h index 9b04393..3ca8b15 100644 --- a/libs/rs/RenderScript.h +++ b/libs/rs/RenderScript.h @@ -55,7 +55,7 @@ RsDevice rsDeviceCreate(); void rsDeviceDestroy(RsDevice); void rsDeviceSetConfig(RsDevice, RsDeviceParam, int32_t value); -RsContext rsContextCreate(RsDevice, void *, uint32_t version, bool useDepth); +RsContext rsContextCreate(RsDevice, uint32_t version, bool useDepth); void rsContextDestroy(RsContext); void rsObjDestroyOOB(RsContext, void *); diff --git a/libs/rs/java/ImageProcessing/src/com/android/rs/image/ImageProcessingActivity.java b/libs/rs/java/ImageProcessing/src/com/android/rs/image/ImageProcessingActivity.java index b1facfc..334fd9c 100644 --- a/libs/rs/java/ImageProcessing/src/com/android/rs/image/ImageProcessingActivity.java +++ b/libs/rs/java/ImageProcessing/src/com/android/rs/image/ImageProcessingActivity.java @@ -126,13 +126,14 @@ public class ImageProcessingActivity extends Activity implements SurfaceHolder.C } public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { + mRS.contextSetSurface(width, height, holder.getSurface()); } public void surfaceDestroyed(SurfaceHolder holder) { } private Script.Invokable createScript() { - mRS = new RenderScript(mSurfaceView.getHolder().getSurface(), false, false); + mRS = new RenderScript(false, false); mRS.mMessageCallback = new FilterCallback(); mParamsType = Type.createFromClass(mRS, Params.class, 1, "Parameters"); diff --git a/libs/rs/rs.spec b/libs/rs/rs.spec index 865e435..da25a27 100644 --- a/libs/rs/rs.spec +++ b/libs/rs/rs.spec @@ -37,9 +37,15 @@ ContextResume { } ContextSetSurface { + param uint32_t width + param uint32_t height param void *sur } +ContextSetPriority { + param uint32_t priority + } + AssignName { param void *obj param const char *name diff --git a/libs/rs/rsContext.cpp b/libs/rs/rsContext.cpp index 3e4cc36..ab3809d 100644 --- a/libs/rs/rsContext.cpp +++ b/libs/rs/rsContext.cpp @@ -92,38 +92,12 @@ void Context::initEGL() LOGE("eglCreateContext returned EGL_NO_CONTEXT"); } gGLContextCount++; - - if (mWndSurface) { - setSurface(mWndSurface); - } else { - setSurface((Surface *)android_createDisplaySurface()); - } - - eglQuerySurface(mEGL.mDisplay, mEGL.mSurface, EGL_WIDTH, &mEGL.mWidth); - eglQuerySurface(mEGL.mDisplay, mEGL.mSurface, EGL_HEIGHT, &mEGL.mHeight); - - - mGL.mVersion = glGetString(GL_VERSION); - mGL.mVendor = glGetString(GL_VENDOR); - mGL.mRenderer = glGetString(GL_RENDERER); - mGL.mExtensions = glGetString(GL_EXTENSIONS); - - LOGV("EGL Version %i %i", mEGL.mMajorVersion, mEGL.mMinorVersion); - LOGV("GL Version %s", mGL.mVersion); - LOGV("GL Vendor %s", mGL.mVendor); - LOGV("GL Renderer %s", mGL.mRenderer); - LOGV("GL Extensions %s", mGL.mExtensions); - - if ((strlen((const char *)mGL.mVersion) < 12) || memcmp(mGL.mVersion, "OpenGL ES-CM", 12)) { - LOGE("Error, OpenGL ES Lite not supported"); - } else { - sscanf((const char *)mGL.mVersion + 13, "%i.%i", &mGL.mMajorVersion, &mGL.mMinorVersion); - } } void Context::deinitEGL() { - setSurface(NULL); + LOGV("deinitEGL"); + setSurface(0, 0, NULL); eglDestroyContext(mEGL.mDisplay, mEGL.mContext); checkEglError("eglDestroyContext"); @@ -265,9 +239,9 @@ void * Context::threadProc(void *vrsc) rsc->props.mLogScripts = getProp("debug.rs.script"); rsc->props.mLogObjects = getProp("debug.rs.objects"); - pthread_mutex_lock(&gInitMutex); - rsc->initEGL(); - pthread_mutex_unlock(&gInitMutex); + //pthread_mutex_lock(&gInitMutex); + //rsc->initEGL(); + //pthread_mutex_unlock(&gInitMutex); ScriptTLSStruct *tlsStruct = new ScriptTLSStruct; if (!tlsStruct) { @@ -342,7 +316,7 @@ void * Context::threadProc(void *vrsc) return NULL; } -Context::Context(Device *dev, Surface *sur, bool useDepth) +Context::Context(Device *dev, bool useDepth) { pthread_mutex_lock(&gInitMutex); @@ -353,6 +327,7 @@ Context::Context(Device *dev, Surface *sur, bool useDepth) mUseDepth = useDepth; mPaused = false; mObjHead = NULL; + memset(&mEGL, 0, sizeof(mEGL)); int status; pthread_attr_t threadAttr; @@ -380,7 +355,7 @@ Context::Context(Device *dev, Surface *sur, bool useDepth) sparam.sched_priority = ANDROID_PRIORITY_DISPLAY; pthread_attr_setschedparam(&threadAttr, &sparam); - mWndSurface = sur; + mWndSurface = NULL; objDestroyOOBInit(); timerInit(); @@ -426,8 +401,10 @@ Context::~Context() objDestroyOOBDestroy(); } -void Context::setSurface(Surface *sur) +void Context::setSurface(uint32_t w, uint32_t h, Surface *sur) { + LOGV("setSurface %i %i %p", w, h, sur); + EGLBoolean ret; if (mEGL.mSurface != NULL) { ret = eglMakeCurrent(mEGL.mDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); @@ -437,10 +414,22 @@ void Context::setSurface(Surface *sur) checkEglError("eglDestroySurface", ret); mEGL.mSurface = NULL; + mEGL.mWidth = 0; + mEGL.mHeight = 0; + mWidth = 0; + mHeight = 0; } mWndSurface = sur; if (mWndSurface != NULL) { + bool first = false; + if (!mEGL.mContext) { + first = true; + pthread_mutex_lock(&gInitMutex); + initEGL(); + pthread_mutex_unlock(&gInitMutex); + } + mEGL.mSurface = eglCreateWindowSurface(mEGL.mDisplay, mEGL.mConfig, mWndSurface, NULL); checkEglError("eglCreateWindowSurface"); if (mEGL.mSurface == EGL_NO_SURFACE) { @@ -449,6 +438,35 @@ void Context::setSurface(Surface *sur) ret = eglMakeCurrent(mEGL.mDisplay, mEGL.mSurface, mEGL.mSurface, mEGL.mContext); checkEglError("eglMakeCurrent", ret); + + eglQuerySurface(mEGL.mDisplay, mEGL.mSurface, EGL_WIDTH, &mEGL.mWidth); + eglQuerySurface(mEGL.mDisplay, mEGL.mSurface, EGL_HEIGHT, &mEGL.mHeight); + mWidth = w; + mHeight = h; + + if ((int)mWidth != mEGL.mWidth || (int)mHeight != mEGL.mHeight) { + LOGE("EGL/Surface mismatch EGL (%i x %i) SF (%i x %i)", mEGL.mWidth, mEGL.mHeight, mWidth, mHeight); + } + + if (first) { + mGL.mVersion = glGetString(GL_VERSION); + mGL.mVendor = glGetString(GL_VENDOR); + mGL.mRenderer = glGetString(GL_RENDERER); + mGL.mExtensions = glGetString(GL_EXTENSIONS); + + //LOGV("EGL Version %i %i", mEGL.mMajorVersion, mEGL.mMinorVersion); + LOGV("GL Version %s", mGL.mVersion); + LOGV("GL Vendor %s", mGL.mVendor); + LOGV("GL Renderer %s", mGL.mRenderer); + //LOGV("GL Extensions %s", mGL.mExtensions); + + if ((strlen((const char *)mGL.mVersion) < 12) || memcmp(mGL.mVersion, "OpenGL ES-CM", 12)) { + LOGE("Error, OpenGL ES Lite not supported"); + } else { + sscanf((const char *)mGL.mVersion + 13, "%i.%i", &mGL.mMajorVersion, &mGL.mMinorVersion); + } + } + } } @@ -767,19 +785,23 @@ void rsi_ContextResume(Context *rsc) rsc->resume(); } -void rsi_ContextSetSurface(Context *rsc, void *sur) +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) { - rsc->setSurface((Surface *)sur); } } } -RsContext rsContextCreate(RsDevice vdev, void *sur, uint32_t version, bool useDepth) +RsContext rsContextCreate(RsDevice vdev, uint32_t version, bool useDepth) { Device * dev = static_cast<Device *>(vdev); - Context *rsc = new Context(dev, (Surface *)sur, useDepth); + Context *rsc = new Context(dev, useDepth); return rsc; } diff --git a/libs/rs/rsContext.h b/libs/rs/rsContext.h index bffc55b..f3803a5 100644 --- a/libs/rs/rsContext.h +++ b/libs/rs/rsContext.h @@ -49,7 +49,7 @@ namespace renderscript { class Context { public: - Context(Device *, Surface *, bool useDepth); + Context(Device *, bool useDepth); ~Context(); static pthread_key_t gThreadTLSKey; @@ -94,7 +94,7 @@ public: void pause(); void resume(); - void setSurface(Surface *sur); + void setSurface(uint32_t w, uint32_t h, Surface *sur); void assignName(ObjectBase *obj, const char *name, uint32_t len); void removeName(ObjectBase *obj); @@ -189,6 +189,9 @@ protected: } mGL; + uint32_t mWidth; + uint32_t mHeight; + bool mRunning; bool mExit; bool mUseDepth; diff --git a/libs/rs/rsLocklessFifo.cpp b/libs/rs/rsLocklessFifo.cpp index 085a81e..c796520 100644 --- a/libs/rs/rsLocklessFifo.cpp +++ b/libs/rs/rsLocklessFifo.cpp @@ -57,7 +57,7 @@ bool LocklessCommandFifo::init(uint32_t sizeInBytes) mPut = mBuffer; mGet = mBuffer; mEnd = mBuffer + (sizeInBytes) - 1; - dumpState("init"); + //dumpState("init"); return true; } diff --git a/libs/rs/rsUtils.h b/libs/rs/rsUtils.h index 63d73a1..07f8933 100644 --- a/libs/rs/rsUtils.h +++ b/libs/rs/rsUtils.h @@ -18,7 +18,7 @@ #define ANDROID_RS_UTILS_H #define LOG_NDEBUG 0 -#define LOG_TAG "rs" +#define LOG_TAG "RenderScript" #include <utils/Log.h> #include <utils/Vector.h> #include <utils/KeyedVector.h> |