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

Commit f17bccc9 authored by Jason Sams's avatar Jason Sams
Browse files

Rough implemetation of ForEach.

Remove launchID from root graphics script.

Change-Id: I9f80c0d4df1264f2ee1624a6d7216b9dfdf8502e
parent 3255823d
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