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

Commit 3678f198 authored by Jason Sams's avatar Jason Sams Committed by Android (Google) Code Review
Browse files

Merge "Rough implemetation of ForEach. Remove launchID from root graphics script."

parents 12fc0af9 f17bccc9
Loading
Loading
Loading
Loading
+3 −3
Original line number Diff line number Diff line
@@ -127,14 +127,14 @@ void Context::deinitEGL()
}


uint32_t Context::runScript(Script *s, uint32_t launchID)
uint32_t Context::runScript(Script *s)
{
    ObjectBaseRef<ProgramFragment> frag(mFragment);
    ObjectBaseRef<ProgramVertex> vtx(mVertex);
    ObjectBaseRef<ProgramStore> store(mFragmentStore);
    ObjectBaseRef<ProgramRaster> raster(mRaster);

    uint32_t ret = s->run(this, launchID);
    uint32_t ret = s->run(this);

    mFragment.set(frag);
    mVertex.set(vtx);
@@ -157,7 +157,7 @@ uint32_t Context::runRootScript()

    timerSet(RS_TIMER_SCRIPT);
    mStateFragmentStore.mLast.clear();
    uint32_t ret = runScript(mRootScript.get(), 0);
    uint32_t ret = runScript(mRootScript.get());

    checkError("runRootScript");
    if (mError != RS_ERROR_NONE) {
+1 −1
Original line number Diff line number Diff line
@@ -107,7 +107,7 @@ public:

    uint32_t getMessageToClient(void *data, size_t *receiveLen, size_t bufferLen, bool wait);
    bool sendMessageToClient(void *data, uint32_t cmdID, size_t len, bool waitForSpace);
    uint32_t runScript(Script *s, uint32_t launchID);
    uint32_t runScript(Script *s);

    void initToClient();
    void deinitToClient();
+6 −2
Original line number Diff line number Diff line
@@ -64,9 +64,13 @@ public:

    void setVar(uint32_t slot, const void *val, uint32_t len);

    virtual void runForEach(Context *rsc, const Allocation *ain, Allocation *aout) = 0;
    virtual void runForEach(Context *rsc, const Allocation *ain, Allocation *aout, uint32_t xStart, uint32_t xEnd) = 0;
    virtual void runForEach(Context *rsc, const Allocation *ain, Allocation *aout, uint32_t xStart, uint32_t yStart, uint32_t xEnd, uint32_t yEnd) = 0;

    virtual void Invoke(Context *rsc, uint32_t slot, const void *data, uint32_t len) = 0;
    virtual void setupScript() = 0;
    virtual uint32_t run(Context *, uint32_t launchID) = 0;
    virtual void setupScript(Context *rsc) = 0;
    virtual uint32_t run(Context *) = 0;
};


+72 −25
Original line number Diff line number Diff line
@@ -49,8 +49,12 @@ ScriptC::~ScriptC()
    mEnviroment.mScriptText = NULL;
}

