10f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines/*
20f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * Copyright (C) 2009-2012 The Android Open Source Project
30f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines *
40f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * Licensed under the Apache License, Version 2.0 (the "License");
50f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * you may not use this file except in compliance with the License.
60f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * You may obtain a copy of the License at
70f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines *
80f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines *      http://www.apache.org/licenses/LICENSE-2.0
90f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines *
100f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * Unless required by applicable law or agreed to in writing, software
110f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * distributed under the License is distributed on an "AS IS" BASIS,
120f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
130f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * See the License for the specific language governing permissions and
140f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * limitations under the License.
150f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines */
160f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
170f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines#ifndef ANDROID_RS_SCRIPT_C_H
180f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines#define ANDROID_RS_SCRIPT_C_H
190f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
200f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines#include "rsScript.h"
210f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
220f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines#include "rsEnv.h"
230f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
240f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines// ---------------------------------------------------------------------------
250f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesnamespace android {
260f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesnamespace renderscript {
270f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
280f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
290f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesclass ScriptC : public Script {
300f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinespublic:
310f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    typedef int (*RunScript_t)();
320f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    typedef void (*VoidFunc_t)();
330f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
340f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    ScriptC(Context *);
350f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    virtual ~ScriptC();
360f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
370f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    virtual void Invoke(Context *rsc, uint32_t slot, const void *data, size_t len);
380f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
390f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    virtual uint32_t run(Context *);
400f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
410f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    virtual void runForEach(Context *rsc,
420f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                            uint32_t slot,
430f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                            const Allocation * ain,
440f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                            Allocation * aout,
450f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                            const void * usr,
460f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                            size_t usrBytes,
470f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                            const RsScriptCall *sc = NULL);
480f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
490f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    virtual void serialize(Context *rsc, OStream *stream) const {    }
500f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    virtual RsA3DClassID getClassId() const { return RS_A3D_CLASS_ID_SCRIPT_C; }
510f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    static Type *createFromStream(Context *rsc, IStream *stream) { return NULL; }
520f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
530f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    bool runCompiler(Context *rsc, const char *resName, const char *cacheDir,
540f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                     const uint8_t *bitcode, size_t bitcodeLen);
550f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
560f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines//protected:
570f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    void setupScript(Context *);
580f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    void setupGLState(Context *);
590f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    Script * setTLS(Script *);
600f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines};
610f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
620f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesclass ScriptCState {
630f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinespublic:
640f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    ScriptCState();
650f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    ~ScriptCState();
660f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
670f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    char * mScriptText;
680f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    size_t mScriptLen;
690f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
700f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    struct SymbolTable_t {
710f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        const char * mName;
720f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        void * mPtr;
730f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        bool threadable;
740f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    };
750f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    static const SymbolTable_t * lookupSymbol(const char *);
760f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    static const SymbolTable_t * lookupSymbolCL(const char *);
770f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    static const SymbolTable_t * lookupSymbolGL(const char *);
780f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines};
790f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
800f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
810f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}
820f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}
830f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines#endif
84