Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8f019d63 authored by Stephen Hines's avatar Stephen Hines Committed by Android (Google) Code Review
Browse files

Merge "Start using bcinfo components within librs."

parents e3373ff6 4382467a
Loading
Loading
Loading
Loading
+22 −7
Original line number Diff line number Diff line
@@ -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.");
        }
+3 −1
Original line number Diff line number Diff line
@@ -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,
+6 −6
Original line number Diff line number Diff line
@@ -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 },
+2 −2
Original line number Diff line number Diff line
@@ -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"

+36 −28
Original line number Diff line number Diff line
@@ -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;
Loading