xref: /aosp_15_r20/frameworks/rs/rsContext.h (revision e1eccf28f96817838ad6867f7f39d2351ec11f56)
1*e1eccf28SAndroid Build Coastguard Worker /*
2*e1eccf28SAndroid Build Coastguard Worker  * Copyright (C) 2011 The Android Open Source Project
3*e1eccf28SAndroid Build Coastguard Worker  *
4*e1eccf28SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*e1eccf28SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*e1eccf28SAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*e1eccf28SAndroid Build Coastguard Worker  *
8*e1eccf28SAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*e1eccf28SAndroid Build Coastguard Worker  *
10*e1eccf28SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*e1eccf28SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*e1eccf28SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*e1eccf28SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*e1eccf28SAndroid Build Coastguard Worker  * limitations under the License.
15*e1eccf28SAndroid Build Coastguard Worker  */
16*e1eccf28SAndroid Build Coastguard Worker 
17*e1eccf28SAndroid Build Coastguard Worker #ifndef ANDROID_RS_CONTEXT_H
18*e1eccf28SAndroid Build Coastguard Worker #define ANDROID_RS_CONTEXT_H
19*e1eccf28SAndroid Build Coastguard Worker 
20*e1eccf28SAndroid Build Coastguard Worker #include "rsUtils.h"
21*e1eccf28SAndroid Build Coastguard Worker #include "rs_hal.h"
22*e1eccf28SAndroid Build Coastguard Worker #include <string.h>
23*e1eccf28SAndroid Build Coastguard Worker 
24*e1eccf28SAndroid Build Coastguard Worker #include "rsThreadIO.h"
25*e1eccf28SAndroid Build Coastguard Worker #include "rsScriptC.h"
26*e1eccf28SAndroid Build Coastguard Worker #include "rsScriptGroup.h"
27*e1eccf28SAndroid Build Coastguard Worker #include "rsSampler.h"
28*e1eccf28SAndroid Build Coastguard Worker 
29*e1eccf28SAndroid Build Coastguard Worker #define ATRACE_ENABLED(...) false
30*e1eccf28SAndroid Build Coastguard Worker #define ATRACE_NAME(...)
31*e1eccf28SAndroid Build Coastguard Worker #define ATRACE_CALL(...)
32*e1eccf28SAndroid Build Coastguard Worker 
33*e1eccf28SAndroid Build Coastguard Worker #ifndef RS_COMPATIBILITY_LIB
34*e1eccf28SAndroid Build Coastguard Worker #include "rsFont.h"
35*e1eccf28SAndroid Build Coastguard Worker #include "rsProgramFragment.h"
36*e1eccf28SAndroid Build Coastguard Worker #include "rsProgramStore.h"
37*e1eccf28SAndroid Build Coastguard Worker #include "rsProgramRaster.h"
38*e1eccf28SAndroid Build Coastguard Worker #include "rsProgramVertex.h"
39*e1eccf28SAndroid Build Coastguard Worker #include "rsFBOCache.h"
40*e1eccf28SAndroid Build Coastguard Worker 
41*e1eccf28SAndroid Build Coastguard Worker #endif
42*e1eccf28SAndroid Build Coastguard Worker 
43*e1eccf28SAndroid Build Coastguard Worker #include <vector>
44*e1eccf28SAndroid Build Coastguard Worker 
45*e1eccf28SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
46*e1eccf28SAndroid Build Coastguard Worker namespace android {
47*e1eccf28SAndroid Build Coastguard Worker 
48*e1eccf28SAndroid Build Coastguard Worker namespace renderscript {
49*e1eccf28SAndroid Build Coastguard Worker 
50*e1eccf28SAndroid Build Coastguard Worker class Device;
51*e1eccf28SAndroid Build Coastguard Worker 
52*e1eccf28SAndroid Build Coastguard Worker #if 0
53*e1eccf28SAndroid Build Coastguard Worker #define CHECK_OBJ(o) { \
54*e1eccf28SAndroid Build Coastguard Worker     GET_TLS(); \
55*e1eccf28SAndroid Build Coastguard Worker     if (!ObjectBase::isValid(rsc, (const ObjectBase *)o)) {  \
56*e1eccf28SAndroid Build Coastguard Worker         ALOGE("Bad object %p at %s, %i", o, __FILE__, __LINE__);  \
57*e1eccf28SAndroid Build Coastguard Worker     } \
58*e1eccf28SAndroid Build Coastguard Worker }
59*e1eccf28SAndroid Build Coastguard Worker #define CHECK_OBJ_OR_NULL(o) { \
60*e1eccf28SAndroid Build Coastguard Worker     GET_TLS(); \
61*e1eccf28SAndroid Build Coastguard Worker     if (o && !ObjectBase::isValid(rsc, (const ObjectBase *)o)) {  \
62*e1eccf28SAndroid Build Coastguard Worker         ALOGE("Bad object %p at %s, %i", o, __FILE__, __LINE__);  \
63*e1eccf28SAndroid Build Coastguard Worker     } \
64*e1eccf28SAndroid Build Coastguard Worker }
65*e1eccf28SAndroid Build Coastguard Worker #else
66*e1eccf28SAndroid Build Coastguard Worker #define CHECK_OBJ(o)
67*e1eccf28SAndroid Build Coastguard Worker #define CHECK_OBJ_OR_NULL(o)
68*e1eccf28SAndroid Build Coastguard Worker #endif
69*e1eccf28SAndroid Build Coastguard Worker 
70*e1eccf28SAndroid Build Coastguard Worker 
71*e1eccf28SAndroid Build Coastguard Worker 
72*e1eccf28SAndroid Build Coastguard Worker class Context {
73*e1eccf28SAndroid Build Coastguard Worker public:
74*e1eccf28SAndroid Build Coastguard Worker     struct Hal {
75*e1eccf28SAndroid Build Coastguard Worker         void * drv;
76*e1eccf28SAndroid Build Coastguard Worker 
77*e1eccf28SAndroid Build Coastguard Worker         RsdHalFunctions funcs;
78*e1eccf28SAndroid Build Coastguard Worker         uint32_t flags;
79*e1eccf28SAndroid Build Coastguard Worker     };
80*e1eccf28SAndroid Build Coastguard Worker     Hal mHal;
81*e1eccf28SAndroid Build Coastguard Worker 
82*e1eccf28SAndroid Build Coastguard Worker     static Context * createContext(Device *, const RsSurfaceConfig *sc,
83*e1eccf28SAndroid Build Coastguard Worker             RsContextType ct = RS_CONTEXT_TYPE_NORMAL,
84*e1eccf28SAndroid Build Coastguard Worker             uint32_t flags = 0,
85*e1eccf28SAndroid Build Coastguard Worker             const char* vendorDriverName = nullptr);
86*e1eccf28SAndroid Build Coastguard Worker     static Context * createContextLite();
87*e1eccf28SAndroid Build Coastguard Worker     ~Context();
88*e1eccf28SAndroid Build Coastguard Worker 
89*e1eccf28SAndroid Build Coastguard Worker     static pthread_mutex_t gMessageMutex;
90*e1eccf28SAndroid Build Coastguard Worker     static pthread_mutex_t gInitMutex;
91*e1eccf28SAndroid Build Coastguard Worker     // Library mutex (for providing thread-safe calls from the runtime)
92*e1eccf28SAndroid Build Coastguard Worker     static pthread_mutex_t gLibMutex;
93*e1eccf28SAndroid Build Coastguard Worker 
94*e1eccf28SAndroid Build Coastguard Worker     class PushState {
95*e1eccf28SAndroid Build Coastguard Worker     public:
96*e1eccf28SAndroid Build Coastguard Worker         explicit PushState(Context *);
97*e1eccf28SAndroid Build Coastguard Worker         ~PushState();
98*e1eccf28SAndroid Build Coastguard Worker 
99*e1eccf28SAndroid Build Coastguard Worker     private:
100*e1eccf28SAndroid Build Coastguard Worker #if !defined(RS_VENDOR_LIB) && !defined(RS_COMPATIBILITY_LIB)
101*e1eccf28SAndroid Build Coastguard Worker         ObjectBaseRef<ProgramFragment> mFragment;
102*e1eccf28SAndroid Build Coastguard Worker         ObjectBaseRef<ProgramVertex> mVertex;
103*e1eccf28SAndroid Build Coastguard Worker         ObjectBaseRef<ProgramStore> mStore;
104*e1eccf28SAndroid Build Coastguard Worker         ObjectBaseRef<ProgramRaster> mRaster;
105*e1eccf28SAndroid Build Coastguard Worker         ObjectBaseRef<Font> mFont;
106*e1eccf28SAndroid Build Coastguard Worker #endif
107*e1eccf28SAndroid Build Coastguard Worker         Context *mRsc;
108*e1eccf28SAndroid Build Coastguard Worker     };
109*e1eccf28SAndroid Build Coastguard Worker 
110*e1eccf28SAndroid Build Coastguard Worker     RsSurfaceConfig mUserSurfaceConfig;
111*e1eccf28SAndroid Build Coastguard Worker 
112*e1eccf28SAndroid Build Coastguard Worker     ElementState mStateElement;
113*e1eccf28SAndroid Build Coastguard Worker     TypeState mStateType;
114*e1eccf28SAndroid Build Coastguard Worker     SamplerState mStateSampler;
115*e1eccf28SAndroid Build Coastguard Worker 
isSynchronous()116*e1eccf28SAndroid Build Coastguard Worker     bool isSynchronous() {return mSynchronous;}
117*e1eccf28SAndroid Build Coastguard Worker     bool setupCheck();
118*e1eccf28SAndroid Build Coastguard Worker 
119*e1eccf28SAndroid Build Coastguard Worker #if !defined(RS_VENDOR_LIB) && !defined(RS_COMPATIBILITY_LIB)
120*e1eccf28SAndroid Build Coastguard Worker     FBOCache mFBOCache;
121*e1eccf28SAndroid Build Coastguard Worker     ProgramFragmentState mStateFragment;
122*e1eccf28SAndroid Build Coastguard Worker     ProgramStoreState mStateFragmentStore;
123*e1eccf28SAndroid Build Coastguard Worker     ProgramRasterState mStateRaster;
124*e1eccf28SAndroid Build Coastguard Worker     ProgramVertexState mStateVertex;
125*e1eccf28SAndroid Build Coastguard Worker     FontState mStateFont;
126*e1eccf28SAndroid Build Coastguard Worker 
127*e1eccf28SAndroid Build Coastguard Worker 
128*e1eccf28SAndroid Build Coastguard Worker     void swapBuffers();
129*e1eccf28SAndroid Build Coastguard Worker     void setRootScript(Script *);
130*e1eccf28SAndroid Build Coastguard Worker     void setProgramRaster(ProgramRaster *);
131*e1eccf28SAndroid Build Coastguard Worker     void setProgramVertex(ProgramVertex *);
132*e1eccf28SAndroid Build Coastguard Worker     void setProgramFragment(ProgramFragment *);
133*e1eccf28SAndroid Build Coastguard Worker     void setProgramStore(ProgramStore *);
134*e1eccf28SAndroid Build Coastguard Worker     void setFont(Font *);
135*e1eccf28SAndroid Build Coastguard Worker 
136*e1eccf28SAndroid Build Coastguard Worker     void updateSurface(void *sur);
137*e1eccf28SAndroid Build Coastguard Worker 
getProgramFragment()138*e1eccf28SAndroid Build Coastguard Worker     ProgramFragment * getProgramFragment() {return mFragment.get();}
getProgramStore()139*e1eccf28SAndroid Build Coastguard Worker     ProgramStore * getProgramStore() {return mFragmentStore.get();}
getProgramRaster()140*e1eccf28SAndroid Build Coastguard Worker     ProgramRaster * getProgramRaster() {return mRaster.get();}
getProgramVertex()141*e1eccf28SAndroid Build Coastguard Worker     ProgramVertex * getProgramVertex() {return mVertex.get();}
getFont()142*e1eccf28SAndroid Build Coastguard Worker     Font * getFont() {return mFont.get();}
143*e1eccf28SAndroid Build Coastguard Worker 
144*e1eccf28SAndroid Build Coastguard Worker     void setupProgramStore();
145*e1eccf28SAndroid Build Coastguard Worker 
146*e1eccf28SAndroid Build Coastguard Worker     void pause();
147*e1eccf28SAndroid Build Coastguard Worker     void resume();
148*e1eccf28SAndroid Build Coastguard Worker     void setSurface(uint32_t w, uint32_t h, RsNativeWindow sur);
149*e1eccf28SAndroid Build Coastguard Worker #endif
150*e1eccf28SAndroid Build Coastguard Worker     void finish();
151*e1eccf28SAndroid Build Coastguard Worker 
152*e1eccf28SAndroid Build Coastguard Worker     void setPriority(int32_t p);
153*e1eccf28SAndroid Build Coastguard Worker     void destroyWorkerThreadResources();
154*e1eccf28SAndroid Build Coastguard Worker 
155*e1eccf28SAndroid Build Coastguard Worker     void assignName(ObjectBase *obj, const char *name, uint32_t len);
156*e1eccf28SAndroid Build Coastguard Worker     void removeName(ObjectBase *obj);
157*e1eccf28SAndroid Build Coastguard Worker 
158*e1eccf28SAndroid Build Coastguard Worker     RsMessageToClientType peekMessageToClient(size_t *receiveLen, uint32_t *subID);
159*e1eccf28SAndroid Build Coastguard Worker     RsMessageToClientType getMessageToClient(void *data, size_t *receiveLen, uint32_t *subID, size_t bufferLen);
160*e1eccf28SAndroid Build Coastguard Worker     bool sendMessageToClient(const void *data, RsMessageToClientType cmdID, uint32_t subID, size_t len, bool waitForSpace) const;
161*e1eccf28SAndroid Build Coastguard Worker     uint32_t runScript(Script *s);
162*e1eccf28SAndroid Build Coastguard Worker 
163*e1eccf28SAndroid Build Coastguard Worker     void initToClient();
164*e1eccf28SAndroid Build Coastguard Worker     void deinitToClient();
165*e1eccf28SAndroid Build Coastguard Worker 
166*e1eccf28SAndroid Build Coastguard Worker #if !defined(RS_VENDOR_LIB) && !defined(RS_COMPATIBILITY_LIB)
getDefaultProgramFragment()167*e1eccf28SAndroid Build Coastguard Worker     ProgramFragment * getDefaultProgramFragment() const {
168*e1eccf28SAndroid Build Coastguard Worker         return mStateFragment.mDefault.get();
169*e1eccf28SAndroid Build Coastguard Worker     }
getDefaultProgramVertex()170*e1eccf28SAndroid Build Coastguard Worker     ProgramVertex * getDefaultProgramVertex() const {
171*e1eccf28SAndroid Build Coastguard Worker         return mStateVertex.mDefault.get();
172*e1eccf28SAndroid Build Coastguard Worker     }
getDefaultProgramStore()173*e1eccf28SAndroid Build Coastguard Worker     ProgramStore * getDefaultProgramStore() const {
174*e1eccf28SAndroid Build Coastguard Worker         return mStateFragmentStore.mDefault.get();
175*e1eccf28SAndroid Build Coastguard Worker     }
getDefaultProgramRaster()176*e1eccf28SAndroid Build Coastguard Worker     ProgramRaster * getDefaultProgramRaster() const {
177*e1eccf28SAndroid Build Coastguard Worker         return mStateRaster.mDefault.get();
178*e1eccf28SAndroid Build Coastguard Worker     }
getDefaultFont()179*e1eccf28SAndroid Build Coastguard Worker     Font* getDefaultFont() const {
180*e1eccf28SAndroid Build Coastguard Worker         return mStateFont.mDefault.get();
181*e1eccf28SAndroid Build Coastguard Worker     }
182*e1eccf28SAndroid Build Coastguard Worker 
getWidth()183*e1eccf28SAndroid Build Coastguard Worker     uint32_t getWidth() const {return mWidth;}
getHeight()184*e1eccf28SAndroid Build Coastguard Worker     uint32_t getHeight() const {return mHeight;}
185*e1eccf28SAndroid Build Coastguard Worker 
186*e1eccf28SAndroid Build Coastguard Worker     uint32_t getCurrentSurfaceWidth() const;
187*e1eccf28SAndroid Build Coastguard Worker     uint32_t getCurrentSurfaceHeight() const;
188*e1eccf28SAndroid Build Coastguard Worker 
setWatchdogGL(const char * cmd,uint32_t line,const char * file)189*e1eccf28SAndroid Build Coastguard Worker     void setWatchdogGL(const char *cmd, uint32_t line, const char *file) const {
190*e1eccf28SAndroid Build Coastguard Worker         watchdog.command = cmd;
191*e1eccf28SAndroid Build Coastguard Worker         watchdog.file = file;
192*e1eccf28SAndroid Build Coastguard Worker         watchdog.line = line;
193*e1eccf28SAndroid Build Coastguard Worker     }
194*e1eccf28SAndroid Build Coastguard Worker #endif
195*e1eccf28SAndroid Build Coastguard Worker 
196*e1eccf28SAndroid Build Coastguard Worker     mutable ThreadIO mIO;
197*e1eccf28SAndroid Build Coastguard Worker 
198*e1eccf28SAndroid Build Coastguard Worker     // Timers
199*e1eccf28SAndroid Build Coastguard Worker     enum Timers {
200*e1eccf28SAndroid Build Coastguard Worker         RS_TIMER_IDLE,
201*e1eccf28SAndroid Build Coastguard Worker         RS_TIMER_INTERNAL,
202*e1eccf28SAndroid Build Coastguard Worker         RS_TIMER_SCRIPT,
203*e1eccf28SAndroid Build Coastguard Worker         RS_TIMER_CLEAR_SWAP,
204*e1eccf28SAndroid Build Coastguard Worker         _RS_TIMER_TOTAL
205*e1eccf28SAndroid Build Coastguard Worker     };
206*e1eccf28SAndroid Build Coastguard Worker     uint64_t getTime() const;
207*e1eccf28SAndroid Build Coastguard Worker     void timerInit();
208*e1eccf28SAndroid Build Coastguard Worker     void timerReset();
209*e1eccf28SAndroid Build Coastguard Worker     void timerSet(Timers);
210*e1eccf28SAndroid Build Coastguard Worker     void timerPrint();
211*e1eccf28SAndroid Build Coastguard Worker     void timerFrame();
212*e1eccf28SAndroid Build Coastguard Worker 
213*e1eccf28SAndroid Build Coastguard Worker     struct {
214*e1eccf28SAndroid Build Coastguard Worker         bool mLogTimes;
215*e1eccf28SAndroid Build Coastguard Worker         bool mLogScripts;
216*e1eccf28SAndroid Build Coastguard Worker         bool mLogShaders;
217*e1eccf28SAndroid Build Coastguard Worker         bool mLogShadersAttr;
218*e1eccf28SAndroid Build Coastguard Worker         bool mLogShadersUniforms;
219*e1eccf28SAndroid Build Coastguard Worker         bool mLogVisual;
220*e1eccf28SAndroid Build Coastguard Worker         uint32_t mLogReduce;
221*e1eccf28SAndroid Build Coastguard Worker         bool mDebugReduceSplitAccum;
222*e1eccf28SAndroid Build Coastguard Worker         uint32_t mDebugMaxThreads;
223*e1eccf28SAndroid Build Coastguard Worker     } props;
224*e1eccf28SAndroid Build Coastguard Worker 
225*e1eccf28SAndroid Build Coastguard Worker     mutable struct {
226*e1eccf28SAndroid Build Coastguard Worker         bool inRoot;
227*e1eccf28SAndroid Build Coastguard Worker         const char *command;
228*e1eccf28SAndroid Build Coastguard Worker         const char *file;
229*e1eccf28SAndroid Build Coastguard Worker         uint32_t line;
230*e1eccf28SAndroid Build Coastguard Worker     } watchdog;
231*e1eccf28SAndroid Build Coastguard Worker     static void printWatchdogInfo(void *ctx);
232*e1eccf28SAndroid Build Coastguard Worker 
233*e1eccf28SAndroid Build Coastguard Worker     void dumpDebug() const;
234*e1eccf28SAndroid Build Coastguard Worker     void setError(RsError e, const char *msg = nullptr) const;
235*e1eccf28SAndroid Build Coastguard Worker 
236*e1eccf28SAndroid Build Coastguard Worker     mutable const ObjectBase * mObjHead;
237*e1eccf28SAndroid Build Coastguard Worker 
getDPI()238*e1eccf28SAndroid Build Coastguard Worker     uint32_t getDPI() const {return mDPI;}
setDPI(uint32_t dpi)239*e1eccf28SAndroid Build Coastguard Worker     void setDPI(uint32_t dpi) {mDPI = dpi;}
240*e1eccf28SAndroid Build Coastguard Worker 
getTargetSdkVersion()241*e1eccf28SAndroid Build Coastguard Worker     uint32_t getTargetSdkVersion() const {return mTargetSdkVersion;}
setTargetSdkVersion(uint32_t sdkVer)242*e1eccf28SAndroid Build Coastguard Worker     void setTargetSdkVersion(uint32_t sdkVer) {mTargetSdkVersion = sdkVer;}
243*e1eccf28SAndroid Build Coastguard Worker 
getContextType()244*e1eccf28SAndroid Build Coastguard Worker     RsContextType getContextType() const { return mContextType; }
setContextType(RsContextType ct)245*e1eccf28SAndroid Build Coastguard Worker     void setContextType(RsContextType ct) { mContextType = ct; }
246*e1eccf28SAndroid Build Coastguard Worker 
247*e1eccf28SAndroid Build Coastguard Worker     // Check for Fatal errors
248*e1eccf28SAndroid Build Coastguard Worker     // Should be used to prevent work from being launched
249*e1eccf28SAndroid Build Coastguard Worker     // which could take the process down.  Maximizes the chance
250*e1eccf28SAndroid Build Coastguard Worker     // the process lives long enough to get the error to the developer
hadFatalError()251*e1eccf28SAndroid Build Coastguard Worker     bool hadFatalError() {return mFatalErrorOccured;}
252*e1eccf28SAndroid Build Coastguard Worker 
getOptLevel()253*e1eccf28SAndroid Build Coastguard Worker     uint32_t getOptLevel() const { return mOptLevel; }
setOptLevel(uint32_t optLevel)254*e1eccf28SAndroid Build Coastguard Worker     void setOptLevel(uint32_t optLevel) { mOptLevel = optLevel; }
255*e1eccf28SAndroid Build Coastguard Worker 
256*e1eccf28SAndroid Build Coastguard Worker     Device *mDev;
257*e1eccf28SAndroid Build Coastguard Worker 
258*e1eccf28SAndroid Build Coastguard Worker #ifdef RS_COMPATIBILITY_LIB
setNativeLibDir(const char * libDir,uint32_t length)259*e1eccf28SAndroid Build Coastguard Worker     void setNativeLibDir(const char * libDir, uint32_t length) {
260*e1eccf28SAndroid Build Coastguard Worker         if (!hasSetNativeLibDir) {
261*e1eccf28SAndroid Build Coastguard Worker             if (length <= PATH_MAX) {
262*e1eccf28SAndroid Build Coastguard Worker                 memcpy(nativeLibDir, libDir, length);
263*e1eccf28SAndroid Build Coastguard Worker                 nativeLibDir[length] = 0;
264*e1eccf28SAndroid Build Coastguard Worker                 hasSetNativeLibDir = true;
265*e1eccf28SAndroid Build Coastguard Worker             } else {
266*e1eccf28SAndroid Build Coastguard Worker                 setError(RS_ERROR_BAD_VALUE, "Invalid path");
267*e1eccf28SAndroid Build Coastguard Worker             }
268*e1eccf28SAndroid Build Coastguard Worker         }
269*e1eccf28SAndroid Build Coastguard Worker     }
getNativeLibDir()270*e1eccf28SAndroid Build Coastguard Worker     const char * getNativeLibDir() {
271*e1eccf28SAndroid Build Coastguard Worker         return nativeLibDir;
272*e1eccf28SAndroid Build Coastguard Worker     }
273*e1eccf28SAndroid Build Coastguard Worker #endif
274*e1eccf28SAndroid Build Coastguard Worker 
275*e1eccf28SAndroid Build Coastguard Worker     void setCacheDir(const char * cacheDir_arg, uint32_t length);
getCacheDir()276*e1eccf28SAndroid Build Coastguard Worker     const char * getCacheDir() {
277*e1eccf28SAndroid Build Coastguard Worker         if (hasSetCacheDir) {
278*e1eccf28SAndroid Build Coastguard Worker             return mCacheDir;
279*e1eccf28SAndroid Build Coastguard Worker         }
280*e1eccf28SAndroid Build Coastguard Worker         return nullptr;
281*e1eccf28SAndroid Build Coastguard Worker     }
282*e1eccf28SAndroid Build Coastguard Worker 
283*e1eccf28SAndroid Build Coastguard Worker     // Returns the actual loaded driver's name (like "libRSDriver.so").
getDriverName()284*e1eccf28SAndroid Build Coastguard Worker     const char * getDriverName() {
285*e1eccf28SAndroid Build Coastguard Worker         return mDriverName;
286*e1eccf28SAndroid Build Coastguard Worker     }
287*e1eccf28SAndroid Build Coastguard Worker 
288*e1eccf28SAndroid Build Coastguard Worker     // Set a new driver name, should be called from within
289*e1eccf28SAndroid Build Coastguard Worker     // rsdHalInit in order to alter default behaviour.
setDriverName(const char * name)290*e1eccf28SAndroid Build Coastguard Worker     void setDriverName(const char * name) {
291*e1eccf28SAndroid Build Coastguard Worker         if (!mDriverName) {
292*e1eccf28SAndroid Build Coastguard Worker             mDriverName = name;
293*e1eccf28SAndroid Build Coastguard Worker         }
294*e1eccf28SAndroid Build Coastguard Worker     }
295*e1eccf28SAndroid Build Coastguard Worker 
296*e1eccf28SAndroid Build Coastguard Worker protected:
297*e1eccf28SAndroid Build Coastguard Worker 
298*e1eccf28SAndroid Build Coastguard Worker     uint32_t mTargetSdkVersion;
299*e1eccf28SAndroid Build Coastguard Worker     uint32_t mDPI;
300*e1eccf28SAndroid Build Coastguard Worker     uint32_t mWidth;
301*e1eccf28SAndroid Build Coastguard Worker     uint32_t mHeight;
302*e1eccf28SAndroid Build Coastguard Worker     int32_t mThreadPriority;
303*e1eccf28SAndroid Build Coastguard Worker     bool mIsGraphicsContext;
304*e1eccf28SAndroid Build Coastguard Worker 
305*e1eccf28SAndroid Build Coastguard Worker     bool mForceRSoV;
306*e1eccf28SAndroid Build Coastguard Worker     bool mForceCpu;
307*e1eccf28SAndroid Build Coastguard Worker 
308*e1eccf28SAndroid Build Coastguard Worker     RsContextType mContextType;
309*e1eccf28SAndroid Build Coastguard Worker     uint32_t mOptLevel;
310*e1eccf28SAndroid Build Coastguard Worker 
311*e1eccf28SAndroid Build Coastguard Worker     bool mRunning;
312*e1eccf28SAndroid Build Coastguard Worker     bool mExit;
313*e1eccf28SAndroid Build Coastguard Worker     bool mPaused;
314*e1eccf28SAndroid Build Coastguard Worker     mutable bool mFatalErrorOccured;
315*e1eccf28SAndroid Build Coastguard Worker     mutable RsError mError;
316*e1eccf28SAndroid Build Coastguard Worker 
317*e1eccf28SAndroid Build Coastguard Worker 
318*e1eccf28SAndroid Build Coastguard Worker     pthread_t mThreadId;
319*e1eccf28SAndroid Build Coastguard Worker     pid_t mNativeThreadId;
320*e1eccf28SAndroid Build Coastguard Worker 
321*e1eccf28SAndroid Build Coastguard Worker     ObjectBaseRef<Script> mRootScript;
322*e1eccf28SAndroid Build Coastguard Worker #if !defined(RS_VENDOR_LIB) && !defined(RS_COMPATIBILITY_LIB)
323*e1eccf28SAndroid Build Coastguard Worker     ObjectBaseRef<ProgramFragment> mFragment;
324*e1eccf28SAndroid Build Coastguard Worker     ObjectBaseRef<ProgramVertex> mVertex;
325*e1eccf28SAndroid Build Coastguard Worker     ObjectBaseRef<ProgramStore> mFragmentStore;
326*e1eccf28SAndroid Build Coastguard Worker     ObjectBaseRef<ProgramRaster> mRaster;
327*e1eccf28SAndroid Build Coastguard Worker     ObjectBaseRef<Font> mFont;
328*e1eccf28SAndroid Build Coastguard Worker #endif
329*e1eccf28SAndroid Build Coastguard Worker 
330*e1eccf28SAndroid Build Coastguard Worker     void displayDebugStats();
331*e1eccf28SAndroid Build Coastguard Worker 
332*e1eccf28SAndroid Build Coastguard Worker private:
333*e1eccf28SAndroid Build Coastguard Worker     Context();
334*e1eccf28SAndroid Build Coastguard Worker     bool initContext(Device *, const RsSurfaceConfig *sc);
335*e1eccf28SAndroid Build Coastguard Worker     bool mSynchronous;
336*e1eccf28SAndroid Build Coastguard Worker     bool initGLThread();
337*e1eccf28SAndroid Build Coastguard Worker     void deinitEGL();
338*e1eccf28SAndroid Build Coastguard Worker 
339*e1eccf28SAndroid Build Coastguard Worker     uint32_t runRootScript();
340*e1eccf28SAndroid Build Coastguard Worker 
341*e1eccf28SAndroid Build Coastguard Worker     bool loadRuntime(const char* filename);
342*e1eccf28SAndroid Build Coastguard Worker     // Loads the driver.
343*e1eccf28SAndroid Build Coastguard Worker     // forceDefault: If true, loads the default CPU driver.
344*e1eccf28SAndroid Build Coastguard Worker     // forceRSoV:  If true, overrides forceDefault and loads the RSoV driver.
345*e1eccf28SAndroid Build Coastguard Worker     bool loadDriver(bool forceDefault, bool forceRSoV);
346*e1eccf28SAndroid Build Coastguard Worker     static void * threadProc(void *);
347*e1eccf28SAndroid Build Coastguard Worker     static void * helperThreadProc(void *);
348*e1eccf28SAndroid Build Coastguard Worker 
349*e1eccf28SAndroid Build Coastguard Worker     bool mHasSurface;
350*e1eccf28SAndroid Build Coastguard Worker     bool mIsContextLite;
351*e1eccf28SAndroid Build Coastguard Worker 
352*e1eccf28SAndroid Build Coastguard Worker     // This holds the name of the driver (like "libRSDriver.so").
353*e1eccf28SAndroid Build Coastguard Worker     // Since this is always just a static string, we don't have to
354*e1eccf28SAndroid Build Coastguard Worker     // allocate, copy, or free any memory here.
355*e1eccf28SAndroid Build Coastguard Worker     const char* mDriverName;
356*e1eccf28SAndroid Build Coastguard Worker     const char* mVendorDriverName;
357*e1eccf28SAndroid Build Coastguard Worker 
358*e1eccf28SAndroid Build Coastguard Worker     std::vector<ObjectBase *> mNames;
359*e1eccf28SAndroid Build Coastguard Worker 
360*e1eccf28SAndroid Build Coastguard Worker     // Sync fence id for Graphic API, default value -1.
361*e1eccf28SAndroid Build Coastguard Worker     int32_t mSyncFd = -1;
362*e1eccf28SAndroid Build Coastguard Worker     uint64_t mTimers[_RS_TIMER_TOTAL];
363*e1eccf28SAndroid Build Coastguard Worker     Timers mTimerActive;
364*e1eccf28SAndroid Build Coastguard Worker     uint64_t mTimeLast;
365*e1eccf28SAndroid Build Coastguard Worker     uint64_t mTimeFrame;
366*e1eccf28SAndroid Build Coastguard Worker     uint64_t mTimeLastFrame;
367*e1eccf28SAndroid Build Coastguard Worker     uint32_t mTimeMSLastFrame;
368*e1eccf28SAndroid Build Coastguard Worker     uint32_t mTimeMSLastScript;
369*e1eccf28SAndroid Build Coastguard Worker     uint32_t mTimeMSLastSwap;
370*e1eccf28SAndroid Build Coastguard Worker     uint32_t mAverageFPSFrameCount;
371*e1eccf28SAndroid Build Coastguard Worker     uint64_t mAverageFPSStartTime;
372*e1eccf28SAndroid Build Coastguard Worker     uint32_t mAverageFPS;
373*e1eccf28SAndroid Build Coastguard Worker #ifdef RS_COMPATIBILITY_LIB
374*e1eccf28SAndroid Build Coastguard Worker     bool hasSetNativeLibDir = false;
375*e1eccf28SAndroid Build Coastguard Worker     char nativeLibDir[PATH_MAX+1];
376*e1eccf28SAndroid Build Coastguard Worker #endif
377*e1eccf28SAndroid Build Coastguard Worker     bool hasSetCacheDir = false;
378*e1eccf28SAndroid Build Coastguard Worker     char mCacheDir[PATH_MAX+1];
379*e1eccf28SAndroid Build Coastguard Worker };
380*e1eccf28SAndroid Build Coastguard Worker 
381*e1eccf28SAndroid Build Coastguard Worker void LF_ObjDestroy_handcode(const Context *rsc, RsAsyncVoidPtr objPtr);
382*e1eccf28SAndroid Build Coastguard Worker 
383*e1eccf28SAndroid Build Coastguard Worker } // namespace renderscript
384*e1eccf28SAndroid Build Coastguard Worker } // namespace android
385*e1eccf28SAndroid Build Coastguard Worker #endif
386