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

Commit 3a833d8e authored by Jason Sams's avatar Jason Sams
Browse files

Fix build issue and ref count bug with scripts.

parent 39ddc950
Loading
Loading
Loading
Loading
+1 −20
Original line number Diff line number Diff line
@@ -37,13 +37,9 @@ void Context::initEGL()
         EGL_NONE
     };

     LOGE("EGL 1");
     mDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY);
     LOGE("EGL 2  %p", mDisplay);
     eglInitialize(mDisplay, &mMajorVersion, &mMinorVersion);
     LOGE("EGL 3  %i  %i", mMajorVersion, mMinorVersion);
     eglChooseConfig(mDisplay, s_configAttribs, &mConfig, 1, &mNumConfigs);
     LOGE("EGL 4  %p", mConfig);

     if (mWndSurface) {
         mSurface = eglCreateWindowSurface(mDisplay, mConfig,
@@ -55,13 +51,10 @@ void Context::initEGL()
                 NULL);
     }

     LOGE("EGL 5");
     mContext = eglCreateContext(mDisplay, mConfig, NULL, NULL);
     eglMakeCurrent(mDisplay, mSurface, mSurface, mContext);
     eglQuerySurface(mDisplay, mSurface, EGL_WIDTH, &mWidth);
     eglQuerySurface(mDisplay, mSurface, EGL_HEIGHT, &mHeight);
     LOGE("EGL 9");

}

bool Context::runRootScript()
@@ -123,16 +116,11 @@ void * Context::threadProc(void *vrsc)
{
     Context *rsc = static_cast<Context *>(vrsc);

     LOGE("TP 1");
     gIO = new ThreadIO();

     rsc->mServerCommands.init(128);
     rsc->mServerReturns.init(128);

     rsc->initEGL();

     LOGE("TP 2");

     rsc->mRunning = true;
     bool mDraw = true;
     while (!rsc->mExit) {
@@ -149,7 +137,6 @@ void * Context::threadProc(void *vrsc)
         }
     }

     LOGE("TP 6");
     glClearColor(0,0,0,0);
     glClear(GL_COLOR_BUFFER_BIT);
     eglSwapBuffers(rsc->mDisplay, rsc->mSurface);
@@ -159,7 +146,6 @@ void * Context::threadProc(void *vrsc)

Context::Context(Device *dev, Surface *sur)
{
    LOGE("CC 1");
    dev->addContext(this);
    mDev = dev;
    mRunning = false;
@@ -171,7 +157,6 @@ Context::Context(Device *dev, Surface *sur)
    // see comment in header
    gCon = this;

    LOGE("CC 2");
    int status;
    pthread_attr_t threadAttr;

@@ -185,17 +170,16 @@ Context::Context(Device *dev, Surface *sur)
    sparam.sched_priority = ANDROID_PRIORITY_DISPLAY;
    pthread_attr_setschedparam(&threadAttr, &sparam);

    LOGE("RS Launching thread");
    status = pthread_create(&mThreadId, &threadAttr, threadProc, this);
    if (status) {
        LOGE("Failed to start rs context thread.");
    }

    LOGE("CC 3");
    mWndSurface = sur;
    while(!mRunning) {
        sleep(1);
    }
    LOGE("CC 4");

    pthread_attr_destroy(&threadAttr);
}
@@ -205,14 +189,11 @@ Context::~Context()
    mExit = true;
    void *res;

    LOGE("DES 1");
    int status = pthread_join(mThreadId, &res);
    LOGE("DES 2");

    if (mDev) {
        mDev->removeContext(this);
    }
    LOGE("DES 3");
}

void Context::swapBuffers()
+35 −44
Original line number Diff line number Diff line
@@ -27,9 +27,7 @@ using namespace android::renderscript;
ScriptC::ScriptC()
{
    mAccScript = NULL;
    mScript = NULL;
    mScriptText = NULL;
    mScriptTextLength = 0;
    memset(&mProgram, 0, sizeof(mProgram));
}

