• 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_CONTEXT_H
18  #define ANDROID_RS_CONTEXT_H
19  
20  #include "rsUtils.h"
21  
22  #include <ui/Surface.h>
23  
24  #include "rsThreadIO.h"
25  #include "rsType.h"
26  #include "rsMatrix.h"
27  #include "rsAllocation.h"
28  #include "rsSimpleMesh.h"
29  #include "rsMesh.h"
30  #include "rsDevice.h"
31  #include "rsScriptC.h"
32  #include "rsAllocation.h"
33  #include "rsAdapter.h"
34  #include "rsSampler.h"
35  #include "rsLight.h"
36  #include "rsProgramFragment.h"
37  #include "rsProgramFragmentStore.h"
38  #include "rsProgramRaster.h"
39  #include "rsProgramVertex.h"
40  
41  #include "rsgApiStructs.h"
42  #include "rsLocklessFifo.h"
43  
44  
45  // ---------------------------------------------------------------------------
46  namespace android {
47  namespace renderscript {
48  
49  class Context
50  {
51  public:
52      Context(Device *, bool useDepth);
53      ~Context();
54  
55      static pthread_key_t gThreadTLSKey;
56      static uint32_t gThreadTLSKeyCount;
57      static uint32_t gGLContextCount;
58      static pthread_mutex_t gInitMutex;
59  
60      struct ScriptTLSStruct {
61          Context * mContext;
62          Script * mScript;
63      };
64  
65  
66      //StructuredAllocationContext mStateAllocation;
67      ElementState mStateElement;
68      TypeState mStateType;
69      SamplerState mStateSampler;
70      ProgramFragmentState mStateFragment;
71      ProgramFragmentStoreState mStateFragmentStore;
72      ProgramRasterState mStateRaster;
73      ProgramVertexState mStateVertex;
74      LightState mStateLight;
75  
76      ScriptCState mScriptC;
77  
78      void swapBuffers();
79      void setRootScript(Script *);
80      void setRaster(ProgramRaster *);
81      void setVertex(ProgramVertex *);
82      void setFragment(ProgramFragment *);
83      void setFragmentStore(ProgramFragmentStore *);
84  
85      void updateSurface(void *sur);
86  
getFragment()87      const ProgramFragment * getFragment() {return mFragment.get();}
getFragmentStore()88      const ProgramFragmentStore * getFragmentStore() {return mFragmentStore.get();}
getRaster()89      const ProgramRaster * getRaster() {return mRaster.get();}
getVertex()90      const ProgramVertex * getVertex() {return mVertex.get();}
91  
92      void setupCheck();
93      void allocationCheck(const Allocation *);
94  
95      void pause();
96      void resume();
97      void setSurface(uint32_t w, uint32_t h, Surface *sur);
98  
99      void assignName(ObjectBase *obj, const char *name, uint32_t len);
100      void removeName(ObjectBase *obj);
101      ObjectBase * lookupName(const char *name) const;
102      void appendNameDefines(String8 *str) const;
103      void appendVarDefines(String8 *str) const;
104  
105      uint32_t getMessageToClient(void *data, size_t *receiveLen, size_t bufferLen, bool wait);
106      bool sendMessageToClient(void *data, uint32_t cmdID, size_t len, bool waitForSpace);
107      bool runScript(Script *s, uint32_t launchID);
108  
109      void initToClient();
110      void deinitToClient();
111  
getDefaultProgramFragment()112      ProgramFragment * getDefaultProgramFragment() const {
113          return mStateFragment.mDefault.get();
114      }
getDefaultProgramVertex()115      ProgramVertex * getDefaultProgramVertex() const {
116          return mStateVertex.mDefault.get();
117      }
getDefaultProgramFragmentStore()118      ProgramFragmentStore * getDefaultProgramFragmentStore() const {
119          return mStateFragmentStore.mDefault.get();
120      }
getDefaultProgramRaster()121      ProgramRaster * getDefaultProgramRaster() const {
122          return mStateRaster.mDefault.get();
123      }
124  
addInt32Define(const char * name,int32_t value)125      void addInt32Define(const char* name, int32_t value) {
126          mInt32Defines.add(String8(name), value);
127      }
128  
addFloatDefine(const char * name,float value)129      void addFloatDefine(const char* name, float value) {
130          mFloatDefines.add(String8(name), value);
131      }
132  
getWidth()133      uint32_t getWidth() const {return mEGL.mWidth;}
getHeight()134      uint32_t getHeight() const {return mEGL.mHeight;}
135  
136  
137      ThreadIO mIO;
138      void objDestroyAdd(ObjectBase *);
139  
140      // Timers
141      enum Timers {
142          RS_TIMER_IDLE,
143          RS_TIMER_INTERNAL,
144          RS_TIMER_SCRIPT,
145          RS_TIMER_CLEAR_SWAP,
146          _RS_TIMER_TOTAL
147      };
148      uint64_t getTime() const;
149      void timerInit();
150      void timerReset();
151      void timerSet(Timers);
152      void timerPrint();
153      void timerFrame();
154  
checkVersion1_1()155      bool checkVersion1_1() const {return (mGL.mMajorVersion > 1) || (mGL.mMinorVersion >= 1); }
checkVersion2_0()156      bool checkVersion2_0() const {return mGL.mMajorVersion >= 2; }
157  
158      struct {
159          bool mLogTimes;
160          bool mLogScripts;
161          bool mLogObjects;
162      } props;
163  
164      mutable const ObjectBase * mObjHead;
165  
166  protected:
167      Device *mDev;
168  
169      struct {
170          EGLint mNumConfigs;
171          EGLint mMajorVersion;
172          EGLint mMinorVersion;
173          EGLConfig mConfig;
174          EGLContext mContext;
175          EGLSurface mSurface;
176          EGLint mWidth;
177          EGLint mHeight;
178          EGLDisplay mDisplay;
179      } mEGL;
180  
181      struct {
182          const uint8_t * mVendor;
183          const uint8_t * mRenderer;
184          const uint8_t * mVersion;
185          const uint8_t * mExtensions;
186  
187          uint32_t mMajorVersion;
188          uint32_t mMinorVersion;
189  
190      } mGL;
191  
192      uint32_t mWidth;
193      uint32_t mHeight;
194  
195      bool mRunning;
196      bool mExit;
197      bool mUseDepth;
198      bool mPaused;
199  
200      pthread_t mThreadId;
201  
202      ObjectBaseRef<Script> mRootScript;
203      ObjectBaseRef<ProgramFragment> mFragment;
204      ObjectBaseRef<ProgramVertex> mVertex;
205      ObjectBaseRef<ProgramFragmentStore> mFragmentStore;
206      ObjectBaseRef<ProgramRaster> mRaster;
207  
208  
209      struct ObjDestroyOOB {
210          pthread_mutex_t mMutex;
211          Vector<ObjectBase *> mDestroyList;
212          bool mNeedToEmpty;
213      };
214      ObjDestroyOOB mObjDestroy;
215      bool objDestroyOOBInit();
216      void objDestroyOOBRun();
217      void objDestroyOOBDestroy();
218  
219  private:
220      Context();
221  
222      void initEGL();
223      void deinitEGL();
224  
225      bool runRootScript();
226  
227      static void * threadProc(void *);
228  
229      Surface *mWndSurface;
230  
231      Vector<ObjectBase *> mNames;
232      KeyedVector<String8,int> mInt32Defines;
233      KeyedVector<String8,float> mFloatDefines;
234  
235      uint64_t mTimers[_RS_TIMER_TOTAL];
236      Timers mTimerActive;
237      uint64_t mTimeLast;
238      uint64_t mTimeFrame;
239      uint64_t mTimeLastFrame;
240  };
241  
242  }
243  }
244  #endif
245