summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStephen Hines <srhines@google.com>2011-08-01 15:02:34 -0700
committerStephen Hines <srhines@google.com>2011-08-03 18:46:56 -0700
commit4382467a80dd12c6362d57edca7f2367f7ae877c (patch)
treef91d338f48444ccb373040ba356910c3fc52c8df
parent00451ed2d1f21945766bc0c59e762ef39cb391b8 (diff)
downloadframeworks_base-4382467a80dd12c6362d57edca7f2367f7ae877c.zip
frameworks_base-4382467a80dd12c6362d57edca7f2367f7ae877c.tar.gz
frameworks_base-4382467a80dd12c6362d57edca7f2367f7ae877c.tar.bz2
Start using bcinfo components within librs.
BUG=4942491 Change-Id: I3a46783511c4954bac9eadbbbefe5abf85498c16
-rw-r--r--graphics/java/android/renderscript/RenderScript.java29
-rw-r--r--graphics/java/android/renderscript/RenderScriptGL.java4
-rw-r--r--graphics/jni/android_renderscript_RenderScript.cpp12
-rw-r--r--libs/rs/RenderScript.h4
-rw-r--r--libs/rs/driver/rsdBcc.cpp64
-rw-r--r--libs/rs/rsContext.cpp11
-rw-r--r--libs/rs/rsContext.h4
-rw-r--r--libs/rs/rsScriptC.cpp29
-rw-r--r--libs/rs/rsScriptC.h7
9 files changed, 118 insertions, 46 deletions
diff --git a/graphics/java/android/renderscript/RenderScript.java b/graphics/java/android/renderscript/RenderScript.java
index 4856ab6..571b895 100644
--- a/graphics/java/android/renderscript/RenderScript.java
+++ b/graphics/java/android/renderscript/RenderScript.java
@@ -19,6 +19,8 @@ package android.renderscript;
import java.lang.reflect.Field;
import android.content.Context;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageManager;
import android.content.res.AssetManager;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
@@ -28,6 +30,7 @@ import android.util.Log;
import android.view.Surface;
+
/**
* RenderScript base master class. An instance of this class creates native
* worker threads for processing commands from this object. This base class
@@ -79,26 +82,26 @@ public class RenderScript {
// Methods below are wrapped to protect the non-threadsafe
// lockless fifo.
- native int rsnContextCreateGL(int dev, int ver,
+ native int rsnContextCreateGL(int dev, int ver, int sdkVer,
int colorMin, int colorPref,
int alphaMin, int alphaPref,
int depthMin, int depthPref,
int stencilMin, int stencilPref,
int samplesMin, int samplesPref, float samplesQ, int dpi);
- synchronized int nContextCreateGL(int dev, int ver,
+ synchronized int nContextCreateGL(int dev, int ver, int sdkVer,
int colorMin, int colorPref,
int alphaMin, int alphaPref,
int depthMin, int depthPref,
int stencilMin, int stencilPref,
int samplesMin, int samplesPref, float samplesQ, int dpi) {
- return rsnContextCreateGL(dev, ver, colorMin, colorPref,
+ return rsnContextCreateGL(dev, ver, sdkVer, colorMin, colorPref,
alphaMin, alphaPref, depthMin, depthPref,
stencilMin, stencilPref,
samplesMin, samplesPref, samplesQ, dpi);
}
- native int rsnContextCreate(int dev, int ver);
- synchronized int nContextCreate(int dev, int ver) {
- return rsnContextCreate(dev, ver);
+ native int rsnContextCreate(int dev, int ver, int sdkVer);
+ synchronized int nContextCreate(int dev, int ver, int sdkVer) {
+ return rsnContextCreate(dev, ver, sdkVer);
}
native void rsnContextDestroy(int con);
synchronized void nContextDestroy() {
@@ -864,6 +867,16 @@ public class RenderScript {
return mApplicationContext;
}
+ static int getTargetSdkVersion(Context ctx) {
+ try {
+ PackageManager pm = ctx.getPackageManager();
+ ApplicationInfo app = pm.getApplicationInfo(ctx.getPackageName(), 0);
+ return app.targetSdkVersion;
+ } catch (Exception e) {
+ throw new RSDriverException("Error calculating target SDK version for RS.");
+ }
+ }
+
/**
* Create a basic RenderScript context.
*
@@ -873,8 +886,10 @@ public class RenderScript {
public static RenderScript create(Context ctx) {
RenderScript rs = new RenderScript(ctx);
+ int sdkVersion = getTargetSdkVersion(ctx);
+
rs.mDev = rs.nDeviceCreate();
- rs.mContext = rs.nContextCreate(rs.mDev, 0);
+ rs.mContext = rs.nContextCreate(rs.mDev, 0, sdkVersion);
if (rs.mContext == 0) {
throw new RSDriverException("Failed to create RS context.");
}
diff --git a/graphics/java/android/renderscript/RenderScriptGL.java b/graphics/java/android/renderscript/RenderScriptGL.java
index 935b75a..2dfcc83 100644
--- a/graphics/java/android/renderscript/RenderScriptGL.java
+++ b/graphics/java/android/renderscript/RenderScriptGL.java
@@ -160,11 +160,13 @@ public class RenderScriptGL extends RenderScript {
super(ctx);
mSurfaceConfig = new SurfaceConfig(sc);
+ int sdkVersion = getTargetSdkVersion(ctx);
+
mWidth = 0;
mHeight = 0;
mDev = nDeviceCreate();
int dpi = ctx.getResources().getDisplayMetrics().densityDpi;
- mContext = nContextCreateGL(mDev, 0,
+ mContext = nContextCreateGL(mDev, 0, sdkVersion,
mSurfaceConfig.mColorMin, mSurfaceConfig.mColorPref,
mSurfaceConfig.mAlphaMin, mSurfaceConfig.mAlphaPref,
mSurfaceConfig.mDepthMin, mSurfaceConfig.mDepthPref,
diff --git a/graphics/jni/android_renderscript_RenderScript.cpp b/graphics/jni/android_renderscript_RenderScript.cpp
index 3476bd5..d7ac5d8 100644
--- a/graphics/jni/android_renderscript_RenderScript.cpp
+++ b/graphics/jni/android_renderscript_RenderScript.cpp
@@ -149,14 +149,14 @@ nDeviceSetConfig(JNIEnv *_env, jobject _this, jint dev, jint p, jint value)
}
static jint
-nContextCreate(JNIEnv *_env, jobject _this, jint dev, jint ver)
+nContextCreate(JNIEnv *_env, jobject _this, jint dev, jint ver, jint sdkVer)
{
LOG_API("nContextCreate");
- return (jint)rsContextCreate((RsDevice)dev, ver);
+ return (jint)rsContextCreate((RsDevice)dev, ver, sdkVer);
}
static jint
-nContextCreateGL(JNIEnv *_env, jobject _this, jint dev, jint ver,
+nContextCreateGL(JNIEnv *_env, jobject _this, jint dev, jint ver, jint sdkVer,
int colorMin, int colorPref,
int alphaMin, int alphaPref,
int depthMin, int depthPref,
@@ -176,7 +176,7 @@ nContextCreateGL(JNIEnv *_env, jobject _this, jint dev, jint ver,
sc.samplesQ = samplesQ;
LOG_API("nContextCreateGL");
- return (jint)rsContextCreateGL((RsDevice)dev, ver, sc, dpi);
+ return (jint)rsContextCreateGL((RsDevice)dev, ver, sdkVer, sc, dpi);
}
static void
@@ -1213,8 +1213,8 @@ static JNINativeMethod methods[] = {
// All methods below are thread protected in java.
-{"rsnContextCreate", "(II)I", (void*)nContextCreate },
-{"rsnContextCreateGL", "(IIIIIIIIIIIIFI)I", (void*)nContextCreateGL },
+{"rsnContextCreate", "(III)I", (void*)nContextCreate },
+{"rsnContextCreateGL", "(IIIIIIIIIIIIIFI)I", (void*)nContextCreateGL },
{"rsnContextFinish", "(I)V", (void*)nContextFinish },
{"rsnContextSetPriority", "(II)V", (void*)nContextSetPriority },
{"rsnContextSetSurface", "(IIILandroid/view/Surface;)V", (void*)nContextSetSurface },
diff --git a/libs/rs/RenderScript.h b/libs/rs/RenderScript.h
index 535f713..3ba0123 100644
--- a/libs/rs/RenderScript.h
+++ b/libs/rs/RenderScript.h
@@ -52,8 +52,8 @@ void rsaElementGetSubElements(RsContext, RsElement, uint32_t *ids, const char **
RsDevice rsDeviceCreate();
void rsDeviceDestroy(RsDevice dev);
void rsDeviceSetConfig(RsDevice dev, RsDeviceParam p, int32_t value);
-RsContext rsContextCreate(RsDevice dev, uint32_t version);
-RsContext rsContextCreateGL(RsDevice dev, uint32_t version, RsSurfaceConfig sc, uint32_t dpi);
+RsContext rsContextCreate(RsDevice dev, uint32_t version, uint32_t sdkVersion);
+RsContext rsContextCreateGL(RsDevice dev, uint32_t version, uint32_t sdkVersion, RsSurfaceConfig sc, uint32_t dpi);
#include "rsgApiFuncDecl.h"
diff --git a/libs/rs/driver/rsdBcc.cpp b/libs/rs/driver/rsdBcc.cpp
index 0c0aa10..807ed24 100644
--- a/libs/rs/driver/rsdBcc.cpp
+++ b/libs/rs/driver/rsdBcc.cpp
@@ -19,7 +19,7 @@
#include "rsdBcc.h"
#include "rsdRuntime.h"
-#include <bcinfo/bcinfo.h>
+#include <bcinfo/MetadataExtractor.h>
#include "rsContext.h"
#include "rsScriptC.h"
@@ -40,7 +40,7 @@ struct DrvScript {
BCCScriptRef mBccScript;
- struct BCScriptMetadata *mScriptMetadata;
+ bcinfo::MetadataExtractor *ME;
InvokeFunc_t *mInvokeFunctions;
void ** mFieldAddress;
@@ -71,7 +71,9 @@ bool rsdScriptInit(const Context *rsc,
pthread_mutex_lock(&rsdgInitMutex);
char *cachePath = NULL;
- struct BCScriptMetadata *md = NULL;
+ size_t exportFuncCount = 0;
+ size_t exportVarCount = 0;
+ size_t objectSlotCount = 0;
DrvScript *drv = (DrvScript *)calloc(1, sizeof(DrvScript));
if (drv == NULL) {
@@ -84,13 +86,13 @@ bool rsdScriptInit(const Context *rsc,
drv->mScriptText = bitcode;
drv->mScriptTextLength = bitcodeSize;
- md = bcinfoGetScriptMetadata((const char*)drv->mScriptText,
- drv->mScriptTextLength, 0);
- if (!md) {
+
+ drv->ME = new bcinfo::MetadataExtractor((const char*)drv->mScriptText,
+ drv->mScriptTextLength);
+ if (!drv->ME->extract()) {
LOGE("bcinfo: failed to read script metadata");
goto error;
}
- drv->mScriptMetadata = md;
//LOGE("mBccScript %p", script->mBccScript);
@@ -122,40 +124,41 @@ bool rsdScriptInit(const Context *rsc,
drv->mRoot = reinterpret_cast<int (*)()>(bccGetFuncAddr(drv->mBccScript, "root"));
drv->mInit = reinterpret_cast<void (*)()>(bccGetFuncAddr(drv->mBccScript, "init"));
- if (md->exportFuncCount > 0) {
- drv->mInvokeFunctions = (InvokeFunc_t*) calloc(md->exportFuncCount,
+ exportFuncCount = drv->ME->getExportFuncCount();
+ if (exportFuncCount > 0) {
+ drv->mInvokeFunctions = (InvokeFunc_t*) calloc(exportFuncCount,
sizeof(InvokeFunc_t));
- bccGetExportFuncList(drv->mBccScript,
- md->exportFuncCount,
+ bccGetExportFuncList(drv->mBccScript, exportFuncCount,
(void **) drv->mInvokeFunctions);
} else {
drv->mInvokeFunctions = NULL;
}
- if (md->exportVarCount > 0) {
- drv->mFieldAddress = (void **) calloc(md->exportVarCount,
- sizeof(void*));
- drv->mFieldIsObject = (bool *) calloc(md->exportVarCount, sizeof(bool));
- bccGetExportVarList(drv->mBccScript,
- md->exportVarCount,
+ exportVarCount = drv->ME->getExportVarCount();
+ if (exportVarCount > 0) {
+ drv->mFieldAddress = (void **) calloc(exportVarCount, sizeof(void*));
+ drv->mFieldIsObject = (bool *) calloc(exportVarCount, sizeof(bool));
+ bccGetExportVarList(drv->mBccScript, exportVarCount,
(void **) drv->mFieldAddress);
} else {
drv->mFieldAddress = NULL;
drv->mFieldIsObject = NULL;
}
- if (md->objectSlotCount) {
- for (uint32_t ct=0; ct < md->objectSlotCount; ct++) {
- drv->mFieldIsObject[md->objectSlotList[ct]] = true;
+ objectSlotCount = drv->ME->getObjectSlotCount();
+ if (objectSlotCount > 0) {
+ const uint32_t *objectSlotList = drv->ME->getObjectSlotList();
+ for (uint32_t ct=0; ct < objectSlotCount; ct++) {
+ drv->mFieldIsObject[objectSlotList[ct]] = true;
}
}
// Copy info over to runtime
- script->mHal.info.exportedFunctionCount = md->exportFuncCount;
- script->mHal.info.exportedVariableCount = md->exportVarCount;
- script->mHal.info.exportedPragmaCount = md->pragmaCount;
- script->mHal.info.exportedPragmaKeyList = md->pragmaKeyList;
- script->mHal.info.exportedPragmaValueList = md->pragmaValueList;
+ script->mHal.info.exportedFunctionCount = drv->ME->getExportFuncCount();
+ script->mHal.info.exportedVariableCount = drv->ME->getExportVarCount();
+ script->mHal.info.exportedPragmaCount = drv->ME->getPragmaCount();
+ script->mHal.info.exportedPragmaKeyList = drv->ME->getPragmaKeyList();
+ script->mHal.info.exportedPragmaValueList = drv->ME->getPragmaValueList();
script->mHal.info.root = drv->mRoot;
pthread_mutex_unlock(&rsdgInitMutex);
@@ -164,6 +167,10 @@ bool rsdScriptInit(const Context *rsc,
error:
pthread_mutex_unlock(&rsdgInitMutex);
+ if (drv->ME) {
+ delete drv->ME;
+ drv->ME = NULL;
+ }
free(drv);
return false;
@@ -445,10 +452,10 @@ void rsdScriptSetGlobalObj(const Context *dc, const Script *script, uint32_t slo
void rsdScriptDestroy(const Context *dc, Script *script) {
DrvScript *drv = (DrvScript *)script->mHal.drv;
- struct BCScriptMetadata *md = drv->mScriptMetadata;
if (drv->mFieldAddress) {
- for (size_t ct = 0; ct < md->exportVarCount; ct++) {
+ size_t exportVarCount = drv->ME->getExportVarCount();
+ for (size_t ct = 0; ct < exportVarCount; ct++) {
if (drv->mFieldIsObject[ct]) {
// The field address can be NULL if the script-side has
// optimized the corresponding global variable away.
@@ -467,7 +474,8 @@ void rsdScriptDestroy(const Context *dc, Script *script) {
drv->mInvokeFunctions = NULL;
}
- bcinfoReleaseScriptMetadata(&drv->mScriptMetadata);
+ delete drv->ME;
+ drv->ME = NULL;
free(drv);
script->mHal.drv = NULL;
diff --git a/libs/rs/rsContext.cpp b/libs/rs/rsContext.cpp
index decd9f1..6a30b17 100644
--- a/libs/rs/rsContext.cpp
+++ b/libs/rs/rsContext.cpp
@@ -333,6 +333,7 @@ Context::Context() {
mPaused = false;
mObjHead = NULL;
mError = RS_ERROR_NONE;
+ mTargetSdkVersion = 14;
mDPI = 96;
mIsContextLite = false;
}
@@ -678,19 +679,25 @@ void rsi_ContextDeinitToClient(Context *rsc) {
}
}
-RsContext rsContextCreate(RsDevice vdev, uint32_t version) {
+RsContext rsContextCreate(RsDevice vdev, uint32_t version,
+ uint32_t sdkVersion) {
LOGV("rsContextCreate %p", vdev);
Device * dev = static_cast<Device *>(vdev);
Context *rsc = Context::createContext(dev, NULL);
+ if (rsc) {
+ rsc->setTargetSdkVersion(sdkVersion);
+ }
return rsc;
}
RsContext rsContextCreateGL(RsDevice vdev, uint32_t version,
- RsSurfaceConfig sc, uint32_t dpi) {
+ uint32_t sdkVersion, RsSurfaceConfig sc,
+ uint32_t dpi) {
LOGV("rsContextCreateGL %p", vdev);
Device * dev = static_cast<Device *>(vdev);
Context *rsc = Context::createContext(dev, &sc);
if (rsc) {
+ rsc->setTargetSdkVersion(sdkVersion);
rsc->setDPI(dpi);
}
LOGV("rsContextCreateGL ret %p ", rsc);
diff --git a/libs/rs/rsContext.h b/libs/rs/rsContext.h
index 309fe95..3c7a3d2 100644
--- a/libs/rs/rsContext.h
+++ b/libs/rs/rsContext.h
@@ -199,9 +199,13 @@ public:
uint32_t getDPI() const {return mDPI;}
void setDPI(uint32_t dpi) {mDPI = dpi;}
+ uint32_t getTargetSdkVersion() const {return mTargetSdkVersion;}
+ void setTargetSdkVersion(uint32_t sdkVer) {mTargetSdkVersion = sdkVer;}
+
Device *mDev;
protected:
+ uint32_t mTargetSdkVersion;
uint32_t mDPI;
uint32_t mWidth;
uint32_t mHeight;
diff --git a/libs/rs/rsScriptC.cpp b/libs/rs/rsScriptC.cpp
index e8b1014..dccf71f 100644
--- a/libs/rs/rsScriptC.cpp
+++ b/libs/rs/rsScriptC.cpp
@@ -19,6 +19,10 @@
#include "utils/Timers.h"
#include "utils/StopWatch.h"
+#ifndef ANDROID_RS_SERIALIZE
+#include <bcinfo/BitcodeTranslator.h>
+#endif
+
using namespace android;
using namespace android::renderscript;
@@ -28,9 +32,18 @@ using namespace android::renderscript;
ScriptC * sc = (ScriptC *) tls->mScript
ScriptC::ScriptC(Context *rsc) : Script(rsc) {
+#ifndef ANDROID_RS_SERIALIZE
+ BT = NULL;
+#endif
}
ScriptC::~ScriptC() {
+#ifndef ANDROID_RS_SERIALIZE
+ if (BT) {
+ delete BT;
+ BT = NULL;
+ }
+#endif
mRSC->mHal.funcs.script.destroy(mRSC, this);
}
@@ -181,6 +194,22 @@ bool ScriptC::runCompiler(Context *rsc,
size_t bitcodeLen) {
//LOGE("runCompiler %p %p %p %p %p %i", rsc, this, resName, cacheDir, bitcode, bitcodeLen);
+#ifndef ANDROID_RS_SERIALIZE
+ uint32_t sdkVersion = rsc->getTargetSdkVersion();
+ if (BT) {
+ delete BT;
+ }
+ BT = new bcinfo::BitcodeTranslator((const char *)bitcode, bitcodeLen,
+ sdkVersion);
+ if (!BT->translate()) {
+ LOGE("Failed to translate bitcode from version: %u", sdkVersion);
+ delete BT;
+ BT = NULL;
+ return false;
+ }
+ bitcode = (const uint8_t *) BT->getTranslatedBitcode();
+ bitcodeLen = BT->getTranslatedBitcodeSize();
+#endif
rsc->mHal.funcs.script.init(rsc, this, resName, cacheDir, bitcode, bitcodeLen, 0);
diff --git a/libs/rs/rsScriptC.h b/libs/rs/rsScriptC.h
index 5c191d9..c65a5bf 100644
--- a/libs/rs/rsScriptC.h
+++ b/libs/rs/rsScriptC.h
@@ -21,6 +21,9 @@
#include "RenderScriptEnv.h"
+#ifndef ANDROID_RS_SERIALIZE
+#include "bcinfo/BitcodeTranslator.h"
+#endif
// ---------------------------------------------------------------------------
namespace android {
@@ -61,6 +64,10 @@ public:
void setupScript(Context *);
void setupGLState(Context *);
Script * setTLS(Script *);
+ private:
+#ifndef ANDROID_RS_SERIALIZE
+ bcinfo::BitcodeTranslator *BT;
+#endif
};
class ScriptCState {