ScriptC::~ScriptC()
@@ -392,7 +390,7 @@ static rsc_FunctionTable scriptCPtrTable = {
bool ScriptC::run(Context *rsc, uint32_t launchID)
{
    Env e = {rsc, this};
    return mScript(&e, &scriptCPtrTable, launchID) != 0;
    return mProgram.mScript(&e, &scriptCPtrTable, launchID) != 0;
}

ScriptCState::ScriptCState()
@@ -409,32 +407,33 @@ ScriptCState::~ScriptCState()

void ScriptCState::clear()
{
    memset(&mProgram, 0, sizeof(mProgram));

    mConstantBufferTypes.clear();
    mClearColor[0] = 0;
    mClearColor[1] = 0;
    mClearColor[2] = 0;
    mClearColor[3] = 1;
    mClearDepth = 1;
    mClearStencil = 0;

    memset(&mEnviroment, 0, sizeof(mEnviroment));
    mEnviroment.mClearColor[0] = 0;
    mEnviroment.mClearColor[1] = 0;
    mEnviroment.mClearColor[2] = 0;
    mEnviroment.mClearColor[3] = 1;
    mEnviroment.mClearDepth = 1;
    mEnviroment.mClearStencil = 0;
    mEnviroment.mIsRoot = false;
    mEnviroment.mIsOrtho = true;

    mAccScript = NULL;
    mScript = NULL;
    mIsRoot = false;
    mIsOrtho = true;
    mScriptText = NULL;
    mScriptTextLength = 0;

}

void ScriptCState::runCompiler()
{
    mAccScript = accCreateScript();

    LOGE("Compiler 1");
    const char* scriptSource[] = {mScriptText};
    int scriptLength[] = {mScriptTextLength} ;
    const char* scriptSource[] = {mProgram.mScriptText};
    int scriptLength[] = {mProgram.mScriptTextLength} ;
    accScriptSource(mAccScript, 1, scriptSource, scriptLength);
    accCompileScript(mAccScript);
    accGetScriptLabel(mAccScript, "main", (ACCvoid**) &mScript);
    LOGE("Compiler 1");
    accGetScriptLabel(mAccScript, "main", (ACCvoid**) &mProgram.mScript);
}

namespace android {
@@ -449,22 +448,22 @@ void rsi_ScriptCBegin(Context * rsc)
void rsi_ScriptCSetClearColor(Context * rsc, float r, float g, float b, float a)
{
    ScriptCState *ss = &rsc->mScriptC;
    ss->mClearColor[0] = r;
    ss->mClearColor[1] = g;
    ss->mClearColor[2] = b;
    ss->mClearColor[3] = a;
    ss->mEnviroment.mClearColor[0] = r;
    ss->mEnviroment.mClearColor[1] = g;
    ss->mEnviroment.mClearColor[2] = b;
    ss->mEnviroment.mClearColor[3] = a;
}

void rsi_ScriptCSetClearDepth(Context * rsc, float v)
{
    ScriptCState *ss = &rsc->mScriptC;
    ss->mClearDepth = v;
    ss->mEnviroment.mClearDepth = v;
}

void rsi_ScriptCSetClearStencil(Context * rsc, uint32_t v)
{
    ScriptCState *ss = &rsc->mScriptC;
    ss->mClearStencil = v;
    ss->mEnviroment.mClearStencil = v;
}

void rsi_ScriptCAddType(Context * rsc, RsType vt)
@@ -473,30 +472,29 @@ void rsi_ScriptCAddType(Context * rsc, RsType vt)
    ss->mConstantBufferTypes.add(static_cast<const Type *>(vt));
}

void rsi_ScriptCSetScript(Context * rsc, void* accScript, void *vp)
void rsi_ScriptCSetScript(Context * rsc, void *vp)
{
    ScriptCState *ss = &rsc->mScriptC;
    ss->mAccScript = reinterpret_cast<ACCscript*>(accScript);
    ss->mScript = reinterpret_cast<rsc_RunScript>(vp);
    ss->mProgram.mScript = reinterpret_cast<rsc_RunScript>(vp);
}

void rsi_ScriptCSetRoot(Context * rsc, bool isRoot)
{
    ScriptCState *ss = &rsc->mScriptC;
    ss->mIsRoot = isRoot;
    ss->mEnviroment.mIsRoot = isRoot;
}

void rsi_ScriptCSetOrtho(Context * rsc, bool isOrtho)
{
    ScriptCState *ss = &rsc->mScriptC;
    ss->mIsOrtho = isOrtho;
    ss->mEnviroment.mIsOrtho = isOrtho;
}

void rsi_ScriptCSetText(Context *rsc, const char *text, uint32_t len)
{
    ScriptCState *ss = &rsc->mScriptC;
    ss->mScriptText = text;
    ss->mScriptTextLength = len;
    ss->mProgram.mScriptText = text;
    ss->mProgram.mScriptTextLength = len;
}


@@ -507,19 +505,12 @@ RsScript rsi_ScriptCCreate(Context * rsc)
    ss->runCompiler();

    ScriptC *s = new ScriptC();
    s->incRef();
    s->mAccScript = ss->mAccScript;
    ss->mAccScript = NULL;
    s->mScript = ss->mScript;
    s->mClearColor[0] = ss->mClearColor[0];
    s->mClearColor[1] = ss->mClearColor[1];
    s->mClearColor[2] = ss->mClearColor[2];
    s->mClearColor[3] = ss->mClearColor[3];
    s->mClearDepth = ss->mClearDepth;
    s->mClearStencil = ss->mClearStencil;
    s->mIsRoot = ss->mIsRoot;
    s->mIsOrtho = ss->mIsOrtho;
    s->mScriptText = ss->mScriptText;
    s->mScriptTextLength = ss->mScriptTextLength;
    s->mEnviroment = ss->mEnviroment;
    s->mProgram = ss->mProgram;
    ss->clear();
    return s;
}

+24 −12
Original line number Diff line number Diff line
@@ -36,15 +36,32 @@ public:
    ScriptC();
    virtual ~ScriptC();


    virtual bool run(Context *, uint32_t launchID);

    struct Program_t {
        const char * mScriptText;
        uint32_t mScriptTextLength;

    ACCscript*    mAccScript;
        bool useStateVertex;
        bool useStateRaster;
        bool useStateFragment;
        bool useStateStore;

        rsc_RunScript mScript;
    };

    struct Enviroment_t {
        bool mIsRoot;
        bool mIsOrtho;
        float mClearColor[4];
        float mClearDepth;
        uint32_t mClearStencil;
    };

    Program_t mProgram;
    Enviroment_t mEnviroment;

    ACCscript*    mAccScript;

    virtual bool run(Context *, uint32_t launchID);

    struct Env {
        Context *mContext;
@@ -60,14 +77,9 @@ public:
    ~ScriptCState();

    ACCscript* mAccScript;
    const char * mScriptText;
    uint32_t mScriptTextLength;
    rsc_RunScript mScript;
    float mClearColor[4];
    float mClearDepth;
    uint32_t mClearStencil;
    bool mIsRoot;
    bool mIsOrtho;

    ScriptC::Program_t mProgram;
    ScriptC::Enviroment_t mEnviroment;

    Vector<const Type *> mConstantBufferTypes;