void ScriptC::setupScript()
void ScriptC::setupScript(Context *rsc)
{
    setupGLState(rsc);
    mEnviroment.mStartTimeMillis
                = nanoseconds_to_milliseconds(systemTime(SYSTEM_TIME_MONOTONIC));

    for (uint32_t ct=0; ct < mEnviroment.mFieldCount; ct++) {
        if (!mSlots[ct].get())
            continue;
@@ -87,29 +91,19 @@ const Allocation *ScriptC::ptrToAllocation(const void *ptr) const
    return NULL;
}

void ScriptC::setTLS()
Script * ScriptC::setTLS(Script *sc)
{
    Context::ScriptTLSStruct * tls = (Context::ScriptTLSStruct *)
                                  pthread_getspecific(Context::gThreadTLSKey);
    rsAssert(tls);
    tls->mScript = this;
    Script *old = tls->mScript;
    tls->mScript = sc;
    return old;
}

void ScriptC::clearTLS()
{
    Context::ScriptTLSStruct * tls = (Context::ScriptTLSStruct *)
                                  pthread_getspecific(Context::gThreadTLSKey);
    rsAssert(tls);
    tls->mScript = NULL;
}

uint32_t ScriptC::run(Context *rsc, uint32_t launchIndex)
void ScriptC::setupGLState(Context *rsc)
{
    if (mProgram.mRoot == NULL) {
        rsc->setError(RS_ERROR_BAD_SCRIPT, "Attempted to run bad script");
        return 0;
    }

    if (mEnviroment.mFragmentStore.get()) {
        rsc->setFragmentStore(mEnviroment.mFragmentStore.get());
    }
@@ -122,22 +116,75 @@ uint32_t ScriptC::run(Context *rsc, uint32_t launchIndex)
    if (mEnviroment.mRaster.get()) {
        rsc->setRaster(mEnviroment.mRaster.get());
    }
}

    if (launchIndex == 0) {
        mEnviroment.mStartTimeMillis
                = nanoseconds_to_milliseconds(systemTime(SYSTEM_TIME_MONOTONIC));
uint32_t ScriptC::run(Context *rsc)
{
    if (mProgram.mRoot == NULL) {
        rsc->setError(RS_ERROR_BAD_SCRIPT, "Attempted to run bad script");
        return 0;
    }
    setupScript();

    setupScript(rsc);

    uint32_t ret = 0;
    setTLS();
    Script * oldTLS = setTLS(this);
    //LOGE("ScriptC::run %p", mProgram.mRoot);
    ret = mProgram.mRoot();
    clearTLS();
    setTLS(oldTLS);
    //LOGE("ScriptC::run ret %i", ret);
    return ret;
}

void ScriptC::runForEach(Context *rsc, const Allocation *ain, Allocation *aout,
                         uint32_t xStart, uint32_t yStart, uint32_t xEnd, uint32_t yEnd)
{
    LOGE("ScriptC::runForEach not implemented");
}

void ScriptC::runForEach(Context *rsc, const Allocation *ain, Allocation *aout, uint32_t xStart, uint32_t xEnd)
{
    uint32_t dimX = ain->getType()->getDimX();
    rsAssert(xStart < dimX);
    rsAssert(xEnd <= dimX);
    rsAssert(ain->getType()->getDimY() == 0);
    rsAssert(ain->getType()->getDimZ() == 0);

    if (xStart >= dimX) xStart = dimX - 1;
    if (xEnd >= dimX) xEnd = dimX - 1;
    if (xStart > xEnd) return;

    setupScript(rsc);
    Script * oldTLS = setTLS(this);

    typedef int (*rs_t)(const void *, void *, uint32_t);
    const uint8_t *ptrIn = (const uint8_t *)ain->getPtr();
    uint32_t strideIn = ain->getType()->getElementSizeBytes();

    uint8_t *ptrOut = NULL;
    uint32_t strideOut = 0;
    if (aout) {
        ptrOut = (uint8_t *)aout->getPtr();
        strideOut = aout->getType()->getElementSizeBytes();
    }

    for (uint32_t ct=xStart; ct < xEnd; ct++) {
        ((rs_t)mProgram.mRoot) (ptrIn + (strideIn * ct), ptrOut + (strideOut * ct), ct);
    }

    setTLS(oldTLS);
}

void ScriptC::runForEach(Context *rsc, const Allocation *ain, Allocation *aout)
{
    if (ain->getType()->getDimY()) {
        runForEach(rsc, ain, aout, 0, 0, 0xffffffff, 0xffffffff);
    } else {
        runForEach(rsc, ain, aout, 0, 0xffffffff);
    }
}


void ScriptC::Invoke(Context *rsc, uint32_t slot, const void *data, uint32_t len)
{
    //LOGE("rsi_ScriptInvoke %i", slot);
@@ -146,8 +193,8 @@ void ScriptC::Invoke(Context *rsc, uint32_t slot, const void *data, uint32_t len
        rsc->setError(RS_ERROR_BAD_SCRIPT, "Calling invoke on bad script");
        return;
    }
    setupScript();
    setTLS();
    setupScript(rsc);
    Script * oldTLS = setTLS(this);

    const uint32_t * dPtr = (const uint32_t *)data;
    switch(len) {
@@ -175,7 +222,7 @@ void ScriptC::Invoke(Context *rsc, uint32_t slot, const void *data, uint32_t len
         mEnviroment.mInvokeFunctions[slot])(dPtr[0], dPtr[1], dPtr[2], dPtr[3], dPtr[4]);
        break;
    }
    clearTLS();
    setTLS(oldTLS);
}

ScriptCState::ScriptCState()
+12 −5
Original line number Diff line number Diff line
@@ -52,17 +52,24 @@ public:

    const Allocation *ptrToAllocation(const void *) const;

    void setTLS();
    void clearTLS();

    virtual void Invoke(Context *rsc, uint32_t slot, const void *data, uint32_t len);

    virtual void setupScript();
    virtual uint32_t run(Context *, uint32_t launchID);
    virtual uint32_t run(Context *);

    virtual void runForEach(Context *rsc, const Allocation *ain, Allocation *aout);
    virtual void runForEach(Context *rsc, const Allocation *ain, Allocation *aout, uint32_t xStart, uint32_t xEnd);
    virtual void runForEach(Context *rsc, const Allocation *ain, Allocation *aout, uint32_t xStart, uint32_t yStart, uint32_t xEnd, uint32_t yEnd);


    virtual void serialize(OStream *stream) const {    }
    virtual A3DClassID getClassId() const { return A3D_CLASS_ID_SCRIPT_C; }
    static Type *createFromStream(Context *rsc, IStream *stream) { return NULL; }

protected:
    void setupScript(Context *);
    void setupGLState(Context *);
    Script * setTLS(Script *);
};

class ScriptCState
Loading