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
212abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni#include "rsCpuScript.h"
222abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni
2382e135c4bbe18855d8ed02632bb074f8da0b96e0Miao Wang#include <stdlib.h>
2482e135c4bbe18855d8ed02632bb074f8da0b96e0Miao Wang#include <string>
2582e135c4bbe18855d8ed02632bb074f8da0b96e0Miao Wang
262abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ninamespace android {
272abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ninamespace renderscript {
282abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni
292abfcc6d129fe3defddef4540aa95cc445c03a7aYang Niclass Context;
302abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni
312abfcc6d129fe3defddef4540aa95cc445c03a7aYang Niclass SharedLibraryUtils {
322abfcc6d129fe3defddef4540aa95cc445c03a7aYang Nipublic:
332abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni#ifndef RS_COMPATIBILITY_LIB
34a845c35880f8434619ac299e8af47aa6a5049e8dYang Ni    // Creates a shared library in cacheDir for the bitcode named resName.
35a845c35880f8434619ac299e8af47aa6a5049e8dYang Ni    // If reuse is false and SOPath is not nullptr, saves the filename
36a845c35880f8434619ac299e8af47aa6a5049e8dYang Ni    // used for the shared library in SOPath.
374c368af7e705f0bcb77fa99495b2e33ef20d2699Stephen Hines    static bool createSharedLibrary(const char* driverName,
384c368af7e705f0bcb77fa99495b2e33ef20d2699Stephen Hines                                    const char* cacheDir,
39a845c35880f8434619ac299e8af47aa6a5049e8dYang Ni                                    const char* resName,
40a845c35880f8434619ac299e8af47aa6a5049e8dYang Ni                                    const bool reuse = true,
41a845c35880f8434619ac299e8af47aa6a5049e8dYang Ni                                    std::string *SOPath = nullptr);
422abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni#endif
432abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni
442abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni    // Load the shared library referred to by cacheDir and resName. If we have
452abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni    // already loaded this library, we instead create a new copy (in the
462abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni    // cache dir) and then load that. We then immediately destroy the copy.
472abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni    // This is required behavior to implement script instancing for the support
482abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni    // library, since shared objects are loaded and de-duped by name only.
492abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni
502abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni    // For 64bit RS Support Lib, the shared lib path cannot be constructed from
512abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni    // cacheDir, so nativeLibDir is needed to load shared libs.
522abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni    static void* loadSharedLibrary(const char *cacheDir, const char *resName,
531efae29f4bbe6c165caf6dfc4b89cf8a5f8c469bYang Ni                                   const char *nativeLibDir = nullptr,
541efae29f4bbe6c165caf6dfc4b89cf8a5f8c469bYang Ni                                   bool *alreadyLoaded = nullptr);
551efae29f4bbe6c165caf6dfc4b89cf8a5f8c469bYang Ni
56a845c35880f8434619ac299e8af47aa6a5049e8dYang Ni    // Load the shared library referred to by fullPath, and delete it right
57a845c35880f8434619ac299e8af47aa6a5049e8dYang Ni    // after loading it. Files loaded by this function are only used once, e.g.,
58a845c35880f8434619ac299e8af47aa6a5049e8dYang Ni    // shared libraries generated for scripts in a debug context. Deleting them
59a845c35880f8434619ac299e8af47aa6a5049e8dYang Ni    // is OK in this case since the shared libraries have already been dlopened.
60a845c35880f8434619ac299e8af47aa6a5049e8dYang Ni    // Deletion is also required because such files are not intended for reuse.
61a845c35880f8434619ac299e8af47aa6a5049e8dYang Ni    static void* loadAndDeleteSharedLibrary(const char *fullPath);
62a845c35880f8434619ac299e8af47aa6a5049e8dYang Ni
631efae29f4bbe6c165caf6dfc4b89cf8a5f8c469bYang Ni    // Create a len length string containing random characters from [A-Za-z0-9].
6482e135c4bbe18855d8ed02632bb074f8da0b96e0Miao Wang    static std::string getRandomString(size_t len);
652abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni
662abfcc6d129fe3defddef4540aa95cc445c03a7aYang Niprivate:
672abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni    // Attempt to load the shared library from origName, but then fall back to
682abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni    // creating a copy of the shared library if necessary (to ensure instancing).
692abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni    // This function returns the dlopen()-ed handle if successful.
702abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni    static void *loadSOHelper(const char *origName, const char *cacheDir,
711efae29f4bbe6c165caf6dfc4b89cf8a5f8c469bYang Ni                              const char *resName, bool* alreadyLoaded = nullptr);
722abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni
732abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni    static const char* LD_EXE_PATH;
742abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni    static const char* RS_CACHE_DIR;
752abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni};
762abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni
772abfcc6d129fe3defddef4540aa95cc445c03a7aYang Niclass ScriptExecutable {
782abfcc6d129fe3defddef4540aa95cc445c03a7aYang Nipublic:
795e48002cc4a11e9ce63852a77488cfb9f6765c2bYang Ni    ScriptExecutable(void** fieldAddress, bool* fieldIsObject,
80062c287f573ecc06c38ee4295e5627e12c52ac3dYang Ni                     const char* const * fieldName, size_t varCount,
812abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni                     InvokeFunc_t* invokeFunctions, size_t funcCount,
822abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni                     ForEachFunc_t* forEachFunctions, uint32_t* forEachSignatures,
832abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni                     size_t forEachCount,
84ae2ec3febedfc29376b9104413fb4042028f1265David Gross                     ReduceDescription *reduceDescriptions, size_t reduceCount,
85062c287f573ecc06c38ee4295e5627e12c52ac3dYang Ni                     const char** pragmaKeys, const char** pragmaValues,
862abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni                     size_t pragmaCount,
878409d6414dd4a42aa59779fcfe9fce18648cb135Stephen Hines                     const char **globalNames, const void **globalAddresses,
885aa018cc36e589b07674957714d27ae3d1fa1c4eStephen Hines                     const size_t *globalSizes,
895aa018cc36e589b07674957714d27ae3d1fa1c4eStephen Hines                     const uint32_t *globalProperties, size_t globalEntries,
90cb17015fed6b11a5028f31cc804a3847e379945dYang Ni                     bool isThreadable, uint32_t buildChecksum) :
912abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni        mFieldAddress(fieldAddress), mFieldIsObject(fieldIsObject),
92062c287f573ecc06c38ee4295e5627e12c52ac3dYang Ni        mFieldName(fieldName), mExportedVarCount(varCount),
93062c287f573ecc06c38ee4295e5627e12c52ac3dYang Ni        mInvokeFunctions(invokeFunctions), mFuncCount(funcCount),
94062c287f573ecc06c38ee4295e5627e12c52ac3dYang Ni        mForEachFunctions(forEachFunctions), mForEachSignatures(forEachSignatures),
95062c287f573ecc06c38ee4295e5627e12c52ac3dYang Ni        mForEachCount(forEachCount),
96ae2ec3febedfc29376b9104413fb4042028f1265David Gross        mReduceDescriptions(reduceDescriptions), mReduceCount(reduceCount),
97062c287f573ecc06c38ee4295e5627e12c52ac3dYang Ni        mPragmaKeys(pragmaKeys), mPragmaValues(pragmaValues),
988409d6414dd4a42aa59779fcfe9fce18648cb135Stephen Hines        mPragmaCount(pragmaCount), mGlobalNames(globalNames),
998409d6414dd4a42aa59779fcfe9fce18648cb135Stephen Hines        mGlobalAddresses(globalAddresses), mGlobalSizes(globalSizes),
1005aa018cc36e589b07674957714d27ae3d1fa1c4eStephen Hines        mGlobalProperties(globalProperties), mGlobalEntries(globalEntries),
1015e48002cc4a11e9ce63852a77488cfb9f6765c2bYang Ni        mIsThreadable(isThreadable), mBuildChecksum(buildChecksum) {
1022abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni    }
1032abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni
1042abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni    ~ScriptExecutable() {
1052abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni        for (size_t i = 0; i < mExportedVarCount; ++i) {
1062abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni            if (mFieldIsObject[i]) {
1072abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni                if (mFieldAddress[i] != nullptr) {
1082abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni                    rs_object_base *obj_addr =
1092abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni                            reinterpret_cast<rs_object_base *>(mFieldAddress[i]);
1105e48002cc4a11e9ce63852a77488cfb9f6765c2bYang Ni                    rsrClearObject(obj_addr);
1112abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni                }
1122abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni            }
1132abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni        }
1142abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni
1152abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni        for (size_t i = 0; i < mPragmaCount; ++i) {
1162abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni            delete [] mPragmaKeys[i];
1172abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni            delete [] mPragmaValues[i];
1182abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni        }
1192abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni        delete[] mPragmaValues;
1202abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni        delete[] mPragmaKeys;
121062c287f573ecc06c38ee4295e5627e12c52ac3dYang Ni
122ae2ec3febedfc29376b9104413fb4042028f1265David Gross        delete[] mReduceDescriptions;
1236c1876bbef1b2c89975dce91230a168bd2d2ce4cDavid Gross
1242abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni        delete[] mForEachSignatures;
1252abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni        delete[] mForEachFunctions;
126062c287f573ecc06c38ee4295e5627e12c52ac3dYang Ni
1272abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni        delete[] mInvokeFunctions;
128062c287f573ecc06c38ee4295e5627e12c52ac3dYang Ni
129062c287f573ecc06c38ee4295e5627e12c52ac3dYang Ni        for (size_t i = 0; i < mExportedVarCount; i++) {
130062c287f573ecc06c38ee4295e5627e12c52ac3dYang Ni            delete[] mFieldName[i];
131062c287f573ecc06c38ee4295e5627e12c52ac3dYang Ni        }
132062c287f573ecc06c38ee4295e5627e12c52ac3dYang Ni        delete[] mFieldName;
1332abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni        delete[] mFieldIsObject;
1342abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni        delete[] mFieldAddress;
1352abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni    }
1362abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni
137cb17015fed6b11a5028f31cc804a3847e379945dYang Ni    // Create an ScriptExecutable object from a shared object.
138cb17015fed6b11a5028f31cc804a3847e379945dYang Ni    // If expectedChecksum is not zero, it will be compared to the checksum
139cb17015fed6b11a5028f31cc804a3847e379945dYang Ni    // embedded in the shared object. A mismatch will cause a failure.
140cb17015fed6b11a5028f31cc804a3847e379945dYang Ni    // If succeeded, returns the new object. Otherwise, returns nullptr.
1412abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni    static ScriptExecutable*
1425e48002cc4a11e9ce63852a77488cfb9f6765c2bYang Ni            createFromSharedObject(void* sharedObj,
143cb17015fed6b11a5028f31cc804a3847e379945dYang Ni                                   uint32_t expectedChecksum = 0);
1442abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni
1452abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni    size_t getExportedVariableCount() const { return mExportedVarCount; }
1462abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni    size_t getExportedFunctionCount() const { return mFuncCount; }
1472abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni    size_t getExportedForEachCount() const { return mForEachCount; }
14814ce007a633b10e3b9a3fae29d8f53a7e8c9b59fMatt Wala    size_t getExportedReduceCount() const { return mReduceCount; }
1492abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni    size_t getPragmaCount() const { return mPragmaCount; }
1502abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni
1512abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni    void* getFieldAddress(int slot) const { return mFieldAddress[slot]; }
152062c287f573ecc06c38ee4295e5627e12c52ac3dYang Ni    void* getFieldAddress(const char* name) const;
1532abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni    bool getFieldIsObject(int slot) const { return mFieldIsObject[slot]; }
154062c287f573ecc06c38ee4295e5627e12c52ac3dYang Ni    const char* getFieldName(int slot) const { return mFieldName[slot]; }
155062c287f573ecc06c38ee4295e5627e12c52ac3dYang Ni
1562abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni    InvokeFunc_t getInvokeFunction(int slot) const { return mInvokeFunctions[slot]; }
157062c287f573ecc06c38ee4295e5627e12c52ac3dYang Ni
1582abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni    ForEachFunc_t getForEachFunction(int slot) const { return mForEachFunctions[slot]; }
1592abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni    uint32_t getForEachSignature(int slot) const { return mForEachSignatures[slot]; }
1602abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni
161ae2ec3febedfc29376b9104413fb4042028f1265David Gross    const ReduceDescription* getReduceDescription(int slot) const {
162ae2ec3febedfc29376b9104413fb4042028f1265David Gross        return &mReduceDescriptions[slot];
1636c1876bbef1b2c89975dce91230a168bd2d2ce4cDavid Gross    }
1646c1876bbef1b2c89975dce91230a168bd2d2ce4cDavid Gross
1652abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni    const char ** getPragmaKeys() const { return mPragmaKeys; }
1662abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni    const char ** getPragmaValues() const { return mPragmaValues; }
1672abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni
1688409d6414dd4a42aa59779fcfe9fce18648cb135Stephen Hines    const char* getGlobalName(int i) const {
1698409d6414dd4a42aa59779fcfe9fce18648cb135Stephen Hines        if (i < mGlobalEntries) {
1708409d6414dd4a42aa59779fcfe9fce18648cb135Stephen Hines            return mGlobalNames[i];
1718409d6414dd4a42aa59779fcfe9fce18648cb135Stephen Hines        } else {
1728409d6414dd4a42aa59779fcfe9fce18648cb135Stephen Hines            return nullptr;
1738409d6414dd4a42aa59779fcfe9fce18648cb135Stephen Hines        }
1748409d6414dd4a42aa59779fcfe9fce18648cb135Stephen Hines    }
1758409d6414dd4a42aa59779fcfe9fce18648cb135Stephen Hines    const void* getGlobalAddress(int i) const {
1768409d6414dd4a42aa59779fcfe9fce18648cb135Stephen Hines        if (i < mGlobalEntries) {
1778409d6414dd4a42aa59779fcfe9fce18648cb135Stephen Hines            return mGlobalAddresses[i];
1788409d6414dd4a42aa59779fcfe9fce18648cb135Stephen Hines        } else {
1798409d6414dd4a42aa59779fcfe9fce18648cb135Stephen Hines            return nullptr;
1808409d6414dd4a42aa59779fcfe9fce18648cb135Stephen Hines        }
1818409d6414dd4a42aa59779fcfe9fce18648cb135Stephen Hines    }
1828409d6414dd4a42aa59779fcfe9fce18648cb135Stephen Hines    size_t getGlobalSize(int i) const {
1838409d6414dd4a42aa59779fcfe9fce18648cb135Stephen Hines        if (i < mGlobalEntries) {
1848409d6414dd4a42aa59779fcfe9fce18648cb135Stephen Hines            return mGlobalSizes[i];
1858409d6414dd4a42aa59779fcfe9fce18648cb135Stephen Hines        } else {
1868409d6414dd4a42aa59779fcfe9fce18648cb135Stephen Hines            return 0;
1878409d6414dd4a42aa59779fcfe9fce18648cb135Stephen Hines        }
1888409d6414dd4a42aa59779fcfe9fce18648cb135Stephen Hines    }
1895aa018cc36e589b07674957714d27ae3d1fa1c4eStephen Hines    uint32_t getGlobalProperties(int i) const {
1905aa018cc36e589b07674957714d27ae3d1fa1c4eStephen Hines        if (i < mGlobalEntries) {
1915aa018cc36e589b07674957714d27ae3d1fa1c4eStephen Hines            return mGlobalProperties[i];
1925aa018cc36e589b07674957714d27ae3d1fa1c4eStephen Hines        } else {
1935aa018cc36e589b07674957714d27ae3d1fa1c4eStephen Hines            return 0;
1945aa018cc36e589b07674957714d27ae3d1fa1c4eStephen Hines        }
1955aa018cc36e589b07674957714d27ae3d1fa1c4eStephen Hines    }
1968409d6414dd4a42aa59779fcfe9fce18648cb135Stephen Hines    int getGlobalEntries() const { return mGlobalEntries; }
1978409d6414dd4a42aa59779fcfe9fce18648cb135Stephen Hines
1982abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni    bool getThreadable() const { return mIsThreadable; }
1992abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni
200cb17015fed6b11a5028f31cc804a3847e379945dYang Ni    uint32_t getBuildChecksum() const { return mBuildChecksum; }
201aa6757ffc1b23d771566439c3179fdbc1e5ba569Pirama Arumuga Nainar
2028409d6414dd4a42aa59779fcfe9fce18648cb135Stephen Hines    bool dumpGlobalInfo() const;
2038409d6414dd4a42aa59779fcfe9fce18648cb135Stephen Hines
2042abfcc6d129fe3defddef4540aa95cc445c03a7aYang Niprivate:
2052abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni    void** mFieldAddress;
2062abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni    bool* mFieldIsObject;
207062c287f573ecc06c38ee4295e5627e12c52ac3dYang Ni    const char* const * mFieldName;
2082abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni    size_t mExportedVarCount;
2092abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni
2102abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni    InvokeFunc_t* mInvokeFunctions;
2112abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni    size_t mFuncCount;
2122abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni
2132abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni    ForEachFunc_t* mForEachFunctions;
2142abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni    uint32_t* mForEachSignatures;
2152abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni    size_t mForEachCount;
2162abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni
217ae2ec3febedfc29376b9104413fb4042028f1265David Gross    ReduceDescription* mReduceDescriptions;
21814ce007a633b10e3b9a3fae29d8f53a7e8c9b59fMatt Wala    size_t mReduceCount;
21914ce007a633b10e3b9a3fae29d8f53a7e8c9b59fMatt Wala
2202abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni    const char ** mPragmaKeys;
2212abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni    const char ** mPragmaValues;
2222abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni    size_t mPragmaCount;
2232abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni
2248409d6414dd4a42aa59779fcfe9fce18648cb135Stephen Hines    const char ** mGlobalNames;
2258409d6414dd4a42aa59779fcfe9fce18648cb135Stephen Hines    const void ** mGlobalAddresses;
2268409d6414dd4a42aa59779fcfe9fce18648cb135Stephen Hines    const size_t * mGlobalSizes;
2275aa018cc36e589b07674957714d27ae3d1fa1c4eStephen Hines    const uint32_t * mGlobalProperties;
2288409d6414dd4a42aa59779fcfe9fce18648cb135Stephen Hines    int mGlobalEntries;
2298409d6414dd4a42aa59779fcfe9fce18648cb135Stephen Hines
2302abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni    bool mIsThreadable;
231cb17015fed6b11a5028f31cc804a3847e379945dYang Ni    uint32_t mBuildChecksum;
2322abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni};
2332abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni
2342abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni}  // namespace renderscript
2352abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni}  // namespace android
2362abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni
2372abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni#endif  // ANDROID_RENDERSCRIPT_EXECUTABLE_H
238