rsCpuExecutable.h revision 4c368af7e705f0bcb77fa99495b2e33ef20d2699
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, 462abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni const char *nativeLibDir = nullptr); 472abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni 482abfcc6d129fe3defddef4540aa95cc445c03a7aYang Niprivate: 492abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni // Attempt to load the shared library from origName, but then fall back to 502abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni // creating a copy of the shared library if necessary (to ensure instancing). 512abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni // This function returns the dlopen()-ed handle if successful. 522abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni static void *loadSOHelper(const char *origName, const char *cacheDir, 532abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni const char *resName); 542abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni 552abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni static const char* LD_EXE_PATH; 562abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni static const char* RS_CACHE_DIR; 572abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni}; 582abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni 592abfcc6d129fe3defddef4540aa95cc445c03a7aYang Niclass ScriptExecutable { 602abfcc6d129fe3defddef4540aa95cc445c03a7aYang Nipublic: 612abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni ScriptExecutable(Context* RSContext, 62062c287f573ecc06c38ee4295e5627e12c52ac3dYang Ni void** fieldAddress, bool* fieldIsObject, 63062c287f573ecc06c38ee4295e5627e12c52ac3dYang Ni const char* const * fieldName, size_t varCount, 642abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni InvokeFunc_t* invokeFunctions, size_t funcCount, 652abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni ForEachFunc_t* forEachFunctions, uint32_t* forEachSignatures, 662abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni size_t forEachCount, 67062c287f573ecc06c38ee4295e5627e12c52ac3dYang Ni const char** pragmaKeys, const char** pragmaValues, 682abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni size_t pragmaCount, 69cb17015fed6b11a5028f31cc804a3847e379945dYang Ni bool isThreadable, uint32_t buildChecksum) : 702abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni mFieldAddress(fieldAddress), mFieldIsObject(fieldIsObject), 71062c287f573ecc06c38ee4295e5627e12c52ac3dYang Ni mFieldName(fieldName), mExportedVarCount(varCount), 72062c287f573ecc06c38ee4295e5627e12c52ac3dYang Ni mInvokeFunctions(invokeFunctions), mFuncCount(funcCount), 73062c287f573ecc06c38ee4295e5627e12c52ac3dYang Ni mForEachFunctions(forEachFunctions), mForEachSignatures(forEachSignatures), 74062c287f573ecc06c38ee4295e5627e12c52ac3dYang Ni mForEachCount(forEachCount), 75062c287f573ecc06c38ee4295e5627e12c52ac3dYang Ni mPragmaKeys(pragmaKeys), mPragmaValues(pragmaValues), 76062c287f573ecc06c38ee4295e5627e12c52ac3dYang Ni mPragmaCount(pragmaCount), mIsThreadable(isThreadable), 77062c287f573ecc06c38ee4295e5627e12c52ac3dYang Ni mBuildChecksum(buildChecksum), mRS(RSContext) { 782abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni } 792abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni 802abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni ~ScriptExecutable() { 812abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni for (size_t i = 0; i < mExportedVarCount; ++i) { 822abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni if (mFieldIsObject[i]) { 832abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni if (mFieldAddress[i] != nullptr) { 842abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni rs_object_base *obj_addr = 852abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni reinterpret_cast<rs_object_base *>(mFieldAddress[i]); 862abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni rsrClearObject(mRS, obj_addr); 872abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni } 882abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni } 892abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni } 902abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni 912abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni for (size_t i = 0; i < mPragmaCount; ++i) { 922abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni delete [] mPragmaKeys[i]; 932abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni delete [] mPragmaValues[i]; 942abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni } 952abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni delete[] mPragmaValues; 962abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni delete[] mPragmaKeys; 97062c287f573ecc06c38ee4295e5627e12c52ac3dYang Ni 982abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni delete[] mForEachSignatures; 992abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni delete[] mForEachFunctions; 100062c287f573ecc06c38ee4295e5627e12c52ac3dYang Ni 1012abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni delete[] mInvokeFunctions; 102062c287f573ecc06c38ee4295e5627e12c52ac3dYang Ni 103062c287f573ecc06c38ee4295e5627e12c52ac3dYang Ni for (size_t i = 0; i < mExportedVarCount; i++) { 104062c287f573ecc06c38ee4295e5627e12c52ac3dYang Ni delete[] mFieldName[i]; 105062c287f573ecc06c38ee4295e5627e12c52ac3dYang Ni } 106062c287f573ecc06c38ee4295e5627e12c52ac3dYang Ni delete[] mFieldName; 1072abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni delete[] mFieldIsObject; 1082abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni delete[] mFieldAddress; 1092abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni } 1102abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni 111cb17015fed6b11a5028f31cc804a3847e379945dYang Ni // Create an ScriptExecutable object from a shared object. 112cb17015fed6b11a5028f31cc804a3847e379945dYang Ni // If expectedChecksum is not zero, it will be compared to the checksum 113cb17015fed6b11a5028f31cc804a3847e379945dYang Ni // embedded in the shared object. A mismatch will cause a failure. 114cb17015fed6b11a5028f31cc804a3847e379945dYang Ni // If succeeded, returns the new object. Otherwise, returns nullptr. 1152abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni static ScriptExecutable* 116cb17015fed6b11a5028f31cc804a3847e379945dYang Ni createFromSharedObject(Context* RSContext, void* sharedObj, 117cb17015fed6b11a5028f31cc804a3847e379945dYang Ni uint32_t expectedChecksum = 0); 1182abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni 1192abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni size_t getExportedVariableCount() const { return mExportedVarCount; } 1202abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni size_t getExportedFunctionCount() const { return mFuncCount; } 1212abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni size_t getExportedForEachCount() const { return mForEachCount; } 1222abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni size_t getPragmaCount() const { return mPragmaCount; } 1232abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni 1242abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni void* getFieldAddress(int slot) const { return mFieldAddress[slot]; } 125062c287f573ecc06c38ee4295e5627e12c52ac3dYang Ni void* getFieldAddress(const char* name) const; 1262abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni bool getFieldIsObject(int slot) const { return mFieldIsObject[slot]; } 127062c287f573ecc06c38ee4295e5627e12c52ac3dYang Ni const char* getFieldName(int slot) const { return mFieldName[slot]; } 128062c287f573ecc06c38ee4295e5627e12c52ac3dYang Ni 1292abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni InvokeFunc_t getInvokeFunction(int slot) const { return mInvokeFunctions[slot]; } 130062c287f573ecc06c38ee4295e5627e12c52ac3dYang Ni 1312abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni ForEachFunc_t getForEachFunction(int slot) const { return mForEachFunctions[slot]; } 1322abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni uint32_t getForEachSignature(int slot) const { return mForEachSignatures[slot]; } 1332abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni 1342abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni const char ** getPragmaKeys() const { return mPragmaKeys; } 1352abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni const char ** getPragmaValues() const { return mPragmaValues; } 1362abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni 1372abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni bool getThreadable() const { return mIsThreadable; } 1382abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni 139cb17015fed6b11a5028f31cc804a3847e379945dYang Ni uint32_t getBuildChecksum() const { return mBuildChecksum; } 140aa6757ffc1b23d771566439c3179fdbc1e5ba569Pirama Arumuga Nainar 1412abfcc6d129fe3defddef4540aa95cc445c03a7aYang Niprivate: 1422abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni void** mFieldAddress; 1432abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni bool* mFieldIsObject; 144062c287f573ecc06c38ee4295e5627e12c52ac3dYang Ni const char* const * mFieldName; 1452abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni size_t mExportedVarCount; 1462abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni 1472abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni InvokeFunc_t* mInvokeFunctions; 1482abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni size_t mFuncCount; 1492abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni 1502abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni ForEachFunc_t* mForEachFunctions; 1512abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni uint32_t* mForEachSignatures; 1522abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni size_t mForEachCount; 1532abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni 1542abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni const char ** mPragmaKeys; 1552abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni const char ** mPragmaValues; 1562abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni size_t mPragmaCount; 1572abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni 1582abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni bool mIsThreadable; 159cb17015fed6b11a5028f31cc804a3847e379945dYang Ni uint32_t mBuildChecksum; 1602abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni 1612abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni Context* mRS; 1622abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni}; 1632abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni 1642abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni} // namespace renderscript 1652abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni} // namespace android 1662abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni 1672abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni#endif // ANDROID_RENDERSCRIPT_EXECUTABLE_H 168