• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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