10f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines/*
20f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * Copyright (C) 2009 The Android Open Source Project
30f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines *
40f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * Licensed under the Apache License, Version 2.0 (the "License");
50f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * you may not use this file except in compliance with the License.
60f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * You may obtain a copy of the License at
70f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines *
80f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines *      http://www.apache.org/licenses/LICENSE-2.0
90f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines *
100f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * Unless required by applicable law or agreed to in writing, software
110f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * distributed under the License is distributed on an "AS IS" BASIS,
120f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
130f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * See the License for the specific language governing permissions and
140f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * limitations under the License.
150f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines */
160f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
170f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines#ifndef ANDROID_RS_THREAD_IO_H
180f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines#define ANDROID_RS_THREAD_IO_H
190f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
200f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines#include "rsUtils.h"
210f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines#include "rsFifoSocket.h"
220f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
230f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines// ---------------------------------------------------------------------------
240f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesnamespace android {
250f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesnamespace renderscript {
260f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
270f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesclass Context;
280f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
290f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesclass ThreadIO {
300f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinespublic:
310f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    ThreadIO();
320f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    ~ThreadIO();
330f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
340f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    void init();
350f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    void shutdown();
360f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
370f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    size_t getMaxInlineSize() {
380f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        return mMaxInlineSize;
390f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    }
400f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    bool isPureFifo() {
410f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        return mPureFifo;
420f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    }
430f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
440f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    // Plays back commands from the client.
450f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    // Returns true if any commands were processed.
460f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    bool playCoreCommands(Context *con, int waitFd);
470f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
480f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    void setTimeoutCallback(void (*)(void *), void *, uint64_t timeout);
490f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
500f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    void * coreHeader(uint32_t, size_t dataLen);
510f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    void coreCommit();
520f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
530f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    void coreSetReturn(const void *data, size_t dataLen);
540f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    void coreGetReturn(void *data, size_t dataLen);
550f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    void coreWrite(const void *data, size_t len);
560f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    void coreRead(void *data, size_t len);
570f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
580f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    void asyncSetReturn(const void *data, size_t dataLen);
590f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    void asyncGetReturn(void *data, size_t dataLen);
600f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    void asyncWrite(const void *data, size_t len);
610f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    void asyncRead(void *data, size_t len);
620f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
630f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
640f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    RsMessageToClientType getClientHeader(size_t *receiveLen, uint32_t *usrID);
650f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    RsMessageToClientType getClientPayload(void *data, size_t *receiveLen, uint32_t *subID, size_t bufferLen);
660f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    bool sendToClient(RsMessageToClientType cmdID, uint32_t usrID, const void *data, size_t dataLen, bool waitForSpace);
670f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    void clientShutdown();
680f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
690f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
700f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesprotected:
710f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    typedef struct CoreCmdHeaderRec {
720f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        uint32_t cmdID;
730f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        uint32_t bytes;
740f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    } CoreCmdHeader;
750f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    typedef struct ClientCmdHeaderRec {
760f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        uint32_t cmdID;
770f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        uint32_t bytes;
780f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        uint32_t userID;
790f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    } ClientCmdHeader;
800f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    ClientCmdHeader mLastClientHeader;
810f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
820f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    bool mRunning;
830f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    bool mPureFifo;
840f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    size_t mMaxInlineSize;
850f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
860f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    FifoSocket mToClient;
870f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    FifoSocket mToCore;
880f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
890f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    intptr_t mToCoreRet;
900f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
910f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    size_t mSendLen;
92ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams    uint8_t mSendBuffer[2 * 1024] __attribute__((aligned(sizeof(double))));
930f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
940f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines};
950f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
960f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
970f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}
980f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}
990f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines#endif
1000f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
101