1 /*
2  * Copyright (C) 2009 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #ifndef ANDROID_RS_THREAD_IO_H
18 #define ANDROID_RS_THREAD_IO_H
19 
20 #include "rsUtils.h"
21 #include "rsFifoSocket.h"
22 
23 // ---------------------------------------------------------------------------
24 namespace android {
25 namespace renderscript {
26 
27 class Context;
28 
29 class ThreadIO {
30 public:
31     ThreadIO();
32     ~ThreadIO();
33 
34     bool init();
35     void shutdown();
36 
getMaxInlineSize()37     size_t getMaxInlineSize() {
38         return mMaxInlineSize;
39     }
40 
41     // Plays back commands from the client.
42     // Returns true if any commands were processed.
43     bool playCoreCommands(Context *con, int waitFd);
44 
45     void setTimeoutCallback(void (*)(void *), void *, uint64_t timeout);
46 
47     void * coreHeader(uint32_t, size_t dataLen);
48     void coreCommit();
49 
50     void coreSetReturn(const void *data, size_t dataLen);
51     void coreGetReturn(void *data, size_t dataLen);
52     void coreWrite(const void *data, size_t len);
53     void coreRead(void *data, size_t len);
54 
55     void asyncSetReturn(const void *data, size_t dataLen);
56     void asyncGetReturn(void *data, size_t dataLen);
57     void asyncWrite(const void *data, size_t len);
58     void asyncRead(void *data, size_t len);
59 
60 
61     RsMessageToClientType getClientHeader(size_t *receiveLen, uint32_t *usrID);
62     RsMessageToClientType getClientPayload(void *data, size_t *receiveLen, uint32_t *subID, size_t bufferLen);
63     bool sendToClient(RsMessageToClientType cmdID, uint32_t usrID, const void *data, size_t dataLen, bool waitForSpace);
64     void clientShutdown();
65 
66 
67 protected:
68     typedef struct CoreCmdHeaderRec {
69         uint32_t cmdID;
70         uint32_t bytes;
71     } CoreCmdHeader;
72     typedef struct ClientCmdHeaderRec {
73         uint32_t cmdID;
74         uint32_t bytes;
75         uint32_t userID;
76     } ClientCmdHeader;
77     ClientCmdHeader mLastClientHeader;
78 
79     bool mRunning;
80     size_t mMaxInlineSize;
81 
82     FifoSocket mToClient;
83     FifoSocket mToCore;
84 
85     intptr_t mToCoreRet;
86 
87     size_t mSendLen;
88     uint8_t mSendBuffer[2 * 1024] __attribute__((aligned(sizeof(double))));
89 
90 };
91 
92 
93 } // namespace renderscript
94 } // namespace android
95 #endif
96 
97