rsContext.h revision e57691037aea219562ac686429b4b98202aab7bc
1bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin/*
2bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin * Copyright (C) 2009 The Android Open Source Project
3bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin *
4bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin * Licensed under the Apache License, Version 2.0 (the "License");
5bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin * you may not use this file except in compliance with the License.
6bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin * You may obtain a copy of the License at
7bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin *
8bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin *      http://www.apache.org/licenses/LICENSE-2.0
9bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin *
10bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin * Unless required by applicable law or agreed to in writing, software
11bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin * distributed under the License is distributed on an "AS IS" BASIS,
12bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin * See the License for the specific language governing permissions and
14bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin * limitations under the License.
15bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin */
16bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin
17bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin#ifndef ANDROID_RS_CONTEXT_H
18bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin#define ANDROID_RS_CONTEXT_H
19bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin
20bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin#include <utils/Vector.h>
21bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin#include <ui/EGLNativeWindowSurface.h>
22bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin#include <ui/Surface.h>
23bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin
24bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin#include "rsType.h"
25bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin#include "rsMatrix.h"
26bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin#include "rsAllocation.h"
27bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin#include "rsTriangleMesh.h"
28bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin#include "rsDevice.h"
29bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin#include "rsScriptC.h"
30bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin#include "rsAllocation.h"
31bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin#include "rsAdapter.h"
32bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin#include "rsSampler.h"
33bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin#include "rsProgramFragment.h"
34bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin#include "rsProgramFragmentStore.h"
35bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin#include "rsProgramVertex.h"
36bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin
37bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin#include "rsgApiStructs.h"
38bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin#include "rsLocklessFifo.h"
39bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin
40bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin
41bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin// ---------------------------------------------------------------------------
42bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkinnamespace android {
43bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkinnamespace renderscript {
44bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin
45bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkinclass Context
46bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin{
47bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkinpublic:
48bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin    Context(Device *, Surface *);
49bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin    ~Context();
50bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin
51bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin    static pthread_key_t gThreadTLSKey;
52bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin    struct ScriptTLSStruct {
53bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin        Context * mContext;
54bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin        Script * mScript;
55bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin    };
56bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin
57bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin
58bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin    //StructuredAllocationContext mStateAllocation;
59bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin    ElementState mStateElement;
60bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin    TypeState mStateType;
61bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin    SamplerState mStateSampler;
62bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin    ProgramFragmentState mStateFragment;
63bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin    ProgramFragmentStoreState mStateFragmentStore;
64bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin    ProgramVertexState mStateVertex;
65bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin
66bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin    TriangleMeshContext mStateTriangleMesh;
67bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin
68bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin    ScriptCState mScriptC;
69bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin
70bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin    static Context * getContext() {return gCon;}
71bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin
72bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin    void swapBuffers();
73bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin    void setRootScript(Script *);
74bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin    void setVertex(ProgramVertex *);
75bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin    void setFragment(ProgramFragment *);
76bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin    void setFragmentStore(ProgramFragmentStore *);
77bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin
78bef3f23f16f2fc575b3f425febcfcc436a7db70fIgor Murashkin    void updateSurface(void *sur);
79bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin
80bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin    const ProgramFragment * getFragment() {return mFragment.get();}
81bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin    const ProgramFragmentStore * getFragmentStore() {return mFragmentStore.get();}
82bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin
83bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin    void setupCheck();
84bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin
85bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin    void assignName(ObjectBase *obj, const char *name, uint32_t len);
86bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin    void removeName(ObjectBase *obj);
87bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin    ObjectBase * lookupName(const char *name) const;
88bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin    void appendNameDefines(String8 *str) const;
89bfc9915f482520eb9676c6d2dbf7f1ac078d937dIgor Murashkin
90
91    ProgramFragment * getDefaultProgramFragment() const {
92        return mStateFragment.mDefault.get();
93    }
94    ProgramVertex * getDefaultProgramVertex() const {
95        return mStateVertex.mDefault.get();
96    }
97    ProgramFragmentStore * getDefaultProgramFragmentStore() const {
98        return mStateFragmentStore.mDefault.get();
99    }
100
101protected:
102    Device *mDev;
103
104    EGLint mNumConfigs;
105    EGLint mMajorVersion;
106    EGLint mMinorVersion;
107    EGLConfig mConfig;
108    EGLContext mContext;
109    EGLSurface mSurface;
110    EGLint mWidth;
111    EGLint mHeight;
112    EGLDisplay mDisplay;
113
114    bool mRunning;
115    bool mExit;
116
117    LocklessCommandFifo mServerCommands;
118    LocklessCommandFifo mServerReturns;
119
120    pthread_t mThreadId;
121
122    ObjectBaseRef<Script> mRootScript;
123    ObjectBaseRef<ProgramFragment> mFragment;
124    ObjectBaseRef<ProgramVertex> mVertex;
125    ObjectBaseRef<ProgramFragmentStore> mFragmentStore;
126
127private:
128    Context();
129
130    void initEGL();
131
132    bool runScript(Script *s, uint32_t launchID);
133    bool runRootScript();
134
135    static void * threadProc(void *);
136
137    // todo: put in TLS
138    static Context *gCon;
139    Surface *mWndSurface;
140
141    Vector<ObjectBase *> mNames;
142};
143
144
145}
146}
147#endif
148