• 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