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]; 123ca451c3280b6265a9b79273b4bf89e121a050cabMichael Butler strncpy(t, api->name, sizeof(t)-1); 124ca451c3280b6265a9b79273b4bf89e121a050cabMichael Butler t[sizeof(t)-1] = '\0'; 125c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams if (strlen(prefix) == 0) { 126c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams if (t[0] > 'A' && t[0] < 'Z') { 127c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams t[0] -= 'A' - 'a'; 128c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams } 129c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams } 130c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams fprintf(f, " (* %s%s) (", prefix, api->name); 131c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams } else { 132c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams fprintf(f, " %s%s (", prefix, api->name); 133c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams } 134186e59154a0fb86e05e283e9c083b69878c06720Jason Sams if (!api->nocontext) { 135186e59154a0fb86e05e283e9c083b69878c06720Jason Sams if (addContext) { 136186e59154a0fb86e05e283e9c083b69878c06720Jason Sams fprintf(f, "Context *"); 137186e59154a0fb86e05e283e9c083b69878c06720Jason Sams } else { 138186e59154a0fb86e05e283e9c083b69878c06720Jason Sams fprintf(f, "RsContext rsc"); 139186e59154a0fb86e05e283e9c083b69878c06720Jason Sams } 140326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 141186e59154a0fb86e05e283e9c083b69878c06720Jason Sams printArgList(f, api, !api->nocontext); 142326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, ")"); 143326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 144326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 145f6023e494e67bc9deaa8b96008180104cbf540c7Tim Murrayvoid printFuncDecls(FILE *f, const char *prefix, int addContext, int externC) { 146326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams int ct; 147afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk for (ct=0; ct < apiCount; ct++) { 148f6023e494e67bc9deaa8b96008180104cbf540c7Tim Murray if (externC) { 149f6023e494e67bc9deaa8b96008180104cbf540c7Tim Murray fprintf(f, "extern \"C\" "); 150f6023e494e67bc9deaa8b96008180104cbf540c7Tim Murray } 151c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams printFuncDecl(f, &apis[ct], prefix, addContext, 0); 152326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, ";\n"); 153326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 154326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, "\n\n"); 155326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 156326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 157afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid printPlaybackFuncs(FILE *f, const char *prefix) { 158326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams int ct; 159afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk for (ct=0; ct < apiCount; ct++) { 160186e59154a0fb86e05e283e9c083b69878c06720Jason Sams if (apis[ct].direct) { 161186e59154a0fb86e05e283e9c083b69878c06720Jason Sams continue; 162186e59154a0fb86e05e283e9c083b69878c06720Jason Sams } 163186e59154a0fb86e05e283e9c083b69878c06720Jason Sams 164326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, "void %s%s (Context *, const void *);\n", prefix, apis[ct].name); 165326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 166326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 167326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 1685fb1aeb6374f814d72117803682bc141cc6b0895Jason Samsstatic int hasInlineDataPointers(const ApiEntry * api) { 1695fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams int ret = 0; 1705fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams int ct; 171b693112b7513227b06d4a0a4e712ad3ce01451b4Jason Sams if (api->sync || api->ret.typeName[0]) { 1725fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams return 0; 1735fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams } 1745fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams for (ct=0; ct < api->paramCount; ct++) { 1755fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams const VarType *vt = &api->params[ct]; 1765fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams 1775fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams if (!vt->isConst && vt->ptrLevel) { 1785fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams // Non-const pointers cannot be inlined. 1795fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams return 0; 1805fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams } 1815fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams if (vt->ptrLevel > 1) { 1825fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams // not handled yet. 1835fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams return 0; 1845fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams } 1855fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams 1865fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams if (vt->isConst && vt->ptrLevel) { 1875fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams // Non-const pointers cannot be inlined. 1885fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams ret = 1; 1895fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams } 1905fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams } 1915fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams return ret; 1925fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams} 1935fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams 194afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid printApiCpp(FILE *f) { 195326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams int ct; 196326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams int ct2; 197326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 198b74514df6be14fd898ddd7906bc70408dc3bb63cMatt Wala fprintf(f, RSG_API_CPP_DOC); 199b74514df6be14fd898ddd7906bc70408dc3bb63cMatt Wala 200326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, "#include \"rsDevice.h\"\n"); 201326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, "#include \"rsContext.h\"\n"); 202326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, "#include \"rsThreadIO.h\"\n"); 2034edf030cbb7c6ac08dc563335c2af73c20f6e2e5Alex Sakhartchouk fprintf(f, "#include \"rsgApiStructs.h\"\n"); 204326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, "#include \"rsgApiFuncDecl.h\"\n"); 2052008747941749ad27fe80663d23036ac320e998fJason Sams fprintf(f, "#include \"rsFifo.h\"\n"); 206326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, "\n"); 20711496ac131bb691edf5bdcab3029dceef5c1e4e1Chih-Hung Hsieh fprintf(f, "using namespace android; // NOLINT\n"); 20811496ac131bb691edf5bdcab3029dceef5c1e4e1Chih-Hung Hsieh fprintf(f, "using namespace android::renderscript; // NOLINT\n"); 209326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, "\n"); 210326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 211b74514df6be14fd898ddd7906bc70408dc3bb63cMatt Wala // Generate RS funcs that send messages on the local FIFO. 212afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk for (ct=0; ct < apiCount; ct++) { 213326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams int needFlush = 0; 214326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams const ApiEntry * api = &apis[ct]; 215326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 216c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams fprintf(f, "static "); 217b74514df6be14fd898ddd7906bc70408dc3bb63cMatt Wala printFuncDecl(f, api, LOCAL_FIFO_PREFIX, 0, 0); 218326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, "\n{\n"); 2191a4efa363916977ef9aeab756725b3bdc880a15bJason Sams if (api->direct) { 2201a4efa363916977ef9aeab756725b3bdc880a15bJason Sams fprintf(f, " "); 2211a4efa363916977ef9aeab756725b3bdc880a15bJason Sams if (api->ret.typeName[0]) { 2221a4efa363916977ef9aeab756725b3bdc880a15bJason Sams fprintf(f, "return "); 2231a4efa363916977ef9aeab756725b3bdc880a15bJason Sams } 224b74514df6be14fd898ddd7906bc70408dc3bb63cMatt Wala fprintf(f, RS_INTERNAL_PREFIX "%s(", api->name); 2251a4efa363916977ef9aeab756725b3bdc880a15bJason Sams if (!api->nocontext) { 2261a4efa363916977ef9aeab756725b3bdc880a15bJason Sams fprintf(f, "(Context *)rsc"); 227c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams } 228afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk for (ct2=0; ct2 < api->paramCount; ct2++) { 2299397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams const VarType *vt = &api->params[ct2]; 230c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams if (ct2 > 0 || !api->nocontext) { 231c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams fprintf(f, ", "); 232c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams } 233c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams fprintf(f, "%s", vt->name); 2349397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams } 2359397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams fprintf(f, ");\n"); 236c2eca55c8b6de99130329a96b13498b700aa6344Tim Murray } else if (api->handcodeApi) { 237c2eca55c8b6de99130329a96b13498b700aa6344Tim Murray // handle handcode path 238b74514df6be14fd898ddd7906bc70408dc3bb63cMatt Wala fprintf(f, " " LOCAL_FIFO_PREFIX "%s_handcode(", api->name); 239c2eca55c8b6de99130329a96b13498b700aa6344Tim Murray if (!api->nocontext) { 240c2eca55c8b6de99130329a96b13498b700aa6344Tim Murray fprintf(f, "(Context *)rsc"); 241c2eca55c8b6de99130329a96b13498b700aa6344Tim Murray } 242c2eca55c8b6de99130329a96b13498b700aa6344Tim Murray for (ct2=0; ct2 < api->paramCount; ct2++) { 243c2eca55c8b6de99130329a96b13498b700aa6344Tim Murray const VarType *vt = &api->params[ct2]; 244c2eca55c8b6de99130329a96b13498b700aa6344Tim Murray if (ct2 > 0 || !api->nocontext) { 245c2eca55c8b6de99130329a96b13498b700aa6344Tim Murray fprintf(f, ", "); 246c2eca55c8b6de99130329a96b13498b700aa6344Tim Murray } 247c2eca55c8b6de99130329a96b13498b700aa6344Tim Murray fprintf(f, "%s", vt->name); 248c2eca55c8b6de99130329a96b13498b700aa6344Tim Murray } 249c2eca55c8b6de99130329a96b13498b700aa6344Tim Murray fprintf(f, ");\n"); 250c2eca55c8b6de99130329a96b13498b700aa6344Tim Murray 2519397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams } else { 2524d252d6e807b89764dad123ac845df298c52ca97Tim Murray // handle synchronous path 2534d252d6e807b89764dad123ac845df298c52ca97Tim Murray fprintf(f, " if (((Context *)rsc)->isSynchronous()) {\n"); 2544d252d6e807b89764dad123ac845df298c52ca97Tim Murray fprintf(f, " "); 2554d252d6e807b89764dad123ac845df298c52ca97Tim Murray if (api->ret.typeName[0]) { 2564d252d6e807b89764dad123ac845df298c52ca97Tim Murray fprintf(f, "return "); 2574d252d6e807b89764dad123ac845df298c52ca97Tim Murray } 258b74514df6be14fd898ddd7906bc70408dc3bb63cMatt Wala fprintf(f, RS_INTERNAL_PREFIX "%s(", api->name); 2594d252d6e807b89764dad123ac845df298c52ca97Tim Murray if (!api->nocontext) { 2604d252d6e807b89764dad123ac845df298c52ca97Tim Murray fprintf(f, "(Context *)rsc"); 2614d252d6e807b89764dad123ac845df298c52ca97Tim Murray } 2624d252d6e807b89764dad123ac845df298c52ca97Tim Murray for (ct2=0; ct2 < api->paramCount; ct2++) { 2634d252d6e807b89764dad123ac845df298c52ca97Tim Murray const VarType *vt = &api->params[ct2]; 2644d252d6e807b89764dad123ac845df298c52ca97Tim Murray if (ct2 > 0 || !api->nocontext) { 2654d252d6e807b89764dad123ac845df298c52ca97Tim Murray fprintf(f, ", "); 2664d252d6e807b89764dad123ac845df298c52ca97Tim Murray } 2674d252d6e807b89764dad123ac845df298c52ca97Tim Murray fprintf(f, "%s", vt->name); 2684d252d6e807b89764dad123ac845df298c52ca97Tim Murray } 2694d252d6e807b89764dad123ac845df298c52ca97Tim Murray fprintf(f, ");\n"); 2704d252d6e807b89764dad123ac845df298c52ca97Tim Murray if (!api->ret.typeName[0]) { 2714d252d6e807b89764dad123ac845df298c52ca97Tim Murray fprintf(f, " return;"); 2724d252d6e807b89764dad123ac845df298c52ca97Tim Murray } 2734d252d6e807b89764dad123ac845df298c52ca97Tim Murray fprintf(f, " }\n\n"); 2744d252d6e807b89764dad123ac845df298c52ca97Tim Murray 2759397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams fprintf(f, " ThreadIO *io = &((Context *)rsc)->mIO;\n"); 276099bc262f862cdeb547cf8a78fe9e0e92560f437Tim Murray fprintf(f, " const size_t size = sizeof(RS_CMD_%s);\n", api->name); 2775fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams if (hasInlineDataPointers(api)) { 278099bc262f862cdeb547cf8a78fe9e0e92560f437Tim Murray fprintf(f, " size_t dataSize = 0;\n"); 2795fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams for (ct2=0; ct2 < api->paramCount; ct2++) { 2805fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams const VarType *vt = &api->params[ct2]; 2815fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams if (vt->isConst && vt->ptrLevel) { 2825fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams fprintf(f, " dataSize += %s_length;\n", vt->name); 2835fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams } 2845fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams } 2855fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams } 2865fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams 287af12ac6a08651464f8d823add667c706f993b587Steve Block //fprintf(f, " ALOGE(\"add command %s\\n\");\n", api->name); 2885fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams if (hasInlineDataPointers(api)) { 289b693112b7513227b06d4a0a4e712ad3ce01451b4Jason Sams fprintf(f, " RS_CMD_%s *cmd = NULL;\n", api->name); 290bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams fprintf(f, " if (dataSize < io->getMaxInlineSize()) {;\n"); 2911a4efa363916977ef9aeab756725b3bdc880a15bJason Sams fprintf(f, " cmd = static_cast<RS_CMD_%s *>(io->coreHeader(RS_CMD_ID_%s, dataSize + size));\n", api->name, api->name); 292b693112b7513227b06d4a0a4e712ad3ce01451b4Jason Sams fprintf(f, " } else {\n"); 2931a4efa363916977ef9aeab756725b3bdc880a15bJason Sams fprintf(f, " cmd = static_cast<RS_CMD_%s *>(io->coreHeader(RS_CMD_ID_%s, size));\n", api->name, api->name); 294b693112b7513227b06d4a0a4e712ad3ce01451b4Jason Sams fprintf(f, " }\n"); 2955fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams fprintf(f, " uint8_t *payload = (uint8_t *)&cmd[1];\n"); 2966e58aef90ec70adf4e7d6d18b869aed143a2ec02Jason Sams } else { 2971a4efa363916977ef9aeab756725b3bdc880a15bJason 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); 2985fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams } 2999397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams 300afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk for (ct2=0; ct2 < api->paramCount; ct2++) { 3019397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams const VarType *vt = &api->params[ct2]; 3029397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams needFlush += vt->ptrLevel; 3035fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams if (vt->ptrLevel && hasInlineDataPointers(api)) { 304db896f0918a7d79b9dd44a786e393206a0ac36a6Chris Wailes fprintf(f, " if (%s_length == 0) {\n", vt->name); 305db896f0918a7d79b9dd44a786e393206a0ac36a6Chris Wailes fprintf(f, " cmd->%s = NULL;\n", vt->name); 306db896f0918a7d79b9dd44a786e393206a0ac36a6Chris Wailes fprintf(f, " } else if (dataSize < io->getMaxInlineSize()) {\n"); 3075fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams fprintf(f, " memcpy(payload, %s, %s_length);\n", vt->name, vt->name); 3085fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams fprintf(f, " cmd->%s = (", vt->name); 3095fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams printVarType(f, vt); 3105f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams fprintf(f, ")(payload - ((uint8_t *)&cmd[1]));\n"); 3115fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams fprintf(f, " payload += %s_length;\n", vt->name); 3125fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams fprintf(f, " } else {\n"); 3135fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams fprintf(f, " cmd->%s = %s;\n", vt->name, vt->name); 3145fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams fprintf(f, " }\n"); 3155fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams 3165fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams } else { 3175fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams fprintf(f, " cmd->%s = %s;\n", vt->name, vt->name); 3185fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams } 3199397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams } 3201a4efa363916977ef9aeab756725b3bdc880a15bJason Sams if (api->ret.typeName[0] || api->sync) { 3219397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams needFlush = 1; 3229397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams } 3239397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams 3245f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams fprintf(f, " io->coreCommit();\n"); 3255fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams if (hasInlineDataPointers(api)) { 326bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams fprintf(f, " if (dataSize >= io->getMaxInlineSize()) {\n"); 3275f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams fprintf(f, " io->coreGetReturn(NULL, 0);\n"); 3285fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams fprintf(f, " }\n"); 3295f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams } else if (api->ret.typeName[0]) { 3301a4efa363916977ef9aeab756725b3bdc880a15bJason Sams fprintf(f, "\n "); 3312008747941749ad27fe80663d23036ac320e998fJason Sams printVarType(f, &api->ret); 3321a4efa363916977ef9aeab756725b3bdc880a15bJason Sams fprintf(f, " ret;\n"); 3331a4efa363916977ef9aeab756725b3bdc880a15bJason Sams fprintf(f, " io->coreGetReturn(&ret, sizeof(ret));\n"); 3341a4efa363916977ef9aeab756725b3bdc880a15bJason Sams fprintf(f, " return ret;\n"); 3355f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams } else if (needFlush) { 3365f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams fprintf(f, " io->coreGetReturn(NULL, 0);\n"); 3379397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams } 338326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 339326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, "};\n\n"); 340c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams } 341c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams 3422008747941749ad27fe80663d23036ac320e998fJason Sams fprintf(f, "\n"); 343c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams 344c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams for (ct=0; ct < apiCount; ct++) { 345c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams int needFlush = 0; 346c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams const ApiEntry * api = &apis[ct]; 347c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams 348f6023e494e67bc9deaa8b96008180104cbf540c7Tim Murray fprintf(f, "extern \"C\" "); 349f6023e494e67bc9deaa8b96008180104cbf540c7Tim Murray 350c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams printFuncDecl(f, api, "rs", 0, 0); 351c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams fprintf(f, "\n{\n"); 352c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams fprintf(f, " "); 353c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams if (api->ret.typeName[0]) { 354c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams fprintf(f, "return "); 355c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams } 356b74514df6be14fd898ddd7906bc70408dc3bb63cMatt Wala fprintf(f, LOCAL_FIFO_PREFIX "%s(", api->name); 357c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams 358c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams if (!api->nocontext) { 359c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams fprintf(f, "(Context *)rsc"); 360c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams } 361c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams 362c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams for (ct2=0; ct2 < api->paramCount; ct2++) { 363c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams const VarType *vt = &api->params[ct2]; 364c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams if (ct2 > 0 || !api->nocontext) { 365c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams fprintf(f, ", "); 366c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams } 367c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams fprintf(f, "%s", vt->name); 368c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams } 369c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams fprintf(f, ");\n"); 370c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams fprintf(f, "}\n\n"); 371c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams } 372c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams 373326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 374326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 375afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid printPlaybackCpp(FILE *f) { 376326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams int ct; 377326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams int ct2; 378326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 379b74514df6be14fd898ddd7906bc70408dc3bb63cMatt Wala fprintf(f, RSG_API_REPLAY_CPP_DOC); 380b74514df6be14fd898ddd7906bc70408dc3bb63cMatt Wala 381326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, "#include \"rsDevice.h\"\n"); 382326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, "#include \"rsContext.h\"\n"); 383326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, "#include \"rsThreadIO.h\"\n"); 3844edf030cbb7c6ac08dc563335c2af73c20f6e2e5Alex Sakhartchouk fprintf(f, "#include \"rsgApiStructs.h\"\n"); 385326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, "#include \"rsgApiFuncDecl.h\"\n"); 386326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, "\n"); 387326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, "namespace android {\n"); 388326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, "namespace renderscript {\n"); 389326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, "\n"); 390326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 391b74514df6be14fd898ddd7906bc70408dc3bb63cMatt Wala // Generate functions to play back messages sent from the local FIFO. 392afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk for (ct=0; ct < apiCount; ct++) { 393326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams const ApiEntry * api = &apis[ct]; 3945f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams int needFlush = 0; 395326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 396186e59154a0fb86e05e283e9c083b69878c06720Jason Sams if (api->direct) { 397186e59154a0fb86e05e283e9c083b69878c06720Jason Sams continue; 398186e59154a0fb86e05e283e9c083b69878c06720Jason Sams } 399186e59154a0fb86e05e283e9c083b69878c06720Jason Sams 400b74514df6be14fd898ddd7906bc70408dc3bb63cMatt Wala fprintf(f, "void " RS_PLAYBACK_PREFIX "%s(Context *con, const void *vp, size_t cmdSizeBytes) {\n", api->name); 401186e59154a0fb86e05e283e9c083b69878c06720Jason Sams fprintf(f, " const RS_CMD_%s *cmd = static_cast<const RS_CMD_%s *>(vp);\n", api->name, api->name); 4025fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams 4035f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams if (hasInlineDataPointers(api)) { 4045f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams fprintf(f, " const uint8_t *baseData = 0;\n"); 4055f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams fprintf(f, " if (cmdSizeBytes != sizeof(RS_CMD_%s)) {\n", api->name); 4065f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams fprintf(f, " baseData = &((const uint8_t *)vp)[sizeof(*cmd)];\n"); 4075f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams fprintf(f, " }\n"); 4085f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams } 4095f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams 410186e59154a0fb86e05e283e9c083b69878c06720Jason Sams fprintf(f, " "); 411186e59154a0fb86e05e283e9c083b69878c06720Jason Sams if (api->ret.typeName[0]) { 4121a4efa363916977ef9aeab756725b3bdc880a15bJason Sams fprintf(f, "\n "); 4131a4efa363916977ef9aeab756725b3bdc880a15bJason Sams printVarType(f, &api->ret); 4141a4efa363916977ef9aeab756725b3bdc880a15bJason Sams fprintf(f, " ret = "); 415326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 416b74514df6be14fd898ddd7906bc70408dc3bb63cMatt Wala fprintf(f, RS_INTERNAL_PREFIX "%s(con", api->name); 417186e59154a0fb86e05e283e9c083b69878c06720Jason Sams for (ct2=0; ct2 < api->paramCount; ct2++) { 418186e59154a0fb86e05e283e9c083b69878c06720Jason Sams const VarType *vt = &api->params[ct2]; 4195f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams needFlush += vt->ptrLevel; 4205f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams 4215f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams if (hasInlineDataPointers(api) && vt->ptrLevel) { 422db896f0918a7d79b9dd44a786e393206a0ac36a6Chris Wailes fprintf(f, ",\n cmd->%s_length == 0 ? NULL : (const %s *)&baseData[(intptr_t)cmd->%s]", 423db896f0918a7d79b9dd44a786e393206a0ac36a6Chris Wailes vt->name, vt->typeName, vt->name); 4245f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams } else { 4255f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams fprintf(f, ",\n cmd->%s", vt->name); 4265f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams } 427186e59154a0fb86e05e283e9c083b69878c06720Jason Sams } 428186e59154a0fb86e05e283e9c083b69878c06720Jason Sams fprintf(f, ");\n"); 429186e59154a0fb86e05e283e9c083b69878c06720Jason Sams 4305f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams if (hasInlineDataPointers(api)) { 431ee5cf0067c374e1c7e9a0736e24e55f4d19a0721Jason Sams fprintf(f, " size_t totalSize = 0;\n"); 432ee5cf0067c374e1c7e9a0736e24e55f4d19a0721Jason Sams for (ct2=0; ct2 < api->paramCount; ct2++) { 433ee5cf0067c374e1c7e9a0736e24e55f4d19a0721Jason Sams if (api->params[ct2].ptrLevel) { 434ee5cf0067c374e1c7e9a0736e24e55f4d19a0721Jason Sams fprintf(f, " totalSize += cmd->%s_length;\n", api->params[ct2].name); 435ee5cf0067c374e1c7e9a0736e24e55f4d19a0721Jason Sams } 436ee5cf0067c374e1c7e9a0736e24e55f4d19a0721Jason Sams } 437ee5cf0067c374e1c7e9a0736e24e55f4d19a0721Jason Sams 438ee5cf0067c374e1c7e9a0736e24e55f4d19a0721Jason Sams fprintf(f, " if ((totalSize != 0) && (cmdSizeBytes == sizeof(RS_CMD_%s))) {\n", api->name); 4395f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams fprintf(f, " con->mIO.coreSetReturn(NULL, 0);\n"); 4405f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams fprintf(f, " }\n"); 4415f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams } else if (api->ret.typeName[0]) { 4421a4efa363916977ef9aeab756725b3bdc880a15bJason Sams fprintf(f, " con->mIO.coreSetReturn(&ret, sizeof(ret));\n"); 4435f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams } else if (api->sync || needFlush) { 4445f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams fprintf(f, " con->mIO.coreSetReturn(NULL, 0);\n"); 4451a4efa363916977ef9aeab756725b3bdc880a15bJason Sams } 4461a4efa363916977ef9aeab756725b3bdc880a15bJason Sams 447326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, "};\n\n"); 448326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 449326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 450b74514df6be14fd898ddd7906bc70408dc3bb63cMatt Wala // Generate the globally accessible table of playback functions. 4512008747941749ad27fe80663d23036ac320e998fJason Sams fprintf(f, "RsPlaybackLocalFunc gPlaybackFuncs[%i] = {\n", apiCount + 1); 452326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, " NULL,\n"); 453afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk for (ct=0; ct < apiCount; ct++) { 454186e59154a0fb86e05e283e9c083b69878c06720Jason Sams if (apis[ct].direct) { 455186e59154a0fb86e05e283e9c083b69878c06720Jason Sams fprintf(f, " NULL,\n"); 456186e59154a0fb86e05e283e9c083b69878c06720Jason Sams } else { 457b74514df6be14fd898ddd7906bc70408dc3bb63cMatt Wala fprintf(f, " %s%s,\n", RS_PLAYBACK_PREFIX, apis[ct].name); 458186e59154a0fb86e05e283e9c083b69878c06720Jason Sams } 459326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 460326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, "};\n"); 461326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 462326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, "};\n"); 463326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, "};\n"); 464326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 465326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 4665fb1aeb6374f814d72117803682bc141cc6b0895Jason Samsvoid yylex(); 4675fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams 468afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukint main(int argc, char **argv) { 469326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams if (argc != 3) { 470326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(stderr, "usage: %s commandFile outFile\n", argv[0]); 471326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams return 1; 472326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 473326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams const char* rsgFile = argv[1]; 474326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams const char* outFile = argv[2]; 475326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams FILE* input = fopen(rsgFile, "r"); 476326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 477326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams char choice = fgetc(input); 478326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fclose(input); 479326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 480326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams if (choice < '0' || choice > '3') { 481326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(stderr, "Uknown command: \'%c\'\n", choice); 482326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams return -2; 483326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 484326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 485326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams yylex(); 486326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams // printf("# of lines = %d\n", num_lines); 487326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 488326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams FILE *f = fopen(outFile, "w"); 489326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 490326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams printFileHeader(f); 491afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk switch (choice) { 492326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams case '0': // rsgApiStructs.h 493326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams { 494326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, "\n"); 495326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, "#include \"rsContext.h\"\n"); 4962008747941749ad27fe80663d23036ac320e998fJason Sams fprintf(f, "#include \"rsFifo.h\"\n"); 497326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, "\n"); 498326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, "namespace android {\n"); 499326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, "namespace renderscript {\n"); 500326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams printStructures(f); 501b74514df6be14fd898ddd7906bc70408dc3bb63cMatt Wala printFuncDecls(f, RS_INTERNAL_PREFIX, 1, 0); 502b74514df6be14fd898ddd7906bc70408dc3bb63cMatt Wala printPlaybackFuncs(f, RS_PLAYBACK_PREFIX); 5032008747941749ad27fe80663d23036ac320e998fJason Sams fprintf(f, "typedef void (*RsPlaybackLocalFunc)(Context *, const void *, size_t sizeBytes);\n"); 5042008747941749ad27fe80663d23036ac320e998fJason Sams fprintf(f, "extern RsPlaybackLocalFunc gPlaybackFuncs[%i];\n", apiCount + 1); 505326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 506326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, "}\n"); 507326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fprintf(f, "}\n"); 508326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 509326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams break; 510326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 511326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams case '1': // rsgApiFuncDecl.h 512326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams { 513f6023e494e67bc9deaa8b96008180104cbf540c7Tim Murray printFuncDecls(f, "rs", 0, 1); 514326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 515326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams break; 516326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 517326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams case '2': // rsgApi.cpp 518326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams { 519326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams printApiCpp(f); 520326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 521326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams break; 522326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 523326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams case '3': // rsgApiReplay.cpp 524326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams { 525326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams printPlaybackCpp(f); 526326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 527326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams break; 528326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 529326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams fclose(f); 530326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams return 0; 531326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 532