1d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 2daed524c35f5fe4d35f403d2279947605d161b2eJoe Onorato#include "spec.h" 3daed524c35f5fe4d35f403d2279947605d161b2eJoe Onorato#include <stdio.h> 4d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 5ed9f210568082dd6d1d8a0c92c693d574d87d545Alex Sakhartchoukvoid printFileHeader(FILE *f) { 6d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams fprintf(f, "/*\n"); 765bdaf1c6d463d9441125d2c87a36015bfef2d95Jason Sams fprintf(f, " * Copyright (C) 2011 The Android Open Source Project\n"); 8d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams fprintf(f, " *\n"); 9d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams fprintf(f, " * Licensed under the Apache License, Version 2.0 (the \"License\");\n"); 10d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams fprintf(f, " * you may not use this file except in compliance with the License.\n"); 11d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams fprintf(f, " * You may obtain a copy of the License at\n"); 12d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams fprintf(f, " *\n"); 13d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams fprintf(f, " * http://www.apache.org/licenses/LICENSE-2.0\n"); 14d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams fprintf(f, " *\n"); 15d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams fprintf(f, " * Unless required by applicable law or agreed to in writing, software\n"); 16d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams fprintf(f, " * distributed under the License is distributed on an \"AS IS\" BASIS,\n"); 17d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams fprintf(f, " * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n"); 18d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams fprintf(f, " * See the License for the specific language governing permissions and\n"); 19d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams fprintf(f, " * limitations under the License.\n"); 20d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams fprintf(f, " */\n\n"); 21d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams} 22d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 23ed9f210568082dd6d1d8a0c92c693d574d87d545Alex Sakhartchoukvoid printVarType(FILE *f, const VarType *vt) { 24d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams int ct; 25d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams if (vt->isConst) { 26d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams fprintf(f, "const "); 27d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams } 28d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 29ed9f210568082dd6d1d8a0c92c693d574d87d545Alex Sakhartchouk switch (vt->type) { 30d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams case 0: 31d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams fprintf(f, "void"); 32d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams break; 33d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams case 1: 34d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams fprintf(f, "int%i_t", vt->bits); 35d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams break; 36d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams case 2: 37d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams fprintf(f, "uint%i_t", vt->bits); 38d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams break; 39d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams case 3: 40d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams if (vt->bits == 32) 41d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams fprintf(f, "float"); 42d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams else 43d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams fprintf(f, "double"); 44d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams break; 45d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams case 4: 46daed524c35f5fe4d35f403d2279947605d161b2eJoe Onorato fprintf(f, "%s", vt->typeName); 47d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams break; 48d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams } 49d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 50ed9f210568082dd6d1d8a0c92c693d574d87d545Alex Sakhartchouk if (vt->ptrLevel) { 51d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams fprintf(f, " "); 52ed9f210568082dd6d1d8a0c92c693d574d87d545Alex Sakhartchouk for (ct=0; ct < vt->ptrLevel; ct++) { 53d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams fprintf(f, "*"); 54d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams } 55d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams } 56a08526ac42b3da98926ae921a6d8cfb9bbc90553Jason Sams} 57a08526ac42b3da98926ae921a6d8cfb9bbc90553Jason Sams 58a08526ac42b3da98926ae921a6d8cfb9bbc90553Jason Samsvoid printVarTypeAndName(FILE *f, const VarType *vt) { 59a08526ac42b3da98926ae921a6d8cfb9bbc90553Jason Sams printVarType(f, vt); 60d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 61ed9f210568082dd6d1d8a0c92c693d574d87d545Alex Sakhartchouk if (vt->name[0]) { 62d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams fprintf(f, " %s", vt->name); 63d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams } 64d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams} 65d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 66ed9f210568082dd6d1d8a0c92c693d574d87d545Alex Sakhartchoukvoid printArgList(FILE *f, const ApiEntry * api, int assumePrevious) { 67d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams int ct; 68ed9f210568082dd6d1d8a0c92c693d574d87d545Alex Sakhartchouk for (ct=0; ct < api->paramCount; ct++) { 69d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams if (ct || assumePrevious) { 70d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams fprintf(f, ", "); 71d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams } 72a08526ac42b3da98926ae921a6d8cfb9bbc90553Jason Sams printVarTypeAndName(f, &api->params[ct]); 73d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams } 74d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams} 75d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 76ed9f210568082dd6d1d8a0c92c693d574d87d545Alex Sakhartchoukvoid printStructures(FILE *f) { 77d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams int ct; 78d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams int ct2; 79d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 80ed9f210568082dd6d1d8a0c92c693d574d87d545Alex Sakhartchouk for (ct=0; ct < apiCount; ct++) { 81d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams fprintf(f, "typedef struct RS_CMD_%s_rec RS_CMD_%s;\n", apis[ct].name, apis[ct].name); 82d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams } 83d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams fprintf(f, "\n"); 84d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 85ed9f210568082dd6d1d8a0c92c693d574d87d545Alex Sakhartchouk for (ct=0; ct < apiCount; ct++) { 86d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams const ApiEntry * api = &apis[ct]; 87d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams fprintf(f, "#define RS_CMD_ID_%s %i\n", api->name, ct+1); 88d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams fprintf(f, "struct RS_CMD_%s_rec {\n", api->name); 89d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams //fprintf(f, " RsCommandHeader _hdr;\n"); 90d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 91ed9f210568082dd6d1d8a0c92c693d574d87d545Alex Sakhartchouk for (ct2=0; ct2 < api->paramCount; ct2++) { 92d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams fprintf(f, " "); 93a08526ac42b3da98926ae921a6d8cfb9bbc90553Jason Sams printVarTypeAndName(f, &api->params[ct2]); 94d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams fprintf(f, ";\n"); 95d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams } 96d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams fprintf(f, "};\n\n"); 97d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams } 98d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams} 99d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 100c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Samsvoid printFuncDecl(FILE *f, const ApiEntry *api, const char *prefix, int addContext, int isFnPtr) { 101a08526ac42b3da98926ae921a6d8cfb9bbc90553Jason Sams printVarTypeAndName(f, &api->ret); 102c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams if (isFnPtr) { 103c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams char t[1024]; 104c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams strcpy(t, api->name); 105c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams if (strlen(prefix) == 0) { 106c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams if (t[0] > 'A' && t[0] < 'Z') { 107c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams t[0] -= 'A' - 'a'; 108c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams } 109c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams } 110c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams fprintf(f, " (* %s%s) (", prefix, api->name); 111c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams } else { 112c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams fprintf(f, " %s%s (", prefix, api->name); 113c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams } 11465bdaf1c6d463d9441125d2c87a36015bfef2d95Jason Sams if (!api->nocontext) { 11565bdaf1c6d463d9441125d2c87a36015bfef2d95Jason Sams if (addContext) { 11665bdaf1c6d463d9441125d2c87a36015bfef2d95Jason Sams fprintf(f, "Context *"); 11765bdaf1c6d463d9441125d2c87a36015bfef2d95Jason Sams } else { 11865bdaf1c6d463d9441125d2c87a36015bfef2d95Jason Sams fprintf(f, "RsContext rsc"); 11965bdaf1c6d463d9441125d2c87a36015bfef2d95Jason Sams } 120d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams } 12165bdaf1c6d463d9441125d2c87a36015bfef2d95Jason Sams printArgList(f, api, !api->nocontext); 122d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams fprintf(f, ")"); 123d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams} 124d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 125ed9f210568082dd6d1d8a0c92c693d574d87d545Alex Sakhartchoukvoid printFuncDecls(FILE *f, const char *prefix, int addContext) { 126d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams int ct; 127ed9f210568082dd6d1d8a0c92c693d574d87d545Alex Sakhartchouk for (ct=0; ct < apiCount; ct++) { 128c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams printFuncDecl(f, &apis[ct], prefix, addContext, 0); 129d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams fprintf(f, ";\n"); 130d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams } 131d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams fprintf(f, "\n\n"); 132d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams} 133d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 134c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Samsvoid printFuncPointers(FILE *f, int addContext) { 135c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams fprintf(f, "\n"); 136c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams fprintf(f, "typedef struct RsApiEntrypoints {\n"); 137c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams int ct; 138c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams for (ct=0; ct < apiCount; ct++) { 139c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams fprintf(f, " "); 140c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams printFuncDecl(f, &apis[ct], "", addContext, 1); 141c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams fprintf(f, ";\n"); 142c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams } 143c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams fprintf(f, "} RsApiEntrypoints_t;\n\n"); 144c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams} 145c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams 146ed9f210568082dd6d1d8a0c92c693d574d87d545Alex Sakhartchoukvoid printPlaybackFuncs(FILE *f, const char *prefix) { 147d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams int ct; 148ed9f210568082dd6d1d8a0c92c693d574d87d545Alex Sakhartchouk for (ct=0; ct < apiCount; ct++) { 14965bdaf1c6d463d9441125d2c87a36015bfef2d95Jason Sams if (apis[ct].direct) { 15065bdaf1c6d463d9441125d2c87a36015bfef2d95Jason Sams continue; 15165bdaf1c6d463d9441125d2c87a36015bfef2d95Jason Sams } 15265bdaf1c6d463d9441125d2c87a36015bfef2d95Jason Sams 153d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams fprintf(f, "void %s%s (Context *, const void *);\n", prefix, apis[ct].name); 154d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams } 155d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams} 156d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 157a08526ac42b3da98926ae921a6d8cfb9bbc90553Jason Samsstatic int hasInlineDataPointers(const ApiEntry * api) { 158a08526ac42b3da98926ae921a6d8cfb9bbc90553Jason Sams int ret = 0; 159a08526ac42b3da98926ae921a6d8cfb9bbc90553Jason Sams int ct; 160b96e9517affa31c2f9b5c8c005c85d2cc99453b4Jason Sams if (api->sync || api->ret.typeName[0]) { 161a08526ac42b3da98926ae921a6d8cfb9bbc90553Jason Sams return 0; 162a08526ac42b3da98926ae921a6d8cfb9bbc90553Jason Sams } 163a08526ac42b3da98926ae921a6d8cfb9bbc90553Jason Sams for (ct=0; ct < api->paramCount; ct++) { 164a08526ac42b3da98926ae921a6d8cfb9bbc90553Jason Sams const VarType *vt = &api->params[ct]; 165a08526ac42b3da98926ae921a6d8cfb9bbc90553Jason Sams 166a08526ac42b3da98926ae921a6d8cfb9bbc90553Jason Sams if (!vt->isConst && vt->ptrLevel) { 167a08526ac42b3da98926ae921a6d8cfb9bbc90553Jason Sams // Non-const pointers cannot be inlined. 168a08526ac42b3da98926ae921a6d8cfb9bbc90553Jason Sams return 0; 169a08526ac42b3da98926ae921a6d8cfb9bbc90553Jason Sams } 170a08526ac42b3da98926ae921a6d8cfb9bbc90553Jason Sams if (vt->ptrLevel > 1) { 171a08526ac42b3da98926ae921a6d8cfb9bbc90553Jason Sams // not handled yet. 172a08526ac42b3da98926ae921a6d8cfb9bbc90553Jason Sams return 0; 173a08526ac42b3da98926ae921a6d8cfb9bbc90553Jason Sams } 174a08526ac42b3da98926ae921a6d8cfb9bbc90553Jason Sams 175a08526ac42b3da98926ae921a6d8cfb9bbc90553Jason Sams if (vt->isConst && vt->ptrLevel) { 176a08526ac42b3da98926ae921a6d8cfb9bbc90553Jason Sams // Non-const pointers cannot be inlined. 177a08526ac42b3da98926ae921a6d8cfb9bbc90553Jason Sams ret = 1; 178a08526ac42b3da98926ae921a6d8cfb9bbc90553Jason Sams } 179a08526ac42b3da98926ae921a6d8cfb9bbc90553Jason Sams } 180a08526ac42b3da98926ae921a6d8cfb9bbc90553Jason Sams return ret; 181a08526ac42b3da98926ae921a6d8cfb9bbc90553Jason Sams} 182a08526ac42b3da98926ae921a6d8cfb9bbc90553Jason Sams 183ed9f210568082dd6d1d8a0c92c693d574d87d545Alex Sakhartchoukvoid printApiCpp(FILE *f) { 184d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams int ct; 185d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams int ct2; 186d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 187d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams fprintf(f, "#include \"rsDevice.h\"\n"); 188d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams fprintf(f, "#include \"rsContext.h\"\n"); 189d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams fprintf(f, "#include \"rsThreadIO.h\"\n"); 190d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams //fprintf(f, "#include \"rsgApiStructs.h\"\n"); 191d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams fprintf(f, "#include \"rsgApiFuncDecl.h\"\n"); 1927a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams fprintf(f, "#include \"rsFifo.h\"\n"); 193d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams fprintf(f, "\n"); 194d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams fprintf(f, "using namespace android;\n"); 195d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams fprintf(f, "using namespace android::renderscript;\n"); 196d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams fprintf(f, "\n"); 197d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 198c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams printFuncPointers(f, 0); 199c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams 200c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams // Generate RS funcs for local fifo 201ed9f210568082dd6d1d8a0c92c693d574d87d545Alex Sakhartchouk for (ct=0; ct < apiCount; ct++) { 202d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams int needFlush = 0; 203d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams const ApiEntry * api = &apis[ct]; 204d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 205c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams fprintf(f, "static "); 206c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams printFuncDecl(f, api, "LF_", 0, 0); 207d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams fprintf(f, "\n{\n"); 208edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams if (api->direct) { 209edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams fprintf(f, " "); 210edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams if (api->ret.typeName[0]) { 211edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams fprintf(f, "return "); 212edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams } 213edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams fprintf(f, "rsi_%s(", api->name); 214edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams if (!api->nocontext) { 215edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams fprintf(f, "(Context *)rsc"); 216c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams } 217ed9f210568082dd6d1d8a0c92c693d574d87d545Alex Sakhartchouk for (ct2=0; ct2 < api->paramCount; ct2++) { 21807ae40623737a6060b8a925fd2e6bba76780dcd4Jason Sams const VarType *vt = &api->params[ct2]; 219c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams if (ct2 > 0 || !api->nocontext) { 220c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams fprintf(f, ", "); 221c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams } 222c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams fprintf(f, "%s", vt->name); 22307ae40623737a6060b8a925fd2e6bba76780dcd4Jason Sams } 22407ae40623737a6060b8a925fd2e6bba76780dcd4Jason Sams fprintf(f, ");\n"); 22507ae40623737a6060b8a925fd2e6bba76780dcd4Jason Sams } else { 22607ae40623737a6060b8a925fd2e6bba76780dcd4Jason Sams fprintf(f, " ThreadIO *io = &((Context *)rsc)->mIO;\n"); 227b96e9517affa31c2f9b5c8c005c85d2cc99453b4Jason Sams fprintf(f, " const uint32_t size = sizeof(RS_CMD_%s);\n", api->name); 228a08526ac42b3da98926ae921a6d8cfb9bbc90553Jason Sams if (hasInlineDataPointers(api)) { 229a08526ac42b3da98926ae921a6d8cfb9bbc90553Jason Sams fprintf(f, " uint32_t dataSize = 0;\n"); 230a08526ac42b3da98926ae921a6d8cfb9bbc90553Jason Sams for (ct2=0; ct2 < api->paramCount; ct2++) { 231a08526ac42b3da98926ae921a6d8cfb9bbc90553Jason Sams const VarType *vt = &api->params[ct2]; 232a08526ac42b3da98926ae921a6d8cfb9bbc90553Jason Sams if (vt->isConst && vt->ptrLevel) { 233a08526ac42b3da98926ae921a6d8cfb9bbc90553Jason Sams fprintf(f, " dataSize += %s_length;\n", vt->name); 234a08526ac42b3da98926ae921a6d8cfb9bbc90553Jason Sams } 235a08526ac42b3da98926ae921a6d8cfb9bbc90553Jason Sams } 236a08526ac42b3da98926ae921a6d8cfb9bbc90553Jason Sams } 237a08526ac42b3da98926ae921a6d8cfb9bbc90553Jason Sams 23807ae40623737a6060b8a925fd2e6bba76780dcd4Jason Sams //fprintf(f, " LOGE(\"add command %s\\n\");\n", api->name); 239a08526ac42b3da98926ae921a6d8cfb9bbc90553Jason Sams if (hasInlineDataPointers(api)) { 240b96e9517affa31c2f9b5c8c005c85d2cc99453b4Jason Sams fprintf(f, " RS_CMD_%s *cmd = NULL;\n", api->name); 241b96e9517affa31c2f9b5c8c005c85d2cc99453b4Jason Sams fprintf(f, " if (dataSize < 1024) {;\n"); 242edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams fprintf(f, " cmd = static_cast<RS_CMD_%s *>(io->coreHeader(RS_CMD_ID_%s, dataSize + size));\n", api->name, api->name); 243b96e9517affa31c2f9b5c8c005c85d2cc99453b4Jason Sams fprintf(f, " } else {\n"); 244edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams fprintf(f, " cmd = static_cast<RS_CMD_%s *>(io->coreHeader(RS_CMD_ID_%s, size));\n", api->name, api->name); 245b96e9517affa31c2f9b5c8c005c85d2cc99453b4Jason Sams fprintf(f, " }\n"); 246a08526ac42b3da98926ae921a6d8cfb9bbc90553Jason Sams fprintf(f, " uint8_t *payload = (uint8_t *)&cmd[1];\n"); 247eccf6c6483564bbe21020e2affb490ced2345e5eJason Sams } else { 248edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams fprintf(f, " RS_CMD_%s *cmd = static_cast<RS_CMD_%s *>(io->coreHeader(RS_CMD_ID_%s, size));\n", api->name, api->name, api->name); 249a08526ac42b3da98926ae921a6d8cfb9bbc90553Jason Sams } 25007ae40623737a6060b8a925fd2e6bba76780dcd4Jason Sams 251ed9f210568082dd6d1d8a0c92c693d574d87d545Alex Sakhartchouk for (ct2=0; ct2 < api->paramCount; ct2++) { 25207ae40623737a6060b8a925fd2e6bba76780dcd4Jason Sams const VarType *vt = &api->params[ct2]; 25307ae40623737a6060b8a925fd2e6bba76780dcd4Jason Sams needFlush += vt->ptrLevel; 254a08526ac42b3da98926ae921a6d8cfb9bbc90553Jason Sams if (vt->ptrLevel && hasInlineDataPointers(api)) { 255a08526ac42b3da98926ae921a6d8cfb9bbc90553Jason Sams fprintf(f, " if (dataSize < 1024) {\n"); 256a08526ac42b3da98926ae921a6d8cfb9bbc90553Jason Sams fprintf(f, " memcpy(payload, %s, %s_length);\n", vt->name, vt->name); 257a08526ac42b3da98926ae921a6d8cfb9bbc90553Jason Sams fprintf(f, " cmd->%s = (", vt->name); 258a08526ac42b3da98926ae921a6d8cfb9bbc90553Jason Sams printVarType(f, vt); 259a08526ac42b3da98926ae921a6d8cfb9bbc90553Jason Sams fprintf(f, ")payload;\n"); 260a08526ac42b3da98926ae921a6d8cfb9bbc90553Jason Sams fprintf(f, " payload += %s_length;\n", vt->name); 261a08526ac42b3da98926ae921a6d8cfb9bbc90553Jason Sams fprintf(f, " } else {\n"); 262a08526ac42b3da98926ae921a6d8cfb9bbc90553Jason Sams fprintf(f, " cmd->%s = %s;\n", vt->name, vt->name); 263a08526ac42b3da98926ae921a6d8cfb9bbc90553Jason Sams fprintf(f, " }\n"); 264a08526ac42b3da98926ae921a6d8cfb9bbc90553Jason Sams 265a08526ac42b3da98926ae921a6d8cfb9bbc90553Jason Sams } else { 266a08526ac42b3da98926ae921a6d8cfb9bbc90553Jason Sams fprintf(f, " cmd->%s = %s;\n", vt->name, vt->name); 267a08526ac42b3da98926ae921a6d8cfb9bbc90553Jason Sams } 26807ae40623737a6060b8a925fd2e6bba76780dcd4Jason Sams } 269edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams if (api->ret.typeName[0] || api->sync) { 27007ae40623737a6060b8a925fd2e6bba76780dcd4Jason Sams needFlush = 1; 27107ae40623737a6060b8a925fd2e6bba76780dcd4Jason Sams } 27207ae40623737a6060b8a925fd2e6bba76780dcd4Jason Sams 273a08526ac42b3da98926ae921a6d8cfb9bbc90553Jason Sams if (hasInlineDataPointers(api)) { 274a08526ac42b3da98926ae921a6d8cfb9bbc90553Jason Sams fprintf(f, " if (dataSize < 1024) {\n"); 275edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams fprintf(f, " io->coreCommit();\n"); 276a08526ac42b3da98926ae921a6d8cfb9bbc90553Jason Sams fprintf(f, " } else {\n"); 277edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams fprintf(f, " io->coreCommitSync();\n"); 278a08526ac42b3da98926ae921a6d8cfb9bbc90553Jason Sams fprintf(f, " }\n"); 279a08526ac42b3da98926ae921a6d8cfb9bbc90553Jason Sams } else { 280edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams fprintf(f, " io->coreCommit"); 281a08526ac42b3da98926ae921a6d8cfb9bbc90553Jason Sams if (needFlush) { 282a08526ac42b3da98926ae921a6d8cfb9bbc90553Jason Sams fprintf(f, "Sync"); 283a08526ac42b3da98926ae921a6d8cfb9bbc90553Jason Sams } 284edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams fprintf(f, "();\n"); 28507ae40623737a6060b8a925fd2e6bba76780dcd4Jason Sams } 28607ae40623737a6060b8a925fd2e6bba76780dcd4Jason Sams 28707ae40623737a6060b8a925fd2e6bba76780dcd4Jason Sams if (api->ret.typeName[0]) { 288edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams fprintf(f, "\n "); 2897a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams printVarType(f, &api->ret); 290edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams fprintf(f, " ret;\n"); 291edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams fprintf(f, " io->coreGetReturn(&ret, sizeof(ret));\n"); 292edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams fprintf(f, " return ret;\n"); 29307ae40623737a6060b8a925fd2e6bba76780dcd4Jason Sams } 294d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams } 295d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams fprintf(f, "};\n\n"); 2967a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams 2977a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams 2987a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams fprintf(f, "static "); 2997a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams printFuncDecl(f, api, "RF_", 0, 0); 3007a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams fprintf(f, "\n{\n"); 3017a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams fprintf(f, " Fifo *f = NULL;\n"); 3027a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams fprintf(f, " RS_CMD_%s cmd;\n", api->name); 3037a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams fprintf(f, " const uint32_t cmdSize = sizeof(cmd);\n"); 3047a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams fprintf(f, " const uint32_t cmdID = RS_CMD_ID_%s;\n", api->name); 3057a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams fprintf(f, " f->writeAsync(&cmdID, sizeof(cmdID));\n"); 306edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams fprintf(f, " intptr_t offset = cmdSize;\n"); 307edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams fprintf(f, " uint32_t dataSize = 0;\n"); 308edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams for (ct2=0; ct2 < api->paramCount; ct2++) { 309edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams const VarType *vt = &api->params[ct2]; 310edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams if (vt->isConst && vt->ptrLevel) { 3117a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams switch(vt->ptrLevel) { 3127a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams case 1: 313edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams fprintf(f, " dataSize += %s_length;\n", vt->name); 3147a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams break; 3157a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams case 2: 3167a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams fprintf(f, " for (size_t ct = 0; ct < (%s_length_length / sizeof(%s_length)); ct++) {\n", vt->name, vt->name); 317edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams fprintf(f, " dataSize += %s_length[ct];\n", vt->name); 3187a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams fprintf(f, " }\n"); 3197a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams break; 3207a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams default: 3217a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams printf("pointer level not handled!!"); 3227a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams } 3237a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams } 324edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams } 325edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams fprintf(f, "\n"); 3267a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams 327edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams for (ct2=0; ct2 < api->paramCount; ct2++) { 328edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams const VarType *vt = &api->params[ct2]; 329edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams switch(vt->ptrLevel) { 330edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams case 0: 331edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams fprintf(f, " cmd.%s = %s;\n", vt->name, vt->name); 332edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams break; 333edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams case 1: 334edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams fprintf(f, " cmd.%s = (", vt->name); 335edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams printVarType(f, vt); 336edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams fprintf(f, ")offset;\n"); 337edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams fprintf(f, " offset += %s_length;\n", vt->name); 338edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams break; 339edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams case 2: 340edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams fprintf(f, " cmd.%s = (", vt->name); 341edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams printVarType(f, vt); 342edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams fprintf(f, ")offset;\n"); 343edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams fprintf(f, " for (size_t ct = 0; ct < (%s_length_length / sizeof(%s_length)); ct++) {\n", vt->name, vt->name); 344edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams fprintf(f, " offset += %s_length[ct];\n", vt->name); 345edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams fprintf(f, " }\n"); 346edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams break; 347edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams default: 348edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams fprintf(stderr, "pointer level not handled!!"); 3497a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams } 350edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams } 351edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams fprintf(f, "\n"); 3527a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams 353edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams fprintf(f, " f->writeAsync(&cmd, cmdSize);\n"); 354edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams for (ct2=0; ct2 < api->paramCount; ct2++) { 355edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams const VarType *vt = &api->params[ct2]; 356edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams if (vt->ptrLevel == 1) { 357edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams fprintf(f, " f->writeAsync(%s, %s_length);\n", vt->name, vt->name); 358edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams } 359edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams if (vt->ptrLevel == 2) { 360edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams fprintf(f, " for (size_t ct = 0; ct < (%s_length_length / sizeof(%s_length)); ct++) {\n", vt->name, vt->name); 361edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams fprintf(f, " f->writeAsync(%s, %s_length[ct]);\n", vt->name, vt->name); 362edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams fprintf(f, " offset += %s_length[ct];\n", vt->name); 363edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams fprintf(f, " }\n"); 3647a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams } 3657a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams } 366edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams 367edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams if (api->ret.typeName[0]) { 368edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams fprintf(f, " "); 369edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams printVarType(f, &api->ret); 370edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams fprintf(f, " retValue;\n"); 371edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams fprintf(f, " f->writeWaitReturn(&retValue, sizeof(retValue));\n"); 372edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams fprintf(f, " return retValue;\n"); 373edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams } 3747a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams fprintf(f, "}\n\n"); 375d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams } 376c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams 377c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams fprintf(f, "\n"); 378c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams fprintf(f, "static RsApiEntrypoints_t s_LocalTable = {\n"); 379c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams for (ct=0; ct < apiCount; ct++) { 380c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams fprintf(f, " LF_%s,\n", apis[ct].name); 381c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams } 382c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams fprintf(f, "};\n"); 383c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams 3847a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams fprintf(f, "\n"); 3857a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams fprintf(f, "static RsApiEntrypoints_t s_RemoteTable = {\n"); 3867a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams for (ct=0; ct < apiCount; ct++) { 3877a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams fprintf(f, " RF_%s,\n", apis[ct].name); 3887a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams } 3897a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams fprintf(f, "};\n"); 390c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams 3917a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams fprintf(f, "static RsApiEntrypoints_t *s_CurrentTable = &s_LocalTable;\n\n"); 392c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams for (ct=0; ct < apiCount; ct++) { 393c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams int needFlush = 0; 394c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams const ApiEntry * api = &apis[ct]; 395c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams 396c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams printFuncDecl(f, api, "rs", 0, 0); 397c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams fprintf(f, "\n{\n"); 398c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams fprintf(f, " "); 399c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams if (api->ret.typeName[0]) { 400c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams fprintf(f, "return "); 401c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams } 402c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams fprintf(f, "s_CurrentTable->%s(", api->name); 403c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams 404c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams if (!api->nocontext) { 405c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams fprintf(f, "(Context *)rsc"); 406c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams } 407c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams 408c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams for (ct2=0; ct2 < api->paramCount; ct2++) { 409c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams const VarType *vt = &api->params[ct2]; 410c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams if (ct2 > 0 || !api->nocontext) { 411c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams fprintf(f, ", "); 412c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams } 413c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams fprintf(f, "%s", vt->name); 414c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams } 415c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams fprintf(f, ");\n"); 416c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams fprintf(f, "}\n\n"); 417c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams } 418c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams 419d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams} 420d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 421ed9f210568082dd6d1d8a0c92c693d574d87d545Alex Sakhartchoukvoid printPlaybackCpp(FILE *f) { 422d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams int ct; 423d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams int ct2; 424d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 425d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams fprintf(f, "#include \"rsDevice.h\"\n"); 426d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams fprintf(f, "#include \"rsContext.h\"\n"); 427d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams fprintf(f, "#include \"rsThreadIO.h\"\n"); 428d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams //fprintf(f, "#include \"rsgApiStructs.h\"\n"); 429d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams fprintf(f, "#include \"rsgApiFuncDecl.h\"\n"); 430d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams fprintf(f, "\n"); 431d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams fprintf(f, "namespace android {\n"); 432d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams fprintf(f, "namespace renderscript {\n"); 433d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams fprintf(f, "\n"); 434d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 435ed9f210568082dd6d1d8a0c92c693d574d87d545Alex Sakhartchouk for (ct=0; ct < apiCount; ct++) { 436d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams const ApiEntry * api = &apis[ct]; 437d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 43865bdaf1c6d463d9441125d2c87a36015bfef2d95Jason Sams if (api->direct) { 43965bdaf1c6d463d9441125d2c87a36015bfef2d95Jason Sams continue; 44065bdaf1c6d463d9441125d2c87a36015bfef2d95Jason Sams } 44165bdaf1c6d463d9441125d2c87a36015bfef2d95Jason Sams 4427a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams fprintf(f, "void rsp_%s(Context *con, const void *vp, size_t cmdSizeBytes) {\n", api->name); 44365bdaf1c6d463d9441125d2c87a36015bfef2d95Jason Sams 44465bdaf1c6d463d9441125d2c87a36015bfef2d95Jason Sams //fprintf(f, " LOGE(\"play command %s\\n\");\n", api->name); 44565bdaf1c6d463d9441125d2c87a36015bfef2d95Jason Sams fprintf(f, " const RS_CMD_%s *cmd = static_cast<const RS_CMD_%s *>(vp);\n", api->name, api->name); 446a08526ac42b3da98926ae921a6d8cfb9bbc90553Jason Sams 44765bdaf1c6d463d9441125d2c87a36015bfef2d95Jason Sams fprintf(f, " "); 44865bdaf1c6d463d9441125d2c87a36015bfef2d95Jason Sams if (api->ret.typeName[0]) { 449edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams fprintf(f, "\n "); 450edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams printVarType(f, &api->ret); 451edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams fprintf(f, " ret = "); 452d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams } 45365bdaf1c6d463d9441125d2c87a36015bfef2d95Jason Sams fprintf(f, "rsi_%s(con", api->name); 45465bdaf1c6d463d9441125d2c87a36015bfef2d95Jason Sams for (ct2=0; ct2 < api->paramCount; ct2++) { 45565bdaf1c6d463d9441125d2c87a36015bfef2d95Jason Sams const VarType *vt = &api->params[ct2]; 45665bdaf1c6d463d9441125d2c87a36015bfef2d95Jason Sams fprintf(f, ",\n cmd->%s", vt->name); 45765bdaf1c6d463d9441125d2c87a36015bfef2d95Jason Sams } 45865bdaf1c6d463d9441125d2c87a36015bfef2d95Jason Sams fprintf(f, ");\n"); 45965bdaf1c6d463d9441125d2c87a36015bfef2d95Jason Sams 460edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams if (api->ret.typeName[0]) { 461edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams fprintf(f, " con->mIO.coreSetReturn(&ret, sizeof(ret));\n"); 462edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams } 463edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams 464d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams fprintf(f, "};\n\n"); 465d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams } 466d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 4677a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams for (ct=0; ct < apiCount; ct++) { 4687a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams const ApiEntry * api = &apis[ct]; 4697a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams 4707a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams fprintf(f, "void rspr_%s(Context *con, Fifo *f, uint8_t *scratch, size_t scratchSize) {\n", api->name); 4717a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams 4727a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams //fprintf(f, " LOGE(\"play command %s\\n\");\n", api->name); 4737a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams fprintf(f, " RS_CMD_%s cmd;\n", api->name); 4747a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams fprintf(f, " f->read(&cmd, sizeof(cmd));\n"); 4757a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams 4767a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams for (ct2=0; ct2 < api->paramCount; ct2++) { 4777a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams const VarType *vt = &api->params[ct2]; 4787a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams if (vt->ptrLevel == 1) { 4797a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams fprintf(f, " cmd.%s = (", vt->name); 4807a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams printVarType(f, vt); 4817a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams fprintf(f, ")scratch;\n"); 4827a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams fprintf(f, " f->read(scratch, cmd.%s_length);\n", vt->name); 4837a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams fprintf(f, " scratch += cmd.%s_length;\n", vt->name); 4847a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams } 4857a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams if (vt->ptrLevel == 2) { 4867a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams fprintf(f, " size_t sum_%s = 0;\n", vt->name); 4877a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams fprintf(f, " for (size_t ct = 0; ct < (cmd.%s_length_length / sizeof(cmd.%s_length)); ct++) {\n", vt->name, vt->name); 4887a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams fprintf(f, " ((size_t *)scratch)[ct] = cmd.%s_length[ct];\n", vt->name); 4897a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams fprintf(f, " sum_%s += cmd.%s_length[ct];\n", vt->name, vt->name); 4907a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams fprintf(f, " }\n"); 4917a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams fprintf(f, " f->read(scratch, sum_%s);\n", vt->name); 4927a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams fprintf(f, " scratch += sum_%s;\n", vt->name); 4937a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams } 4947a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams } 4957a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams fprintf(f, "\n"); 4967a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams 4977a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams if (api->ret.typeName[0]) { 4987a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams fprintf(f, " "); 4997a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams printVarType(f, &api->ret); 5007a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams fprintf(f, " ret =\n"); 5017a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams } 5027a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams 5037a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams fprintf(f, " rsi_%s(", api->name); 5047a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams if (!api->nocontext) { 5057a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams fprintf(f, "con"); 5067a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams } 5077a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams for (ct2=0; ct2 < api->paramCount; ct2++) { 5087a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams const VarType *vt = &api->params[ct2]; 5097a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams if (ct2 > 0 || !api->nocontext) { 5107a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams fprintf(f, ",\n"); 5117a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams } 5127a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams fprintf(f, " cmd.%s", vt->name); 5137a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams } 5147a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams fprintf(f, ");\n"); 5157a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams 5167a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams if (api->ret.typeName[0]) { 5177a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams fprintf(f, " f->readReturn(&ret, sizeof(ret));\n"); 5187a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams } 5197a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams 5207a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams fprintf(f, "};\n\n"); 5217a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams } 5227a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams 5237a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams fprintf(f, "RsPlaybackLocalFunc gPlaybackFuncs[%i] = {\n", apiCount + 1); 524d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams fprintf(f, " NULL,\n"); 525ed9f210568082dd6d1d8a0c92c693d574d87d545Alex Sakhartchouk for (ct=0; ct < apiCount; ct++) { 52665bdaf1c6d463d9441125d2c87a36015bfef2d95Jason Sams if (apis[ct].direct) { 52765bdaf1c6d463d9441125d2c87a36015bfef2d95Jason Sams fprintf(f, " NULL,\n"); 52865bdaf1c6d463d9441125d2c87a36015bfef2d95Jason Sams } else { 52965bdaf1c6d463d9441125d2c87a36015bfef2d95Jason Sams fprintf(f, " %s%s,\n", "rsp_", apis[ct].name); 53065bdaf1c6d463d9441125d2c87a36015bfef2d95Jason Sams } 531d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams } 532d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams fprintf(f, "};\n"); 533d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 5347a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams fprintf(f, "RsPlaybackRemoteFunc gPlaybackRemoteFuncs[%i] = {\n", apiCount + 1); 5357a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams fprintf(f, " NULL,\n"); 5367a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams for (ct=0; ct < apiCount; ct++) { 5377a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams fprintf(f, " %s%s,\n", "rspr_", apis[ct].name); 5387a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams } 5397a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams fprintf(f, "};\n"); 5407a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams 541d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams fprintf(f, "};\n"); 542d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams fprintf(f, "};\n"); 543d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams} 544d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 545a08526ac42b3da98926ae921a6d8cfb9bbc90553Jason Samsvoid yylex(); 546a08526ac42b3da98926ae921a6d8cfb9bbc90553Jason Sams 547ed9f210568082dd6d1d8a0c92c693d574d87d545Alex Sakhartchoukint main(int argc, char **argv) { 548d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams if (argc != 3) { 549d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams fprintf(stderr, "usage: %s commandFile outFile\n", argv[0]); 550d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams return 1; 551d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams } 552d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams const char* rsgFile = argv[1]; 553d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams const char* outFile = argv[2]; 554d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams FILE* input = fopen(rsgFile, "r"); 555d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 556d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams char choice = fgetc(input); 557d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams fclose(input); 558d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 559d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams if (choice < '0' || choice > '3') { 560d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams fprintf(stderr, "Uknown command: \'%c\'\n", choice); 561d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams return -2; 562d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams } 563d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 564d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams yylex(); 565d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams // printf("# of lines = %d\n", num_lines); 566d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 567d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams FILE *f = fopen(outFile, "w"); 568d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 569d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams printFileHeader(f); 570ed9f210568082dd6d1d8a0c92c693d574d87d545Alex Sakhartchouk switch (choice) { 571d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams case '0': // rsgApiStructs.h 572d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams { 573d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams fprintf(f, "\n"); 574d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams fprintf(f, "#include \"rsContext.h\"\n"); 5757a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams fprintf(f, "#include \"rsFifo.h\"\n"); 576d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams fprintf(f, "\n"); 577d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams fprintf(f, "namespace android {\n"); 578d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams fprintf(f, "namespace renderscript {\n"); 579d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams printStructures(f); 580d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams printFuncDecls(f, "rsi_", 1); 581d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams printPlaybackFuncs(f, "rsp_"); 5827a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams fprintf(f, "\n\ntypedef struct RsPlaybackRemoteHeaderRec {\n"); 5837a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams fprintf(f, " uint32_t command;\n"); 5847a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams fprintf(f, " uint32_t size;\n"); 5857a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams fprintf(f, "} RsPlaybackRemoteHeader;\n\n"); 5867a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams fprintf(f, "typedef void (*RsPlaybackLocalFunc)(Context *, const void *, size_t sizeBytes);\n"); 5877a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams fprintf(f, "typedef void (*RsPlaybackRemoteFunc)(Context *, Fifo *, uint8_t *scratch, size_t scratchSize);\n"); 5887a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams fprintf(f, "extern RsPlaybackLocalFunc gPlaybackFuncs[%i];\n", apiCount + 1); 5897a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams fprintf(f, "extern RsPlaybackRemoteFunc gPlaybackRemoteFuncs[%i];\n", apiCount + 1); 590d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 591d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams fprintf(f, "}\n"); 592d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams fprintf(f, "}\n"); 593d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams } 594d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams break; 595d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 596d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams case '1': // rsgApiFuncDecl.h 597d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams { 598d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams printFuncDecls(f, "rs", 0); 599d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams } 600d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams break; 601d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 602d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams case '2': // rsgApi.cpp 603d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams { 604d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams printApiCpp(f); 605d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams } 606d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams break; 607d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams 608d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams case '3': // rsgApiReplay.cpp 609d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams { 610d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams printFileHeader(f); 611d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams printPlaybackCpp(f); 612d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams } 613d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams break; 614c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams 615c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams case '4': // rsgApiStream.cpp 616c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams { 617c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams printFileHeader(f); 618c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams printPlaybackCpp(f); 619c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams } 620c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams 621c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams case '5': // rsgApiStreamReplay.cpp 622c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams { 623c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams printFileHeader(f); 624c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams printPlaybackCpp(f); 625c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams } 626c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams break; 627d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams } 628d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams fclose(f); 629d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams return 0; 630d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams} 631