blob: 191777428712f82b429e73e0709fc09bc26632d3 [file] [log] [blame]
Jason Samsd19f10d2009-05-22 14:03:28 -07001/*
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#include "rsContext.h"
18
Jason Samsd19f10d2009-05-22 14:03:28 -070019#include "rsThreadIO.h"
20
21using namespace android;
22using namespace android::renderscript;
23
Alex Sakhartchouk1bfccea2011-07-13 17:32:05 -070024ThreadIO::ThreadIO() : mUsingSocket(false) {
Jason Samsd19f10d2009-05-22 14:03:28 -070025}
26
Alex Sakhartchouked9f2102010-11-09 17:00:54 -080027ThreadIO::~ThreadIO() {
Jason Samsd19f10d2009-05-22 14:03:28 -070028}
29
Jason Samsedbfabd2011-05-17 15:01:29 -070030void ThreadIO::init(bool useSocket) {
31 mUsingSocket = useSocket;
Alex Sakhartchouk1bfccea2011-07-13 17:32:05 -070032 mToCore.init(16 * 1024);
Jason Samsedbfabd2011-05-17 15:01:29 -070033
34 if (mUsingSocket) {
35 mToClientSocket.init();
36 mToCoreSocket.init();
37 } else {
38 mToClient.init(1024);
39 }
Jason Samsf5b45962009-08-25 14:49:07 -070040}
41
Jason Samsedbfabd2011-05-17 15:01:29 -070042void ThreadIO::shutdown() {
Steve Block3762c312012-01-06 19:20:56 +000043 //ALOGE("shutdown 1");
Jason Samsedbfabd2011-05-17 15:01:29 -070044 mToCore.shutdown();
Steve Block3762c312012-01-06 19:20:56 +000045 //ALOGE("shutdown 2");
Jason Samsedbfabd2011-05-17 15:01:29 -070046}
47
48void ThreadIO::coreFlush() {
Steve Block3762c312012-01-06 19:20:56 +000049 //ALOGE("coreFlush 1");
Jason Samsedbfabd2011-05-17 15:01:29 -070050 if (mUsingSocket) {
51 } else {
52 mToCore.flush();
53 }
Steve Block3762c312012-01-06 19:20:56 +000054 //ALOGE("coreFlush 2");
Jason Samsedbfabd2011-05-17 15:01:29 -070055}
56
57void * ThreadIO::coreHeader(uint32_t cmdID, size_t dataLen) {
Steve Block3762c312012-01-06 19:20:56 +000058 //ALOGE("coreHeader %i %i", cmdID, dataLen);
Jason Samsedbfabd2011-05-17 15:01:29 -070059 if (mUsingSocket) {
60 CoreCmdHeader hdr;
61 hdr.bytes = dataLen;
62 hdr.cmdID = cmdID;
63 mToCoreSocket.writeAsync(&hdr, sizeof(hdr));
64 } else {
65 mCoreCommandSize = dataLen;
66 mCoreCommandID = cmdID;
67 mCoreDataPtr = (uint8_t *)mToCore.reserve(dataLen);
68 mCoreDataBasePtr = mCoreDataPtr;
69 }
Steve Block3762c312012-01-06 19:20:56 +000070 //ALOGE("coreHeader ret %p", mCoreDataPtr);
Jason Samsedbfabd2011-05-17 15:01:29 -070071 return mCoreDataPtr;
72}
73
74void ThreadIO::coreData(const void *data, size_t dataLen) {
Steve Block3762c312012-01-06 19:20:56 +000075 //ALOGE("coreData %p %i", data, dataLen);
Jason Samsedbfabd2011-05-17 15:01:29 -070076 mToCoreSocket.writeAsync(data, dataLen);
Steve Block3762c312012-01-06 19:20:56 +000077 //ALOGE("coreData ret %p", mCoreDataPtr);
Jason Samsedbfabd2011-05-17 15:01:29 -070078}
79
80void ThreadIO::coreCommit() {
Steve Block3762c312012-01-06 19:20:56 +000081 //ALOGE("coreCommit %p %p %i", mCoreDataPtr, mCoreDataBasePtr, mCoreCommandSize);
Jason Samsedbfabd2011-05-17 15:01:29 -070082 if (mUsingSocket) {
83 } else {
84 rsAssert((size_t)(mCoreDataPtr - mCoreDataBasePtr) <= mCoreCommandSize);
85 mToCore.commit(mCoreCommandID, mCoreCommandSize);
86 }
Steve Block3762c312012-01-06 19:20:56 +000087 //ALOGE("coreCommit ret");
Jason Samsedbfabd2011-05-17 15:01:29 -070088}
89
90void ThreadIO::coreCommitSync() {
Steve Block3762c312012-01-06 19:20:56 +000091 //ALOGE("coreCommitSync %p %p %i", mCoreDataPtr, mCoreDataBasePtr, mCoreCommandSize);
Jason Samsedbfabd2011-05-17 15:01:29 -070092 if (mUsingSocket) {
93 } else {
94 rsAssert((size_t)(mCoreDataPtr - mCoreDataBasePtr) <= mCoreCommandSize);
95 mToCore.commitSync(mCoreCommandID, mCoreCommandSize);
96 }
Steve Block3762c312012-01-06 19:20:56 +000097 //ALOGE("coreCommitSync ret");
Jason Samsedbfabd2011-05-17 15:01:29 -070098}
99
100void ThreadIO::clientShutdown() {
Steve Block3762c312012-01-06 19:20:56 +0000101 //ALOGE("coreShutdown 1");
Jason Samsedbfabd2011-05-17 15:01:29 -0700102 mToClient.shutdown();
Steve Block3762c312012-01-06 19:20:56 +0000103 //ALOGE("coreShutdown 2");
Jason Samsedbfabd2011-05-17 15:01:29 -0700104}
105
106void ThreadIO::coreSetReturn(const void *data, size_t dataLen) {
107 rsAssert(dataLen <= sizeof(mToCoreRet));
108 memcpy(&mToCoreRet, data, dataLen);
109}
110
111void ThreadIO::coreGetReturn(void *data, size_t dataLen) {
112 memcpy(data, &mToCoreRet, dataLen);
113}
114
Jason Sams5316b9e2011-09-13 15:41:01 -0700115void ThreadIO::setTimoutCallback(void (*cb)(void *), void *dat, uint64_t timeout) {
116 mToCore.setTimoutCallback(cb, dat, timeout);
117}
118
Jason Samsedbfabd2011-05-17 15:01:29 -0700119
Jason Samsbfc78912011-08-12 15:05:15 -0700120bool ThreadIO::playCoreCommands(Context *con, bool waitForCommand, uint64_t timeToWait) {
Jason Samsa09f11d2009-06-04 17:58:03 -0700121 bool ret = false;
Jason Samsbfc78912011-08-12 15:05:15 -0700122 uint64_t startTime = con->getTime();
123
Alex Sakhartchouked9f2102010-11-09 17:00:54 -0800124 while (!mToCore.isEmpty() || waitForCommand) {
Jason Samsf4d16062009-08-19 12:17:14 -0700125 uint32_t cmdID = 0;
126 uint32_t cmdSize = 0;
Jason Sams66b27712009-09-25 15:25:00 -0700127 if (con->props.mLogTimes) {
Joe Onorato9ac2c662009-09-23 16:37:36 -0700128 con->timerSet(Context::RS_TIMER_IDLE);
129 }
Jason Samsbfc78912011-08-12 15:05:15 -0700130
131 uint64_t delay = 0;
132 if (waitForCommand) {
133 delay = timeToWait - (con->getTime() - startTime);
134 if (delay > timeToWait) {
135 delay = 0;
136 }
137 }
Stephen Hinese3f9cc62012-01-26 17:09:43 -0800138
139 if (delay == 0 && timeToWait != 0 && mToCore.isEmpty()) {
140 break;
141 }
142
Jason Samsbfc78912011-08-12 15:05:15 -0700143 const void * data = mToCore.get(&cmdID, &cmdSize, delay);
Jason Samsa9e7a052009-09-25 14:51:22 -0700144 if (!cmdSize) {
Jason Samsbfc78912011-08-12 15:05:15 -0700145 // exception or timeout occurred.
Stephen Hinese3f9cc62012-01-26 17:09:43 -0800146 break;
Jason Samsa9e7a052009-09-25 14:51:22 -0700147 }
Stephen Hinese3f9cc62012-01-26 17:09:43 -0800148 ret = true;
Jason Sams66b27712009-09-25 15:25:00 -0700149 if (con->props.mLogTimes) {
Joe Onorato9ac2c662009-09-23 16:37:36 -0700150 con->timerSet(Context::RS_TIMER_INTERNAL);
151 }
Jason Sams5f7fc272009-06-18 16:58:42 -0700152 waitForCommand = false;
Steve Block71f2cf12011-10-20 11:56:00 +0100153 //ALOGV("playCoreCommands 3 %i %i", cmdID, cmdSize);
Jason Samsd19f10d2009-05-22 14:03:28 -0700154
Jason Sams300406a2011-01-16 14:54:28 -0800155 if (cmdID >= (sizeof(gPlaybackFuncs) / sizeof(void *))) {
156 rsAssert(cmdID < (sizeof(gPlaybackFuncs) / sizeof(void *)));
Steve Block3762c312012-01-06 19:20:56 +0000157 ALOGE("playCoreCommands error con %p, cmd %i", con, cmdID);
Jason Samsd1ac9812011-01-18 18:12:26 -0800158 mToCore.printDebugData();
Jason Sams300406a2011-01-16 14:54:28 -0800159 }
Jason Samsa08526a2011-04-27 15:12:49 -0700160 gPlaybackFuncs[cmdID](con, data, cmdSize << 2);
Jason Samsd19f10d2009-05-22 14:03:28 -0700161 mToCore.next();
Jason Samsd19f10d2009-05-22 14:03:28 -0700162 }
Jason Samsa09f11d2009-06-04 17:58:03 -0700163 return ret;
Jason Samsd19f10d2009-05-22 14:03:28 -0700164}
165
Jason Samsedbfabd2011-05-17 15:01:29 -0700166RsMessageToClientType ThreadIO::getClientHeader(size_t *receiveLen, uint32_t *usrID) {
167 if (mUsingSocket) {
168 mToClientSocket.read(&mLastClientHeader, sizeof(mLastClientHeader));
169 } else {
170 size_t bytesData = 0;
Alex Sakhartchouk17a8a192011-06-03 10:18:01 -0700171 const uint32_t *d = (const uint32_t *)mToClient.get(&mLastClientHeader.cmdID, (uint32_t*)&bytesData);
Jason Samsedbfabd2011-05-17 15:01:29 -0700172 if (bytesData >= sizeof(uint32_t)) {
173 mLastClientHeader.userID = d[0];
174 mLastClientHeader.bytes = bytesData - sizeof(uint32_t);
175 } else {
176 mLastClientHeader.userID = 0;
177 mLastClientHeader.bytes = 0;
178 }
179 }
180 receiveLen[0] = mLastClientHeader.bytes;
181 usrID[0] = mLastClientHeader.userID;
182 return (RsMessageToClientType)mLastClientHeader.cmdID;
183}
184
185RsMessageToClientType ThreadIO::getClientPayload(void *data, size_t *receiveLen,
186 uint32_t *usrID, size_t bufferLen) {
187 receiveLen[0] = mLastClientHeader.bytes;
188 usrID[0] = mLastClientHeader.userID;
189 if (bufferLen < mLastClientHeader.bytes) {
190 return RS_MESSAGE_TO_CLIENT_RESIZE;
191 }
192 if (mUsingSocket) {
193 if (receiveLen[0]) {
194 mToClientSocket.read(data, receiveLen[0]);
195 }
196 return (RsMessageToClientType)mLastClientHeader.cmdID;
197 } else {
198 uint32_t bytesData = 0;
199 uint32_t commandID = 0;
200 const uint32_t *d = (const uint32_t *)mToClient.get(&commandID, &bytesData);
Steve Block3762c312012-01-06 19:20:56 +0000201 //ALOGE("getMessageToClient 3 %i %i", commandID, bytesData);
202 //ALOGE("getMessageToClient %i %i", commandID, *subID);
Jason Samsedbfabd2011-05-17 15:01:29 -0700203 if (bufferLen >= receiveLen[0]) {
204 memcpy(data, d+1, receiveLen[0]);
205 mToClient.next();
206 return (RsMessageToClientType)commandID;
207 }
208 }
209 return RS_MESSAGE_TO_CLIENT_RESIZE;
210}
211
212bool ThreadIO::sendToClient(RsMessageToClientType cmdID, uint32_t usrID, const void *data,
213 size_t dataLen, bool waitForSpace) {
214 ClientCmdHeader hdr;
215 hdr.bytes = dataLen;
216 hdr.cmdID = cmdID;
217 hdr.userID = usrID;
218 if (mUsingSocket) {
219 mToClientSocket.writeAsync(&hdr, sizeof(hdr));
220 if (dataLen) {
221 mToClientSocket.writeAsync(data, dataLen);
222 }
223 return true;
224 } else {
225 if (!waitForSpace) {
226 if (!mToClient.makeSpaceNonBlocking(dataLen + sizeof(hdr))) {
227 // Not enough room, and not waiting.
228 return false;
229 }
230 }
231
Steve Block3762c312012-01-06 19:20:56 +0000232 //ALOGE("sendMessageToClient 2");
Jason Samsedbfabd2011-05-17 15:01:29 -0700233 uint32_t *p = (uint32_t *)mToClient.reserve(dataLen + sizeof(usrID));
234 p[0] = usrID;
235 if (dataLen > 0) {
236 memcpy(p+1, data, dataLen);
237 }
238 mToClient.commit(cmdID, dataLen + sizeof(usrID));
Steve Block3762c312012-01-06 19:20:56 +0000239 //ALOGE("sendMessageToClient 3");
Jason Samsedbfabd2011-05-17 15:01:29 -0700240 return true;
241 }
242 return false;
243}
Jason Samsd19f10d2009-05-22 14:03:28 -0700244