slang_rs_reflection.cpp revision bd49c8ff5a35befb413de3b6d7989d257b54f057
1462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include "slang_rs_context.hpp" 2462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include "slang_rs_export_var.hpp" 3462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include "slang_rs_reflection.hpp" 4462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include "slang_rs_export_func.hpp" 5462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 6462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include <ctype.h> 7462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 8462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include <utility> 9462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include <cstdarg> 10462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 11462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaousing std::make_pair; 12462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaousing std::endl; 13462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 14462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 15462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#define RS_SCRIPT_CLASS_NAME_PREFIX "ScriptC_" 16462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#define RS_SCRIPT_CLASS_SUPER_CLASS_NAME "ScriptC" 17462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 18462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#define RS_TYPE_CLASS_NAME_PREFIX "ScriptField_" 19462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#define RS_TYPE_CLASS_SUPER_CLASS_NAME "android.renderscript.Script.FieldBase" 20462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 21462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#define RS_TYPE_ITEM_CLASS_NAME "Item" 22462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 23462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#define RS_TYPE_ITEM_BUFFER_NAME "mItemArray" 24462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#define RS_TYPE_ITEM_BUFFER_PACKER_NAME "mIOBuffer" 25462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 26462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#define RS_EXPORT_VAR_INDEX_PREFIX "mExportVarIdx_" 27462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#define RS_EXPORT_VAR_PREFIX "mExportVar_" 28462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 29462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#define RS_EXPORT_FUNC_INDEX_PREFIX "mExportFuncIdx_" 30462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 31462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#define RS_EXPORT_VAR_ALLOCATION_PREFIX "mAlloction_" 32462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#define RS_EXPORT_VAR_DATA_STORAGE_PREFIX "mData_" 33462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 34462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaonamespace slang { 35462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 36462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao/* Some utility function using internal in RSReflection */ 37462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaostatic bool GetFileNameWithoutExtension(const std::string& FileName, std::string& OutFileName) { 38462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao OutFileName.clear(); 39462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 40462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(FileName.empty() || (FileName == "-")) 41462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return true; 42462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 43462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* find last component in given path */ 44462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao size_t SlashPos = FileName.find_last_of("/\\"); 45462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 46462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if((SlashPos != std::string::npos) && ((SlashPos + 1) < FileName.length())) 47462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao OutFileName = FileName.substr(SlashPos + 1); 48462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao else 49462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao OutFileName = FileName; 50462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 51462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao size_t DotPos = OutFileName.find_first_of('.'); 522dd42ffb0679851777ec4733681816d399d5f7d3Shih-wei Liao if(DotPos != std::string::npos) 532dd42ffb0679851777ec4733681816d399d5f7d3Shih-wei Liao OutFileName.erase(DotPos); 54462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 55462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return true; 56462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 57462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 58462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaostatic const char* GetPrimitiveTypeName(const RSExportPrimitiveType* EPT) { 59462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao static const char* PrimitiveTypeJavaNameMap[] = { 60462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "", 61462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "", 62462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "float", /* RSExportPrimitiveType::DataTypeFloat32 */ 63462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "double", /* RSExportPrimitiveType::DataTypeFloat64 */ 64462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "byte", /* RSExportPrimitiveType::DataTypeSigned8 */ 65462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "short", /* RSExportPrimitiveType::DataTypeSigned16 */ 66462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "int", /* RSExportPrimitiveType::DataTypeSigned32 */ 67462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "long", /* RSExportPrimitiveType::DataTypeSigned64 */ 68c20992e629a0edb507be763851edaf073cb5b18aShih-wei Liao "short", /* RSExportPrimitiveType::DataTypeUnsigned8 */ 69c20992e629a0edb507be763851edaf073cb5b18aShih-wei Liao "int", /* RSExportPrimitiveType::DataTypeUnsigned16 */ 70c20992e629a0edb507be763851edaf073cb5b18aShih-wei Liao "long", /* RSExportPrimitiveType::DataTypeUnsigned32 */ 71462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "long", /* RSExportPrimitiveType::DataTypeUnsigned64 */ 72462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 73c20992e629a0edb507be763851edaf073cb5b18aShih-wei Liao "int", /* RSExportPrimitiveType::DataTypeUnsigned565 */ 74c20992e629a0edb507be763851edaf073cb5b18aShih-wei Liao "int", /* RSExportPrimitiveType::DataTypeUnsigned5551 */ 75c20992e629a0edb507be763851edaf073cb5b18aShih-wei Liao "int", /* RSExportPrimitiveType::DataTypeUnsigned4444 */ 76462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 77462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "Element", /* RSExportPrimitiveType::DataTypeRSElement */ 78462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "Type", /* RSExportPrimitiveType::DataTypeRSType */ 79462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "Allocation", /* RSExportPrimitiveType::DataTypeRSAllocation */ 80462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "Sampler", /* RSExportPrimitiveType::DataTypeRSSampler */ 81462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "Script", /* RSExportPrimitiveType::DataTypeRSScript */ 82462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "SimpleMesh", /* RSExportPrimitiveType::DataTypeRSSimpleMesh */ 83462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "ProgramFragment", /* RSExportPrimitiveType::DataTypeRSProgramFragment */ 84462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "ProgramVertex", /* RSExportPrimitiveType::DataTypeRSProgramVertex */ 85462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "ProgramRaster", /* RSExportPrimitiveType::DataTypeRSProgramRaster */ 86462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "ProgramStore", /* RSExportPrimitiveType::DataTypeRSProgramStore */ 87462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao }; 88462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 89462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if((EPT->getType() >= 0) && (EPT->getType() < (sizeof(PrimitiveTypeJavaNameMap) / sizeof(const char*)))) 90462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return PrimitiveTypeJavaNameMap[ EPT->getType() ]; 91462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 92462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao assert(false && "GetPrimitiveTypeName : Unknown primitive data type"); 93462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return NULL; 94462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 95462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 96462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaostatic const char* GetVectorTypeName(const RSExportVectorType* EVT) { 97462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao static const char* VectorTypeJavaNameMap[][3] = { 98462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* 0 */ { "Byte2", "Byte3", "Byte4" }, 99462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* 1 */ { "Short2", "Short3", "Short4" }, 100462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* 2 */ { "Int2", "Int3", "Int4" }, 101c20992e629a0edb507be763851edaf073cb5b18aShih-wei Liao /* 3 */ { "Long2", "Long3", "Long4" }, 102c20992e629a0edb507be763851edaf073cb5b18aShih-wei Liao /* 4 */ { "Float2", "Float3", "Float4" }, 103462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao }; 104462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 105462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao const char** BaseElement; 106462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 107462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao switch(EVT->getType()) { 108462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao case RSExportPrimitiveType::DataTypeSigned8: 109462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao BaseElement = VectorTypeJavaNameMap[0]; 110462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao break; 111462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 112462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao case RSExportPrimitiveType::DataTypeSigned16: 113c20992e629a0edb507be763851edaf073cb5b18aShih-wei Liao case RSExportPrimitiveType::DataTypeUnsigned8: 114462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao BaseElement = VectorTypeJavaNameMap[1]; 115462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao break; 116462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 117462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao case RSExportPrimitiveType::DataTypeSigned32: 118c20992e629a0edb507be763851edaf073cb5b18aShih-wei Liao case RSExportPrimitiveType::DataTypeUnsigned16: 119462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao BaseElement = VectorTypeJavaNameMap[2]; 120462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao break; 121462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 122c20992e629a0edb507be763851edaf073cb5b18aShih-wei Liao case RSExportPrimitiveType::DataTypeUnsigned32: 123462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao BaseElement = VectorTypeJavaNameMap[3]; 124462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao break; 125462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1262dd42ffb0679851777ec4733681816d399d5f7d3Shih-wei Liao case RSExportPrimitiveType::DataTypeFloat32: 127c20992e629a0edb507be763851edaf073cb5b18aShih-wei Liao BaseElement = VectorTypeJavaNameMap[4]; 128c20992e629a0edb507be763851edaf073cb5b18aShih-wei Liao break; 129c20992e629a0edb507be763851edaf073cb5b18aShih-wei Liao 130462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao default: 131462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao assert(false && "RSReflection::genElementTypeName : Unsupported vector element data type"); 132462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao break; 133462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 134462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 135462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao assert((EVT->getNumElement() > 1) && (EVT->getNumElement() <= 4) && "Number of element in vector type is invalid"); 136462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 137462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return BaseElement[EVT->getNumElement() - 2]; 138462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 139462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 140462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaostatic const char* GetPackerAPIName(const RSExportPrimitiveType* EPT) { 141462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao static const char* PrimitiveTypePackerAPINameMap[] = { 142462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "", 143462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "", 144462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "addF32", /* RSExportPrimitiveType::DataTypeFloat32 */ 145462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "addF64", /* RSExportPrimitiveType::DataTypeFloat64 */ 146462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "addI8", /* RSExportPrimitiveType::DataTypeSigned8 */ 147462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "addI16", /* RSExportPrimitiveType::DataTypeSigned16 */ 148462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "addI32", /* RSExportPrimitiveType::DataTypeSigned32 */ 149462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "addI64", /* RSExportPrimitiveType::DataTypeSigned64 */ 150462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "addU8", /* RSExportPrimitiveType::DataTypeUnsigned8 */ 151462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "addU16", /* RSExportPrimitiveType::DataTypeUnsigned16 */ 152462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "addU32", /* RSExportPrimitiveType::DataTypeUnsigned32 */ 153462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "addU64", /* RSExportPrimitiveType::DataTypeUnsigned64 */ 154462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 155462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "addU16", /* RSExportPrimitiveType::DataTypeUnsigned565 */ 156462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "addU16", /* RSExportPrimitiveType::DataTypeUnsigned5551 */ 157462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "addU16", /* RSExportPrimitiveType::DataTypeUnsigned4444 */ 158462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 159462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "addObj", /* RSExportPrimitiveType::DataTypeRSElement */ 160462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "addObj", /* RSExportPrimitiveType::DataTypeRSType */ 161462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "addObj", /* RSExportPrimitiveType::DataTypeRSAllocation */ 162462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "addObj", /* RSExportPrimitiveType::DataTypeRSSampler */ 163462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "addObj", /* RSExportPrimitiveType::DataTypeRSScript */ 164462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "addObj", /* RSExportPrimitiveType::DataTypeRSSimpleMesh */ 165462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "addObj", /* RSExportPrimitiveType::DataTypeRSProgramFragment */ 166462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "addObj", /* RSExportPrimitiveType::DataTypeRSProgramVertex */ 167462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "addObj", /* RSExportPrimitiveType::DataTypeRSProgramRaster */ 168462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "addObj", /* RSExportPrimitiveType::DataTypeRSProgramStore */ 169462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao }; 170462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 171462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if((EPT->getType() >= 0) && (EPT->getType() < (sizeof(PrimitiveTypePackerAPINameMap) / sizeof(const char*)))) 172462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return PrimitiveTypePackerAPINameMap[ EPT->getType() ]; 173462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 174462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao assert(false && "GetPackerAPIName : Unknown primitive data type"); 175462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return NULL; 176462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 177462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 178462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaostatic std::string GetTypeName(const RSExportType* ET) { 179462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao switch(ET->getClass()) { 180462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao case RSExportType::ExportClassPrimitive: 181462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return GetPrimitiveTypeName(static_cast<const RSExportPrimitiveType*>(ET)); 182462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao break; 183462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 184462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao case RSExportType::ExportClassPointer: 185462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao { 186462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao const RSExportType* PointeeType = static_cast<const RSExportPointerType*>(ET)->getPointeeType(); 187462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 188462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(PointeeType->getClass() != RSExportType::ExportClassRecord) 189462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return "Allocation"; 190462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao else 191462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return RS_TYPE_CLASS_NAME_PREFIX + PointeeType->getName(); 192462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 193462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao break; 194462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 195462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao case RSExportType::ExportClassVector: 196462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return GetVectorTypeName(static_cast<const RSExportVectorType*>(ET)); 197462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao break; 198462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 199462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao case RSExportType::ExportClassRecord: 200462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return RS_TYPE_CLASS_NAME_PREFIX + ET->getName() + "."RS_TYPE_ITEM_CLASS_NAME; 201462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao break; 202462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 203462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao default: 204462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao assert(false && "Unknown class of type"); 205462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao break; 206462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 207462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 208462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return ""; 209462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 210462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 211462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaostatic const char* GetBuiltinElementConstruct(const RSExportType* ET) { 212462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(ET->getClass() == RSExportType::ExportClassPrimitive) { 213462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao const RSExportPrimitiveType* EPT = static_cast<const RSExportPrimitiveType*>(ET); 214462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(EPT->getKind() == RSExportPrimitiveType::DataKindUser) { 215462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao static const char* PrimitiveBuiltinElementConstructMap[] = { 216462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao NULL, 217462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao NULL, 218bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao "F32", /* RSExportPrimitiveType::DataTypeFloat32 */ 219462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao NULL, /* RSExportPrimitiveType::DataTypeFloat64 */ 220bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao "I8", /* RSExportPrimitiveType::DataTypeSigned8 */ 221462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao NULL, /* RSExportPrimitiveType::DataTypeSigned16 */ 222bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao "I32", /* RSExportPrimitiveType::DataTypeSigned32 */ 223462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao NULL, /* RSExportPrimitiveType::DataTypeSigned64 */ 224bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao "U8", /* RSExportPrimitiveType::DataTypeUnsigned8 */ 225462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao NULL, /* RSExportPrimitiveType::DataTypeUnsigned16 */ 226bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao "U32", /* RSExportPrimitiveType::DataTypeUnsigned32 */ 227462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao NULL, /* RSExportPrimitiveType::DataTypeUnsigned64 */ 228462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 229462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao NULL, /* RSExportPrimitiveType::DataTypeUnsigned565 */ 230462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao NULL, /* RSExportPrimitiveType::DataTypeUnsigned5551 */ 231462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao NULL, /* RSExportPrimitiveType::DataTypeUnsigned4444 */ 232462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 233bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao "ELEMENT", /* RSExportPrimitiveType::DataTypeRSElement */ 234bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao "TYPE", /* RSExportPrimitiveType::DataTypeRSType */ 235bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao "ALLOCATION", /* RSExportPrimitiveType::DataTypeRSAllocation */ 236bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao "SAMPLER", /* RSExportPrimitiveType::DataTypeRSSampler */ 237bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao "SCRIPT", /* RSExportPrimitiveType::DataTypeRSScript */ 238bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao "MESH", /* RSExportPrimitiveType::DataTypeRSSimpleMesh */ 239bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao "PROGRAM_FRAGMENT", /* RSExportPrimitiveType::DataTypeRSProgramFragment */ 240bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao "PROGRAM_VERTEX", /* RSExportPrimitiveType::DataTypeRSProgramVertex */ 241bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao "PROGRAM_RASTER", /* RSExportPrimitiveType::DataTypeRSProgramRaster */ 242bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao "PROGRAM_STORE", /* RSExportPrimitiveType::DataTypeRSProgramStore */ 243462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao }; 244462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 245462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if((EPT->getType() >= 0) && (EPT->getType() < (sizeof(PrimitiveBuiltinElementConstructMap) / sizeof(const char*)))) 246462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return PrimitiveBuiltinElementConstructMap[ EPT->getType() ]; 247462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } else if(EPT->getKind() == RSExportPrimitiveType::DataKindPixelA) { 2482dd42ffb0679851777ec4733681816d399d5f7d3Shih-wei Liao if(EPT->getType() == RSExportPrimitiveType::DataTypeUnsigned8) 249462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return "A_8"; 250462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } else if(EPT->getKind() == RSExportPrimitiveType::DataKindPixelRGB) { 251462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(EPT->getType() == RSExportPrimitiveType::DataTypeUnsigned565) 252462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return "RGB_565"; 253462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao else if(EPT->getType() == RSExportPrimitiveType::DataTypeUnsigned8) 254462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return "RGB_888"; 255462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } else if(EPT->getKind() == RSExportPrimitiveType::DataKindPixelRGBA) { 256462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(EPT->getType() == RSExportPrimitiveType::DataTypeUnsigned5551) 257462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return "RGB_5551"; 258462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao else if(EPT->getType() == RSExportPrimitiveType::DataTypeUnsigned4444) 259462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return "RGB_4444"; 260462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao else if(EPT->getType() == RSExportPrimitiveType::DataTypeUnsigned8) 261462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return "RGB_8888"; 262462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } else if(EPT->getKind() == RSExportPrimitiveType::DataKindIndex) { 263462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(EPT->getType() == RSExportPrimitiveType::DataTypeUnsigned16) 264462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return "INDEX_16"; 265462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 266462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } else if(ET->getClass() == RSExportType::ExportClassVector) { 267462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao const RSExportVectorType* EVT = static_cast<const RSExportVectorType*>(ET); 268462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(EVT->getKind() == RSExportPrimitiveType::DataKindPosition) { 269462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(EVT->getType() == RSExportPrimitiveType::DataTypeFloat32) { 270462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(EVT->getNumElement() == 2) 271462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return "ATTRIB_POSITION_2"; 272462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao else if(EVT->getNumElement() == 3) 273462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return "ATTRIB_POSITION_3"; 274462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 275462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } else if(EVT->getKind() == RSExportPrimitiveType::DataKindTexture) { 276462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(EVT->getType() == RSExportPrimitiveType::DataTypeFloat32) { 277462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(EVT->getNumElement() == 2) 278462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return "ATTRIB_TEXTURE_2"; 279462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 280462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } else if(EVT->getKind() == RSExportPrimitiveType::DataKindNormal) { 281462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(EVT->getType() == RSExportPrimitiveType::DataTypeFloat32) { 282462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(EVT->getNumElement() == 3) 283462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return "ATTRIB_NORMAL_3"; 284462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 285462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } else if(EVT->getKind() == RSExportPrimitiveType::DataKindColor) { 286462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(EVT->getType() == RSExportPrimitiveType::DataTypeFloat32) { 287462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(EVT->getNumElement() == 4) 288462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return "ATTRIB_COLOR_F32_4"; 289462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } else if(EVT->getType() == RSExportPrimitiveType::DataTypeUnsigned8) { 290462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(EVT->getNumElement() == 4) 291462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return "ATTRIB_COLOR_U8_4"; 292462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 293462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 294462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } else if(ET->getClass() == RSExportType::ExportClassPointer) { 295c20992e629a0edb507be763851edaf073cb5b18aShih-wei Liao return "USER_I32"; /* tread pointer type variable as unsigned int (TODO: this is target dependent) */ 296462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 297462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 298462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return NULL; 299462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 300462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 301462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaostatic const char* GetElementDataKindName(RSExportPrimitiveType::DataKind DK) { 302462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao static const char* ElementDataKindNameMap[] = { 303462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "Element.DataKind.USER", /* RSExportPrimitiveType::DataKindUser */ 304462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "Element.DataKind.COLOR", /* RSExportPrimitiveType::DataKindColor */ 305462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "Element.DataKind.POSITION", /* RSExportPrimitiveType::DataKindPosition */ 306462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "Element.DataKind.TEXTURE", /* RSExportPrimitiveType::DataKindTexture */ 307462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "Element.DataKind.NORMAL", /* RSExportPrimitiveType::DataKindNormal */ 308462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "Element.DataKind.INDEX", /* RSExportPrimitiveType::DataKindIndex */ 309462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "Element.DataKind.POINT_SIZE", /* RSExportPrimitiveType::DataKindPointSize */ 310462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "Element.DataKind.PIXEL_L", /* RSExportPrimitiveType::DataKindPixelL */ 311462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "Element.DataKind.PIXEL_A", /* RSExportPrimitiveType::DataKindPixelA */ 312462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "Element.DataKind.PIXEL_LA", /* RSExportPrimitiveType::DataKindPixelLA */ 313462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "Element.DataKind.PIXEL_RGB", /* RSExportPrimitiveType::DataKindPixelRGB */ 314462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "Element.DataKind.PIXEL_RGBA", /* RSExportPrimitiveType::DataKindPixelRGBA */ 315462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao }; 316462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 317462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if((DK >= 0) && (DK < (sizeof(ElementDataKindNameMap) / sizeof(const char*)))) 318462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return ElementDataKindNameMap[ DK ]; 319462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao else 320462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return NULL; 321462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 322462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 323462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaostatic const char* GetElementDataTypeName(RSExportPrimitiveType::DataType DT) { 324462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao static const char* ElementDataTypeNameMap[] = { 325462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao NULL, 326462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao NULL, 327462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "Element.DataType.FLOAT_32", /* RSExportPrimitiveType::DataTypeFloat32 */ 328462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao NULL, /* RSExportPrimitiveType::DataTypeFloat64 */ 329462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "Element.DataType.SIGNED_8", /* RSExportPrimitiveType::DataTypeSigned8 */ 330462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "Element.DataType.SIGNED_16", /* RSExportPrimitiveType::DataTypeSigned16 */ 331462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "Element.DataType.SIGNED_32", /* RSExportPrimitiveType::DataTypeSigned32 */ 332462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao NULL, /* RSExportPrimitiveType::DataTypeSigned64 */ 333462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "Element.DataType.UNSIGNED_8", /* RSExportPrimitiveType::DataTypeUnsigned8 */ 334462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "Element.DataType.UNSIGNED_16", /* RSExportPrimitiveType::DataTypeUnsigned16 */ 335462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "Element.DataType.UNSIGNED_32", /* RSExportPrimitiveType::DataTypeUnsigned32 */ 336462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao NULL, /* RSExportPrimitiveType::DataTypeUnsigned64 */ 337462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 338462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "Element.DataType.UNSIGNED_5_6_5", /* RSExportPrimitiveType::DataTypeUnsigned565 */ 339462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "Element.DataType.UNSIGNED_5_5_5_1", /* RSExportPrimitiveType::DataTypeUnsigned5551 */ 340462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "Element.DataType.UNSIGNED_4_4_4_4", /* RSExportPrimitiveType::DataTypeUnsigned4444 */ 341462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 342462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "Element.DataType.RS_ELEMENT", /* RSExportPrimitiveType::DataTypeRSElement */ 343462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "Element.DataType.RS_TYPE", /* RSExportPrimitiveType::DataTypeRSType */ 344462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "Element.DataType.RS_ALLOCATION", /* RSExportPrimitiveType::DataTypeRSAllocation */ 345462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "Element.DataType.RS_SAMPLER", /* RSExportPrimitiveType::DataTypeRSSampler */ 346462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "Element.DataType.RS_SCRIPT", /* RSExportPrimitiveType::DataTypeRSScript */ 347462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "Element.DataType.RS_MESH", /* RSExportPrimitiveType::DataTypeRSSimpleMesh */ 348462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "Element.DataType.RS_PROGRAM_FRAGMENT", /* RSExportPrimitiveType::DataTypeRSProgramFragment */ 349462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "Element.DataType.RS_PROGRAM_VERTEX", /* RSExportPrimitiveType::DataTypeRSProgramVertex */ 350462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "Element.DataType.RS_PROGRAM_RASTER", /* RSExportPrimitiveType::DataTypeRSProgramRaster */ 351462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "Element.DataType.RS_PROGRAM_STORE", /* RSExportPrimitiveType::DataTypeRSProgramStore */ 352462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao }; 353462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 354462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if((DT >= 0) && (DT < (sizeof(ElementDataTypeNameMap) / sizeof(const char*)))) 355462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return ElementDataTypeNameMap[ DT ]; 356462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao else 357462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return NULL; 358462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 359462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 360462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao/****************************** Methods to generate script class ******************************/ 361462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaobool RSReflection::genScriptClass(Context& C, const std::string& ClassName, std::string& ErrorMsg) { 3622dd42ffb0679851777ec4733681816d399d5f7d3Shih-wei Liao if(!C.startClass(Context::AM_Public, false, ClassName, RS_SCRIPT_CLASS_SUPER_CLASS_NAME, ErrorMsg)) 363462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return false; 364462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 365462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao genScriptClassConstructor(C); 366462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 367462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* Reflect export variable */ 368462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao for(RSContext::const_export_var_iterator I = mRSContext->export_vars_begin(); 369462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao I != mRSContext->export_vars_end(); 370462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao I++) 371462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao genExportVariable(C, *I); 372462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 373462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* Reflect export function */ 374462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao for(RSContext::const_export_func_iterator I = mRSContext->export_funcs_begin(); 375462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao I != mRSContext->export_funcs_end(); 376462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao I++) 377462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao genExportFunction(C, *I); 378462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 379462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.endClass(); 380462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 381462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return true; 382462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 383462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 384462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaovoid RSReflection::genScriptClassConstructor(Context& C) { 385462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.indent() << "// Constructor" << endl; 3862dd42ffb0679851777ec4733681816d399d5f7d3Shih-wei Liao C.startFunction(Context::AM_Public, false, NULL, C.getClassName(), 4, "RenderScript", "rs", 387462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "Resources", "resources", 3882dd42ffb0679851777ec4733681816d399d5f7d3Shih-wei Liao "int", "id", 389462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "boolean", "isRoot"); 390462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* Call constructor of super class */ 3912dd42ffb0679851777ec4733681816d399d5f7d3Shih-wei Liao C.indent() << "super(rs, resources, id, isRoot);" << endl; 392462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.endFunction(); 393462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return; 394462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 395462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 396462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaovoid RSReflection::genExportVariable(Context& C, const RSExportVar* EV) { 397462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao const RSExportType* ET = EV->getType(); 398462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 399462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.indent() << "private final static int "RS_EXPORT_VAR_INDEX_PREFIX << EV->getName() << " = " << C.getNextExportVarSlot() << ";" << endl; 400462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 401462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao switch(ET->getClass()) { 402462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao case RSExportType::ExportClassPrimitive: 403462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao genPrimitiveTypeExportVariable(C, EV); 404462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao break; 405462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 406462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao case RSExportType::ExportClassPointer: 407462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao genPointerTypeExportVariable(C, EV); 408462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao break; 409462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 410462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao case RSExportType::ExportClassVector: 411462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao genVectorTypeExportVariable(C, EV); 412462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao break; 413462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 414462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao case RSExportType::ExportClassRecord: 415462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao genRecordTypeExportVariable(C, EV); 416462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao break; 417462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 418462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao default: 419462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao assert(false && "Unknown class of type"); 420462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao break; 421462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 422462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 423462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return; 424462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 425462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 426462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaovoid RSReflection::genExportFunction(Context& C, const RSExportFunc* EF) { 427462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.indent() << "private final static int "RS_EXPORT_FUNC_INDEX_PREFIX << EF->getName() << " = " << C.getNextExportFuncSlot() << ";" << endl; 428462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 429462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* invoke_*() */ 430462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao Context::ArgTy Args; 431462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 432462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao for(RSExportFunc::const_param_iterator I = EF->params_begin(); 433462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao I != EF->params_end(); 4342dd42ffb0679851777ec4733681816d399d5f7d3Shih-wei Liao I++) 435462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao { 436462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao const RSExportFunc::Parameter* P = *I; 437462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao Args.push_back( make_pair(GetTypeName(P->getType()), P->getName()) ); 438462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 439462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 440462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.startFunction(Context::AM_Public, false, "void", "invoke_" + EF->getName(), Args); 441462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 442462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(!EF->hasParam()) { 4432dd42ffb0679851777ec4733681816d399d5f7d3Shih-wei Liao C.indent() << "invoke("RS_EXPORT_FUNC_INDEX_PREFIX << EF->getName() << ");" << endl; 444462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } else { 445462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao const RSExportRecordType* ERT = EF->getParamPacketType(); 446462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao std::string FieldPackerName = EF->getName() + "_fp"; 447462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 448462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(genCreateFieldPacker(C, ERT, FieldPackerName.c_str())) 449462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao genPackVarOfType(C, ERT, NULL, FieldPackerName.c_str()); 450462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 451bdd788877b3f18980836a3ed0d46627169483653Shih-wei Liao C.indent() << "invoke("RS_EXPORT_FUNC_INDEX_PREFIX << EF->getName() << ", " << FieldPackerName << ");" << endl; 452462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 453462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 454462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.endFunction(); 455462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return; 456462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 457462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 458462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaovoid RSReflection::genPrimitiveTypeExportVariable(Context& C, const RSExportVar* EV) { 459462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao assert((EV->getType()->getClass() == RSExportType::ExportClassPrimitive) && "Variable should be type of primitive here"); 460462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 461462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao const RSExportPrimitiveType* EPT = static_cast<const RSExportPrimitiveType*>(EV->getType()); 462462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao const char* TypeName = GetPrimitiveTypeName(EPT); 463462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 464462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.indent() << "private " << TypeName << " "RS_EXPORT_VAR_PREFIX << EV->getName() << ";" << endl; 465462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 466462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* set_*() */ 467462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.startFunction(Context::AM_Public, false, "void", "set_" + EV->getName(), 1, TypeName, "v"); 468462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.indent() << RS_EXPORT_VAR_PREFIX << EV->getName() << " = v;" << endl; 469462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 470462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(EPT->isRSObjectType()) 47160c985d5a07b76b34e5113fbd166bf73ba16b7d0Shih-wei Liao C.indent() << "setVar("RS_EXPORT_VAR_INDEX_PREFIX << EV->getName() << ", (v == null) ? 0 : v.getID());" << endl; 472462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao else 473462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.indent() << "setVar("RS_EXPORT_VAR_INDEX_PREFIX << EV->getName() << ", v);" << endl; 474462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 475462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.endFunction(); 476462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 477462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao genGetExportVariable(C, TypeName, EV->getName()); 478462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 479462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return; 480462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 481462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 482462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaovoid RSReflection::genPointerTypeExportVariable(Context& C, const RSExportVar* EV) { 483462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao const RSExportType* ET = EV->getType(); 484462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao const RSExportType* PointeeType; 485462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao std::string TypeName; 486462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 487462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao assert((ET->getClass() == RSExportType::ExportClassPointer) && "Variable should be type of pointer here"); 488462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 489462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao PointeeType = static_cast<const RSExportPointerType*>(ET)->getPointeeType(); 490462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao TypeName = GetTypeName(ET); 491462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 492462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* bind_*() */ 493462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.indent() << "private " << TypeName << " "RS_EXPORT_VAR_PREFIX << EV->getName() << ";" << endl; 494462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 495462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.startFunction(Context::AM_Public, false, "void", "bind_" + EV->getName(), 1, TypeName.c_str(), "v"); 496462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 497462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.indent() << RS_EXPORT_VAR_PREFIX << EV->getName() << " = v;" << endl; 498462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.indent() << "if(v == null) bindAllocation(null, "RS_EXPORT_VAR_INDEX_PREFIX << EV->getName() << ");" << endl; 499462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 500462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(PointeeType->getClass() == RSExportType::ExportClassRecord) 501462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.indent() << "else bindAllocation(v.getAllocation(), "RS_EXPORT_VAR_INDEX_PREFIX << EV->getName() << ");" << endl; 502462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao else 503462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.indent() << "else bindAllocation(v, "RS_EXPORT_VAR_INDEX_PREFIX << EV->getName() << ");" << endl; 504462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 505462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.endFunction(); 506462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 507462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao genGetExportVariable(C, TypeName, EV->getName()); 508462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 509462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return; 510462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 511462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 512462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaovoid RSReflection::genVectorTypeExportVariable(Context& C, const RSExportVar* EV) { 513462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao assert((EV->getType()->getClass() == RSExportType::ExportClassVector) && "Variable should be type of vector here"); 514462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 515462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao const RSExportVectorType* EVT = static_cast<const RSExportVectorType*>(EV->getType()); 516462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao const char* TypeName = GetVectorTypeName(EVT); 517462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao const char* FieldPackerName = "fp"; 518462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 519462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.indent() << "private " << TypeName << " "RS_EXPORT_VAR_PREFIX << EV->getName() << ";" << endl; 520462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 521462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* set_*() */ 522462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.startFunction(Context::AM_Public, false, "void", "set_" + EV->getName(), 1, TypeName, "v"); 523462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.indent() << RS_EXPORT_VAR_PREFIX << EV->getName() << " = v;" << endl; 524462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 525462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(genCreateFieldPacker(C, EVT, FieldPackerName)) 526462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao genPackVarOfType(C, EVT, "v", FieldPackerName); 527462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.indent() << "setVar("RS_EXPORT_VAR_INDEX_PREFIX << EV->getName() << ", " << FieldPackerName << ");" << endl; 528462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 529462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.endFunction(); 530462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 531462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao genGetExportVariable(C, TypeName, EV->getName()); 532462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return; 533462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 534462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 535462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaovoid RSReflection::genRecordTypeExportVariable(Context& C, const RSExportVar* EV) { 536462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao assert((EV->getType()->getClass() == RSExportType::ExportClassRecord) && "Variable should be type of struct here"); 537462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 538462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao const RSExportRecordType* ERT = static_cast<const RSExportRecordType*>(EV->getType()); 539462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao std::string TypeName = RS_TYPE_CLASS_NAME_PREFIX + ERT->getName() + "."RS_TYPE_ITEM_CLASS_NAME; 540462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao const char* FieldPackerName = "fp"; 541462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 542462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.indent() << "private " << TypeName << " "RS_EXPORT_VAR_PREFIX << EV->getName() << ";" << endl; 543462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 544462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* set_*() */ 545462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.startFunction(Context::AM_Public, false, "void", "set_" + EV->getName(), 1, TypeName.c_str(), "v"); 546462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.indent() << RS_EXPORT_VAR_PREFIX << EV->getName() << " = v;" << endl; 547462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 548462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(genCreateFieldPacker(C, ERT, FieldPackerName)) 549462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao genPackVarOfType(C, ERT, "v", FieldPackerName); 550462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.indent() << "setVar("RS_EXPORT_VAR_INDEX_PREFIX << EV->getName() << ", " << FieldPackerName << ");" << endl; 551462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 552462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.endFunction(); 553462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 554462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao genGetExportVariable(C, TypeName.c_str(), EV->getName()); 555462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return; 556462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 557462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 558462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaovoid RSReflection::genGetExportVariable(Context& C, const std::string& TypeName, const std::string& VarName) { 559462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.startFunction(Context::AM_Public, false, TypeName.c_str(), "get_" + VarName, 0); 560462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 561462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.indent() << "return "RS_EXPORT_VAR_PREFIX << VarName << ";" << endl; 562462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 563462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.endFunction(); 564462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return; 565462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 566462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 567462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao/****************************** Methods to generate script class /end ******************************/ 568462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 569462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaobool RSReflection::genCreateFieldPacker(Context& C, const RSExportType* ET, const char* FieldPackerName) { 570462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao size_t AllocSize = RSExportType::GetTypeAllocSize(ET); 571462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(AllocSize > 0) 572462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.indent() << "FieldPacker " << FieldPackerName << " = new FieldPacker(" << AllocSize << ");" << endl; 573462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao else 574462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return false; 575462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return true; 576462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 577462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 578462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaovoid RSReflection::genPackVarOfType(Context& C, const RSExportType* ET, const char* VarName, const char* FieldPackerName) { 579462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao switch(ET->getClass()) { 580462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao case RSExportType::ExportClassPrimitive: 581462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao case RSExportType::ExportClassVector: 582462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.indent() << FieldPackerName << "." << GetPackerAPIName(static_cast<const RSExportPrimitiveType*>(ET)) << "(" << VarName << ");" << endl; 583462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao break; 584462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 585462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao case RSExportType::ExportClassPointer: 586462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao { 587462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* Must reflect as type Allocation in Java */ 588462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao const RSExportType* PointeeType = static_cast<const RSExportPointerType*>(ET)->getPointeeType(); 589462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 590462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(PointeeType->getClass() != RSExportType::ExportClassRecord) 591c20992e629a0edb507be763851edaf073cb5b18aShih-wei Liao C.indent() << FieldPackerName << ".addI32(" << VarName << ".getPtr());" << endl; 592462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao else 593c20992e629a0edb507be763851edaf073cb5b18aShih-wei Liao C.indent() << FieldPackerName << ".addI32(" << VarName << ".getAllocation().getPtr());" << endl; 594462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 595462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao break; 596462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 597462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao case RSExportType::ExportClassRecord: 598462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao { 599462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao const RSExportRecordType* ERT = static_cast<const RSExportRecordType*>(ET); 600462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao int Pos = 0; /* relative pos from now on in field packer */ 601462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 602462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao for(RSExportRecordType::const_field_iterator I = ERT->fields_begin(); 603462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao I != ERT->fields_end(); 604462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao I++) 605462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao { 606462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao const RSExportRecordType::Field* F = *I; 607462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao std::string FieldName; 608462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao size_t FieldOffset = F->getOffsetInParent(); 609462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao size_t FieldStoreSize = RSExportType::GetTypeStoreSize(F->getType()); 610462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao size_t FieldAllocSize = RSExportType::GetTypeAllocSize(F->getType()); 611462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 612462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(VarName != NULL) 613462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao FieldName = VarName + ("." + F->getName()); 614462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao else 615462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao FieldName = F->getName(); 616462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 617462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(FieldOffset > Pos) 618462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.indent() << FieldPackerName << ".skip(" << (FieldOffset - Pos) << ");" << endl; 619462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 620462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao genPackVarOfType(C, F->getType(), FieldName.c_str(), FieldPackerName); 621462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 622462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(FieldAllocSize > FieldStoreSize) /* there's padding in the field type */ 623462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.indent() << FieldPackerName << ".skip(" << (FieldAllocSize - FieldStoreSize) << ");" << endl; 624462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 625462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao Pos = FieldOffset + FieldAllocSize; 626462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 627462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 628462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* There maybe some padding after the struct */ 629462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao size_t Padding = RSExportType::GetTypeAllocSize(ERT) - Pos; 630462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(Padding > 0) 631462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.indent() << FieldPackerName << ".skip(" << Padding << ");" << endl; 632462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 633462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao break; 634462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 635462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao default: 636462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao assert(false && "Unknown class of type"); 637462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao break; 638462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 639462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 640462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return; 641462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 642462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 643462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao/****************************** Methods to generate type class ******************************/ 644462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaobool RSReflection::genTypeClass(Context& C, const RSExportRecordType* ERT, std::string& ErrorMsg) { 645462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao std::string ClassName = RS_TYPE_CLASS_NAME_PREFIX + ERT->getName(); 646462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 6472dd42ffb0679851777ec4733681816d399d5f7d3Shih-wei Liao if(!C.startClass(Context::AM_Public, false, ClassName, RS_TYPE_CLASS_SUPER_CLASS_NAME, ErrorMsg)) 648462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return false; 649462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 650462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(!genTypeItemClass(C, ERT, ErrorMsg)) 651462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return false; 652462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 653462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* Declare item buffer and item buffer packer */ 654462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.indent() << "private "RS_TYPE_ITEM_CLASS_NAME" "RS_TYPE_ITEM_BUFFER_NAME"[];" << endl; 655462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.indent() << "private FieldPacker "RS_TYPE_ITEM_BUFFER_PACKER_NAME";" << endl; 656462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 657462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao genTypeClassConstructor(C, ERT); 658462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao genTypeClassCopyToArray(C, ERT); 659462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao genTypeClasSet(C, ERT); 660462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao genTypeClasCopyAll(C, ERT); 661462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 662462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.endClass(); 663462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 664462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return true; 665462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 666462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 667462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaobool RSReflection::genTypeItemClass(Context& C, const RSExportRecordType* ERT, std::string& ErrorMsg) { 668462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.indent() << "static public class "RS_TYPE_ITEM_CLASS_NAME; 669462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.startBlock(); 670462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 671462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.indent() << "public static final int sizeof = " << RSExportType::GetTypeAllocSize(ERT) << ";" << endl; 672462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 673462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* Member elements */ 674462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.out() << endl; 675462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao for(RSExportRecordType::const_field_iterator FI = ERT->fields_begin(); 676462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao FI != ERT->fields_end(); 6772dd42ffb0679851777ec4733681816d399d5f7d3Shih-wei Liao FI++) 678462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.indent() << GetTypeName((*FI)->getType()) << " " << (*FI)->getName() << ";" << endl; 679462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 680462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* Constructor */ 681462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.out() << endl; 682462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.indent() << RS_TYPE_ITEM_CLASS_NAME"()"; 683462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.startBlock(); 684462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 685462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao for(RSExportRecordType::const_field_iterator FI = ERT->fields_begin(); 686462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao FI != ERT->fields_end(); 6872dd42ffb0679851777ec4733681816d399d5f7d3Shih-wei Liao FI++) 688462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao { 689462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao const RSExportRecordType::Field* F = *FI; 690462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if((F->getType()->getClass() == RSExportType::ExportClassVector) || (F->getType()->getClass() == RSExportType::ExportClassRecord)) 691462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.indent() << F->getName() << " = new " << GetTypeName(F->getType()) << "();" << endl; 692462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 693462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 694462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.endBlock(); /* end Constructor */ 695462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 696462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.endBlock(); /* end Item class */ 697462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 698462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 699462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return true; 700462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 701462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 702462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaovoid RSReflection::genTypeClassConstructor(Context& C, const RSExportRecordType* ERT) { 703462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao const char* RenderScriptVar = "rs"; 704462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 705462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.startFunction(Context::AM_Public, false, NULL, C.getClassName(), 2, "RenderScript", RenderScriptVar, 706462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "int", "count"); 707462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 708462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.indent() << RS_TYPE_ITEM_BUFFER_NAME" = null;" << endl; 709462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.indent() << RS_TYPE_ITEM_BUFFER_PACKER_NAME" = null;" << endl; 710462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 711462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao genBuildElement(C, ERT, "mElement", RenderScriptVar); 712462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* Call init() in super class */ 713462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.indent() << "init(" << RenderScriptVar << ", count);" << endl; 714462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.endFunction(); 715462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 716462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return; 717462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 718462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 719462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaovoid RSReflection::genTypeClassCopyToArray(Context& C, const RSExportRecordType* ERT) { 720462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.startFunction(Context::AM_Private, false, "void", "copyToArray", 2, RS_TYPE_ITEM_CLASS_NAME, "i", 721462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "int", "index"); 722462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 723462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.indent() << "if ("RS_TYPE_ITEM_BUFFER_PACKER_NAME" == null) "RS_TYPE_ITEM_BUFFER_PACKER_NAME" = new FieldPacker("RS_TYPE_ITEM_CLASS_NAME".sizeof * mType.getX() /* count */);" << endl; 724462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.indent() << RS_TYPE_ITEM_BUFFER_PACKER_NAME".reset(index * "RS_TYPE_ITEM_CLASS_NAME".sizeof);" << endl; 725462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 726462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao genPackVarOfType(C, ERT, "i", RS_TYPE_ITEM_BUFFER_PACKER_NAME); 727462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 728462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.endFunction(); 729462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return; 730462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 731462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 732462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaovoid RSReflection::genTypeClasSet(Context& C, const RSExportRecordType* ERT) { 733462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.startFunction(Context::AM_Public, false, "void", "set", 3, RS_TYPE_ITEM_CLASS_NAME, "i", 734462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "int", "index", 735462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "boolean", "copyNow"); 736462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.indent() << "if ("RS_TYPE_ITEM_BUFFER_NAME" == null) "RS_TYPE_ITEM_BUFFER_NAME" = new "RS_TYPE_ITEM_CLASS_NAME"[mType.getX() /* count */];" << endl; 737462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.indent() << RS_TYPE_ITEM_BUFFER_NAME"[index] = i;" << endl; 738462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 739462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.indent() << "if (copyNow) "; 740462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.startBlock(); 7412dd42ffb0679851777ec4733681816d399d5f7d3Shih-wei Liao 742462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.indent() << "copyToArray(i, index);" << endl; 743462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.indent() << "mAllocation.subData1D(index * "RS_TYPE_ITEM_CLASS_NAME".sizeof, "RS_TYPE_ITEM_CLASS_NAME".sizeof, "RS_TYPE_ITEM_BUFFER_PACKER_NAME".getData());" << endl; 744462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 745462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.endBlock(); /* end if (copyNow) */ 746462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 747462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.endFunction(); 748462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return; 749462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 750462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 751462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaovoid RSReflection::genTypeClasCopyAll(Context& C, const RSExportRecordType* ERT) { 752462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.startFunction(Context::AM_Public, false, "void", "copyAll", 0); 753462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 754462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.indent() << "for (int ct=0; ct < "RS_TYPE_ITEM_BUFFER_NAME".length; ct++) copyToArray("RS_TYPE_ITEM_BUFFER_NAME"[ct], ct);" << endl; 755462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.indent() << "mAllocation.data("RS_TYPE_ITEM_BUFFER_PACKER_NAME".getData());" << endl; 756462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 757462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.endFunction(); 758462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return; 759462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 760462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 761462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao/****************************** Methods to generate type class /end ******************************/ 762462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 763462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao/******************** Methods to create Element in Java of given record type ********************/ 764462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaovoid RSReflection::genBuildElement(Context& C, const RSExportRecordType* ERT, const char* ElementName, const char* RenderScriptVar) { 765462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao const char* ElementBuilderName = "eb"; 766462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 767462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* Create element builder */ 768462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.startBlock(true); 769462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 770462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.indent() << "Element.Builder " << ElementBuilderName << " = new Element.Builder(" << RenderScriptVar << ");" << endl; 771462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 772462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* eb.add(...) */ 773462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao genAddElementToElementBuilder(C, ERT, "", ElementBuilderName, RenderScriptVar); 774462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 775462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.indent() << ElementName << " = " << ElementBuilderName << ".create();" << endl; 776462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 777462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C.endBlock(); 778462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return; 779462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 780462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 781462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#define EB_ADD(x, ...) \ 782b1a28e752571e744444377c89e5c256b4332dc58Shih-wei Liao C.indent() << ElementBuilderName << ".add(Element." << x ##__VA_ARGS__ ", \"" << VarName << "\");" << endl 783b1a28e752571e744444377c89e5c256b4332dc58Shih-wei Liao 784462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaovoid RSReflection::genAddElementToElementBuilder(Context& C, const RSExportType* ET, const std::string& VarName, const char* ElementBuilderName, const char* RenderScriptVar) { 785b1a28e752571e744444377c89e5c256b4332dc58Shih-wei Liao const char* ElementConstruct = GetBuiltinElementConstruct(ET); 786b1a28e752571e744444377c89e5c256b4332dc58Shih-wei Liao 787bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao if(ElementConstruct != NULL) { 788bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao EB_ADD(ElementConstruct << "(" << RenderScriptVar << ")"); 789b1a28e752571e744444377c89e5c256b4332dc58Shih-wei Liao } else { 790bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao if((ET->getClass() == RSExportType::ExportClassPrimitive) || (ET->getClass() == RSExportType::ExportClassVector)) { 791bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao const RSExportPrimitiveType* EPT = static_cast<const RSExportPrimitiveType*>(ET); 792bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao const char* DataKindName = GetElementDataKindName(EPT->getKind()); 793bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao const char* DataTypeName = GetElementDataTypeName(EPT->getType()); 794bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao int Size = (ET->getClass() == RSExportType::ExportClassVector) ? static_cast<const RSExportVectorType*>(ET)->getNumElement() : 1; 795bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao 796bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao switch(EPT->getKind()) { 797bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao case RSExportPrimitiveType::DataKindColor: 798bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao case RSExportPrimitiveType::DataKindPosition: 799bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao case RSExportPrimitiveType::DataKindTexture: 800bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao case RSExportPrimitiveType::DataKindNormal: 801bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao case RSExportPrimitiveType::DataKindPointSize: 802bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao /* Element.createAttrib() */ 803bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao EB_ADD("createAttrib(" << RenderScriptVar << ", " << DataTypeName << ", " << DataKindName << ", " << Size << ")"); 804bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao break; 805bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao 806bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao case RSExportPrimitiveType::DataKindIndex: 807bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao /* Element.createIndex() */ 808bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao EB_ADD("createAttrib(" << RenderScriptVar << ")"); 809bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao break; 810bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao 811bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao case RSExportPrimitiveType::DataKindPixelL: 812bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao case RSExportPrimitiveType::DataKindPixelA: 813bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao case RSExportPrimitiveType::DataKindPixelLA: 814bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao case RSExportPrimitiveType::DataKindPixelRGB: 815bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao case RSExportPrimitiveType::DataKindPixelRGBA: 816bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao /* Element.createPixel() */ 817bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao EB_ADD("createVector(" << RenderScriptVar << ", " << DataTypeName << ", " << DataKindName << ")"); 818bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao break; 819bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao 820bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao case RSExportPrimitiveType::DataKindUser: 821bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao default: 822bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao if(EPT->getClass() == RSExportType::ExportClassPrimitive) 823bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao /* Element.createUser() */ 824bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao EB_ADD("createUser(" << RenderScriptVar << ", " << DataTypeName << ")"); 825bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao else /* (ET->getClass() == RSExportType::ExportClassVector) must hold here */ 826bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao /* Element.createVector() */ 827bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao EB_ADD("createVector(" << RenderScriptVar << ", " << DataTypeName << ", " << Size << ")"); 828bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao break; 829bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao } 830bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao } else if(ET->getClass() == RSExportType::ExportClassPointer) { 831bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao /* Pointer type variable should be resolved in GetBuiltinElementConstruct() */ 832bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao assert(false && "??"); 833bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao } else if(ET->getClass() == RSExportType::ExportClassRecord) { 834bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao /* 835bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao * Simalar to genPackVarOfType. 836bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao * 837bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao * TODO: Generalize these two function such that there's no duplicated codes. 838bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao */ 839bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao const RSExportRecordType* ERT = static_cast<const RSExportRecordType*>(ET); 840bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao int Pos = 0; /* relative pos from now on */ 841bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao 842bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao for(RSExportRecordType::const_field_iterator I = ERT->fields_begin(); 843bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao I != ERT->fields_end(); 844bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao I++) 845bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao { 846bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao const RSExportRecordType::Field* F = *I; 847bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao std::string FieldName; 848bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao size_t FieldOffset = F->getOffsetInParent(); 849bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao size_t FieldStoreSize = RSExportType::GetTypeStoreSize(F->getType()); 850bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao size_t FieldAllocSize = RSExportType::GetTypeAllocSize(F->getType()); 851bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao 852bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao if(!VarName.empty()) 853bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao FieldName = VarName + "." + F->getName(); 854bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao else 855bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao FieldName = F->getName(); 856bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao 857bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao /* alignment */ 858bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao genAddPaddingToElementBuiler(C, (FieldOffset - Pos), ElementBuilderName, RenderScriptVar); 859bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao 860bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao /* eb.add(...) */ 861bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao genAddElementToElementBuilder(C, (*I)->getType(), FieldName, ElementBuilderName, RenderScriptVar); 862bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao 863bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao /* there's padding within the field type */ 864bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao genAddPaddingToElementBuiler(C, (FieldAllocSize - FieldStoreSize), ElementBuilderName, RenderScriptVar); 865bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao 866bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao Pos = FieldOffset + FieldAllocSize; 867bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao } 868bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao 869bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao /* There maybe some padding after the struct */ 870bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao genAddPaddingToElementBuiler(C, (RSExportType::GetTypeAllocSize(ERT) - Pos), ElementBuilderName, RenderScriptVar); 871bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao } else { 872bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao assert(false && "Unknown class of type"); 873bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao } 874b1a28e752571e744444377c89e5c256b4332dc58Shih-wei Liao } 875462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 876462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 877462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaovoid RSReflection::genAddPaddingToElementBuiler(Context& C, size_t PaddingSize, const char* ElementBuilderName, const char* RenderScriptVar) { 878462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao while(PaddingSize > 0) { 879462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao const std::string& VarName = C.createPaddingField(); 880462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(PaddingSize >= 4) { 881bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao EB_ADD("U32(" << RenderScriptVar << ")"); 882bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao PaddingSize -= 4; 883462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } else if(PaddingSize >= 2) { 884bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao EB_ADD("U16(" << RenderScriptVar << ")"); 885462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao PaddingSize -= 2; 886462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } else if(PaddingSize >= 1) { 887bd49c8ff5a35befb413de3b6d7989d257b54f057Shih-wei Liao EB_ADD("U8(" << RenderScriptVar << ")"); 888462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao PaddingSize -= 1; 889462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 890462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 891462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return; 892462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 893462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 894462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#undef EB_ADD 895462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao/******************** Methods to create Element in Java of given record type /end ********************/ 896462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 897462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaobool RSReflection::reflect(const char* OutputPackageName, const std::string& InputFileName, const std::string& OutputBCFileName) { 898462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao Context *C = NULL; 899462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao std::string ResourceId = ""; 900462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 901462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(!GetFileNameWithoutExtension(OutputBCFileName, ResourceId)) 902462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return false; 903462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 904462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(ResourceId.empty()) 905462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao ResourceId = "<Resource ID>"; 906462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 9072dd42ffb0679851777ec4733681816d399d5f7d3Shih-wei Liao if((OutputPackageName == NULL) || (*OutputPackageName == '\0') || strcmp(OutputPackageName, "-") == 0) 908462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C = new Context("<Package Name>", ResourceId, true); 9092dd42ffb0679851777ec4733681816d399d5f7d3Shih-wei Liao else 910462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao C = new Context(OutputPackageName, ResourceId, false); 911462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 912462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(C != NULL) { 913462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao std::string ErrorMsg, ScriptClassName; 914462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* class ScriptC_<ScriptName> */ 915462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(!GetFileNameWithoutExtension(InputFileName, ScriptClassName)) 916462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return false; 917462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 918462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(ScriptClassName.empty()) 919462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao ScriptClassName = "<Input Script Name>"; 920462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 921462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao ScriptClassName.at(0) = toupper(ScriptClassName.at(0)); 922462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao ScriptClassName.insert(0, RS_SCRIPT_CLASS_NAME_PREFIX); 923462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 924462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(!genScriptClass(*C, ScriptClassName, ErrorMsg)) { 925462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao std::cerr << "Failed to generate class " << ScriptClassName << " (" << ErrorMsg << ")" << endl; 926462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return false; 927462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 928462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 929462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* class ScriptField_<TypeName> */ 930462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao for(RSContext::const_export_type_iterator TI = mRSContext->export_types_begin(); 931462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao TI != mRSContext->export_types_end(); 9322dd42ffb0679851777ec4733681816d399d5f7d3Shih-wei Liao TI++) 933462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao { 934462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao const RSExportType* ET = TI->getValue(); 935462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 936462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(ET->getClass() == RSExportType::ExportClassRecord) { 937462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao const RSExportRecordType* ERT = static_cast<const RSExportRecordType*>(ET); 938462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 939462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(!ERT->isArtificial() && !genTypeClass(*C, ERT, ErrorMsg)) { 940462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao std::cerr << "Failed to generate type class for struct '" << ERT->getName() << "' (" << ErrorMsg << ")" << endl; 941462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return false; 942462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 943462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 944462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 945462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 946462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 947462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return true; 948462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 949462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 950462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao/****************************** RSReflection::Context ******************************/ 9512dd42ffb0679851777ec4733681816d399d5f7d3Shih-wei Liaoconst char* const RSReflection::Context::LicenseNote = 952462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "/*\n" 953462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao " * Copyright (C) 2010 The Android Open Source Project\n" 954462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao " *\n" 955462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao " * Licensed under the Apache License, Version 2.0 (the \"License\");\n" 956462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao " * you may not use this file except in compliance with the License.\n" 957462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao " * You may obtain a copy of the License at\n" 958462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao " *\n" 959462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao " * http://www.apache.org/licenses/LICENSE-2.0\n" 960462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao " *\n" 961462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao " * Unless required by applicable law or agreed to in writing, software\n" 962462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao " * distributed under the License is distributed on an \"AS IS\" BASIS,\n" 963462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao " * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n" 964462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao " * See the License for the specific language governing permissions and\n" 965462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao " * limitations under the License.\n" 966462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao " */\n"; 967462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 968462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaoconst char* const RSReflection::Context::Import[] = { 969462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* RenderScript java class */ 970462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "android.renderscript.*", 971462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* Import R */ 972462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "android.content.res.Resources", 973462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* Import for debugging */ 974462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao "android.util.Log", 975462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}; 976462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 977462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaoconst char* RSReflection::Context::AccessModifierStr(AccessModifier AM) { 978462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao switch(AM) { 979462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao case AM_Public: return "public"; break; 980462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao case AM_Protected: return "protected"; break; 981462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao case AM_Private: return "private"; break; 982462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao default: return ""; break; 983462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 984462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 985462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 986462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaobool RSReflection::Context::startClass(AccessModifier AM, bool IsStatic, const std::string& ClassName, const char* SuperClassName, std::string& ErrorMsg) { 9872dd42ffb0679851777ec4733681816d399d5f7d3Shih-wei Liao if(mVerbose) 988462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao std::cout << "Generating " << ClassName << ".java ..." << endl; 989462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 990462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* Open the file */ 991462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(!mUseStdout) { 992462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao mOF.clear(); 993462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao mOF.open((ClassName + ".java").c_str()); 994462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(!mOF.good()) { 995462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao ErrorMsg = "failed to open file '" + ClassName + ".java' for write"; 996462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return false; 997462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 998462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 999462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1000462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* License */ 1001462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao out() << LicenseNote << endl; 1002462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1003462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* Package */ 1004462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(!mPackageName.empty()) 1005462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao out() << "package " << mPackageName << ";" << endl; 1006462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao out() << endl; 1007462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1008462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* Imports */ 1009462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao for(int i=0;i<(sizeof(Import)/sizeof(const char*));i++) 1010462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao out() << "import " << Import[i] << ";" << endl; 1011462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao out() << endl; 1012462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1013462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao out() << AccessModifierStr(AM) << ((IsStatic) ? " static" : "") << " class " << ClassName; 1014462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(SuperClassName != NULL) 1015462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao out() << " extends " << SuperClassName; 1016462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1017462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao startBlock(); 1018462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1019462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao mClassName = ClassName; 1020462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1021462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return true; 1022462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 1023462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1024462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaovoid RSReflection::Context::endClass() { 1025462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao endBlock(); 1026462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(!mUseStdout) 1027462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao mOF.close(); 1028462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao clear(); 1029462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return; 1030462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 1031462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1032462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaovoid RSReflection::Context::startBlock(bool ShouldIndent) { 1033462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(ShouldIndent) 1034462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao indent() << "{" << endl; 1035462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao else 1036462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao out() << " {" << endl; 1037462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao incIndentLevel(); 1038462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return; 1039462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 1040462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1041462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaovoid RSReflection::Context::endBlock() { 1042462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao decIndentLevel(); 1043462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao indent() << "}" << endl << endl; 1044462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return; 1045462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 1046462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1047462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaovoid RSReflection::Context::startTypeClass(const std::string& ClassName) { 1048462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao indent() << "public static class " << ClassName; 1049462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao startBlock(); 1050462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return; 1051462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 1052462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1053462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaovoid RSReflection::Context::endTypeClass() { 1054462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao endBlock(); 1055462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return; 1056462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 1057462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1058462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaovoid RSReflection::Context::startFunction(AccessModifier AM, bool IsStatic, const char* ReturnType, const std::string& FunctionName, int Argc, ...) { 1059462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao ArgTy Args; 1060462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao va_list vl; 1061462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao va_start(vl, Argc); 1062462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1063462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao for(int i=0;i<Argc;i++) { 1064462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao const char* ArgType = va_arg(vl, const char*); 1065462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao const char* ArgName = va_arg(vl, const char*); 1066462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1067462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao Args.push_back( make_pair(ArgType, ArgName) ); 1068462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 1069462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao va_end(vl); 1070462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1071462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao startFunction(AM, IsStatic, ReturnType, FunctionName, Args); 1072462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1073462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return; 1074462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 1075462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 10762dd42ffb0679851777ec4733681816d399d5f7d3Shih-wei Liaovoid RSReflection::Context::startFunction(AccessModifier AM, 10772dd42ffb0679851777ec4733681816d399d5f7d3Shih-wei Liao bool IsStatic, 10782dd42ffb0679851777ec4733681816d399d5f7d3Shih-wei Liao const char* ReturnType, 10792dd42ffb0679851777ec4733681816d399d5f7d3Shih-wei Liao const std::string& FunctionName, 10802dd42ffb0679851777ec4733681816d399d5f7d3Shih-wei Liao const ArgTy& Args) 1081462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao{ 1082462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao indent() << AccessModifierStr(AM) << ((IsStatic) ? " static " : " ") << ((ReturnType) ? ReturnType : "") << " " << FunctionName << "("; 1083462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1084462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao bool FirstArg = true; 1085462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao for(ArgTy::const_iterator I = Args.begin(); 1086462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao I != Args.end(); 1087462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao I++) 1088462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao { 10892dd42ffb0679851777ec4733681816d399d5f7d3Shih-wei Liao if(!FirstArg) 1090462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao out() << ", "; 1091462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao else 1092462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao FirstArg = false; 1093462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1094462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao out() << I->first << " " << I->second; 1095462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 1096462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1097462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao out() << ")"; 1098462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao startBlock(); 1099462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1100462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return; 1101462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 1102462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1103462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaovoid RSReflection::Context::endFunction() { 1104462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao endBlock(); 1105462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return; 1106462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 1107462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 1108462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} /* namespace slang */ 1109