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

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

Merge "Core to client fifo on sockets."

parents eb00a7e4 edbfabdb
Loading
Loading
Loading
Loading
+7 −4
Original line number Original line Diff line number Diff line
@@ -68,9 +68,9 @@ public class RenderScript {
    native int  nDeviceCreate();
    native int  nDeviceCreate();
    native void nDeviceDestroy(int dev);
    native void nDeviceDestroy(int dev);
    native void nDeviceSetConfig(int dev, int param, int value);
    native void nDeviceSetConfig(int dev, int param, int value);
    native void nContextGetUserMessage(int con, int[] data);
    native int nContextGetUserMessage(int con, int[] data);
    native String nContextGetErrorMessage(int con);
    native String nContextGetErrorMessage(int con);
    native int  nContextPeekMessage(int con, int[] subID, boolean wait);
    native int  nContextPeekMessage(int con, int[] subID);
    native void nContextInitToClient(int con);
    native void nContextInitToClient(int con);
    native void nContextDeinitToClient(int con);
    native void nContextDeinitToClient(int con);


@@ -736,7 +736,7 @@ public class RenderScript {
            mRS.nContextInitToClient(mRS.mContext);
            mRS.nContextInitToClient(mRS.mContext);
            while(mRun) {
            while(mRun) {
                rbuf[0] = 0;
                rbuf[0] = 0;
                int msg = mRS.nContextPeekMessage(mRS.mContext, mAuxData, true);
                int msg = mRS.nContextPeekMessage(mRS.mContext, mAuxData);
                int size = mAuxData[1];
                int size = mAuxData[1];
                int subID = mAuxData[0];
                int subID = mAuxData[0];


@@ -744,7 +744,10 @@ public class RenderScript {
                    if ((size>>2) >= rbuf.length) {
                    if ((size>>2) >= rbuf.length) {
                        rbuf = new int[(size + 3) >> 2];
                        rbuf = new int[(size + 3) >> 2];
                    }
                    }
                    mRS.nContextGetUserMessage(mRS.mContext, rbuf);
                    if (mRS.nContextGetUserMessage(mRS.mContext, rbuf) !=
                        RS_MESSAGE_TO_CLIENT_USER) {
                        throw new RSDriverException("Error processing message from Renderscript.");
                    }


                    if(mRS.mMessageCallback != null) {
                    if(mRS.mMessageCallback != null) {
                        mRS.mMessageCallback.mData = rbuf;
                        mRS.mMessageCallback.mData = rbuf;
+8 −9
Original line number Original line Diff line number Diff line
@@ -240,15 +240,14 @@ nContextGetErrorMessage(JNIEnv *_env, jobject _this, RsContext con)
    int id = rsContextGetMessage(con,
    int id = rsContextGetMessage(con,
                                 buf, sizeof(buf),
                                 buf, sizeof(buf),
                                 &receiveLen, sizeof(receiveLen),
                                 &receiveLen, sizeof(receiveLen),
                                 &subID, sizeof(subID),
                                 &subID, sizeof(subID));
                                 true);
    if (!id && receiveLen) {
    if (!id && receiveLen) {
        LOGV("message receive buffer too small.  %i", receiveLen);
        LOGV("message receive buffer too small.  %i", receiveLen);
    }
    }
    return _env->NewStringUTF(buf);
    return _env->NewStringUTF(buf);
}
}


static void
static jint
nContextGetUserMessage(JNIEnv *_env, jobject _this, RsContext con, jintArray data)
nContextGetUserMessage(JNIEnv *_env, jobject _this, RsContext con, jintArray data)
{
{
    jint len = _env->GetArrayLength(data);
    jint len = _env->GetArrayLength(data);
@@ -259,23 +258,23 @@ nContextGetUserMessage(JNIEnv *_env, jobject _this, RsContext con, jintArray dat
    int id = rsContextGetMessage(con,
    int id = rsContextGetMessage(con,
                                 ptr, len * 4,
                                 ptr, len * 4,
                                 &receiveLen, sizeof(receiveLen),
                                 &receiveLen, sizeof(receiveLen),
                                 &subID, sizeof(subID),
                                 &subID, sizeof(subID));
                                 true);
    if (!id && receiveLen) {
    if (!id && receiveLen) {
        LOGV("message receive buffer too small.  %i", receiveLen);
        LOGV("message receive buffer too small.  %i", receiveLen);
    }
    }
    _env->ReleaseIntArrayElements(data, ptr, 0);
    _env->ReleaseIntArrayElements(data, ptr, 0);
    return id;
}
}


static jint
static jint
nContextPeekMessage(JNIEnv *_env, jobject _this, RsContext con, jintArray auxData, jboolean wait)
nContextPeekMessage(JNIEnv *_env, jobject _this, RsContext con, jintArray auxData)
{
{
    LOG_API("nContextPeekMessage, con(%p)", con);
    LOG_API("nContextPeekMessage, con(%p)", con);
    jint *auxDataPtr = _env->GetIntArrayElements(auxData, NULL);
    jint *auxDataPtr = _env->GetIntArrayElements(auxData, NULL);
    size_t receiveLen;
    size_t receiveLen;
    uint32_t subID;
    uint32_t subID;
    int id = rsContextPeekMessage(con, &receiveLen, sizeof(receiveLen),
    int id = rsContextPeekMessage(con, &receiveLen, sizeof(receiveLen),
                                  &subID, sizeof(subID), wait);
                                  &subID, sizeof(subID));
    auxDataPtr[0] = (jint)subID;
    auxDataPtr[0] = (jint)subID;
    auxDataPtr[1] = (jint)receiveLen;
    auxDataPtr[1] = (jint)receiveLen;
    _env->ReleaseIntArrayElements(auxData, auxDataPtr, 0);
    _env->ReleaseIntArrayElements(auxData, auxDataPtr, 0);
@@ -1160,9 +1159,9 @@ static JNINativeMethod methods[] = {
{"nDeviceCreate",                  "()I",                                     (void*)nDeviceCreate },
{"nDeviceCreate",                  "()I",                                     (void*)nDeviceCreate },
{"nDeviceDestroy",                 "(I)V",                                    (void*)nDeviceDestroy },
{"nDeviceDestroy",                 "(I)V",                                    (void*)nDeviceDestroy },
{"nDeviceSetConfig",               "(III)V",                                  (void*)nDeviceSetConfig },
{"nDeviceSetConfig",               "(III)V",                                  (void*)nDeviceSetConfig },
{"nContextGetUserMessage",         "(I[I)V",                                  (void*)nContextGetUserMessage },
{"nContextGetUserMessage",         "(I[I)I",                                  (void*)nContextGetUserMessage },
{"nContextGetErrorMessage",        "(I)Ljava/lang/String;",                   (void*)nContextGetErrorMessage },
{"nContextGetErrorMessage",        "(I)Ljava/lang/String;",                   (void*)nContextGetErrorMessage },
{"nContextPeekMessage",            "(I[IZ)I",                                 (void*)nContextPeekMessage },
{"nContextPeekMessage",            "(I[I)I",                                  (void*)nContextPeekMessage },


{"nContextInitToClient",           "(I)V",                                    (void*)nContextInitToClient },
{"nContextInitToClient",           "(I)V",                                    (void*)nContextInitToClient },
{"nContextDeinitToClient",         "(I)V",                                    (void*)nContextDeinitToClient },
{"nContextDeinitToClient",         "(I)V",                                    (void*)nContextDeinitToClient },
+3 −5
Original line number Original line Diff line number Diff line
@@ -45,16 +45,14 @@ ContextGetMessage {
    direct
    direct
    param void *data
    param void *data
    param size_t *receiveLen
    param size_t *receiveLen
    param uint32_t *subID
    param uint32_t *usrID
    param bool wait
    ret RsMessageToClientType
    ret RsMessageToClientType
}
}


ContextPeekMessage {
ContextPeekMessage {
    direct
    direct
    param size_t *receiveLen
    param size_t *receiveLen
    param uint32_t *subID
    param uint32_t *usrID
    param bool wait
    ret RsMessageToClientType
    ret RsMessageToClientType
}
}


@@ -106,7 +104,7 @@ AllocationCubeCreateFromBitmap {




ContextFinish {
ContextFinish {
	handcodeApi
	sync
	}
	}


ContextBindRootScript {
ContextBindRootScript {
+14 −63
Original line number Original line Diff line number Diff line
@@ -344,6 +344,8 @@ Context * Context::createContext(Device *dev, const RsSurfaceConfig *sc) {
bool Context::initContext(Device *dev, const RsSurfaceConfig *sc) {
bool Context::initContext(Device *dev, const RsSurfaceConfig *sc) {
    pthread_mutex_lock(&gInitMutex);
    pthread_mutex_lock(&gInitMutex);


    mIO.init();

    dev->addContext(this);
    dev->addContext(this);
    mDev = dev;
    mDev = dev;
    if (sc) {
    if (sc) {
@@ -393,7 +395,7 @@ bool Context::initContext(Device *dev, const RsSurfaceConfig *sc) {
Context::~Context() {
Context::~Context() {
    LOGV("Context::~Context");
    LOGV("Context::~Context");


    mIO.mToCore.flush();
    mIO.coreFlush();
    rsAssert(mExit);
    rsAssert(mExit);
    mExit = true;
    mExit = true;
    mPaused = false;
    mPaused = false;
@@ -505,69 +507,18 @@ void Context::removeName(ObjectBase *obj) {
    }
    }
}
}


RsMessageToClientType Context::peekMessageToClient(size_t *receiveLen, uint32_t *subID, bool wait) {
RsMessageToClientType Context::peekMessageToClient(size_t *receiveLen, uint32_t *subID) {
    *receiveLen = 0;
    return (RsMessageToClientType)mIO.getClientHeader(receiveLen, subID);
    if (!wait && mIO.mToClient.isEmpty()) {
        return RS_MESSAGE_TO_CLIENT_NONE;
}
}


    uint32_t bytesData = 0;
RsMessageToClientType Context::getMessageToClient(void *data, size_t *receiveLen, uint32_t *subID, size_t bufferLen) {
    uint32_t commandID = 0;
    return (RsMessageToClientType)mIO.getClientPayload(data, receiveLen, subID, bufferLen);
    const uint32_t *d = (const uint32_t *)mIO.mToClient.get(&commandID, &bytesData);
    *receiveLen = bytesData - sizeof(uint32_t);
    if (bytesData) {
        *subID = d[0];
    }
    return (RsMessageToClientType)commandID;
}

RsMessageToClientType Context::getMessageToClient(void *data, size_t *receiveLen, uint32_t *subID, size_t bufferLen, bool wait) {
    //LOGE("getMessageToClient %i %i", bufferLen, wait);
    *receiveLen = 0;
    if (!wait && mIO.mToClient.isEmpty()) {
        return RS_MESSAGE_TO_CLIENT_NONE;
    }

    //LOGE("getMessageToClient 2 con=%p", this);
    uint32_t bytesData = 0;
    uint32_t commandID = 0;
    const uint32_t *d = (const uint32_t *)mIO.mToClient.get(&commandID, &bytesData);
    //LOGE("getMessageToClient 3    %i  %i", commandID, bytesData);

    *receiveLen = bytesData - sizeof(uint32_t);
    *subID = d[0];

    //LOGE("getMessageToClient  %i %i", commandID, *subID);
    if (bufferLen >= (*receiveLen)) {
        memcpy(data, d+1, *receiveLen);
        mIO.mToClient.next();
        return (RsMessageToClientType)commandID;
    }
    return RS_MESSAGE_TO_CLIENT_RESIZE;
}
}


bool Context::sendMessageToClient(const void *data, RsMessageToClientType cmdID,
bool Context::sendMessageToClient(const void *data, RsMessageToClientType cmdID,
                                  uint32_t subID, size_t len, bool waitForSpace) const {
                                  uint32_t subID, size_t len, bool waitForSpace) const {
    //LOGE("sendMessageToClient %i %i %i %i", cmdID, subID, len, waitForSpace);

    if (cmdID == 0) {
    return mIO.sendToClient(cmdID, subID, data, len, waitForSpace);
        LOGE("Attempting to send invalid command 0 to client.");
        return false;
    }
    if (!waitForSpace) {
        if (!mIO.mToClient.makeSpaceNonBlocking(len + 12)) {
            // Not enough room, and not waiting.
            return false;
        }
    }
    //LOGE("sendMessageToClient 2");
    uint32_t *p = (uint32_t *)mIO.mToClient.reserve(len + sizeof(subID));
    p[0] = subID;
    if (len > 0) {
        memcpy(p+1, data, len);
    }
    mIO.mToClient.commit(cmdID, len + sizeof(subID));
    //LOGE("sendMessageToClient 3");
    return true;
}
}


void Context::initToClient() {
void Context::initToClient() {
@@ -577,7 +528,7 @@ void Context::initToClient() {
}
}


void Context::deinitToClient() {
void Context::deinitToClient() {
    mIO.mToClient.shutdown();
    mIO.clientShutdown();
}
}


void Context::setError(RsError e, const char *msg) const {
void Context::setError(RsError e, const char *msg) const {
@@ -706,16 +657,16 @@ RsContext rsi_ContextCreateGL(RsDevice vdev, uint32_t version,


RsMessageToClientType rsi_ContextPeekMessage(Context *rsc,
RsMessageToClientType rsi_ContextPeekMessage(Context *rsc,
                                           size_t * receiveLen, size_t receiveLen_length,
                                           size_t * receiveLen, size_t receiveLen_length,
                                           uint32_t * subID, size_t subID_length, bool wait) {
                                           uint32_t * subID, size_t subID_length) {
    return rsc->peekMessageToClient(receiveLen, subID, wait);
    return rsc->peekMessageToClient(receiveLen, subID);
}
}


RsMessageToClientType rsi_ContextGetMessage(Context *rsc, void * data, size_t data_length,
RsMessageToClientType rsi_ContextGetMessage(Context *rsc, void * data, size_t data_length,
                                          size_t * receiveLen, size_t receiveLen_length,
                                          size_t * receiveLen, size_t receiveLen_length,
                                          uint32_t * subID, size_t subID_length, bool wait) {
                                          uint32_t * subID, size_t subID_length) {
    rsAssert(subID_length == sizeof(uint32_t));
    rsAssert(subID_length == sizeof(uint32_t));
    rsAssert(receiveLen_length == sizeof(size_t));
    rsAssert(receiveLen_length == sizeof(size_t));
    return rsc->getMessageToClient(data, receiveLen, subID, data_length, wait);
    return rsc->getMessageToClient(data, receiveLen, subID, data_length);
}
}


void rsi_ContextInitToClient(Context *rsc) {
void rsi_ContextInitToClient(Context *rsc) {
+2 −2
Original line number Original line Diff line number Diff line
@@ -143,8 +143,8 @@ public:
    void assignName(ObjectBase *obj, const char *name, uint32_t len);
    void assignName(ObjectBase *obj, const char *name, uint32_t len);
    void removeName(ObjectBase *obj);
    void removeName(ObjectBase *obj);


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


Loading