10f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
20f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines#include "spec.h"
30f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines#include <stdio.h>
4ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams#include <string.h>
50f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
60f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesvoid printFileHeader(FILE *f) {
70f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    fprintf(f, "/*\n");
80f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    fprintf(f, " * Copyright (C) 2011 The Android Open Source Project\n");
90f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    fprintf(f, " *\n");
100f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    fprintf(f, " * Licensed under the Apache License, Version 2.0 (the \"License\");\n");
110f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    fprintf(f, " * you may not use this file except in compliance with the License.\n");
120f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    fprintf(f, " * You may obtain a copy of the License at\n");
130f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    fprintf(f, " *\n");
140f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    fprintf(f, " *      http://www.apache.org/licenses/LICENSE-2.0\n");
150f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    fprintf(f, " *\n");
160f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    fprintf(f, " * Unless required by applicable law or agreed to in writing, software\n");
170f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    fprintf(f, " * distributed under the License is distributed on an \"AS IS\" BASIS,\n");
180f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    fprintf(f, " * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n");
190f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    fprintf(f, " * See the License for the specific language governing permissions and\n");
200f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    fprintf(f, " * limitations under the License.\n");
210f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    fprintf(f, " */\n\n");
220f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}
230f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
240f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesvoid printVarType(FILE *f, const VarType *vt) {
250f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    int ct;
260f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    if (vt->isConst) {
270f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        fprintf(f, "const ");
280f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    }
290f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
300f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    switch (vt->type) {
310f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    case 0:
320f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        fprintf(f, "void");
330f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        break;
340f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    case 1:
350f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        fprintf(f, "int%i_t", vt->bits);
360f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        break;
370f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    case 2:
380f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        fprintf(f, "uint%i_t", vt->bits);
390f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        break;
400f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    case 3:
410f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        if (vt->bits == 32)
420f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            fprintf(f, "float");
430f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        else
440f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            fprintf(f, "double");
450f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        break;
460f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    case 4:
470f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        fprintf(f, "%s", vt->typeName);
480f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        break;
490f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    }
500f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
510f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    if (vt->ptrLevel) {
520f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        fprintf(f, " ");
530f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        for (ct=0; ct < vt->ptrLevel; ct++) {
540f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            fprintf(f, "*");
550f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        }
560f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    }
570f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}
580f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
590f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesvoid printVarTypeAndName(FILE *f, const VarType *vt) {
600f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    printVarType(f, vt);
610f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
620f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    if (vt->name[0]) {
630f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        fprintf(f, " %s", vt->name);
640f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    }
650f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}
660f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
670f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesvoid printArgList(FILE *f, const ApiEntry * api, int assumePrevious) {
680f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    int ct;
690f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    for (ct=0; ct < api->paramCount; ct++) {
700f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        if (ct || assumePrevious) {
710f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            fprintf(f, ", ");
720f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        }
730f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        printVarTypeAndName(f, &api->params[ct]);
740f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    }
750f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}
760f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
770f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesvoid printStructures(FILE *f) {
780f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    int ct;
790f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    int ct2;
800f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
810f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    for (ct=0; ct < apiCount; ct++) {
820f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        fprintf(f, "typedef struct RS_CMD_%s_rec RS_CMD_%s;\n", apis[ct].name, apis[ct].name);
830f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    }
840f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    fprintf(f, "\n");
850f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
860f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    for (ct=0; ct < apiCount; ct++) {
870f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        const ApiEntry * api = &apis[ct];
880f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        fprintf(f, "#define RS_CMD_ID_%s %i\n", api->name, ct+1);
890f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        fprintf(f, "struct RS_CMD_%s_rec {\n", api->name);
900f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        //fprintf(f, "    RsCommandHeader _hdr;\n");
910f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
920f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        for (ct2=0; ct2 < api->paramCount; ct2++) {
930f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            fprintf(f, "    ");
940f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            printVarTypeAndName(f, &api->params[ct2]);
950f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            fprintf(f, ";\n");
960f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        }
970f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        fprintf(f, "};\n\n");
980f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    }
990f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}
1000f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
1010f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesvoid printFuncDecl(FILE *f, const ApiEntry *api, const char *prefix, int addContext, int isFnPtr) {
1020f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    printVarTypeAndName(f, &api->ret);
1030f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    if (isFnPtr) {
1040f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        char t[1024];
1050f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        strcpy(t, api->name);
1060f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        if (strlen(prefix) == 0) {
1070f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            if (t[0] > 'A' && t[0] < 'Z') {
1080f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                t[0] -= 'A' - 'a';
1090f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            }
1100f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        }
1110f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        fprintf(f, " (* %s%s) (", prefix, api->name);
1120f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    } else {
1130f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        fprintf(f, " %s%s (", prefix, api->name);
1140f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    }
1150f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    if (!api->nocontext) {
1160f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        if (addContext) {
1170f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            fprintf(f, "Context *");
1180f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        } else {
1190f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            fprintf(f, "RsContext rsc");
1200f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        }
1210f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    }
1220f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    printArgList(f, api, !api->nocontext);
1230f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    fprintf(f, ")");
1240f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}
1250f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
1260f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesvoid printFuncDecls(FILE *f, const char *prefix, int addContext) {
1270f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    int ct;
1280f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    for (ct=0; ct < apiCount; ct++) {
1290f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        printFuncDecl(f, &apis[ct], prefix, addContext, 0);
1300f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        fprintf(f, ";\n");
1310f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    }
1320f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    fprintf(f, "\n\n");
1330f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}
1340f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
1350f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesvoid printFuncPointers(FILE *f, int addContext) {
1360f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    fprintf(f, "\n");
1370f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    fprintf(f, "typedef struct RsApiEntrypoints {\n");
1380f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    int ct;
1390f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    for (ct=0; ct < apiCount; ct++) {
1400f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        fprintf(f, "    ");
1410f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        printFuncDecl(f, &apis[ct], "", addContext, 1);
1420f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        fprintf(f, ";\n");
1430f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    }
1440f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    fprintf(f, "} RsApiEntrypoints_t;\n\n");
1450f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}
1460f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
1470f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesvoid printPlaybackFuncs(FILE *f, const char *prefix) {
1480f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    int ct;
1490f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    for (ct=0; ct < apiCount; ct++) {
1500f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        if (apis[ct].direct) {
1510f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            continue;
1520f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        }
1530f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
1540f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        fprintf(f, "void %s%s (Context *, const void *);\n", prefix, apis[ct].name);
1550f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    }
1560f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}
1570f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
1580f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesstatic int hasInlineDataPointers(const ApiEntry * api) {
1590f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    int ret = 0;
1600f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    int ct;
1610f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    if (api->sync || api->ret.typeName[0]) {
1620f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        return 0;
1630f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    }
1640f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    for (ct=0; ct < api->paramCount; ct++) {
1650f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        const VarType *vt = &api->params[ct];
1660f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
1670f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        if (!vt->isConst && vt->ptrLevel) {
1680f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            // Non-const pointers cannot be inlined.
1690f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            return 0;
1700f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        }
1710f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        if (vt->ptrLevel > 1) {
1720f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            // not handled yet.
1730f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            return 0;
1740f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        }
1750f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
1760f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        if (vt->isConst && vt->ptrLevel) {
1770f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            // Non-const pointers cannot be inlined.
1780f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            ret = 1;
1790f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        }
1800f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    }
1810f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    return ret;
1820f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}
1830f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
1840f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesvoid printApiCpp(FILE *f) {
1850f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    int ct;
1860f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    int ct2;
1870f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
1880f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    fprintf(f, "#include \"rsDevice.h\"\n");
1890f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    fprintf(f, "#include \"rsContext.h\"\n");
1900f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    fprintf(f, "#include \"rsThreadIO.h\"\n");
1910f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    fprintf(f, "#include \"rsgApiStructs.h\"\n");
1920f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    fprintf(f, "#include \"rsgApiFuncDecl.h\"\n");
1930f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    fprintf(f, "#include \"rsFifo.h\"\n");
1940f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    fprintf(f, "\n");
1950f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    fprintf(f, "using namespace android;\n");
1960f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    fprintf(f, "using namespace android::renderscript;\n");
1970f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    fprintf(f, "\n");
1980f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
1990f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    printFuncPointers(f, 0);
2000f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
2010f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    // Generate RS funcs for local fifo
2020f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    for (ct=0; ct < apiCount; ct++) {
2030f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        int needFlush = 0;
2040f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        const ApiEntry * api = &apis[ct];
2050f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
2060f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        fprintf(f, "static ");
2070f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        printFuncDecl(f, api, "LF_", 0, 0);
2080f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        fprintf(f, "\n{\n");
2090f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        if (api->direct) {
2100f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            fprintf(f, "    ");
2110f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            if (api->ret.typeName[0]) {
2120f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                fprintf(f, "return ");
2130f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            }
2140f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            fprintf(f, "rsi_%s(", api->name);
2150f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            if (!api->nocontext) {
2160f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                fprintf(f, "(Context *)rsc");
2170f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            }
2180f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            for (ct2=0; ct2 < api->paramCount; ct2++) {
2190f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                const VarType *vt = &api->params[ct2];
2200f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                if (ct2 > 0 || !api->nocontext) {
2210f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                    fprintf(f, ", ");
2220f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                }
2230f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                fprintf(f, "%s", vt->name);
2240f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            }
2250f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            fprintf(f, ");\n");
2260f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        } else {
2270f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            fprintf(f, "    ThreadIO *io = &((Context *)rsc)->mIO;\n");
2280f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            fprintf(f, "    const uint32_t size = sizeof(RS_CMD_%s);\n", api->name);
2290f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            if (hasInlineDataPointers(api)) {
2300f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                fprintf(f, "    uint32_t dataSize = 0;\n");
2310f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                for (ct2=0; ct2 < api->paramCount; ct2++) {
2320f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                    const VarType *vt = &api->params[ct2];
2330f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                    if (vt->isConst && vt->ptrLevel) {
2340f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                        fprintf(f, "    dataSize += %s_length;\n", vt->name);
2350f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                    }
2360f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                }
2370f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            }
2380f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
2390f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            //fprintf(f, "    ALOGE(\"add command %s\\n\");\n", api->name);
2400f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            if (hasInlineDataPointers(api)) {
2410f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                fprintf(f, "    RS_CMD_%s *cmd = NULL;\n", api->name);
2420f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                fprintf(f, "    if (dataSize < io->getMaxInlineSize()) {;\n");
2430f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                fprintf(f, "        cmd = static_cast<RS_CMD_%s *>(io->coreHeader(RS_CMD_ID_%s, dataSize + size));\n", api->name, api->name);
2440f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                fprintf(f, "    } else {\n");
2450f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                fprintf(f, "        cmd = static_cast<RS_CMD_%s *>(io->coreHeader(RS_CMD_ID_%s, size));\n", api->name, api->name);
2460f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                fprintf(f, "    }\n");
2470f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                fprintf(f, "    uint8_t *payload = (uint8_t *)&cmd[1];\n");
2480f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            } else {
2490f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                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);
2500f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            }
2510f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
2520f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            for (ct2=0; ct2 < api->paramCount; ct2++) {
2530f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                const VarType *vt = &api->params[ct2];
2540f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                needFlush += vt->ptrLevel;
2550f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                if (vt->ptrLevel && hasInlineDataPointers(api)) {
2560f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                    fprintf(f, "    if (dataSize < io->getMaxInlineSize()) {\n");
2570f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                    fprintf(f, "        memcpy(payload, %s, %s_length);\n", vt->name, vt->name);
2580f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                    fprintf(f, "        cmd->%s = (", vt->name);
2590f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                    printVarType(f, vt);
2600f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                    fprintf(f, ")(payload - ((uint8_t *)&cmd[1]));\n");
2610f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                    fprintf(f, "        payload += %s_length;\n", vt->name);
2620f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                    fprintf(f, "    } else {\n");
2630f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                    fprintf(f, "        cmd->%s = %s;\n", vt->name, vt->name);
2640f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                    fprintf(f, "    }\n");
2650f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
2660f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                } else {
2670f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                    fprintf(f, "    cmd->%s = %s;\n", vt->name, vt->name);
2680f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                }
2690f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            }
2700f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            if (api->ret.typeName[0] || api->sync) {
2710f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                needFlush = 1;
2720f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            }
2730f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
2740f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            fprintf(f, "    io->coreCommit();\n");
2750f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            if (hasInlineDataPointers(api)) {
2760f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                fprintf(f, "    if (dataSize >= io->getMaxInlineSize()) {\n");
2770f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                fprintf(f, "        io->coreGetReturn(NULL, 0);\n");
2780f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                fprintf(f, "    }\n");
2790f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            } else if (api->ret.typeName[0]) {
2800f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                fprintf(f, "\n    ");
2810f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                printVarType(f, &api->ret);
2820f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                fprintf(f, " ret;\n");
2830f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                fprintf(f, "    io->coreGetReturn(&ret, sizeof(ret));\n");
2840f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                fprintf(f, "    return ret;\n");
2850f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            } else if (needFlush) {
2860f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                fprintf(f, "    io->coreGetReturn(NULL, 0);\n");
2870f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            }
2880f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        }
2890f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        fprintf(f, "};\n\n");
2900f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
2910f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
2920f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        // Generate a remote sender function
2930f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        const char * str = "core";
2940f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        if (api->direct) {
2950f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            str = "async";
2960f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        }
2970f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
2980f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        fprintf(f, "static ");
2990f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        printFuncDecl(f, api, "RF_", 0, 0);
3000f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        fprintf(f, "\n{\n");
3010f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        fprintf(f, "    ThreadIO *io = &((Context *)rsc)->mIO;\n");
3020f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        fprintf(f, "    const uint32_t cmdID = RS_CMD_ID_%s;\n", api->name);
3030f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        fprintf(f, "    io->%sWrite(&cmdID, sizeof(cmdID));\n\n", str);
3040f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
3050f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        for (ct2=0; ct2 < api->paramCount; ct2++) {
3060f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            const VarType *vt = &api->params[ct2];
3070f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            if (vt->ptrLevel == 0) {
3080f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                fprintf(f, "    io->%sWrite(& %s, sizeof(%s));\n", str, vt->name, vt->name);
3090f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            }
3100f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        }
3110f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        fprintf(f, "\n");
3120f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
3130f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        for (ct2=0; ct2 < api->paramCount; ct2++) {
3140f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            const VarType *vt = &api->params[ct2];
3150f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            if ((vt->ptrLevel == 1) && (vt->isConst)) {
3160f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                fprintf(f, "    io->%sWrite(%s, %s_length);\n", str, vt->name, vt->name);
3170f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            }
3180f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        }
3190f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        fprintf(f, "\n");
3200f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
3210f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        for (ct2=0; ct2 < api->paramCount; ct2++) {
3220f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            const VarType *vt = &api->params[ct2];
3230f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            if ((vt->ptrLevel == 2) && (vt->isConst)) {
3240f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                fprintf(f, "    for (size_t ct = 0; ct < (%s_length_length / sizeof(%s_length)); ct++) {\n", vt->name, vt->name);
3250f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                fprintf(f, "        io->%sWrite(%s[ct], %s_length[ct]);\n", str, vt->name, vt->name);
3260f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                fprintf(f, "    }\n");
3270f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            }
3280f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        }
3290f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        fprintf(f, "\n");
3300f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
3310f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        for (ct2=0; ct2 < api->paramCount; ct2++) {
3320f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            const VarType *vt = &api->params[ct2];
3330f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            if ((vt->ptrLevel == 1) && (!vt->isConst)) {
3340f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                fprintf(f, "    io->%sGetReturn(%s, %s_length);\n", str, vt->name, vt->name);
3350f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            }
3360f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        }
3370f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        fprintf(f, "\n");
3380f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
3390f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        for (ct2=0; ct2 < api->paramCount; ct2++) {
3400f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            const VarType *vt = &api->params[ct2];
3410f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            if ((vt->ptrLevel == 2) && (!vt->isConst)) {
3420f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                fprintf(f, "    for (size_t ct = 0; ct < (%s_length_length / sizeof(%s_length)); ct++) {\n", vt->name, vt->name);
3430f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                fprintf(f, "        io->%sGetReturn(%s[ct], %s_length[ct]);\n", str, vt->name, vt->name);
3440f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                fprintf(f, "    }\n");
3450f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            }
3460f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        }
3470f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        fprintf(f, "\n");
3480f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
3490f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        if (api->ret.typeName[0]) {
3500f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            fprintf(f, "    ");
3510f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            printVarType(f, &api->ret);
3520f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            fprintf(f, " retValue;\n");
3530f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            fprintf(f, "    io->%sGetReturn(&retValue, sizeof(retValue));\n", str);
3540f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            fprintf(f, "    return retValue;\n");
3550f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        } else /*if (api->sync)*/ {
3560f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            fprintf(f, "    io->%sGetReturn(NULL, 0);\n", str);
3570f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        }
3580f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        fprintf(f, "}\n\n");
3590f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    }
3600f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
3610f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    fprintf(f, "\n");
3620f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    fprintf(f, "static RsApiEntrypoints_t s_LocalTable = {\n");
3630f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    for (ct=0; ct < apiCount; ct++) {
3640f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        fprintf(f, "    LF_%s,\n", apis[ct].name);
3650f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    }
3660f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    fprintf(f, "};\n");
3670f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
3680f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    fprintf(f, "\n");
3690f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    fprintf(f, "static RsApiEntrypoints_t s_RemoteTable = {\n");
3700f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    for (ct=0; ct < apiCount; ct++) {
3710f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        fprintf(f, "    RF_%s,\n", apis[ct].name);
3720f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    }
3730f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    fprintf(f, "};\n");
3740f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
3750f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    fprintf(f, "static RsApiEntrypoints_t *s_CurrentTable = &s_LocalTable;\n\n");
3760f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    for (ct=0; ct < apiCount; ct++) {
3770f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        int needFlush = 0;
3780f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        const ApiEntry * api = &apis[ct];
3790f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
3800f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        printFuncDecl(f, api, "rs", 0, 0);
3810f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        fprintf(f, "\n{\n");
3820f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        fprintf(f, "    ");
3830f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        if (api->ret.typeName[0]) {
3840f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            fprintf(f, "return ");
3850f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        }
3860f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        fprintf(f, "s_CurrentTable->%s(", api->name);
3870f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
3880f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        if (!api->nocontext) {
3890f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            fprintf(f, "(Context *)rsc");
3900f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        }
3910f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
3920f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        for (ct2=0; ct2 < api->paramCount; ct2++) {
3930f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            const VarType *vt = &api->params[ct2];
3940f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            if (ct2 > 0 || !api->nocontext) {
3950f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                fprintf(f, ", ");
3960f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            }
3970f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            fprintf(f, "%s", vt->name);
3980f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        }
3990f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        fprintf(f, ");\n");
4000f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        fprintf(f, "}\n\n");
4010f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    }
4020f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
4030f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}
4040f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
4050f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesvoid printPlaybackCpp(FILE *f) {
4060f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    int ct;
4070f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    int ct2;
4080f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
4090f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    fprintf(f, "#include \"rsDevice.h\"\n");
4100f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    fprintf(f, "#include \"rsContext.h\"\n");
4110f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    fprintf(f, "#include \"rsThreadIO.h\"\n");
4120f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    fprintf(f, "#include \"rsgApiStructs.h\"\n");
4130f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    fprintf(f, "#include \"rsgApiFuncDecl.h\"\n");
4140f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    fprintf(f, "\n");
4150f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    fprintf(f, "namespace android {\n");
4160f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    fprintf(f, "namespace renderscript {\n");
4170f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    fprintf(f, "\n");
4180f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
4190f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    for (ct=0; ct < apiCount; ct++) {
4200f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        const ApiEntry * api = &apis[ct];
4210f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        int needFlush = 0;
4220f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
4230f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        if (api->direct) {
4240f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            continue;
4250f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        }
4260f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
4270f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        fprintf(f, "void rsp_%s(Context *con, const void *vp, size_t cmdSizeBytes) {\n", api->name);
4280f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        fprintf(f, "    const RS_CMD_%s *cmd = static_cast<const RS_CMD_%s *>(vp);\n", api->name, api->name);
4290f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
4300f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        if (hasInlineDataPointers(api)) {
4310f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            fprintf(f, "    const uint8_t *baseData = 0;\n");
4320f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            fprintf(f, "    if (cmdSizeBytes != sizeof(RS_CMD_%s)) {\n", api->name);
4330f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            fprintf(f, "        baseData = &((const uint8_t *)vp)[sizeof(*cmd)];\n");
4340f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            fprintf(f, "    }\n");
4350f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        }
4360f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
4370f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        fprintf(f, "    ");
4380f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        if (api->ret.typeName[0]) {
4390f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            fprintf(f, "\n    ");
4400f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            printVarType(f, &api->ret);
4410f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            fprintf(f, " ret = ");
4420f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        }
4430f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        fprintf(f, "rsi_%s(con", api->name);
4440f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        for (ct2=0; ct2 < api->paramCount; ct2++) {
4450f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            const VarType *vt = &api->params[ct2];
4460f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            needFlush += vt->ptrLevel;
4470f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
4480f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            if (hasInlineDataPointers(api) && vt->ptrLevel) {
4490f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                fprintf(f, ",\n           (const %s *)&baseData[(intptr_t)cmd->%s]", vt->typeName, vt->name);
4500f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            } else {
4510f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                fprintf(f, ",\n           cmd->%s", vt->name);
4520f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            }
4530f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        }
4540f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        fprintf(f, ");\n");
4550f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
4560f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        if (hasInlineDataPointers(api)) {
4570f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            fprintf(f, "    size_t totalSize = 0;\n");
4580f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            for (ct2=0; ct2 < api->paramCount; ct2++) {
4590f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                if (api->params[ct2].ptrLevel) {
4600f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                    fprintf(f, "    totalSize += cmd->%s_length;\n", api->params[ct2].name);
4610f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                }
4620f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            }
4630f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
4640f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            fprintf(f, "    if ((totalSize != 0) && (cmdSizeBytes == sizeof(RS_CMD_%s))) {\n", api->name);
4650f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            fprintf(f, "        con->mIO.coreSetReturn(NULL, 0);\n");
4660f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            fprintf(f, "    }\n");
4670f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        } else if (api->ret.typeName[0]) {
4680f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            fprintf(f, "    con->mIO.coreSetReturn(&ret, sizeof(ret));\n");
4690f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        } else if (api->sync || needFlush) {
4700f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            fprintf(f, "    con->mIO.coreSetReturn(NULL, 0);\n");
4710f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        }
4720f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
4730f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        fprintf(f, "};\n\n");
4740f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    }
4750f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
4760f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    for (ct=0; ct < apiCount; ct++) {
4770f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        const ApiEntry * api = &apis[ct];
4780f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        int needFlush = 0;
4790f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
4800f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        fprintf(f, "void rspr_%s(Context *con, ThreadIO *io) {\n", api->name);
4810f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        fprintf(f, "    RS_CMD_%s cmd;\n", api->name);
4820f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
4830f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        for (ct2=0; ct2 < api->paramCount; ct2++) {
4840f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            const VarType *vt = &api->params[ct2];
4850f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            if (vt->ptrLevel == 0) {
4860f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                fprintf(f, "    io->coreRead(&cmd.%s, sizeof(cmd.%s));\n", vt->name, vt->name);
4870f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            }
4880f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        }
4890f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        fprintf(f, "\n");
4900f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
4910f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        for (ct2=0; ct2 < api->paramCount; ct2++) {
4920f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            const VarType *vt = &api->params[ct2];
4930f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            if (vt->ptrLevel == 1) {
4940f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                fprintf(f, "    cmd.%s = (", vt->name);
4950f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                printVarType(f, vt);
4960f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                fprintf(f, ")malloc(cmd.%s_length);\n", vt->name);
4970f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
4980f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                if (vt->isConst) {
4990f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                    fprintf(f, "    if (cmd.%s_length) io->coreRead((void *)cmd.%s, cmd.%s_length);\n", vt->name, vt->name, vt->name);
5000f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                }
5010f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            }
5020f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        }
5030f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        fprintf(f, "\n");
5040f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
5050f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        for (ct2=0; ct2 < api->paramCount; ct2++) {
5060f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            const VarType *vt = &api->params[ct2];
5070f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            if (vt->ptrLevel == 2) {
5080f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                fprintf(f, "    for (size_t ct = 0; ct < (cmd.%s_length_length / sizeof(cmd.%s_length)); ct++) {\n", vt->name, vt->name);
5090f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                fprintf(f, "        cmd.%s = (", vt->name);
5100f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                printVarType(f, vt);
5110f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                fprintf(f, ")malloc(cmd.%s_length[ct]);\n", vt->name);
5120f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                fprintf(f, "        io->coreRead(& cmd.%s, cmd.%s_length[ct]);\n", vt->name, vt->name);
5130f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                fprintf(f, "    }\n");
5140f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            }
5150f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        }
5160f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        fprintf(f, "\n");
5170f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
5180f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        if (api->ret.typeName[0]) {
5190f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            fprintf(f, "    ");
5200f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            printVarType(f, &api->ret);
5210f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            fprintf(f, " ret =\n");
5220f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        }
5230f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
5240f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        fprintf(f, "    rsi_%s(", api->name);
5250f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        if (!api->nocontext) {
5260f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            fprintf(f, "con");
5270f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        }
5280f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        for (ct2=0; ct2 < api->paramCount; ct2++) {
5290f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            const VarType *vt = &api->params[ct2];
5300f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            if (ct2 > 0 || !api->nocontext) {
5310f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                fprintf(f, ",\n");
5320f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            }
5330f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            fprintf(f, "           cmd.%s", vt->name);
5340f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        }
5350f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        fprintf(f, ");\n");
5360f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
5370f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        for (ct2=0; ct2 < api->paramCount; ct2++) {
5380f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            const VarType *vt = &api->params[ct2];
5390f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            if ((vt->ptrLevel == 1) && (!vt->isConst)) {
5400f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                fprintf(f, "    io->coreSetReturn((void *)cmd.%s, cmd.%s_length);\n", vt->name, vt->name);
5410f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            }
5420f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        }
5430f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
5440f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        for (ct2=0; ct2 < api->paramCount; ct2++) {
5450f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            const VarType *vt = &api->params[ct2];
5460f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            if ((vt->ptrLevel == 2) && (!vt->isConst)) {
5470f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                fprintf(f, "    for (size_t ct = 0; ct < (cmd.%s_length_length / sizeof(cmd.%s_length)); ct++) {\n", vt->name, vt->name);
5480f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                fprintf(f, "        io->coreSetReturn((void *)cmd.%s[ct], cmd.%s_length[ct]);\n", vt->name, vt->name);
5490f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                fprintf(f, "    }\n");
5500f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            }
5510f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        }
5520f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        fprintf(f, "\n");
5530f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
5540f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        if (api->ret.typeName[0]) {
5550f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            fprintf(f, "    io->coreSetReturn(&ret, sizeof(ret));\n");
5560f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        } else /*if (needFlush)*/ {
5570f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            fprintf(f, "    io->coreSetReturn(NULL, 0);\n");
5580f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        }
5590f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
5600f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        for (ct2=0; ct2 < api->paramCount; ct2++) {
5610f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            const VarType *vt = &api->params[ct2];
5620f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            if (vt->ptrLevel == 1) {
5630f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                fprintf(f, "    free((void *)cmd.%s);\n", vt->name);
5640f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            }
5650f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        }
5660f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        for (ct2=0; ct2 < api->paramCount; ct2++) {
5670f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            const VarType *vt = &api->params[ct2];
5680f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            if (vt->ptrLevel == 2) {
5690f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                fprintf(f, "    for (size_t ct = 0; ct < (cmd.%s_length_length / sizeof(cmd.%s_length)); ct++) {\n", vt->name, vt->name);
5700f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                fprintf(f, "        free((void *)cmd.%s);\n", vt->name);
5710f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines                fprintf(f, "    }\n");
5720f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            }
5730f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        }
5740f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
5750f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        fprintf(f, "};\n\n");
5760f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    }
5770f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
5780f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    fprintf(f, "RsPlaybackLocalFunc gPlaybackFuncs[%i] = {\n", apiCount + 1);
5790f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    fprintf(f, "    NULL,\n");
5800f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    for (ct=0; ct < apiCount; ct++) {
5810f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        if (apis[ct].direct) {
5820f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            fprintf(f, "    NULL,\n");
5830f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        } else {
5840f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            fprintf(f, "    %s%s,\n", "rsp_", apis[ct].name);
5850f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        }
5860f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    }
5870f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    fprintf(f, "};\n");
5880f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
5890f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    fprintf(f, "RsPlaybackRemoteFunc gPlaybackRemoteFuncs[%i] = {\n", apiCount + 1);
5900f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    fprintf(f, "    NULL,\n");
5910f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    for (ct=0; ct < apiCount; ct++) {
5920f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        fprintf(f, "    %s%s,\n", "rspr_", apis[ct].name);
5930f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    }
5940f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    fprintf(f, "};\n");
5950f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
5960f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    fprintf(f, "};\n");
5970f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    fprintf(f, "};\n");
5980f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}
5990f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
6000f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesvoid yylex();
6010f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
6020f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesint main(int argc, char **argv) {
6030f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    if (argc != 3) {
6040f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        fprintf(stderr, "usage: %s commandFile outFile\n", argv[0]);
6050f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        return 1;
6060f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    }
6070f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    const char* rsgFile = argv[1];
6080f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    const char* outFile = argv[2];
6090f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    FILE* input = fopen(rsgFile, "r");
6100f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
6110f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    char choice = fgetc(input);
6120f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    fclose(input);
6130f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
6140f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    if (choice < '0' || choice > '3') {
6150f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        fprintf(stderr, "Uknown command: \'%c\'\n", choice);
6160f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        return -2;
6170f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    }
6180f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
6190f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    yylex();
6200f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    // printf("# of lines = %d\n", num_lines);
6210f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
6220f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    FILE *f = fopen(outFile, "w");
6230f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
6240f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    printFileHeader(f);
6250f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    switch (choice) {
6260f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        case '0': // rsgApiStructs.h
6270f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        {
6280f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            fprintf(f, "\n");
6290f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            fprintf(f, "#include \"rsContext.h\"\n");
6300f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            fprintf(f, "#include \"rsFifo.h\"\n");
6310f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            fprintf(f, "\n");
6320f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            fprintf(f, "namespace android {\n");
6330f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            fprintf(f, "namespace renderscript {\n");
6340f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            printStructures(f);
6350f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            printFuncDecls(f, "rsi_", 1);
6360f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            printPlaybackFuncs(f, "rsp_");
6370f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            fprintf(f, "\n\ntypedef struct RsPlaybackRemoteHeaderRec {\n");
6380f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            fprintf(f, "    uint32_t command;\n");
6390f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            fprintf(f, "    uint32_t size;\n");
6400f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            fprintf(f, "} RsPlaybackRemoteHeader;\n\n");
6410f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            fprintf(f, "typedef void (*RsPlaybackLocalFunc)(Context *, const void *, size_t sizeBytes);\n");
6420f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            fprintf(f, "typedef void (*RsPlaybackRemoteFunc)(Context *, ThreadIO *);\n");
6430f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            fprintf(f, "extern RsPlaybackLocalFunc gPlaybackFuncs[%i];\n", apiCount + 1);
6440f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            fprintf(f, "extern RsPlaybackRemoteFunc gPlaybackRemoteFuncs[%i];\n", apiCount + 1);
6450f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
6460f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            fprintf(f, "}\n");
6470f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            fprintf(f, "}\n");
6480f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        }
6490f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        break;
6500f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
6510f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        case '1': // rsgApiFuncDecl.h
6520f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        {
6530f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            printFuncDecls(f, "rs", 0);
6540f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        }
6550f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        break;
6560f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
6570f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        case '2': // rsgApi.cpp
6580f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        {
6590f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            printApiCpp(f);
6600f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        }
6610f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        break;
6620f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
6630f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        case '3': // rsgApiReplay.cpp
6640f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        {
6650f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            printFileHeader(f);
6660f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            printPlaybackCpp(f);
6670f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        }
6680f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        break;
6690f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
6700f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        case '4': // rsgApiStream.cpp
6710f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        {
6720f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            printFileHeader(f);
6730f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            printPlaybackCpp(f);
6740f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        }
6750f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
6760f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        case '5': // rsgApiStreamReplay.cpp
6770f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        {
6780f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            printFileHeader(f);
6790f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines            printPlaybackCpp(f);
6800f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        }
6810f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        break;
6820f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    }
6830f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    fclose(f);
6840f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    return 0;
6850f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}
686