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     void init();
35     void shutdown();
36 
getMaxInlineSize()37     size_t getMaxInlineSize() {
38         return mMaxInlineSize;
39     }
isPureFifo()40     bool isPureFifo() {
41         return mPureFifo;
42     }
43 
44     // Plays back commands from the client.
45     // Returns true if any commands were processed.
46     bool playCoreCommands(Context *con, int waitFd);
47 
48     void setTimeoutCallback(void (*)(void *), void *, uint64_t timeout);
49 
50     void * coreHeader(uint32_t, size_t dataLen);
51     void coreCommit();
52 
53     void coreSetReturn(const void *data, size_t dataLen);
54     void coreGetReturn(void *data, size_t dataLen);
55     void coreWrite(const void *data, size_t len);
56     void coreRead(void *data, size_t len);
57 
58     void asyncSetReturn(const void *data, size_t dataLen);
59     void asyncGetReturn(void *data, size_t dataLen);
60     void asyncWrite(const void *data, size_t len);
61     void asyncRead(void *data, size_t len);
62 
63 
64     RsMessageToClientType getClientHeader(size_t *receiveLen, uint32_t *usrID);
65     RsMessageToClientType getClientPayload(void *data, size_t *receiveLen, uint32_t *subID, size_t bufferLen);
66     bool sendToClient(RsMessageToClientType cmdID, uint32_t usrID, const void *data, size_t dataLen, bool waitForSpace);
67     void clientShutdown();
68 
69 
70 protected:
71     typedef struct CoreCmdHeaderRec {
72         uint32_t cmdID;
73         uint32_t bytes;
74     } CoreCmdHeader;
75     typedef struct ClientCmdHeaderRec {
76         uint32_t cmdID;
77         uint32_t bytes;
78         uint32_t userID;
79     } ClientCmdHeader;
80     ClientCmdHeader mLastClientHeader;
81 
82     bool mRunning;
83     bool mPureFifo;
84     size_t mMaxInlineSize;
85 
86     FifoSocket mToClient;
87     FifoSocket mToCore;
88 
89     intptr_t mToCoreRet;
90 
91     size_t mSendLen;
92     uint8_t mSendBuffer[2 * 1024] __attribute__((aligned(sizeof(double))));
93 
94 };
95 
96 
97 }
98 }
99 #endif
100 
101