184614dd02411e1cf9a4c37aa421898c471cfad20Joe Onorato#include "spec.h" 284614dd02411e1cf9a4c37aa421898c471cfad20Joe Onorato#include <stdio.h> 3da3b58d804b59595f1c618ff271fecd8a9ce59edShih-wei Liao#include <string.h> 4326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 5b74514df6be14fd898ddd7906bc70408dc3bb63cMatt Wala#define LOCAL_FIFO_PREFIX "LF_" 6b74514df6be14fd898ddd7906bc70408dc3bb63cMatt Wala#define RS_PLAYBACK_PREFIX "rsp_" 7b74514df6be14fd898ddd7906bc70408dc3bb63cMatt Wala#define RS_INTERNAL_PREFIX "rsi_" 8b74514df6be14fd898ddd7906bc70408dc3bb63cMatt Wala 9b74514df6be14fd898ddd7906bc70408dc3bb63cMatt Wala#define RSG_API_CPP_DOC \ 10b74514df6be14fd898ddd7906bc70408dc3bb63cMatt Wala"/*\n" \ 11b74514df6be14fd898ddd7906bc70408dc3bb63cMatt Wala" * rsgApi.cpp\n" \ 12b74514df6be14fd898ddd7906bc70408dc3bb63cMatt Wala" * This file implements the functions responsible for sending messages\n" \ 13b74514df6be14fd898ddd7906bc70408dc3bb63cMatt Wala" * to the RS driver layer. The messages are sent through a FIFO that is\n" \ 14b74514df6be14fd898ddd7906bc70408dc3bb63cMatt Wala" * shared between the process's caller threads and driver thread.\n" \ 15b74514df6be14fd898ddd7906bc70408dc3bb63cMatt Wala" */\n\n" 16b74514df6be14fd898ddd7906bc70408dc3bb63cMatt Wala 17b74514df6be14fd898ddd7906bc70408dc3bb63cMatt Wala#define RSG_API_REPLAY_CPP_DOC \ 18b74514df6be14fd898ddd7906bc70408dc3bb63cMatt Wala"/*\n" \ 19b74514df6be14fd898ddd7906bc70408dc3bb63cMatt Wala" * rsgApiReplay.cpp\n" \ 20b74514df6be14fd898ddd7906bc70408dc3bb63cMatt Wala" * This file implements the functions responsible for reading messages\n" \ 21b74514df6be14fd898ddd7906bc70408dc3bb63cMatt Wala" * sent to the RS driver layer.\n" \ 22b74514df6be14fd898ddd7906bc70408dc3bb63cMatt Wala" */\n\n" 23b74514df6be14fd898ddd7906bc70408dc3bb63cMatt Wala 24afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid printFileHeader(FILE *f) { 25326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, "/*\n"); 26b74514df6be14fd898ddd7906bc70408dc3bb63cMatt Wala fprintf(f, " * Copyright (C) 2015 The Android Open Source Project\n"); 27326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, " *\n"); 28326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, " * Licensed under the Apache License, Version 2.0 (the \"License\");\n"); 29326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, " * you may not use this file except in compliance with the License.\n"); 30326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, " * You may obtain a copy of the License at\n"); 31326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, " *\n"); 32326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, " * http://www.apache.org/licenses/LICENSE-2.0\n"); 33326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, " *\n"); 34326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, " * Unless required by applicable law or agreed to in writing, software\n"); 35326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, " * distributed under the License is distributed on an \"AS IS\" BASIS,\n"); 36326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, " * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n"); 37326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, " * See the License for the specific language governing permissions and\n"); 38326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, " * limitations under the License.\n"); 39326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, " */\n\n"); 40326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 41326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 42afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid printVarType(FILE *f, const VarType *vt) { 43326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams int ct; 44326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams if (vt->isConst) { 45326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, "const "); 46326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 47326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 48afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk switch (vt->type) { 49326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams case 0: 50326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, "void"); 51326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams break; 52326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams case 1: 53326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, "int%i_t", vt->bits); 54326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams break; 55326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams case 2: 56326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, "uint%i_t", vt->bits); 57326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams break; 58326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams case 3: 59326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams if (vt->bits == 32) 60326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, "float"); 61326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams else 62326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, "double"); 63326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams break; 64326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams case 4: 6584614dd02411e1cf9a4c37aa421898c471cfad20Joe Onorato fprintf(f, "%s", vt->typeName); 66326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams break; 67326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 68326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 69afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (vt->ptrLevel) { 70326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, " "); 71afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk for (ct=0; ct < vt->ptrLevel; ct++) { 72326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, "*"); 73326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 74326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 755fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams} 765fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams 775fb1aeb6374f814d72117803682bc141cc6b0895Jason Samsvoid printVarTypeAndName(FILE *f, const VarType *vt) { 785fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams printVarType(f, vt); 79326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 80afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (vt->name[0]) { 81326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, " %s", vt->name); 82326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 83326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 84326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 85afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid printArgList(FILE *f, const ApiEntry * api, int assumePrevious) { 86326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams int ct; 87afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk for (ct=0; ct < api->paramCount; ct++) { 88326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams if (ct || assumePrevious) { 89326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, ", "); 90326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 915fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams printVarTypeAndName(f, &api->params[ct]); 92326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 93326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 94326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 95afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid printStructures(FILE *f) { 96326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams int ct; 97326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams int ct2; 98326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 99afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk for (ct=0; ct < apiCount; ct++) { 100326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, "typedef struct RS_CMD_%s_rec RS_CMD_%s;\n", apis[ct].name, apis[ct].name); 101326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 102326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, "\n"); 103326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 104afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk for (ct=0; ct < apiCount; ct++) { 105326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams const ApiEntry * api = &apis[ct]; 106326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, "#define RS_CMD_ID_%s %i\n", api->name, ct+1); 107f047575af292b9d2f56a266250de7feb9987de18Stephen Hines fprintf(f, "struct __attribute__((packed)) RS_CMD_%s_rec {\n", api->name); 108326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams //fprintf(f, " RsCommandHeader _hdr;\n"); 109326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 110afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk for (ct2=0; ct2 < api->paramCount; ct2++) { 111326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, " "); 1125fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams printVarTypeAndName(f, &api->params[ct2]); 113326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, ";\n"); 114326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 115326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, "};\n\n"); 116326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 117326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 118326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 119c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Samsvoid printFuncDecl(FILE *f, const ApiEntry *api, const char *prefix, int addContext, int isFnPtr) { 1205fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams printVarTypeAndName(f, &api->ret); 121c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams if (isFnPtr) { 122c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams char t[1024]; 123c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams strcpy(t, api->name); 124c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams if (strlen(prefix) == 0) { 125c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams if (t[0] > 'A' && t[0] < 'Z') { 126c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams t[0] -= 'A' - 'a'; 127c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams } 128c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams } 129c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams fprintf(f, " (* %s%s) (", prefix, api->name); 130c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams } else { 131c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams fprintf(f, " %s%s (", prefix, api->name); 132c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams } 133186e59154a0fb86e05e283e9c083b69878c06720Jason Sams if (!api->nocontext) { 134186e59154a0fb86e05e283e9c083b69878c06720Jason Sams if (addContext) { 135186e59154a0fb86e05e283e9c083b69878c06720Jason Sams fprintf(f, "Context *"); 136186e59154a0fb86e05e283e9c083b69878c06720Jason Sams } else { 137186e59154a0fb86e05e283e9c083b69878c06720Jason Sams fprintf(f, "RsContext rsc"); 138186e59154a0fb86e05e283e9c083b69878c06720Jason Sams } 139326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 140186e59154a0fb86e05e283e9c083b69878c06720Jason Sams printArgList(f, api, !api->nocontext); 141326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, ")"); 142326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 143326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 144f6023e494e67bc9deaa8b96008180104cbf540c7Tim Murrayvoid printFuncDecls(FILE *f, const char *prefix, int addContext, int externC) { 145326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams int ct; 146afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk for (ct=0; ct < apiCount; ct++) { 147f6023e494e67bc9deaa8b96008180104cbf540c7Tim Murray if (externC) { 148f6023e494e67bc9deaa8b96008180104cbf540c7Tim Murray fprintf(f, "extern \"C\" "); 149f6023e494e67bc9deaa8b96008180104cbf540c7Tim Murray } 150c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams printFuncDecl(f, &apis[ct], prefix, addContext, 0); 151326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, ";\n"); 152326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 153326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, "\n\n"); 154326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 155326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 156afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid printPlaybackFuncs(FILE *f, const char *prefix) { 157326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams int ct; 158afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk for (ct=0; ct < apiCount; ct++) { 159186e59154a0fb86e05e283e9c083b69878c06720Jason Sams if (apis[ct].direct) { 160186e59154a0fb86e05e283e9c083b69878c06720Jason Sams continue; 161186e59154a0fb86e05e283e9c083b69878c06720Jason Sams } 162186e59154a0fb86e05e283e9c083b69878c06720Jason Sams 163326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, "void %s%s (Context *, const void *);\n", prefix, apis[ct].name); 164326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 165326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 166326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 1675fb1aeb6374f814d72117803682bc141cc6b0895Jason Samsstatic int hasInlineDataPointers(const ApiEntry * api) { 1685fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams int ret = 0; 1695fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams int ct; 170b693112b7513227b06d4a0a4e712ad3ce01451b4Jason Sams if (api->sync || api->ret.typeName[0]) { 1715fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams return 0; 1725fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams } 1735fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams for (ct=0; ct < api->paramCount; ct++) { 1745fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams const VarType *vt = &api->params[ct]; 1755fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams 1765fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams if (!vt->isConst && vt->ptrLevel) { 1775fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams // Non-const pointers cannot be inlined. 1785fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams return 0; 1795fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams } 1805fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams if (vt->ptrLevel > 1) { 1815fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams // not handled yet. 1825fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams return 0; 1835fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams } 1845fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams 1855fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams if (vt->isConst && vt->ptrLevel) { 1865fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams // Non-const pointers cannot be inlined. 1875fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams ret = 1; 1885fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams } 1895fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams } 1905fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams return ret; 1915fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams} 1925fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams 193afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid printApiCpp(FILE *f) { 194326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams int ct; 195326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams int ct2; 196326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 197b74514df6be14fd898ddd7906bc70408dc3bb63cMatt Wala fprintf(f, RSG_API_CPP_DOC); 198b74514df6be14fd898ddd7906bc70408dc3bb63cMatt Wala 199326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, "#include \"rsDevice.h\"\n"); 200326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, "#include \"rsContext.h\"\n"); 201326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, "#include \"rsThreadIO.h\"\n"); 2024edf030cbb7c6ac08dc563335c2af73c20f6e2e5Alex Sakhartchouk fprintf(f, "#include \"rsgApiStructs.h\"\n"); 203326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, "#include \"rsgApiFuncDecl.h\"\n"); 2042008747941749ad27fe80663d23036ac320e998fJason Sams fprintf(f, "#include \"rsFifo.h\"\n"); 205326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, "\n"); 206326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, "using namespace android;\n"); 207326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, "using namespace android::renderscript;\n"); 208326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, "\n"); 209326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 210b74514df6be14fd898ddd7906bc70408dc3bb63cMatt Wala // Generate RS funcs that send messages on the local FIFO. 211afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk for (ct=0; ct < apiCount; ct++) { 212326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams int needFlush = 0; 213326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams const ApiEntry * api = &apis[ct]; 214326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 215c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams fprintf(f, "static "); 216b74514df6be14fd898ddd7906bc70408dc3bb63cMatt Wala printFuncDecl(f, api, LOCAL_FIFO_PREFIX, 0, 0); 217326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, "\n{\n"); 2181a4efa363916977ef9aeab756725b3bdc880a15bJason Sams if (api->direct) { 2191a4efa363916977ef9aeab756725b3bdc880a15bJason Sams fprintf(f, " "); 2201a4efa363916977ef9aeab756725b3bdc880a15bJason Sams if (api->ret.typeName[0]) { 2211a4efa363916977ef9aeab756725b3bdc880a15bJason Sams fprintf(f, "return "); 2221a4efa363916977ef9aeab756725b3bdc880a15bJason Sams } 223b74514df6be14fd898ddd7906bc70408dc3bb63cMatt Wala fprintf(f, RS_INTERNAL_PREFIX "%s(", api->name); 2241a4efa363916977ef9aeab756725b3bdc880a15bJason Sams if (!api->nocontext) { 2251a4efa363916977ef9aeab756725b3bdc880a15bJason Sams fprintf(f, "(Context *)rsc"); 226c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams } 227afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk for (ct2=0; ct2 < api->paramCount; ct2++) { 2289397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams const VarType *vt = &api->params[ct2]; 229c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams if (ct2 > 0 || !api->nocontext) { 230c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams fprintf(f, ", "); 231c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams } 232c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams fprintf(f, "%s", vt->name); 2339397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams } 2349397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams fprintf(f, ");\n"); 235c2eca55c8b6de99130329a96b13498b700aa6344Tim Murray } else if (api->handcodeApi) { 236c2eca55c8b6de99130329a96b13498b700aa6344Tim Murray // handle handcode path 237b74514df6be14fd898ddd7906bc70408dc3bb63cMatt Wala fprintf(f, " " LOCAL_FIFO_PREFIX "%s_handcode(", api->name); 238c2eca55c8b6de99130329a96b13498b700aa6344Tim Murray if (!api->nocontext) { 239c2eca55c8b6de99130329a96b13498b700aa6344Tim Murray fprintf(f, "(Context *)rsc"); 240c2eca55c8b6de99130329a96b13498b700aa6344Tim Murray } 241c2eca55c8b6de99130329a96b13498b700aa6344Tim Murray for (ct2=0; ct2 < api->paramCount; ct2++) { 242c2eca55c8b6de99130329a96b13498b700aa6344Tim Murray const VarType *vt = &api->params[ct2]; 243c2eca55c8b6de99130329a96b13498b700aa6344Tim Murray if (ct2 > 0 || !api->nocontext) { 244c2eca55c8b6de99130329a96b13498b700aa6344Tim Murray fprintf(f, ", "); 245c2eca55c8b6de99130329a96b13498b700aa6344Tim Murray } 246c2eca55c8b6de99130329a96b13498b700aa6344Tim Murray fprintf(f, "%s", vt->name); 247c2eca55c8b6de99130329a96b13498b700aa6344Tim Murray } 248c2eca55c8b6de99130329a96b13498b700aa6344Tim Murray fprintf(f, ");\n"); 249c2eca55c8b6de99130329a96b13498b700aa6344Tim Murray 2509397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams } else { 2514d252d6e807b89764dad123ac845df298c52ca97Tim Murray // handle synchronous path 2524d252d6e807b89764dad123ac845df298c52ca97Tim Murray fprintf(f, " if (((Context *)rsc)->isSynchronous()) {\n"); 2534d252d6e807b89764dad123ac845df298c52ca97Tim Murray fprintf(f, " "); 2544d252d6e807b89764dad123ac845df298c52ca97Tim Murray if (api->ret.typeName[0]) { 2554d252d6e807b89764dad123ac845df298c52ca97Tim Murray fprintf(f, "return "); 2564d252d6e807b89764dad123ac845df298c52ca97Tim Murray } 257b74514df6be14fd898ddd7906bc70408dc3bb63cMatt Wala fprintf(f, RS_INTERNAL_PREFIX "%s(", api->name); 2584d252d6e807b89764dad123ac845df298c52ca97Tim Murray if (!api->nocontext) { 2594d252d6e807b89764dad123ac845df298c52ca97Tim Murray fprintf(f, "(Context *)rsc"); 2604d252d6e807b89764dad123ac845df298c52ca97Tim Murray } 2614d252d6e807b89764dad123ac845df298c52ca97Tim Murray for (ct2=0; ct2 < api->paramCount; ct2++) { 2624d252d6e807b89764dad123ac845df298c52ca97Tim Murray const VarType *vt = &api->params[ct2]; 2634d252d6e807b89764dad123ac845df298c52ca97Tim Murray if (ct2 > 0 || !api->nocontext) { 2644d252d6e807b89764dad123ac845df298c52ca97Tim Murray fprintf(f, ", "); 2654d252d6e807b89764dad123ac845df298c52ca97Tim Murray } 2664d252d6e807b89764dad123ac845df298c52ca97Tim Murray fprintf(f, "%s", vt->name); 2674d252d6e807b89764dad123ac845df298c52ca97Tim Murray } 2684d252d6e807b89764dad123ac845df298c52ca97Tim Murray fprintf(f, ");\n"); 2694d252d6e807b89764dad123ac845df298c52ca97Tim Murray if (!api->ret.typeName[0]) { 2704d252d6e807b89764dad123ac845df298c52ca97Tim Murray fprintf(f, " return;"); 2714d252d6e807b89764dad123ac845df298c52ca97Tim Murray } 2724d252d6e807b89764dad123ac845df298c52ca97Tim Murray fprintf(f, " }\n\n"); 2734d252d6e807b89764dad123ac845df298c52ca97Tim Murray 2749397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams fprintf(f, " ThreadIO *io = &((Context *)rsc)->mIO;\n"); 275099bc262f862cdeb547cf8a78fe9e0e92560f437Tim Murray fprintf(f, " const size_t size = sizeof(RS_CMD_%s);\n", api->name); 2765fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams if (hasInlineDataPointers(api)) { 277099bc262f862cdeb547cf8a78fe9e0e92560f437Tim Murray fprintf(f, " size_t dataSize = 0;\n"); 2785fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams for (ct2=0; ct2 < api->paramCount; ct2++) { 2795fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams const VarType *vt = &api->params[ct2]; 2805fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams if (vt->isConst && vt->ptrLevel) { 2815fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams fprintf(f, " dataSize += %s_length;\n", vt->name); 2825fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams } 2835fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams } 2845fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams } 2855fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams 286af12ac6a08651464f8d823add667c706f993b587Steve Block //fprintf(f, " ALOGE(\"add command %s\\n\");\n", api->name); 2875fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams if (hasInlineDataPointers(api)) { 288b693112b7513227b06d4a0a4e712ad3ce01451b4Jason Sams fprintf(f, " RS_CMD_%s *cmd = NULL;\n", api->name); 289bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams fprintf(f, " if (dataSize < io->getMaxInlineSize()) {;\n"); 2901a4efa363916977ef9aeab756725b3bdc880a15bJason Sams fprintf(f, " cmd = static_cast<RS_CMD_%s *>(io->coreHeader(RS_CMD_ID_%s, dataSize + size));\n", api->name, api->name); 291b693112b7513227b06d4a0a4e712ad3ce01451b4Jason Sams fprintf(f, " } else {\n"); 2921a4efa363916977ef9aeab756725b3bdc880a15bJason Sams fprintf(f, " cmd = static_cast<RS_CMD_%s *>(io->coreHeader(RS_CMD_ID_%s, size));\n", api->name, api->name); 293b693112b7513227b06d4a0a4e712ad3ce01451b4Jason Sams fprintf(f, " }\n"); 2945fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams fprintf(f, " uint8_t *payload = (uint8_t *)&cmd[1];\n"); 2956e58aef90ec70adf4e7d6d18b869aed143a2ec02Jason Sams } else { 2961a4efa363916977ef9aeab756725b3bdc880a15bJason 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); 2975fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams } 2989397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams 299afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk for (ct2=0; ct2 < api->paramCount; ct2++) { 3009397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams const VarType *vt = &api->params[ct2]; 3019397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams needFlush += vt->ptrLevel; 3025fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams if (vt->ptrLevel && hasInlineDataPointers(api)) { 303db896f0918a7d79b9dd44a786e393206a0ac36a6Chris Wailes fprintf(f, " if (%s_length == 0) {\n", vt->name); 304db896f0918a7d79b9dd44a786e393206a0ac36a6Chris Wailes fprintf(f, " cmd->%s = NULL;\n", vt->name); 305db896f0918a7d79b9dd44a786e393206a0ac36a6Chris Wailes fprintf(f, " } else if (dataSize < io->getMaxInlineSize()) {\n"); 3065fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams fprintf(f, " memcpy(payload, %s, %s_length);\n", vt->name, vt->name); 3075fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams fprintf(f, " cmd->%s = (", vt->name); 3085fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams printVarType(f, vt); 3095f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams fprintf(f, ")(payload - ((uint8_t *)&cmd[1]));\n"); 3105fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams fprintf(f, " payload += %s_length;\n", vt->name); 3115fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams fprintf(f, " } else {\n"); 3125fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams fprintf(f, " cmd->%s = %s;\n", vt->name, vt->name); 3135fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams fprintf(f, " }\n"); 3145fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams 3155fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams } else { 3165fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams fprintf(f, " cmd->%s = %s;\n", vt->name, vt->name); 3175fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams } 3189397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams } 3191a4efa363916977ef9aeab756725b3bdc880a15bJason Sams if (api->ret.typeName[0] || api->sync) { 3209397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams needFlush = 1; 3219397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams } 3229397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams 3235f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams fprintf(f, " io->coreCommit();\n"); 3245fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams if (hasInlineDataPointers(api)) { 325bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams fprintf(f, " if (dataSize >= io->getMaxInlineSize()) {\n"); 3265f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams fprintf(f, " io->coreGetReturn(NULL, 0);\n"); 3275fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams fprintf(f, " }\n"); 3285f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams } else if (api->ret.typeName[0]) { 3291a4efa363916977ef9aeab756725b3bdc880a15bJason Sams fprintf(f, "\n "); 3302008747941749ad27fe80663d23036ac320e998fJason Sams printVarType(f, &api->ret); 3311a4efa363916977ef9aeab756725b3bdc880a15bJason Sams fprintf(f, " ret;\n"); 3321a4efa363916977ef9aeab756725b3bdc880a15bJason Sams fprintf(f, " io->coreGetReturn(&ret, sizeof(ret));\n"); 3331a4efa363916977ef9aeab756725b3bdc880a15bJason Sams fprintf(f, " return ret;\n"); 3345f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams } else if (needFlush) { 3355f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams fprintf(f, " io->coreGetReturn(NULL, 0);\n"); 3369397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams } 337326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 338326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, "};\n\n"); 339c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams } 340c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams 3412008747941749ad27fe80663d23036ac320e998fJason Sams fprintf(f, "\n"); 342c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams 343c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams for (ct=0; ct < apiCount; ct++) { 344c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams int needFlush = 0; 345c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams const ApiEntry * api = &apis[ct]; 346c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams 347f6023e494e67bc9deaa8b96008180104cbf540c7Tim Murray fprintf(f, "extern \"C\" "); 348f6023e494e67bc9deaa8b96008180104cbf540c7Tim Murray 349c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams printFuncDecl(f, api, "rs", 0, 0); 350c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams fprintf(f, "\n{\n"); 351c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams fprintf(f, " "); 352c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams if (api->ret.typeName[0]) { 353c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams fprintf(f, "return "); 354c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams } 355b74514df6be14fd898ddd7906bc70408dc3bb63cMatt Wala fprintf(f, LOCAL_FIFO_PREFIX "%s(", api->name); 356c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams 357c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams if (!api->nocontext) { 358c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams fprintf(f, "(Context *)rsc"); 359c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams } 360c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams 361c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams for (ct2=0; ct2 < api->paramCount; ct2++) { 362c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams const VarType *vt = &api->params[ct2]; 363c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams if (ct2 > 0 || !api->nocontext) { 364c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams fprintf(f, ", "); 365c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams } 366c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams fprintf(f, "%s", vt->name); 367c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams } 368c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams fprintf(f, ");\n"); 369c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams fprintf(f, "}\n\n"); 370c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams } 371c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams 372326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 373326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 374afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid printPlaybackCpp(FILE *f) { 375326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams int ct; 376326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams int ct2; 377326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 378b74514df6be14fd898ddd7906bc70408dc3bb63cMatt Wala fprintf(f, RSG_API_REPLAY_CPP_DOC); 379b74514df6be14fd898ddd7906bc70408dc3bb63cMatt Wala 380326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, "#include \"rsDevice.h\"\n"); 381326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, "#include \"rsContext.h\"\n"); 382326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, "#include \"rsThreadIO.h\"\n"); 3834edf030cbb7c6ac08dc563335c2af73c20f6e2e5Alex Sakhartchouk fprintf(f, "#include \"rsgApiStructs.h\"\n"); 384326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, "#include \"rsgApiFuncDecl.h\"\n"); 385326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, "\n"); 386326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, "namespace android {\n"); 387326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, "namespace renderscript {\n"); 388326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, "\n"); 389326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 390b74514df6be14fd898ddd7906bc70408dc3bb63cMatt Wala // Generate functions to play back messages sent from the local FIFO. 391afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk for (ct=0; ct < apiCount; ct++) { 392326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams const ApiEntry * api = &apis[ct]; 3935f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams int needFlush = 0; 394326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 395186e59154a0fb86e05e283e9c083b69878c06720Jason Sams if (api->direct) { 396186e59154a0fb86e05e283e9c083b69878c06720Jason Sams continue; 397186e59154a0fb86e05e283e9c083b69878c06720Jason Sams } 398186e59154a0fb86e05e283e9c083b69878c06720Jason Sams 399b74514df6be14fd898ddd7906bc70408dc3bb63cMatt Wala fprintf(f, "void " RS_PLAYBACK_PREFIX "%s(Context *con, const void *vp, size_t cmdSizeBytes) {\n", api->name); 400186e59154a0fb86e05e283e9c083b69878c06720Jason Sams fprintf(f, " const RS_CMD_%s *cmd = static_cast<const RS_CMD_%s *>(vp);\n", api->name, api->name); 4015fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams 4025f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams if (hasInlineDataPointers(api)) { 4035f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams fprintf(f, " const uint8_t *baseData = 0;\n"); 4045f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams fprintf(f, " if (cmdSizeBytes != sizeof(RS_CMD_%s)) {\n", api->name); 4055f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams fprintf(f, " baseData = &((const uint8_t *)vp)[sizeof(*cmd)];\n"); 4065f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams fprintf(f, " }\n"); 4075f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams } 4085f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams 409186e59154a0fb86e05e283e9c083b69878c06720Jason Sams fprintf(f, " "); 410186e59154a0fb86e05e283e9c083b69878c06720Jason Sams if (api->ret.typeName[0]) { 4111a4efa363916977ef9aeab756725b3bdc880a15bJason Sams fprintf(f, "\n "); 4121a4efa363916977ef9aeab756725b3bdc880a15bJason Sams printVarType(f, &api->ret); 4131a4efa363916977ef9aeab756725b3bdc880a15bJason Sams fprintf(f, " ret = "); 414326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 415b74514df6be14fd898ddd7906bc70408dc3bb63cMatt Wala fprintf(f, RS_INTERNAL_PREFIX "%s(con", api->name); 416186e59154a0fb86e05e283e9c083b69878c06720Jason Sams for (ct2=0; ct2 < api->paramCount; ct2++) { 417186e59154a0fb86e05e283e9c083b69878c06720Jason Sams const VarType *vt = &api->params[ct2]; 4185f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams needFlush += vt->ptrLevel; 4195f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams 4205f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams if (hasInlineDataPointers(api) && vt->ptrLevel) { 421db896f0918a7d79b9dd44a786e393206a0ac36a6Chris Wailes fprintf(f, ",\n cmd->%s_length == 0 ? NULL : (const %s *)&baseData[(intptr_t)cmd->%s]", 422db896f0918a7d79b9dd44a786e393206a0ac36a6Chris Wailes vt->name, vt->typeName, vt->name); 4235f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams } else { 4245f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams fprintf(f, ",\n cmd->%s", vt->name); 4255f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams } 426186e59154a0fb86e05e283e9c083b69878c06720Jason Sams } 427186e59154a0fb86e05e283e9c083b69878c06720Jason Sams fprintf(f, ");\n"); 428186e59154a0fb86e05e283e9c083b69878c06720Jason Sams 4295f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams if (hasInlineDataPointers(api)) { 430ee5cf0067c374e1c7e9a0736e24e55f4d19a0721Jason Sams fprintf(f, " size_t totalSize = 0;\n"); 431ee5cf0067c374e1c7e9a0736e24e55f4d19a0721Jason Sams for (ct2=0; ct2 < api->paramCount; ct2++) { 432ee5cf0067c374e1c7e9a0736e24e55f4d19a0721Jason Sams if (api->params[ct2].ptrLevel) { 433ee5cf0067c374e1c7e9a0736e24e55f4d19a0721Jason Sams fprintf(f, " totalSize += cmd->%s_length;\n", api->params[ct2].name); 434ee5cf0067c374e1c7e9a0736e24e55f4d19a0721Jason Sams } 435ee5cf0067c374e1c7e9a0736e24e55f4d19a0721Jason Sams } 436ee5cf0067c374e1c7e9a0736e24e55f4d19a0721Jason Sams 437ee5cf0067c374e1c7e9a0736e24e55f4d19a0721Jason Sams fprintf(f, " if ((totalSize != 0) && (cmdSizeBytes == sizeof(RS_CMD_%s))) {\n", api->name); 4385f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams fprintf(f, " con->mIO.coreSetReturn(NULL, 0);\n"); 4395f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams fprintf(f, " }\n"); 4405f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams } else if (api->ret.typeName[0]) { 4411a4efa363916977ef9aeab756725b3bdc880a15bJason Sams fprintf(f, " con->mIO.coreSetReturn(&ret, sizeof(ret));\n"); 4425f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams } else if (api->sync || needFlush) { 4435f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams fprintf(f, " con->mIO.coreSetReturn(NULL, 0);\n"); 4441a4efa363916977ef9aeab756725b3bdc880a15bJason Sams } 4451a4efa363916977ef9aeab756725b3bdc880a15bJason Sams 446326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, "};\n\n"); 447326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 448326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 449b74514df6be14fd898ddd7906bc70408dc3bb63cMatt Wala // Generate the globally accessible table of playback functions. 4502008747941749ad27fe80663d23036ac320e998fJason Sams fprintf(f, "RsPlaybackLocalFunc gPlaybackFuncs[%i] = {\n", apiCount + 1); 451326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, " NULL,\n"); 452afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk for (ct=0; ct < apiCount; ct++) { 453186e59154a0fb86e05e283e9c083b69878c06720Jason Sams if (apis[ct].direct) { 454186e59154a0fb86e05e283e9c083b69878c06720Jason Sams fprintf(f, " NULL,\n"); 455186e59154a0fb86e05e283e9c083b69878c06720Jason Sams } else { 456b74514df6be14fd898ddd7906bc70408dc3bb63cMatt Wala fprintf(f, " %s%s,\n", RS_PLAYBACK_PREFIX, apis[ct].name); 457186e59154a0fb86e05e283e9c083b69878c06720Jason Sams } 458326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 459326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, "};\n"); 460326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 461326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, "};\n"); 462326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, "};\n"); 463326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 464326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 4655fb1aeb6374f814d72117803682bc141cc6b0895Jason Samsvoid yylex(); 4665fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams 467afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukint main(int argc, char **argv) { 468326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams if (argc != 3) { 469326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(stderr, "usage: %s commandFile outFile\n", argv[0]); 470326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams return 1; 471326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 472326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams const char* rsgFile = argv[1]; 473326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams const char* outFile = argv[2]; 474326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams FILE* input = fopen(rsgFile, "r"); 475326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 476326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams char choice = fgetc(input); 477326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fclose(input); 478326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 479326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams if (choice < '0' || choice > '3') { 480326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(stderr, "Uknown command: \'%c\'\n", choice); 481326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams return -2; 482326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 483326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 484326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams yylex(); 485326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams // printf("# of lines = %d\n", num_lines); 486326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 487326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams FILE *f = fopen(outFile, "w"); 488326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 489326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams printFileHeader(f); 490afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk switch (choice) { 491326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams case '0': // rsgApiStructs.h 492326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams { 493326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, "\n"); 494326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, "#include \"rsContext.h\"\n"); 4952008747941749ad27fe80663d23036ac320e998fJason Sams fprintf(f, "#include \"rsFifo.h\"\n"); 496326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, "\n"); 497326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, "namespace android {\n"); 498326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, "namespace renderscript {\n"); 499326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams printStructures(f); 500b74514df6be14fd898ddd7906bc70408dc3bb63cMatt Wala printFuncDecls(f, RS_INTERNAL_PREFIX, 1, 0); 501b74514df6be14fd898ddd7906bc70408dc3bb63cMatt Wala printPlaybackFuncs(f, RS_PLAYBACK_PREFIX); 5022008747941749ad27fe80663d23036ac320e998fJason Sams fprintf(f, "typedef void (*RsPlaybackLocalFunc)(Context *, const void *, size_t sizeBytes);\n"); 5032008747941749ad27fe80663d23036ac320e998fJason Sams fprintf(f, "extern RsPlaybackLocalFunc gPlaybackFuncs[%i];\n", apiCount + 1); 504326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 505326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, "}\n"); 506326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, "}\n"); 507326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 508326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams break; 509326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 510326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams case '1': // rsgApiFuncDecl.h 511326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams { 512f6023e494e67bc9deaa8b96008180104cbf540c7Tim Murray printFuncDecls(f, "rs", 0, 1); 513326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 514326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams break; 515326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 516326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams case '2': // rsgApi.cpp 517326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams { 518326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams printApiCpp(f); 519326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 520326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams break; 521326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 522326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams case '3': // rsgApiReplay.cpp 523326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams { 524326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams printPlaybackCpp(f); 525326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 526326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams break; 527326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 528326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fclose(f); 529326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams return 0; 530326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 531