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