rsCpuExecutable.h revision 6c1876bbef1b2c89975dce91230a168bd2d2ce4c
12abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni/*
22abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni * Copyright (C) 2015 The Android Open Source Project
32abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni *
42abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni * Licensed under the Apache License, Version 2.0 (the "License");
52abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni * you may not use this file except in compliance with the License.
62abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni * You may obtain a copy of the License at
72abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni *
82abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni *      http://www.apache.org/licenses/LICENSE-2.0
92abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni *
102abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni * Unless required by applicable law or agreed to in writing, software
112abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni * distributed under the License is distributed on an "AS IS" BASIS,
122abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
132abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni * See the License for the specific language governing permissions and
142abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni * limitations under the License.
152abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni */
162abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni
172abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni#ifndef ANDROID_RENDERSCRIPT_EXECUTABLE_H
182abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni#define ANDROID_RENDERSCRIPT_EXECUTABLE_H
192abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni
202abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni#include <stdlib.h>
212abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni
222abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni#include "rsCpuScript.h"
232abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni
242abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ninamespace android {
252abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ninamespace renderscript {
262abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni
272abfcc6d129fe3defddef4540aa95cc445c03a7aYang Niclass Context;
282abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni
292abfcc6d129fe3defddef4540aa95cc445c03a7aYang Niclass SharedLibraryUtils {
302abfcc6d129fe3defddef4540aa95cc445c03a7aYang Nipublic:
312abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni#ifndef RS_COMPATIBILITY_LIB
324c368af7e705f0bcb77fa99495b2e33ef20d2699Stephen Hines    static bool createSharedLibrary(const char* driverName,
334c368af7e705f0bcb77fa99495b2e33ef20d2699Stephen Hines                                    const char* cacheDir,
344c368af7e705f0bcb77fa99495b2e33ef20d2699Stephen Hines                                    const char* resName);
352abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni#endif
362abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni
372abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni    // Load the shared library referred to by cacheDir and resName. If we have
382abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni    // already loaded this library, we instead create a new copy (in the
392abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni    // cache dir) and then load that. We then immediately destroy the copy.
402abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni    // This is required behavior to implement script instancing for the support
412abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni    // library, since shared objects are loaded and de-duped by name only.
422abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni
432abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni    // For 64bit RS Support Lib, the shared lib path cannot be constructed from
442abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni    // cacheDir, so nativeLibDir is needed to load shared libs.
452abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni    static void* loadSharedLibrary(const char *cacheDir, const char *resName,
461efae29f4bbe6c165caf6dfc4b89cf8a5f8c469bYang Ni                                   const char *nativeLibDir = nullptr,
471efae29f4bbe6c165caf6dfc4b89cf8a5f8c469bYang Ni                                   bool *alreadyLoaded = nullptr);
481efae29f4bbe6c165caf6dfc4b89cf8a5f8c469bYang Ni
491efae29f4bbe6c165caf6dfc4b89cf8a5f8c469bYang Ni    // Create a len length string containing random characters from [A-Za-z0-9].
501efae29f4bbe6c165caf6dfc4b89cf8a5f8c469bYang Ni    static String8 getRandomString(size_t len);
512abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni
522abfcc6d129fe3defddef4540aa95cc445c03a7aYang Niprivate:
532abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni    // Attempt to load the shared library from origName, but then fall back to
542abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni    // creating a copy of the shared library if necessary (to ensure instancing).
552abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni    // This function returns the dlopen()-ed handle if successful.
562abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni    static void *loadSOHelper(const char *origName, const char *cacheDir,
571efae29f4bbe6c165caf6dfc4b89cf8a5f8c469bYang Ni                              const char *resName, bool* alreadyLoaded = nullptr);
582abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni
592abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni    static const char* LD_EXE_PATH;
602abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni    static const char* RS_CACHE_DIR;
612abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni};
622abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni
632abfcc6d129fe3defddef4540aa95cc445c03a7aYang Niclass ScriptExecutable {
642abfcc6d129fe3defddef4540aa95cc445c03a7aYang Nipublic:
652abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni    ScriptExecutable(Context* RSContext,
66062c287f573ecc06c38ee4295e5627e12c52ac3dYang Ni                     void** fieldAddress, bool* fieldIsObject,
67062c287f573ecc06c38ee4295e5627e12c52ac3dYang Ni                     const char* const * fieldName, size_t varCount,
682abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni                     InvokeFunc_t* invokeFunctions, size_t funcCount,
692abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni                     ForEachFunc_t* forEachFunctions, uint32_t* forEachSignatures,
702abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni                     size_t forEachCount,
7114ce007a633b10e3b9a3fae29d8f53a7e8c9b59fMatt Wala                     ReduceFunc_t* reduceFunctions, size_t reduceCount,
726c1876bbef1b2c89975dce91230a168bd2d2ce4cDavid Gross                     ReduceNewDescription *reduceNewDescriptions, size_t reduceNewCount,
73062c287f573ecc06c38ee4295e5627e12c52ac3dYang Ni                     const char** pragmaKeys, const char** pragmaValues,
742abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni                     size_t pragmaCount,
758409d6414dd4a42aa59779fcfe9fce18648cb135Stephen Hines                     const char **globalNames, const void **globalAddresses,
765aa018cc36e589b07674957714d27ae3d1fa1c4eStephen Hines                     const size_t *globalSizes,
775aa018cc36e589b07674957714d27ae3d1fa1c4eStephen Hines                     const uint32_t *globalProperties, size_t globalEntries,
78cb17015fed6b11a5028f31cc804a3847e379945dYang Ni                     bool isThreadable, uint32_t buildChecksum) :
792abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni        mFieldAddress(fieldAddress), mFieldIsObject(fieldIsObject),
80062c287f573ecc06c38ee4295e5627e12c52ac3dYang Ni        mFieldName(fieldName), mExportedVarCount(varCount),
81062c287f573ecc06c38ee4295e5627e12c52ac3dYang Ni        mInvokeFunctions(invokeFunctions), mFuncCount(funcCount),
82062c287f573ecc06c38ee4295e5627e12c52ac3dYang Ni        mForEachFunctions(forEachFunctions), mForEachSignatures(forEachSignatures),
83062c287f573ecc06c38ee4295e5627e12c52ac3dYang Ni        mForEachCount(forEachCount),
8414ce007a633b10e3b9a3fae29d8f53a7e8c9b59fMatt Wala        mReduceFunctions(reduceFunctions), mReduceCount(reduceCount),
856c1876bbef1b2c89975dce91230a168bd2d2ce4cDavid Gross        mReduceNewDescriptions(reduceNewDescriptions), mReduceNewCount(reduceNewCount),
86062c287f573ecc06c38ee4295e5627e12c52ac3dYang Ni        mPragmaKeys(pragmaKeys), mPragmaValues(pragmaValues),
878409d6414dd4a42aa59779fcfe9fce18648cb135Stephen Hines        mPragmaCount(pragmaCount), mGlobalNames(globalNames),
888409d6414dd4a42aa59779fcfe9fce18648cb135Stephen Hines        mGlobalAddresses(globalAddresses), mGlobalSizes(globalSizes),
895aa018cc36e589b07674957714d27ae3d1fa1c4eStephen Hines        mGlobalProperties(globalProperties), mGlobalEntries(globalEntries),
905aa018cc36e589b07674957714d27ae3d1fa1c4eStephen Hines        mIsThreadable(isThreadable), mBuildChecksum(buildChecksum),
915aa018cc36e589b07674957714d27ae3d1fa1c4eStephen Hines        mRS(RSContext) {
922abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni    }
932abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni
942abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni    ~ScriptExecutable() {
952abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni        for (size_t i = 0; i < mExportedVarCount; ++i) {
962abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni            if (mFieldIsObject[i]) {
972abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni                if (mFieldAddress[i] != nullptr) {
982abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni                    rs_object_base *obj_addr =
992abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni                            reinterpret_cast<rs_object_base *>(mFieldAddress[i]);
1002abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni                    rsrClearObject(mRS, obj_addr);
1012abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni                }
1022abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni            }
1032abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni        }
1042abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni
1052abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni        for (size_t i = 0; i < mPragmaCount; ++i) {
1062abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni            delete [] mPragmaKeys[i];
1072abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni            delete [] mPragmaValues[i];
1082abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni        }
1092abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni        delete[] mPragmaValues;
1102abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni        delete[] mPragmaKeys;
111062c287f573ecc06c38ee4295e5627e12c52ac3dYang Ni
11214ce007a633b10e3b9a3fae29d8f53a7e8c9b59fMatt Wala        delete[] mReduceFunctions;
11314ce007a633b10e3b9a3fae29d8f53a7e8c9b59fMatt Wala
1146c1876bbef1b2c89975dce91230a168bd2d2ce4cDavid Gross        delete[] mReduceNewDescriptions;
1156c1876bbef1b2c89975dce91230a168bd2d2ce4cDavid Gross
1162abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni        delete[] mForEachSignatures;
1172abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni        delete[] mForEachFunctions;
118062c287f573ecc06c38ee4295e5627e12c52ac3dYang Ni
1192abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni        delete[] mInvokeFunctions;
120062c287f573ecc06c38ee4295e5627e12c52ac3dYang Ni
121062c287f573ecc06c38ee4295e5627e12c52ac3dYang Ni        for (size_t i = 0; i < mExportedVarCount; i++) {
122062c287f573ecc06c38ee4295e5627e12c52ac3dYang Ni            delete[] mFieldName[i];
123062c287f573ecc06c38ee4295e5627e12c52ac3dYang Ni        }
124062c287f573ecc06c38ee4295e5627e12c52ac3dYang Ni        delete[] mFieldName;
1252abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni        delete[] mFieldIsObject;
1262abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni        delete[] mFieldAddress;
1272abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni    }
1282abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni
129cb17015fed6b11a5028f31cc804a3847e379945dYang Ni    // Create an ScriptExecutable object from a shared object.
130cb17015fed6b11a5028f31cc804a3847e379945dYang Ni    // If expectedChecksum is not zero, it will be compared to the checksum
131cb17015fed6b11a5028f31cc804a3847e379945dYang Ni    // embedded in the shared object. A mismatch will cause a failure.
132cb17015fed6b11a5028f31cc804a3847e379945dYang Ni    // If succeeded, returns the new object. Otherwise, returns nullptr.
1332abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni    static ScriptExecutable*
134cb17015fed6b11a5028f31cc804a3847e379945dYang Ni            createFromSharedObject(Context* RSContext, void* sharedObj,
135cb17015fed6b11a5028f31cc804a3847e379945dYang Ni                                   uint32_t expectedChecksum = 0);
1362abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni
1372abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni    size_t getExportedVariableCount() const { return mExportedVarCount; }
1382abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni    size_t getExportedFunctionCount() const { return mFuncCount; }
1392abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni    size_t getExportedForEachCount() const { return mForEachCount; }
14014ce007a633b10e3b9a3fae29d8f53a7e8c9b59fMatt Wala    size_t getExportedReduceCount() const { return mReduceCount; }
1416c1876bbef1b2c89975dce91230a168bd2d2ce4cDavid Gross    size_t getExportedReduceNewCount() const { return mReduceNewCount; }
1422abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni    size_t getPragmaCount() const { return mPragmaCount; }
1432abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni
1442abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni    void* getFieldAddress(int slot) const { return mFieldAddress[slot]; }
145062c287f573ecc06c38ee4295e5627e12c52ac3dYang Ni    void* getFieldAddress(const char* name) const;
1462abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni    bool getFieldIsObject(int slot) const { return mFieldIsObject[slot]; }
147062c287f573ecc06c38ee4295e5627e12c52ac3dYang Ni    const char* getFieldName(int slot) const { return mFieldName[slot]; }
148062c287f573ecc06c38ee4295e5627e12c52ac3dYang Ni
1492abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni    InvokeFunc_t getInvokeFunction(int slot) const { return mInvokeFunctions[slot]; }
150062c287f573ecc06c38ee4295e5627e12c52ac3dYang Ni
1512abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni    ForEachFunc_t getForEachFunction(int slot) const { return mForEachFunctions[slot]; }
1522abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni    uint32_t getForEachSignature(int slot) const { return mForEachSignatures[slot]; }
1532abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni
15414ce007a633b10e3b9a3fae29d8f53a7e8c9b59fMatt Wala    ReduceFunc_t getReduceFunction(int slot) const { return mReduceFunctions[slot]; }
15514ce007a633b10e3b9a3fae29d8f53a7e8c9b59fMatt Wala
1566c1876bbef1b2c89975dce91230a168bd2d2ce4cDavid Gross    const ReduceNewDescription* getReduceNewDescription(int slot) const {
1576c1876bbef1b2c89975dce91230a168bd2d2ce4cDavid Gross        return &mReduceNewDescriptions[slot];
1586c1876bbef1b2c89975dce91230a168bd2d2ce4cDavid Gross    }
1596c1876bbef1b2c89975dce91230a168bd2d2ce4cDavid Gross
1602abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni    const char ** getPragmaKeys() const { return mPragmaKeys; }
1612abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni    const char ** getPragmaValues() const { return mPragmaValues; }
1622abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni
1638409d6414dd4a42aa59779fcfe9fce18648cb135Stephen Hines    const char* getGlobalName(int i) const {
1648409d6414dd4a42aa59779fcfe9fce18648cb135Stephen Hines        if (i < mGlobalEntries) {
1658409d6414dd4a42aa59779fcfe9fce18648cb135Stephen Hines            return mGlobalNames[i];
1668409d6414dd4a42aa59779fcfe9fce18648cb135Stephen Hines        } else {
1678409d6414dd4a42aa59779fcfe9fce18648cb135Stephen Hines            return nullptr;
1688409d6414dd4a42aa59779fcfe9fce18648cb135Stephen Hines        }
1698409d6414dd4a42aa59779fcfe9fce18648cb135Stephen Hines    }
1708409d6414dd4a42aa59779fcfe9fce18648cb135Stephen Hines    const void* getGlobalAddress(int i) const {
1718409d6414dd4a42aa59779fcfe9fce18648cb135Stephen Hines        if (i < mGlobalEntries) {
1728409d6414dd4a42aa59779fcfe9fce18648cb135Stephen Hines            return mGlobalAddresses[i];
1738409d6414dd4a42aa59779fcfe9fce18648cb135Stephen Hines        } else {
1748409d6414dd4a42aa59779fcfe9fce18648cb135Stephen Hines            return nullptr;
1758409d6414dd4a42aa59779fcfe9fce18648cb135Stephen Hines        }
1768409d6414dd4a42aa59779fcfe9fce18648cb135Stephen Hines    }
1778409d6414dd4a42aa59779fcfe9fce18648cb135Stephen Hines    size_t getGlobalSize(int i) const {
1788409d6414dd4a42aa59779fcfe9fce18648cb135Stephen Hines        if (i < mGlobalEntries) {
1798409d6414dd4a42aa59779fcfe9fce18648cb135Stephen Hines            return mGlobalSizes[i];
1808409d6414dd4a42aa59779fcfe9fce18648cb135Stephen Hines        } else {
1818409d6414dd4a42aa59779fcfe9fce18648cb135Stephen Hines            return 0;
1828409d6414dd4a42aa59779fcfe9fce18648cb135Stephen Hines        }
1838409d6414dd4a42aa59779fcfe9fce18648cb135Stephen Hines    }
1845aa018cc36e589b07674957714d27ae3d1fa1c4eStephen Hines    uint32_t getGlobalProperties(int i) const {
1855aa018cc36e589b07674957714d27ae3d1fa1c4eStephen Hines        if (i < mGlobalEntries) {
1865aa018cc36e589b07674957714d27ae3d1fa1c4eStephen Hines            return mGlobalProperties[i];
1875aa018cc36e589b07674957714d27ae3d1fa1c4eStephen Hines        } else {
1885aa018cc36e589b07674957714d27ae3d1fa1c4eStephen Hines            return 0;
1895aa018cc36e589b07674957714d27ae3d1fa1c4eStephen Hines        }
1905aa018cc36e589b07674957714d27ae3d1fa1c4eStephen Hines    }
1918409d6414dd4a42aa59779fcfe9fce18648cb135Stephen Hines    int getGlobalEntries() const { return mGlobalEntries; }
1928409d6414dd4a42aa59779fcfe9fce18648cb135Stephen Hines
1932abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni    bool getThreadable() const { return mIsThreadable; }
1942abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni
195cb17015fed6b11a5028f31cc804a3847e379945dYang Ni    uint32_t getBuildChecksum() const { return mBuildChecksum; }
196aa6757ffc1b23d771566439c3179fdbc1e5ba569Pirama Arumuga Nainar
1978409d6414dd4a42aa59779fcfe9fce18648cb135Stephen Hines    bool dumpGlobalInfo() const;
1988409d6414dd4a42aa59779fcfe9fce18648cb135Stephen Hines
1992abfcc6d129fe3defddef4540aa95cc445c03a7aYang Niprivate:
2002abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni    void** mFieldAddress;
2012abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni    bool* mFieldIsObject;
202062c287f573ecc06c38ee4295e5627e12c52ac3dYang Ni    const char* const * mFieldName;
2032abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni    size_t mExportedVarCount;
2042abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni
2052abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni    InvokeFunc_t* mInvokeFunctions;
2062abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni    size_t mFuncCount;
2072abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni
2082abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni    ForEachFunc_t* mForEachFunctions;
2092abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni    uint32_t* mForEachSignatures;
2102abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni    size_t mForEachCount;
2112abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni
21214ce007a633b10e3b9a3fae29d8f53a7e8c9b59fMatt Wala    ReduceFunc_t* mReduceFunctions;
21314ce007a633b10e3b9a3fae29d8f53a7e8c9b59fMatt Wala    size_t mReduceCount;
21414ce007a633b10e3b9a3fae29d8f53a7e8c9b59fMatt Wala
2156c1876bbef1b2c89975dce91230a168bd2d2ce4cDavid Gross    ReduceNewDescription* mReduceNewDescriptions;
2166c1876bbef1b2c89975dce91230a168bd2d2ce4cDavid Gross    size_t mReduceNewCount;
2176c1876bbef1b2c89975dce91230a168bd2d2ce4cDavid Gross
2182abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni    const char ** mPragmaKeys;
2192abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni    const char ** mPragmaValues;
2202abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni    size_t mPragmaCount;
2212abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni
2228409d6414dd4a42aa59779fcfe9fce18648cb135Stephen Hines    const char ** mGlobalNames;
2238409d6414dd4a42aa59779fcfe9fce18648cb135Stephen Hines    const void ** mGlobalAddresses;
2248409d6414dd4a42aa59779fcfe9fce18648cb135Stephen Hines    const size_t * mGlobalSizes;
2255aa018cc36e589b07674957714d27ae3d1fa1c4eStephen Hines    const uint32_t * mGlobalProperties;
2268409d6414dd4a42aa59779fcfe9fce18648cb135Stephen Hines    int mGlobalEntries;
2278409d6414dd4a42aa59779fcfe9fce18648cb135Stephen Hines
2282abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni    bool mIsThreadable;
229cb17015fed6b11a5028f31cc804a3847e379945dYang Ni    uint32_t mBuildChecksum;
2302abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni
2312abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni    Context* mRS;
2322abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni};
2332abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni
2342abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni}  // namespace renderscript
2352abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni}  // namespace android
2362abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni
2372abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni#endif  // ANDROID_RENDERSCRIPT_EXECUTABLE_H
238