1326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 284614dd02411e1cf9a4c37aa421898c471cfad20Joe Onorato#include "spec.h" 384614dd02411e1cf9a4c37aa421898c471cfad20Joe Onorato#include <stdio.h> 4da3b58d804b59595f1c618ff271fecd8a9ce59edShih-wei Liao#include <string.h> 5326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 6afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid printFileHeader(FILE *f) { 7326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, "/*\n"); 8186e59154a0fb86e05e283e9c083b69878c06720Jason Sams fprintf(f, " * Copyright (C) 2011 The Android Open Source Project\n"); 9326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, " *\n"); 10326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, " * Licensed under the Apache License, Version 2.0 (the \"License\");\n"); 11326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, " * you may not use this file except in compliance with the License.\n"); 12326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, " * You may obtain a copy of the License at\n"); 13326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, " *\n"); 14326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, " * http://www.apache.org/licenses/LICENSE-2.0\n"); 15326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, " *\n"); 16326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, " * Unless required by applicable law or agreed to in writing, software\n"); 17326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, " * distributed under the License is distributed on an \"AS IS\" BASIS,\n"); 18326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, " * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n"); 19326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, " * See the License for the specific language governing permissions and\n"); 20326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, " * limitations under the License.\n"); 21326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, " */\n\n"); 22326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 23326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 24afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid printVarType(FILE *f, const VarType *vt) { 25326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams int ct; 26326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams if (vt->isConst) { 27326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, "const "); 28326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 29326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 30afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk switch (vt->type) { 31326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams case 0: 32326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, "void"); 33326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams break; 34326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams case 1: 35326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, "int%i_t", vt->bits); 36326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams break; 37326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams case 2: 38326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, "uint%i_t", vt->bits); 39326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams break; 40326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams case 3: 41326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams if (vt->bits == 32) 42326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, "float"); 43326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams else 44326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, "double"); 45326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams break; 46326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams case 4: 4784614dd02411e1cf9a4c37aa421898c471cfad20Joe Onorato fprintf(f, "%s", vt->typeName); 48326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams break; 49326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 50326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 51afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (vt->ptrLevel) { 52326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, " "); 53afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk for (ct=0; ct < vt->ptrLevel; ct++) { 54326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, "*"); 55326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 56326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 575fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams} 585fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams 595fb1aeb6374f814d72117803682bc141cc6b0895Jason Samsvoid printVarTypeAndName(FILE *f, const VarType *vt) { 605fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams printVarType(f, vt); 61326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 62afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (vt->name[0]) { 63326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, " %s", vt->name); 64326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 65326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 66326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 67afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid printArgList(FILE *f, const ApiEntry * api, int assumePrevious) { 68326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams int ct; 69afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk for (ct=0; ct < api->paramCount; ct++) { 70326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams if (ct || assumePrevious) { 71326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, ", "); 72326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 735fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams printVarTypeAndName(f, &api->params[ct]); 74326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 75326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 76326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 77afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid printStructures(FILE *f) { 78326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams int ct; 79326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams int ct2; 80326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 81afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk for (ct=0; ct < apiCount; ct++) { 82326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, "typedef struct RS_CMD_%s_rec RS_CMD_%s;\n", apis[ct].name, apis[ct].name); 83326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 84326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, "\n"); 85326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 86afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk for (ct=0; ct < apiCount; ct++) { 87326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams const ApiEntry * api = &apis[ct]; 88326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, "#define RS_CMD_ID_%s %i\n", api->name, ct+1); 89f047575af292b9d2f56a266250de7feb9987de18Stephen Hines fprintf(f, "struct __attribute__((packed)) RS_CMD_%s_rec {\n", api->name); 90326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams //fprintf(f, " RsCommandHeader _hdr;\n"); 91326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 92afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk for (ct2=0; ct2 < api->paramCount; ct2++) { 93326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, " "); 945fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams printVarTypeAndName(f, &api->params[ct2]); 95326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, ";\n"); 96326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 97326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, "};\n\n"); 98326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 99326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 100326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 101c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Samsvoid printFuncDecl(FILE *f, const ApiEntry *api, const char *prefix, int addContext, int isFnPtr) { 1025fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams printVarTypeAndName(f, &api->ret); 103c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams if (isFnPtr) { 104c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams char t[1024]; 105c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams strcpy(t, api->name); 106c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams if (strlen(prefix) == 0) { 107c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams if (t[0] > 'A' && t[0] < 'Z') { 108c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams t[0] -= 'A' - 'a'; 109c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams } 110c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams } 111c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams fprintf(f, " (* %s%s) (", prefix, api->name); 112c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams } else { 113c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams fprintf(f, " %s%s (", prefix, api->name); 114c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams } 115186e59154a0fb86e05e283e9c083b69878c06720Jason Sams if (!api->nocontext) { 116186e59154a0fb86e05e283e9c083b69878c06720Jason Sams if (addContext) { 117186e59154a0fb86e05e283e9c083b69878c06720Jason Sams fprintf(f, "Context *"); 118186e59154a0fb86e05e283e9c083b69878c06720Jason Sams } else { 119186e59154a0fb86e05e283e9c083b69878c06720Jason Sams fprintf(f, "RsContext rsc"); 120186e59154a0fb86e05e283e9c083b69878c06720Jason Sams } 121326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 122186e59154a0fb86e05e283e9c083b69878c06720Jason Sams printArgList(f, api, !api->nocontext); 123326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, ")"); 124326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 125326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 126f6023e494e67bc9deaa8b96008180104cbf540c7Tim Murrayvoid printFuncDecls(FILE *f, const char *prefix, int addContext, int externC) { 127326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams int ct; 128afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk for (ct=0; ct < apiCount; ct++) { 129f6023e494e67bc9deaa8b96008180104cbf540c7Tim Murray if (externC) { 130f6023e494e67bc9deaa8b96008180104cbf540c7Tim Murray fprintf(f, "extern \"C\" "); 131f6023e494e67bc9deaa8b96008180104cbf540c7Tim Murray } 132c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams printFuncDecl(f, &apis[ct], prefix, addContext, 0); 133326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, ";\n"); 134326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 135326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, "\n\n"); 136326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 137326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 138c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Samsvoid printFuncPointers(FILE *f, int addContext) { 139c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams fprintf(f, "\n"); 140c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams fprintf(f, "typedef struct RsApiEntrypoints {\n"); 141c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams int ct; 142c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams for (ct=0; ct < apiCount; ct++) { 143c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams fprintf(f, " "); 144c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams printFuncDecl(f, &apis[ct], "", addContext, 1); 145c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams fprintf(f, ";\n"); 146c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams } 147c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams fprintf(f, "} RsApiEntrypoints_t;\n\n"); 148c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams} 149c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams 150afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid printPlaybackFuncs(FILE *f, const char *prefix) { 151326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams int ct; 152afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk for (ct=0; ct < apiCount; ct++) { 153186e59154a0fb86e05e283e9c083b69878c06720Jason Sams if (apis[ct].direct) { 154186e59154a0fb86e05e283e9c083b69878c06720Jason Sams continue; 155186e59154a0fb86e05e283e9c083b69878c06720Jason Sams } 156186e59154a0fb86e05e283e9c083b69878c06720Jason Sams 157326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, "void %s%s (Context *, const void *);\n", prefix, apis[ct].name); 158326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 159326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 160326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 1615fb1aeb6374f814d72117803682bc141cc6b0895Jason Samsstatic int hasInlineDataPointers(const ApiEntry * api) { 1625fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams int ret = 0; 1635fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams int ct; 164b693112b7513227b06d4a0a4e712ad3ce01451b4Jason Sams if (api->sync || api->ret.typeName[0]) { 1655fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams return 0; 1665fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams } 1675fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams for (ct=0; ct < api->paramCount; ct++) { 1685fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams const VarType *vt = &api->params[ct]; 1695fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams 1705fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams if (!vt->isConst && vt->ptrLevel) { 1715fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams // Non-const pointers cannot be inlined. 1725fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams return 0; 1735fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams } 1745fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams if (vt->ptrLevel > 1) { 1755fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams // not handled yet. 1765fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams return 0; 1775fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams } 1785fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams 1795fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams if (vt->isConst && vt->ptrLevel) { 1805fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams // Non-const pointers cannot be inlined. 1815fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams ret = 1; 1825fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams } 1835fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams } 1845fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams return ret; 1855fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams} 1865fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams 187afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid printApiCpp(FILE *f) { 188326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams int ct; 189326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams int ct2; 190326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 191326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, "#include \"rsDevice.h\"\n"); 192326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, "#include \"rsContext.h\"\n"); 193326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, "#include \"rsThreadIO.h\"\n"); 1944edf030cbb7c6ac08dc563335c2af73c20f6e2e5Alex Sakhartchouk fprintf(f, "#include \"rsgApiStructs.h\"\n"); 195326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, "#include \"rsgApiFuncDecl.h\"\n"); 1962008747941749ad27fe80663d23036ac320e998fJason Sams fprintf(f, "#include \"rsFifo.h\"\n"); 197326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, "\n"); 198326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, "using namespace android;\n"); 199326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, "using namespace android::renderscript;\n"); 200326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, "\n"); 201326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 202c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams printFuncPointers(f, 0); 203c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams 204c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams // Generate RS funcs for local fifo 205afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk for (ct=0; ct < apiCount; ct++) { 206326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams int needFlush = 0; 207326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams const ApiEntry * api = &apis[ct]; 208326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 209c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams fprintf(f, "static "); 210c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams printFuncDecl(f, api, "LF_", 0, 0); 211326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, "\n{\n"); 2121a4efa363916977ef9aeab756725b3bdc880a15bJason Sams if (api->direct) { 2131a4efa363916977ef9aeab756725b3bdc880a15bJason Sams fprintf(f, " "); 2141a4efa363916977ef9aeab756725b3bdc880a15bJason Sams if (api->ret.typeName[0]) { 2151a4efa363916977ef9aeab756725b3bdc880a15bJason Sams fprintf(f, "return "); 2161a4efa363916977ef9aeab756725b3bdc880a15bJason Sams } 2171a4efa363916977ef9aeab756725b3bdc880a15bJason Sams fprintf(f, "rsi_%s(", api->name); 2181a4efa363916977ef9aeab756725b3bdc880a15bJason Sams if (!api->nocontext) { 2191a4efa363916977ef9aeab756725b3bdc880a15bJason Sams fprintf(f, "(Context *)rsc"); 220c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams } 221afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk for (ct2=0; ct2 < api->paramCount; ct2++) { 2229397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams const VarType *vt = &api->params[ct2]; 223c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams if (ct2 > 0 || !api->nocontext) { 224c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams fprintf(f, ", "); 225c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams } 226c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams fprintf(f, "%s", vt->name); 2279397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams } 2289397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams fprintf(f, ");\n"); 229c2eca55c8b6de99130329a96b13498b700aa6344Tim Murray } else if (api->handcodeApi) { 230c2eca55c8b6de99130329a96b13498b700aa6344Tim Murray // handle handcode path 231c2eca55c8b6de99130329a96b13498b700aa6344Tim Murray fprintf(f, " LF_%s_handcode(", api->name); 232c2eca55c8b6de99130329a96b13498b700aa6344Tim Murray if (!api->nocontext) { 233c2eca55c8b6de99130329a96b13498b700aa6344Tim Murray fprintf(f, "(Context *)rsc"); 234c2eca55c8b6de99130329a96b13498b700aa6344Tim Murray } 235c2eca55c8b6de99130329a96b13498b700aa6344Tim Murray for (ct2=0; ct2 < api->paramCount; ct2++) { 236c2eca55c8b6de99130329a96b13498b700aa6344Tim Murray const VarType *vt = &api->params[ct2]; 237c2eca55c8b6de99130329a96b13498b700aa6344Tim Murray if (ct2 > 0 || !api->nocontext) { 238c2eca55c8b6de99130329a96b13498b700aa6344Tim Murray fprintf(f, ", "); 239c2eca55c8b6de99130329a96b13498b700aa6344Tim Murray } 240c2eca55c8b6de99130329a96b13498b700aa6344Tim Murray fprintf(f, "%s", vt->name); 241c2eca55c8b6de99130329a96b13498b700aa6344Tim Murray } 242c2eca55c8b6de99130329a96b13498b700aa6344Tim Murray fprintf(f, ");\n"); 243c2eca55c8b6de99130329a96b13498b700aa6344Tim Murray 2449397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams } else { 2454d252d6e807b89764dad123ac845df298c52ca97Tim Murray // handle synchronous path 2464d252d6e807b89764dad123ac845df298c52ca97Tim Murray fprintf(f, " if (((Context *)rsc)->isSynchronous()) {\n"); 2474d252d6e807b89764dad123ac845df298c52ca97Tim Murray fprintf(f, " "); 2484d252d6e807b89764dad123ac845df298c52ca97Tim Murray if (api->ret.typeName[0]) { 2494d252d6e807b89764dad123ac845df298c52ca97Tim Murray fprintf(f, "return "); 2504d252d6e807b89764dad123ac845df298c52ca97Tim Murray } 2514d252d6e807b89764dad123ac845df298c52ca97Tim Murray fprintf(f, "rsi_%s(", api->name); 2524d252d6e807b89764dad123ac845df298c52ca97Tim Murray if (!api->nocontext) { 2534d252d6e807b89764dad123ac845df298c52ca97Tim Murray fprintf(f, "(Context *)rsc"); 2544d252d6e807b89764dad123ac845df298c52ca97Tim Murray } 2554d252d6e807b89764dad123ac845df298c52ca97Tim Murray for (ct2=0; ct2 < api->paramCount; ct2++) { 2564d252d6e807b89764dad123ac845df298c52ca97Tim Murray const VarType *vt = &api->params[ct2]; 2574d252d6e807b89764dad123ac845df298c52ca97Tim Murray if (ct2 > 0 || !api->nocontext) { 2584d252d6e807b89764dad123ac845df298c52ca97Tim Murray fprintf(f, ", "); 2594d252d6e807b89764dad123ac845df298c52ca97Tim Murray } 2604d252d6e807b89764dad123ac845df298c52ca97Tim Murray fprintf(f, "%s", vt->name); 2614d252d6e807b89764dad123ac845df298c52ca97Tim Murray } 2624d252d6e807b89764dad123ac845df298c52ca97Tim Murray fprintf(f, ");\n"); 2634d252d6e807b89764dad123ac845df298c52ca97Tim Murray if (!api->ret.typeName[0]) { 2644d252d6e807b89764dad123ac845df298c52ca97Tim Murray fprintf(f, " return;"); 2654d252d6e807b89764dad123ac845df298c52ca97Tim Murray } 2664d252d6e807b89764dad123ac845df298c52ca97Tim Murray fprintf(f, " }\n\n"); 2674d252d6e807b89764dad123ac845df298c52ca97Tim Murray 2689397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams fprintf(f, " ThreadIO *io = &((Context *)rsc)->mIO;\n"); 269099bc262f862cdeb547cf8a78fe9e0e92560f437Tim Murray fprintf(f, " const size_t size = sizeof(RS_CMD_%s);\n", api->name); 2705fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams if (hasInlineDataPointers(api)) { 271099bc262f862cdeb547cf8a78fe9e0e92560f437Tim Murray fprintf(f, " size_t dataSize = 0;\n"); 2725fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams for (ct2=0; ct2 < api->paramCount; ct2++) { 2735fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams const VarType *vt = &api->params[ct2]; 2745fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams if (vt->isConst && vt->ptrLevel) { 2755fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams fprintf(f, " dataSize += %s_length;\n", vt->name); 2765fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams } 2775fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams } 2785fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams } 2795fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams 280af12ac6a08651464f8d823add667c706f993b587Steve Block //fprintf(f, " ALOGE(\"add command %s\\n\");\n", api->name); 2815fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams if (hasInlineDataPointers(api)) { 282b693112b7513227b06d4a0a4e712ad3ce01451b4Jason Sams fprintf(f, " RS_CMD_%s *cmd = NULL;\n", api->name); 283bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams fprintf(f, " if (dataSize < io->getMaxInlineSize()) {;\n"); 2841a4efa363916977ef9aeab756725b3bdc880a15bJason Sams fprintf(f, " cmd = static_cast<RS_CMD_%s *>(io->coreHeader(RS_CMD_ID_%s, dataSize + size));\n", api->name, api->name); 285b693112b7513227b06d4a0a4e712ad3ce01451b4Jason Sams fprintf(f, " } else {\n"); 2861a4efa363916977ef9aeab756725b3bdc880a15bJason Sams fprintf(f, " cmd = static_cast<RS_CMD_%s *>(io->coreHeader(RS_CMD_ID_%s, size));\n", api->name, api->name); 287b693112b7513227b06d4a0a4e712ad3ce01451b4Jason Sams fprintf(f, " }\n"); 2885fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams fprintf(f, " uint8_t *payload = (uint8_t *)&cmd[1];\n"); 2896e58aef90ec70adf4e7d6d18b869aed143a2ec02Jason Sams } else { 2901a4efa363916977ef9aeab756725b3bdc880a15bJason 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); 2915fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams } 2929397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams 293afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk for (ct2=0; ct2 < api->paramCount; ct2++) { 2949397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams const VarType *vt = &api->params[ct2]; 2959397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams needFlush += vt->ptrLevel; 2965fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams if (vt->ptrLevel && hasInlineDataPointers(api)) { 297bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams fprintf(f, " if (dataSize < io->getMaxInlineSize()) {\n"); 2985fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams fprintf(f, " memcpy(payload, %s, %s_length);\n", vt->name, vt->name); 2995fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams fprintf(f, " cmd->%s = (", vt->name); 3005fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams printVarType(f, vt); 3015f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams fprintf(f, ")(payload - ((uint8_t *)&cmd[1]));\n"); 3025fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams fprintf(f, " payload += %s_length;\n", vt->name); 3035fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams fprintf(f, " } else {\n"); 3045fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams fprintf(f, " cmd->%s = %s;\n", vt->name, vt->name); 3055fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams fprintf(f, " }\n"); 3065fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams 3075fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams } else { 3085fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams fprintf(f, " cmd->%s = %s;\n", vt->name, vt->name); 3095fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams } 3109397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams } 3111a4efa363916977ef9aeab756725b3bdc880a15bJason Sams if (api->ret.typeName[0] || api->sync) { 3129397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams needFlush = 1; 3139397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams } 3149397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams 3155f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams fprintf(f, " io->coreCommit();\n"); 3165fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams if (hasInlineDataPointers(api)) { 317bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams fprintf(f, " if (dataSize >= io->getMaxInlineSize()) {\n"); 3185f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams fprintf(f, " io->coreGetReturn(NULL, 0);\n"); 3195fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams fprintf(f, " }\n"); 3205f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams } else if (api->ret.typeName[0]) { 3211a4efa363916977ef9aeab756725b3bdc880a15bJason Sams fprintf(f, "\n "); 3222008747941749ad27fe80663d23036ac320e998fJason Sams printVarType(f, &api->ret); 3231a4efa363916977ef9aeab756725b3bdc880a15bJason Sams fprintf(f, " ret;\n"); 3241a4efa363916977ef9aeab756725b3bdc880a15bJason Sams fprintf(f, " io->coreGetReturn(&ret, sizeof(ret));\n"); 3251a4efa363916977ef9aeab756725b3bdc880a15bJason Sams fprintf(f, " return ret;\n"); 3265f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams } else if (needFlush) { 3275f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams fprintf(f, " io->coreGetReturn(NULL, 0);\n"); 3289397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams } 329326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 330326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, "};\n\n"); 3312008747941749ad27fe80663d23036ac320e998fJason Sams 3322008747941749ad27fe80663d23036ac320e998fJason Sams 333bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams // Generate a remote sender function 334bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams const char * str = "core"; 335bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams if (api->direct) { 336bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams str = "async"; 337bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams } 338bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams 3392008747941749ad27fe80663d23036ac320e998fJason Sams fprintf(f, "static "); 3402008747941749ad27fe80663d23036ac320e998fJason Sams printFuncDecl(f, api, "RF_", 0, 0); 3412008747941749ad27fe80663d23036ac320e998fJason Sams fprintf(f, "\n{\n"); 342bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams fprintf(f, " ThreadIO *io = &((Context *)rsc)->mIO;\n"); 3432008747941749ad27fe80663d23036ac320e998fJason Sams fprintf(f, " const uint32_t cmdID = RS_CMD_ID_%s;\n", api->name); 344bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams fprintf(f, " io->%sWrite(&cmdID, sizeof(cmdID));\n\n", str); 345bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams 3461a4efa363916977ef9aeab756725b3bdc880a15bJason Sams for (ct2=0; ct2 < api->paramCount; ct2++) { 3471a4efa363916977ef9aeab756725b3bdc880a15bJason Sams const VarType *vt = &api->params[ct2]; 348bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams if (vt->ptrLevel == 0) { 349bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams fprintf(f, " io->%sWrite(& %s, sizeof(%s));\n", str, vt->name, vt->name); 3502008747941749ad27fe80663d23036ac320e998fJason Sams } 3511a4efa363916977ef9aeab756725b3bdc880a15bJason Sams } 3521a4efa363916977ef9aeab756725b3bdc880a15bJason Sams fprintf(f, "\n"); 3532008747941749ad27fe80663d23036ac320e998fJason Sams 3541a4efa363916977ef9aeab756725b3bdc880a15bJason Sams for (ct2=0; ct2 < api->paramCount; ct2++) { 3551a4efa363916977ef9aeab756725b3bdc880a15bJason Sams const VarType *vt = &api->params[ct2]; 356bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams if ((vt->ptrLevel == 1) && (vt->isConst)) { 357bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams fprintf(f, " io->%sWrite(%s, %s_length);\n", str, vt->name, vt->name); 358bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams } 359bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams } 360bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams fprintf(f, "\n"); 361bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams 362bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams for (ct2=0; ct2 < api->paramCount; ct2++) { 363bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams const VarType *vt = &api->params[ct2]; 364bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams if ((vt->ptrLevel == 2) && (vt->isConst)) { 3651a4efa363916977ef9aeab756725b3bdc880a15bJason Sams fprintf(f, " for (size_t ct = 0; ct < (%s_length_length / sizeof(%s_length)); ct++) {\n", vt->name, vt->name); 366bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams fprintf(f, " io->%sWrite(%s[ct], %s_length[ct]);\n", str, vt->name, vt->name); 3671a4efa363916977ef9aeab756725b3bdc880a15bJason Sams fprintf(f, " }\n"); 3682008747941749ad27fe80663d23036ac320e998fJason Sams } 3691a4efa363916977ef9aeab756725b3bdc880a15bJason Sams } 3701a4efa363916977ef9aeab756725b3bdc880a15bJason Sams fprintf(f, "\n"); 3712008747941749ad27fe80663d23036ac320e998fJason Sams 3721a4efa363916977ef9aeab756725b3bdc880a15bJason Sams for (ct2=0; ct2 < api->paramCount; ct2++) { 3731a4efa363916977ef9aeab756725b3bdc880a15bJason Sams const VarType *vt = &api->params[ct2]; 374bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams if ((vt->ptrLevel == 1) && (!vt->isConst)) { 375bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams fprintf(f, " io->%sGetReturn(%s, %s_length);\n", str, vt->name, vt->name); 3761a4efa363916977ef9aeab756725b3bdc880a15bJason Sams } 377bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams } 378bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams fprintf(f, "\n"); 379bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams 380bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams for (ct2=0; ct2 < api->paramCount; ct2++) { 381bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams const VarType *vt = &api->params[ct2]; 382bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams if ((vt->ptrLevel == 2) && (!vt->isConst)) { 3831a4efa363916977ef9aeab756725b3bdc880a15bJason Sams fprintf(f, " for (size_t ct = 0; ct < (%s_length_length / sizeof(%s_length)); ct++) {\n", vt->name, vt->name); 384bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams fprintf(f, " io->%sGetReturn(%s[ct], %s_length[ct]);\n", str, vt->name, vt->name); 3851a4efa363916977ef9aeab756725b3bdc880a15bJason Sams fprintf(f, " }\n"); 3862008747941749ad27fe80663d23036ac320e998fJason Sams } 3872008747941749ad27fe80663d23036ac320e998fJason Sams } 388bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams fprintf(f, "\n"); 3891a4efa363916977ef9aeab756725b3bdc880a15bJason Sams 3901a4efa363916977ef9aeab756725b3bdc880a15bJason Sams if (api->ret.typeName[0]) { 3911a4efa363916977ef9aeab756725b3bdc880a15bJason Sams fprintf(f, " "); 3921a4efa363916977ef9aeab756725b3bdc880a15bJason Sams printVarType(f, &api->ret); 3931a4efa363916977ef9aeab756725b3bdc880a15bJason Sams fprintf(f, " retValue;\n"); 394bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams fprintf(f, " io->%sGetReturn(&retValue, sizeof(retValue));\n", str); 3951a4efa363916977ef9aeab756725b3bdc880a15bJason Sams fprintf(f, " return retValue;\n"); 396bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams } else /*if (api->sync)*/ { 397bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams fprintf(f, " io->%sGetReturn(NULL, 0);\n", str); 3981a4efa363916977ef9aeab756725b3bdc880a15bJason Sams } 3992008747941749ad27fe80663d23036ac320e998fJason Sams fprintf(f, "}\n\n"); 400326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 401c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams 402c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams fprintf(f, "\n"); 403c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams fprintf(f, "static RsApiEntrypoints_t s_LocalTable = {\n"); 404c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams for (ct=0; ct < apiCount; ct++) { 405c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams fprintf(f, " LF_%s,\n", apis[ct].name); 406c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams } 407c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams fprintf(f, "};\n"); 408c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams 4092008747941749ad27fe80663d23036ac320e998fJason Sams fprintf(f, "\n"); 4102008747941749ad27fe80663d23036ac320e998fJason Sams fprintf(f, "static RsApiEntrypoints_t s_RemoteTable = {\n"); 4112008747941749ad27fe80663d23036ac320e998fJason Sams for (ct=0; ct < apiCount; ct++) { 4122008747941749ad27fe80663d23036ac320e998fJason Sams fprintf(f, " RF_%s,\n", apis[ct].name); 4132008747941749ad27fe80663d23036ac320e998fJason Sams } 4142008747941749ad27fe80663d23036ac320e998fJason Sams fprintf(f, "};\n"); 415c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams 4162008747941749ad27fe80663d23036ac320e998fJason Sams fprintf(f, "static RsApiEntrypoints_t *s_CurrentTable = &s_LocalTable;\n\n"); 417c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams for (ct=0; ct < apiCount; ct++) { 418c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams int needFlush = 0; 419c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams const ApiEntry * api = &apis[ct]; 420c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams 421f6023e494e67bc9deaa8b96008180104cbf540c7Tim Murray fprintf(f, "extern \"C\" "); 422f6023e494e67bc9deaa8b96008180104cbf540c7Tim Murray 423c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams printFuncDecl(f, api, "rs", 0, 0); 424c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams fprintf(f, "\n{\n"); 425c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams fprintf(f, " "); 426c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams if (api->ret.typeName[0]) { 427c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams fprintf(f, "return "); 428c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams } 429c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams fprintf(f, "s_CurrentTable->%s(", api->name); 430c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams 431c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams if (!api->nocontext) { 432c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams fprintf(f, "(Context *)rsc"); 433c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams } 434c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams 435c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams for (ct2=0; ct2 < api->paramCount; ct2++) { 436c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams const VarType *vt = &api->params[ct2]; 437c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams if (ct2 > 0 || !api->nocontext) { 438c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams fprintf(f, ", "); 439c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams } 440c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams fprintf(f, "%s", vt->name); 441c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams } 442c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams fprintf(f, ");\n"); 443c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams fprintf(f, "}\n\n"); 444c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams } 445c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams 446326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 447326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 448afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid printPlaybackCpp(FILE *f) { 449326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams int ct; 450326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams int ct2; 451326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 452326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, "#include \"rsDevice.h\"\n"); 453326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, "#include \"rsContext.h\"\n"); 454326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, "#include \"rsThreadIO.h\"\n"); 4554edf030cbb7c6ac08dc563335c2af73c20f6e2e5Alex Sakhartchouk fprintf(f, "#include \"rsgApiStructs.h\"\n"); 456326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, "#include \"rsgApiFuncDecl.h\"\n"); 457326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, "\n"); 458326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, "namespace android {\n"); 459326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, "namespace renderscript {\n"); 460326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, "\n"); 461326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 462afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk for (ct=0; ct < apiCount; ct++) { 463326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams const ApiEntry * api = &apis[ct]; 4645f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams int needFlush = 0; 465326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 466186e59154a0fb86e05e283e9c083b69878c06720Jason Sams if (api->direct) { 467186e59154a0fb86e05e283e9c083b69878c06720Jason Sams continue; 468186e59154a0fb86e05e283e9c083b69878c06720Jason Sams } 469186e59154a0fb86e05e283e9c083b69878c06720Jason Sams 4702008747941749ad27fe80663d23036ac320e998fJason Sams fprintf(f, "void rsp_%s(Context *con, const void *vp, size_t cmdSizeBytes) {\n", api->name); 471186e59154a0fb86e05e283e9c083b69878c06720Jason Sams fprintf(f, " const RS_CMD_%s *cmd = static_cast<const RS_CMD_%s *>(vp);\n", api->name, api->name); 4725fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams 4735f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams if (hasInlineDataPointers(api)) { 4745f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams fprintf(f, " const uint8_t *baseData = 0;\n"); 4755f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams fprintf(f, " if (cmdSizeBytes != sizeof(RS_CMD_%s)) {\n", api->name); 4765f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams fprintf(f, " baseData = &((const uint8_t *)vp)[sizeof(*cmd)];\n"); 4775f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams fprintf(f, " }\n"); 4785f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams } 4795f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams 480186e59154a0fb86e05e283e9c083b69878c06720Jason Sams fprintf(f, " "); 481186e59154a0fb86e05e283e9c083b69878c06720Jason Sams if (api->ret.typeName[0]) { 4821a4efa363916977ef9aeab756725b3bdc880a15bJason Sams fprintf(f, "\n "); 4831a4efa363916977ef9aeab756725b3bdc880a15bJason Sams printVarType(f, &api->ret); 4841a4efa363916977ef9aeab756725b3bdc880a15bJason Sams fprintf(f, " ret = "); 485326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 486186e59154a0fb86e05e283e9c083b69878c06720Jason Sams fprintf(f, "rsi_%s(con", api->name); 487186e59154a0fb86e05e283e9c083b69878c06720Jason Sams for (ct2=0; ct2 < api->paramCount; ct2++) { 488186e59154a0fb86e05e283e9c083b69878c06720Jason Sams const VarType *vt = &api->params[ct2]; 4895f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams needFlush += vt->ptrLevel; 4905f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams 4915f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams if (hasInlineDataPointers(api) && vt->ptrLevel) { 4925f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams fprintf(f, ",\n (const %s *)&baseData[(intptr_t)cmd->%s]", vt->typeName, vt->name); 4935f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams } else { 4945f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams fprintf(f, ",\n cmd->%s", vt->name); 4955f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams } 496186e59154a0fb86e05e283e9c083b69878c06720Jason Sams } 497186e59154a0fb86e05e283e9c083b69878c06720Jason Sams fprintf(f, ");\n"); 498186e59154a0fb86e05e283e9c083b69878c06720Jason Sams 4995f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams if (hasInlineDataPointers(api)) { 500ee5cf0067c374e1c7e9a0736e24e55f4d19a0721Jason Sams fprintf(f, " size_t totalSize = 0;\n"); 501ee5cf0067c374e1c7e9a0736e24e55f4d19a0721Jason Sams for (ct2=0; ct2 < api->paramCount; ct2++) { 502ee5cf0067c374e1c7e9a0736e24e55f4d19a0721Jason Sams if (api->params[ct2].ptrLevel) { 503ee5cf0067c374e1c7e9a0736e24e55f4d19a0721Jason Sams fprintf(f, " totalSize += cmd->%s_length;\n", api->params[ct2].name); 504ee5cf0067c374e1c7e9a0736e24e55f4d19a0721Jason Sams } 505ee5cf0067c374e1c7e9a0736e24e55f4d19a0721Jason Sams } 506ee5cf0067c374e1c7e9a0736e24e55f4d19a0721Jason Sams 507ee5cf0067c374e1c7e9a0736e24e55f4d19a0721Jason Sams fprintf(f, " if ((totalSize != 0) && (cmdSizeBytes == sizeof(RS_CMD_%s))) {\n", api->name); 5085f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams fprintf(f, " con->mIO.coreSetReturn(NULL, 0);\n"); 5095f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams fprintf(f, " }\n"); 5105f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams } else if (api->ret.typeName[0]) { 5111a4efa363916977ef9aeab756725b3bdc880a15bJason Sams fprintf(f, " con->mIO.coreSetReturn(&ret, sizeof(ret));\n"); 5125f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams } else if (api->sync || needFlush) { 5135f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams fprintf(f, " con->mIO.coreSetReturn(NULL, 0);\n"); 5141a4efa363916977ef9aeab756725b3bdc880a15bJason Sams } 5151a4efa363916977ef9aeab756725b3bdc880a15bJason Sams 516326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, "};\n\n"); 517326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 518326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 5192008747941749ad27fe80663d23036ac320e998fJason Sams for (ct=0; ct < apiCount; ct++) { 5202008747941749ad27fe80663d23036ac320e998fJason Sams const ApiEntry * api = &apis[ct]; 5215f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams int needFlush = 0; 5222008747941749ad27fe80663d23036ac320e998fJason Sams 523bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams fprintf(f, "void rspr_%s(Context *con, ThreadIO *io) {\n", api->name); 5242008747941749ad27fe80663d23036ac320e998fJason Sams fprintf(f, " RS_CMD_%s cmd;\n", api->name); 5252008747941749ad27fe80663d23036ac320e998fJason Sams 5262008747941749ad27fe80663d23036ac320e998fJason Sams for (ct2=0; ct2 < api->paramCount; ct2++) { 5272008747941749ad27fe80663d23036ac320e998fJason Sams const VarType *vt = &api->params[ct2]; 528bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams if (vt->ptrLevel == 0) { 529bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams fprintf(f, " io->coreRead(&cmd.%s, sizeof(cmd.%s));\n", vt->name, vt->name); 530bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams } 531bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams } 532bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams fprintf(f, "\n"); 533bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams 534bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams for (ct2=0; ct2 < api->paramCount; ct2++) { 535bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams const VarType *vt = &api->params[ct2]; 5362008747941749ad27fe80663d23036ac320e998fJason Sams if (vt->ptrLevel == 1) { 5372008747941749ad27fe80663d23036ac320e998fJason Sams fprintf(f, " cmd.%s = (", vt->name); 5382008747941749ad27fe80663d23036ac320e998fJason Sams printVarType(f, vt); 539bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams fprintf(f, ")malloc(cmd.%s_length);\n", vt->name); 540bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams 541bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams if (vt->isConst) { 542bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams fprintf(f, " if (cmd.%s_length) io->coreRead((void *)cmd.%s, cmd.%s_length);\n", vt->name, vt->name, vt->name); 543bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams } 5442008747941749ad27fe80663d23036ac320e998fJason Sams } 545bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams } 546bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams fprintf(f, "\n"); 547bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams 548bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams for (ct2=0; ct2 < api->paramCount; ct2++) { 549bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams const VarType *vt = &api->params[ct2]; 5502008747941749ad27fe80663d23036ac320e998fJason Sams if (vt->ptrLevel == 2) { 5512008747941749ad27fe80663d23036ac320e998fJason Sams fprintf(f, " for (size_t ct = 0; ct < (cmd.%s_length_length / sizeof(cmd.%s_length)); ct++) {\n", vt->name, vt->name); 552bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams fprintf(f, " cmd.%s = (", vt->name); 553bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams printVarType(f, vt); 554bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams fprintf(f, ")malloc(cmd.%s_length[ct]);\n", vt->name); 555bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams fprintf(f, " io->coreRead(& cmd.%s, cmd.%s_length[ct]);\n", vt->name, vt->name); 5562008747941749ad27fe80663d23036ac320e998fJason Sams fprintf(f, " }\n"); 5572008747941749ad27fe80663d23036ac320e998fJason Sams } 5582008747941749ad27fe80663d23036ac320e998fJason Sams } 5592008747941749ad27fe80663d23036ac320e998fJason Sams fprintf(f, "\n"); 5602008747941749ad27fe80663d23036ac320e998fJason Sams 5612008747941749ad27fe80663d23036ac320e998fJason Sams if (api->ret.typeName[0]) { 5622008747941749ad27fe80663d23036ac320e998fJason Sams fprintf(f, " "); 5632008747941749ad27fe80663d23036ac320e998fJason Sams printVarType(f, &api->ret); 5642008747941749ad27fe80663d23036ac320e998fJason Sams fprintf(f, " ret =\n"); 5652008747941749ad27fe80663d23036ac320e998fJason Sams } 5662008747941749ad27fe80663d23036ac320e998fJason Sams 5672008747941749ad27fe80663d23036ac320e998fJason Sams fprintf(f, " rsi_%s(", api->name); 5682008747941749ad27fe80663d23036ac320e998fJason Sams if (!api->nocontext) { 5692008747941749ad27fe80663d23036ac320e998fJason Sams fprintf(f, "con"); 5702008747941749ad27fe80663d23036ac320e998fJason Sams } 5712008747941749ad27fe80663d23036ac320e998fJason Sams for (ct2=0; ct2 < api->paramCount; ct2++) { 5722008747941749ad27fe80663d23036ac320e998fJason Sams const VarType *vt = &api->params[ct2]; 5732008747941749ad27fe80663d23036ac320e998fJason Sams if (ct2 > 0 || !api->nocontext) { 5742008747941749ad27fe80663d23036ac320e998fJason Sams fprintf(f, ",\n"); 5752008747941749ad27fe80663d23036ac320e998fJason Sams } 5762008747941749ad27fe80663d23036ac320e998fJason Sams fprintf(f, " cmd.%s", vt->name); 5772008747941749ad27fe80663d23036ac320e998fJason Sams } 5782008747941749ad27fe80663d23036ac320e998fJason Sams fprintf(f, ");\n"); 5792008747941749ad27fe80663d23036ac320e998fJason Sams 580bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams for (ct2=0; ct2 < api->paramCount; ct2++) { 581bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams const VarType *vt = &api->params[ct2]; 582bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams if ((vt->ptrLevel == 1) && (!vt->isConst)) { 583bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams fprintf(f, " io->coreSetReturn((void *)cmd.%s, cmd.%s_length);\n", vt->name, vt->name); 584bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams } 585bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams } 586bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams 587bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams for (ct2=0; ct2 < api->paramCount; ct2++) { 588bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams const VarType *vt = &api->params[ct2]; 589bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams if ((vt->ptrLevel == 2) && (!vt->isConst)) { 590bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams fprintf(f, " for (size_t ct = 0; ct < (cmd.%s_length_length / sizeof(cmd.%s_length)); ct++) {\n", vt->name, vt->name); 591bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams fprintf(f, " io->coreSetReturn((void *)cmd.%s[ct], cmd.%s_length[ct]);\n", vt->name, vt->name); 592bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams fprintf(f, " }\n"); 593bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams } 594bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams } 595bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams fprintf(f, "\n"); 596bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams 5972008747941749ad27fe80663d23036ac320e998fJason Sams if (api->ret.typeName[0]) { 598bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams fprintf(f, " io->coreSetReturn(&ret, sizeof(ret));\n"); 599bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams } else /*if (needFlush)*/ { 600bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams fprintf(f, " io->coreSetReturn(NULL, 0);\n"); 601bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams } 602bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams 603bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams for (ct2=0; ct2 < api->paramCount; ct2++) { 604bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams const VarType *vt = &api->params[ct2]; 605bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams if (vt->ptrLevel == 1) { 606bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams fprintf(f, " free((void *)cmd.%s);\n", vt->name); 607bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams } 608bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams } 609bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams for (ct2=0; ct2 < api->paramCount; ct2++) { 610bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams const VarType *vt = &api->params[ct2]; 611bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams if (vt->ptrLevel == 2) { 612bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams fprintf(f, " for (size_t ct = 0; ct < (cmd.%s_length_length / sizeof(cmd.%s_length)); ct++) {\n", vt->name, vt->name); 613bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams fprintf(f, " free((void *)cmd.%s);\n", vt->name); 614bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams fprintf(f, " }\n"); 615bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams } 6162008747941749ad27fe80663d23036ac320e998fJason Sams } 6172008747941749ad27fe80663d23036ac320e998fJason Sams 6182008747941749ad27fe80663d23036ac320e998fJason Sams fprintf(f, "};\n\n"); 6192008747941749ad27fe80663d23036ac320e998fJason Sams } 6202008747941749ad27fe80663d23036ac320e998fJason Sams 6212008747941749ad27fe80663d23036ac320e998fJason Sams fprintf(f, "RsPlaybackLocalFunc gPlaybackFuncs[%i] = {\n", apiCount + 1); 622326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, " NULL,\n"); 623afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk for (ct=0; ct < apiCount; ct++) { 624186e59154a0fb86e05e283e9c083b69878c06720Jason Sams if (apis[ct].direct) { 625186e59154a0fb86e05e283e9c083b69878c06720Jason Sams fprintf(f, " NULL,\n"); 626186e59154a0fb86e05e283e9c083b69878c06720Jason Sams } else { 627186e59154a0fb86e05e283e9c083b69878c06720Jason Sams fprintf(f, " %s%s,\n", "rsp_", apis[ct].name); 628186e59154a0fb86e05e283e9c083b69878c06720Jason Sams } 629326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 630326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, "};\n"); 631326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 6322008747941749ad27fe80663d23036ac320e998fJason Sams fprintf(f, "RsPlaybackRemoteFunc gPlaybackRemoteFuncs[%i] = {\n", apiCount + 1); 6332008747941749ad27fe80663d23036ac320e998fJason Sams fprintf(f, " NULL,\n"); 6342008747941749ad27fe80663d23036ac320e998fJason Sams for (ct=0; ct < apiCount; ct++) { 6352008747941749ad27fe80663d23036ac320e998fJason Sams fprintf(f, " %s%s,\n", "rspr_", apis[ct].name); 6362008747941749ad27fe80663d23036ac320e998fJason Sams } 6372008747941749ad27fe80663d23036ac320e998fJason Sams fprintf(f, "};\n"); 6382008747941749ad27fe80663d23036ac320e998fJason Sams 639326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, "};\n"); 640326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, "};\n"); 641326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 642326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 6435fb1aeb6374f814d72117803682bc141cc6b0895Jason Samsvoid yylex(); 6445fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams 645afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukint main(int argc, char **argv) { 646326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams if (argc != 3) { 647326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(stderr, "usage: %s commandFile outFile\n", argv[0]); 648326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams return 1; 649326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 650326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams const char* rsgFile = argv[1]; 651326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams const char* outFile = argv[2]; 652326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams FILE* input = fopen(rsgFile, "r"); 653326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 654326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams char choice = fgetc(input); 655326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fclose(input); 656326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 657326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams if (choice < '0' || choice > '3') { 658326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(stderr, "Uknown command: \'%c\'\n", choice); 659326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams return -2; 660326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 661326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 662326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams yylex(); 663326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams // printf("# of lines = %d\n", num_lines); 664326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 665326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams FILE *f = fopen(outFile, "w"); 666326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 667326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams printFileHeader(f); 668afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk switch (choice) { 669326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams case '0': // rsgApiStructs.h 670326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams { 671326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, "\n"); 672326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, "#include \"rsContext.h\"\n"); 6732008747941749ad27fe80663d23036ac320e998fJason Sams fprintf(f, "#include \"rsFifo.h\"\n"); 674326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, "\n"); 675326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, "namespace android {\n"); 676326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, "namespace renderscript {\n"); 677326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams printStructures(f); 678f6023e494e67bc9deaa8b96008180104cbf540c7Tim Murray printFuncDecls(f, "rsi_", 1, 0); 679326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams printPlaybackFuncs(f, "rsp_"); 6802008747941749ad27fe80663d23036ac320e998fJason Sams fprintf(f, "\n\ntypedef struct RsPlaybackRemoteHeaderRec {\n"); 6812008747941749ad27fe80663d23036ac320e998fJason Sams fprintf(f, " uint32_t command;\n"); 682099bc262f862cdeb547cf8a78fe9e0e92560f437Tim Murray fprintf(f, " size_t size;\n"); 6832008747941749ad27fe80663d23036ac320e998fJason Sams fprintf(f, "} RsPlaybackRemoteHeader;\n\n"); 6842008747941749ad27fe80663d23036ac320e998fJason Sams fprintf(f, "typedef void (*RsPlaybackLocalFunc)(Context *, const void *, size_t sizeBytes);\n"); 685bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams fprintf(f, "typedef void (*RsPlaybackRemoteFunc)(Context *, ThreadIO *);\n"); 6862008747941749ad27fe80663d23036ac320e998fJason Sams fprintf(f, "extern RsPlaybackLocalFunc gPlaybackFuncs[%i];\n", apiCount + 1); 6872008747941749ad27fe80663d23036ac320e998fJason Sams fprintf(f, "extern RsPlaybackRemoteFunc gPlaybackRemoteFuncs[%i];\n", apiCount + 1); 688326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 689326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, "}\n"); 690326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, "}\n"); 691326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 692326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams break; 693326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 694326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams case '1': // rsgApiFuncDecl.h 695326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams { 696f6023e494e67bc9deaa8b96008180104cbf540c7Tim Murray printFuncDecls(f, "rs", 0, 1); 697326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 698326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams break; 699326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 700326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams case '2': // rsgApi.cpp 701326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams { 702326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams printApiCpp(f); 703326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 704326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams break; 705326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 706326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams case '3': // rsgApiReplay.cpp 707326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams { 708326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams printFileHeader(f); 709326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams printPlaybackCpp(f); 710326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 711326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams break; 712326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 713326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fclose(f); 714326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams return 0; 715326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 716