1326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
284614dd02411e1cf9a4c37aa421898c471cfad20Joe Onorato#include "spec.h"
384614dd02411e1cf9a4c37aa421898c471cfad20Joe Onorato#include <stdio.h>
4da3b58d804b59595f1c618ff271fecd8a9ce59edShih-wei Liao#include <string.h>
5326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
6afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid printFileHeader(FILE *f) {
7326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    fprintf(f, "/*\n");
8186e59154a0fb86e05e283e9c083b69878c06720Jason Sams    fprintf(f, " * Copyright (C) 2011 The Android Open Source Project\n");
9326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    fprintf(f, " *\n");
10326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    fprintf(f, " * Licensed under the Apache License, Version 2.0 (the \"License\");\n");
11326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    fprintf(f, " * you may not use this file except in compliance with the License.\n");
12326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    fprintf(f, " * You may obtain a copy of the License at\n");
13326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    fprintf(f, " *\n");
14326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    fprintf(f, " *      http://www.apache.org/licenses/LICENSE-2.0\n");
15326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    fprintf(f, " *\n");
16326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    fprintf(f, " * Unless required by applicable law or agreed to in writing, software\n");
17326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    fprintf(f, " * distributed under the License is distributed on an \"AS IS\" BASIS,\n");
18326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    fprintf(f, " * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n");
19326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    fprintf(f, " * See the License for the specific language governing permissions and\n");
20326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    fprintf(f, " * limitations under the License.\n");
21326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    fprintf(f, " */\n\n");
22326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
23326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
24afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid printVarType(FILE *f, const VarType *vt) {
25326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    int ct;
26326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    if (vt->isConst) {
27326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        fprintf(f, "const ");
28326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
29326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
30afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk    switch (vt->type) {
31326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    case 0:
32326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        fprintf(f, "void");
33326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        break;
34326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    case 1:
35326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        fprintf(f, "int%i_t", vt->bits);
36326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        break;
37326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    case 2:
38326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        fprintf(f, "uint%i_t", vt->bits);
39326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        break;
40326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    case 3:
41326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        if (vt->bits == 32)
42326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams            fprintf(f, "float");
43326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        else
44326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams            fprintf(f, "double");
45326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        break;
46326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    case 4:
4784614dd02411e1cf9a4c37aa421898c471cfad20Joe Onorato        fprintf(f, "%s", vt->typeName);
48326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        break;
49326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
50326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
51afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk    if (vt->ptrLevel) {
52326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        fprintf(f, " ");
53afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk        for (ct=0; ct < vt->ptrLevel; ct++) {
54326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams            fprintf(f, "*");
55326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        }
56326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
575fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams}
585fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams
595fb1aeb6374f814d72117803682bc141cc6b0895Jason Samsvoid printVarTypeAndName(FILE *f, const VarType *vt) {
605fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams    printVarType(f, vt);
61326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
62afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk    if (vt->name[0]) {
63326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        fprintf(f, " %s", vt->name);
64326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
65326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
66326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
67afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid printArgList(FILE *f, const ApiEntry * api, int assumePrevious) {
68326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    int ct;
69afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk    for (ct=0; ct < api->paramCount; ct++) {
70326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        if (ct || assumePrevious) {
71326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams            fprintf(f, ", ");
72326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        }
735fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams        printVarTypeAndName(f, &api->params[ct]);
74326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
75326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
76326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
77afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid printStructures(FILE *f) {
78326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    int ct;
79326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    int ct2;
80326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
81afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk    for (ct=0; ct < apiCount; ct++) {
82326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        fprintf(f, "typedef struct RS_CMD_%s_rec RS_CMD_%s;\n", apis[ct].name, apis[ct].name);
83326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
84326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    fprintf(f, "\n");
85326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
86afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk    for (ct=0; ct < apiCount; ct++) {
87326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        const ApiEntry * api = &apis[ct];
88326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        fprintf(f, "#define RS_CMD_ID_%s %i\n", api->name, ct+1);
89326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        fprintf(f, "struct RS_CMD_%s_rec {\n", api->name);
90326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        //fprintf(f, "    RsCommandHeader _hdr;\n");
91326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
92afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk        for (ct2=0; ct2 < api->paramCount; ct2++) {
93326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams            fprintf(f, "    ");
945fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams            printVarTypeAndName(f, &api->params[ct2]);
95326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams            fprintf(f, ";\n");
96326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        }
97326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        fprintf(f, "};\n\n");
98326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
99326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
100326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
101c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Samsvoid printFuncDecl(FILE *f, const ApiEntry *api, const char *prefix, int addContext, int isFnPtr) {
1025fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams    printVarTypeAndName(f, &api->ret);
103c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams    if (isFnPtr) {
104c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams        char t[1024];
105c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams        strcpy(t, api->name);
106c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams        if (strlen(prefix) == 0) {
107c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams            if (t[0] > 'A' && t[0] < 'Z') {
108c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams                t[0] -= 'A' - 'a';
109c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams            }
110c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams        }
111c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams        fprintf(f, " (* %s%s) (", prefix, api->name);
112c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams    } else {
113c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams        fprintf(f, " %s%s (", prefix, api->name);
114c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams    }
115186e59154a0fb86e05e283e9c083b69878c06720Jason Sams    if (!api->nocontext) {
116186e59154a0fb86e05e283e9c083b69878c06720Jason Sams        if (addContext) {
117186e59154a0fb86e05e283e9c083b69878c06720Jason Sams            fprintf(f, "Context *");
118186e59154a0fb86e05e283e9c083b69878c06720Jason Sams        } else {
119186e59154a0fb86e05e283e9c083b69878c06720Jason Sams            fprintf(f, "RsContext rsc");
120186e59154a0fb86e05e283e9c083b69878c06720Jason Sams        }
121326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
122186e59154a0fb86e05e283e9c083b69878c06720Jason Sams    printArgList(f, api, !api->nocontext);
123326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    fprintf(f, ")");
124326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
125326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
126afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid printFuncDecls(FILE *f, const char *prefix, int addContext) {
127326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    int ct;
128afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk    for (ct=0; ct < apiCount; ct++) {
129c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams        printFuncDecl(f, &apis[ct], prefix, addContext, 0);
130326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        fprintf(f, ";\n");
131326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
132326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    fprintf(f, "\n\n");
133326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
134326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
135c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Samsvoid printFuncPointers(FILE *f, int addContext) {
136c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams    fprintf(f, "\n");
137c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams    fprintf(f, "typedef struct RsApiEntrypoints {\n");
138c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams    int ct;
139c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams    for (ct=0; ct < apiCount; ct++) {
140c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams        fprintf(f, "    ");
141c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams        printFuncDecl(f, &apis[ct], "", addContext, 1);
142c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams        fprintf(f, ";\n");
143c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams    }
144c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams    fprintf(f, "} RsApiEntrypoints_t;\n\n");
145c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams}
146c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams
147afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid printPlaybackFuncs(FILE *f, const char *prefix) {
148326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    int ct;
149afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk    for (ct=0; ct < apiCount; ct++) {
150186e59154a0fb86e05e283e9c083b69878c06720Jason Sams        if (apis[ct].direct) {
151186e59154a0fb86e05e283e9c083b69878c06720Jason Sams            continue;
152186e59154a0fb86e05e283e9c083b69878c06720Jason Sams        }
153186e59154a0fb86e05e283e9c083b69878c06720Jason Sams
154326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        fprintf(f, "void %s%s (Context *, const void *);\n", prefix, apis[ct].name);
155326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
156326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
157326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
1585fb1aeb6374f814d72117803682bc141cc6b0895Jason Samsstatic int hasInlineDataPointers(const ApiEntry * api) {
1595fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams    int ret = 0;
1605fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams    int ct;
161b693112b7513227b06d4a0a4e712ad3ce01451b4Jason Sams    if (api->sync || api->ret.typeName[0]) {
1625fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams        return 0;
1635fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams    }
1645fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams    for (ct=0; ct < api->paramCount; ct++) {
1655fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams        const VarType *vt = &api->params[ct];
1665fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams
1675fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams        if (!vt->isConst && vt->ptrLevel) {
1685fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams            // Non-const pointers cannot be inlined.
1695fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams            return 0;
1705fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams        }
1715fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams        if (vt->ptrLevel > 1) {
1725fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams            // not handled yet.
1735fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams            return 0;
1745fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams        }
1755fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams
1765fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams        if (vt->isConst && vt->ptrLevel) {
1775fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams            // Non-const pointers cannot be inlined.
1785fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams            ret = 1;
1795fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams        }
1805fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams    }
1815fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams    return ret;
1825fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams}
1835fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams
184afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid printApiCpp(FILE *f) {
185326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    int ct;
186326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    int ct2;
187326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
188326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    fprintf(f, "#include \"rsDevice.h\"\n");
189326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    fprintf(f, "#include \"rsContext.h\"\n");
190326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    fprintf(f, "#include \"rsThreadIO.h\"\n");
1914edf030cbb7c6ac08dc563335c2af73c20f6e2e5Alex Sakhartchouk    fprintf(f, "#include \"rsgApiStructs.h\"\n");
192326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    fprintf(f, "#include \"rsgApiFuncDecl.h\"\n");
1932008747941749ad27fe80663d23036ac320e998fJason Sams    fprintf(f, "#include \"rsFifo.h\"\n");
194326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    fprintf(f, "\n");
195326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    fprintf(f, "using namespace android;\n");
196326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    fprintf(f, "using namespace android::renderscript;\n");
197326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    fprintf(f, "\n");
198326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
199c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams    printFuncPointers(f, 0);
200c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams
201c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams    // Generate RS funcs for local fifo
202afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk    for (ct=0; ct < apiCount; ct++) {
203326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        int needFlush = 0;
204326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        const ApiEntry * api = &apis[ct];
205326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
206c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams        fprintf(f, "static ");
207c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams        printFuncDecl(f, api, "LF_", 0, 0);
208326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        fprintf(f, "\n{\n");
2091a4efa363916977ef9aeab756725b3bdc880a15bJason Sams        if (api->direct) {
2101a4efa363916977ef9aeab756725b3bdc880a15bJason Sams            fprintf(f, "    ");
2111a4efa363916977ef9aeab756725b3bdc880a15bJason Sams            if (api->ret.typeName[0]) {
2121a4efa363916977ef9aeab756725b3bdc880a15bJason Sams                fprintf(f, "return ");
2131a4efa363916977ef9aeab756725b3bdc880a15bJason Sams            }
2141a4efa363916977ef9aeab756725b3bdc880a15bJason Sams            fprintf(f, "rsi_%s(", api->name);
2151a4efa363916977ef9aeab756725b3bdc880a15bJason Sams            if (!api->nocontext) {
2161a4efa363916977ef9aeab756725b3bdc880a15bJason Sams                fprintf(f, "(Context *)rsc");
217c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams            }
218afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk            for (ct2=0; ct2 < api->paramCount; ct2++) {
2199397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams                const VarType *vt = &api->params[ct2];
220c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams                if (ct2 > 0 || !api->nocontext) {
221c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams                    fprintf(f, ", ");
222c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams                }
223c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams                fprintf(f, "%s", vt->name);
2249397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams            }
2259397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams            fprintf(f, ");\n");
2269397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams        } else {
2274d252d6e807b89764dad123ac845df298c52ca97Tim Murray            // handle synchronous path
2284d252d6e807b89764dad123ac845df298c52ca97Tim Murray            fprintf(f, "    if (((Context *)rsc)->isSynchronous()) {\n");
2294d252d6e807b89764dad123ac845df298c52ca97Tim Murray            fprintf(f, "        ");
2304d252d6e807b89764dad123ac845df298c52ca97Tim Murray            if (api->ret.typeName[0]) {
2314d252d6e807b89764dad123ac845df298c52ca97Tim Murray                fprintf(f, "return ");
2324d252d6e807b89764dad123ac845df298c52ca97Tim Murray            }
2334d252d6e807b89764dad123ac845df298c52ca97Tim Murray            fprintf(f, "rsi_%s(", api->name);
2344d252d6e807b89764dad123ac845df298c52ca97Tim Murray            if (!api->nocontext) {
2354d252d6e807b89764dad123ac845df298c52ca97Tim Murray                fprintf(f, "(Context *)rsc");
2364d252d6e807b89764dad123ac845df298c52ca97Tim Murray            }
2374d252d6e807b89764dad123ac845df298c52ca97Tim Murray            for (ct2=0; ct2 < api->paramCount; ct2++) {
2384d252d6e807b89764dad123ac845df298c52ca97Tim Murray                const VarType *vt = &api->params[ct2];
2394d252d6e807b89764dad123ac845df298c52ca97Tim Murray                if (ct2 > 0 || !api->nocontext) {
2404d252d6e807b89764dad123ac845df298c52ca97Tim Murray                    fprintf(f, ", ");
2414d252d6e807b89764dad123ac845df298c52ca97Tim Murray                }
2424d252d6e807b89764dad123ac845df298c52ca97Tim Murray                fprintf(f, "%s", vt->name);
2434d252d6e807b89764dad123ac845df298c52ca97Tim Murray            }
2444d252d6e807b89764dad123ac845df298c52ca97Tim Murray            fprintf(f, ");\n");
2454d252d6e807b89764dad123ac845df298c52ca97Tim Murray            if (!api->ret.typeName[0]) {
2464d252d6e807b89764dad123ac845df298c52ca97Tim Murray                fprintf(f, "    return;");
2474d252d6e807b89764dad123ac845df298c52ca97Tim Murray            }
2484d252d6e807b89764dad123ac845df298c52ca97Tim Murray            fprintf(f, "    }\n\n");
2494d252d6e807b89764dad123ac845df298c52ca97Tim Murray
2509397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams            fprintf(f, "    ThreadIO *io = &((Context *)rsc)->mIO;\n");
251099bc262f862cdeb547cf8a78fe9e0e92560f437Tim Murray            fprintf(f, "    const size_t size = sizeof(RS_CMD_%s);\n", api->name);
2525fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams            if (hasInlineDataPointers(api)) {
253099bc262f862cdeb547cf8a78fe9e0e92560f437Tim Murray                fprintf(f, "    size_t dataSize = 0;\n");
2545fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams                for (ct2=0; ct2 < api->paramCount; ct2++) {
2555fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams                    const VarType *vt = &api->params[ct2];
2565fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams                    if (vt->isConst && vt->ptrLevel) {
2575fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams                        fprintf(f, "    dataSize += %s_length;\n", vt->name);
2585fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams                    }
2595fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams                }
2605fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams            }
2615fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams
262af12ac6a08651464f8d823add667c706f993b587Steve Block            //fprintf(f, "    ALOGE(\"add command %s\\n\");\n", api->name);
2635fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams            if (hasInlineDataPointers(api)) {
264b693112b7513227b06d4a0a4e712ad3ce01451b4Jason Sams                fprintf(f, "    RS_CMD_%s *cmd = NULL;\n", api->name);
265bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams                fprintf(f, "    if (dataSize < io->getMaxInlineSize()) {;\n");
2661a4efa363916977ef9aeab756725b3bdc880a15bJason Sams                fprintf(f, "        cmd = static_cast<RS_CMD_%s *>(io->coreHeader(RS_CMD_ID_%s, dataSize + size));\n", api->name, api->name);
267b693112b7513227b06d4a0a4e712ad3ce01451b4Jason Sams                fprintf(f, "    } else {\n");
2681a4efa363916977ef9aeab756725b3bdc880a15bJason Sams                fprintf(f, "        cmd = static_cast<RS_CMD_%s *>(io->coreHeader(RS_CMD_ID_%s, size));\n", api->name, api->name);
269b693112b7513227b06d4a0a4e712ad3ce01451b4Jason Sams                fprintf(f, "    }\n");
2705fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams                fprintf(f, "    uint8_t *payload = (uint8_t *)&cmd[1];\n");
2716e58aef90ec70adf4e7d6d18b869aed143a2ec02Jason Sams            } else {
2721a4efa363916977ef9aeab756725b3bdc880a15bJason 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);
2735fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams            }
2749397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams
275afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk            for (ct2=0; ct2 < api->paramCount; ct2++) {
2769397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams                const VarType *vt = &api->params[ct2];
2779397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams                needFlush += vt->ptrLevel;
2785fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams                if (vt->ptrLevel && hasInlineDataPointers(api)) {
279bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams                    fprintf(f, "    if (dataSize < io->getMaxInlineSize()) {\n");
2805fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams                    fprintf(f, "        memcpy(payload, %s, %s_length);\n", vt->name, vt->name);
2815fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams                    fprintf(f, "        cmd->%s = (", vt->name);
2825fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams                    printVarType(f, vt);
2835f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams                    fprintf(f, ")(payload - ((uint8_t *)&cmd[1]));\n");
2845fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams                    fprintf(f, "        payload += %s_length;\n", vt->name);
2855fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams                    fprintf(f, "    } else {\n");
2865fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams                    fprintf(f, "        cmd->%s = %s;\n", vt->name, vt->name);
2875fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams                    fprintf(f, "    }\n");
2885fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams
2895fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams                } else {
2905fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams                    fprintf(f, "    cmd->%s = %s;\n", vt->name, vt->name);
2915fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams                }
2929397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams            }
2931a4efa363916977ef9aeab756725b3bdc880a15bJason Sams            if (api->ret.typeName[0] || api->sync) {
2949397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams                needFlush = 1;
2959397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams            }
2969397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams
2975f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams            fprintf(f, "    io->coreCommit();\n");
2985fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams            if (hasInlineDataPointers(api)) {
299bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams                fprintf(f, "    if (dataSize >= io->getMaxInlineSize()) {\n");
3005f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams                fprintf(f, "        io->coreGetReturn(NULL, 0);\n");
3015fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams                fprintf(f, "    }\n");
3025f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams            } else if (api->ret.typeName[0]) {
3031a4efa363916977ef9aeab756725b3bdc880a15bJason Sams                fprintf(f, "\n    ");
3042008747941749ad27fe80663d23036ac320e998fJason Sams                printVarType(f, &api->ret);
3051a4efa363916977ef9aeab756725b3bdc880a15bJason Sams                fprintf(f, " ret;\n");
3061a4efa363916977ef9aeab756725b3bdc880a15bJason Sams                fprintf(f, "    io->coreGetReturn(&ret, sizeof(ret));\n");
3071a4efa363916977ef9aeab756725b3bdc880a15bJason Sams                fprintf(f, "    return ret;\n");
3085f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams            } else if (needFlush) {
3095f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams                fprintf(f, "    io->coreGetReturn(NULL, 0);\n");
3109397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams            }
311326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        }
312326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        fprintf(f, "};\n\n");
3132008747941749ad27fe80663d23036ac320e998fJason Sams
3142008747941749ad27fe80663d23036ac320e998fJason Sams
315bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams        // Generate a remote sender function
316bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams        const char * str = "core";
317bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams        if (api->direct) {
318bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams            str = "async";
319bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams        }
320bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams
3212008747941749ad27fe80663d23036ac320e998fJason Sams        fprintf(f, "static ");
3222008747941749ad27fe80663d23036ac320e998fJason Sams        printFuncDecl(f, api, "RF_", 0, 0);
3232008747941749ad27fe80663d23036ac320e998fJason Sams        fprintf(f, "\n{\n");
324bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams        fprintf(f, "    ThreadIO *io = &((Context *)rsc)->mIO;\n");
3252008747941749ad27fe80663d23036ac320e998fJason Sams        fprintf(f, "    const uint32_t cmdID = RS_CMD_ID_%s;\n", api->name);
326bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams        fprintf(f, "    io->%sWrite(&cmdID, sizeof(cmdID));\n\n", str);
327bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams
3281a4efa363916977ef9aeab756725b3bdc880a15bJason Sams        for (ct2=0; ct2 < api->paramCount; ct2++) {
3291a4efa363916977ef9aeab756725b3bdc880a15bJason Sams            const VarType *vt = &api->params[ct2];
330bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams            if (vt->ptrLevel == 0) {
331bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams                fprintf(f, "    io->%sWrite(& %s, sizeof(%s));\n", str, vt->name, vt->name);
3322008747941749ad27fe80663d23036ac320e998fJason Sams            }
3331a4efa363916977ef9aeab756725b3bdc880a15bJason Sams        }
3341a4efa363916977ef9aeab756725b3bdc880a15bJason Sams        fprintf(f, "\n");
3352008747941749ad27fe80663d23036ac320e998fJason Sams
3361a4efa363916977ef9aeab756725b3bdc880a15bJason Sams        for (ct2=0; ct2 < api->paramCount; ct2++) {
3371a4efa363916977ef9aeab756725b3bdc880a15bJason Sams            const VarType *vt = &api->params[ct2];
338bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams            if ((vt->ptrLevel == 1) && (vt->isConst)) {
339bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams                fprintf(f, "    io->%sWrite(%s, %s_length);\n", str, vt->name, vt->name);
340bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams            }
341bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams        }
342bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams        fprintf(f, "\n");
343bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams
344bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams        for (ct2=0; ct2 < api->paramCount; ct2++) {
345bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams            const VarType *vt = &api->params[ct2];
346bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams            if ((vt->ptrLevel == 2) && (vt->isConst)) {
3471a4efa363916977ef9aeab756725b3bdc880a15bJason Sams                fprintf(f, "    for (size_t ct = 0; ct < (%s_length_length / sizeof(%s_length)); ct++) {\n", vt->name, vt->name);
348bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams                fprintf(f, "        io->%sWrite(%s[ct], %s_length[ct]);\n", str, vt->name, vt->name);
3491a4efa363916977ef9aeab756725b3bdc880a15bJason Sams                fprintf(f, "    }\n");
3502008747941749ad27fe80663d23036ac320e998fJason Sams            }
3511a4efa363916977ef9aeab756725b3bdc880a15bJason Sams        }
3521a4efa363916977ef9aeab756725b3bdc880a15bJason Sams        fprintf(f, "\n");
3532008747941749ad27fe80663d23036ac320e998fJason Sams
3541a4efa363916977ef9aeab756725b3bdc880a15bJason Sams        for (ct2=0; ct2 < api->paramCount; ct2++) {
3551a4efa363916977ef9aeab756725b3bdc880a15bJason Sams            const VarType *vt = &api->params[ct2];
356bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams            if ((vt->ptrLevel == 1) && (!vt->isConst)) {
357bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams                fprintf(f, "    io->%sGetReturn(%s, %s_length);\n", str, vt->name, vt->name);
3581a4efa363916977ef9aeab756725b3bdc880a15bJason Sams            }
359bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams        }
360bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams        fprintf(f, "\n");
361bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams
362bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams        for (ct2=0; ct2 < api->paramCount; ct2++) {
363bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams            const VarType *vt = &api->params[ct2];
364bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams            if ((vt->ptrLevel == 2) && (!vt->isConst)) {
3651a4efa363916977ef9aeab756725b3bdc880a15bJason Sams                fprintf(f, "    for (size_t ct = 0; ct < (%s_length_length / sizeof(%s_length)); ct++) {\n", vt->name, vt->name);
366bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams                fprintf(f, "        io->%sGetReturn(%s[ct], %s_length[ct]);\n", str, vt->name, vt->name);
3671a4efa363916977ef9aeab756725b3bdc880a15bJason Sams                fprintf(f, "    }\n");
3682008747941749ad27fe80663d23036ac320e998fJason Sams            }
3692008747941749ad27fe80663d23036ac320e998fJason Sams        }
370bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams        fprintf(f, "\n");
3711a4efa363916977ef9aeab756725b3bdc880a15bJason Sams
3721a4efa363916977ef9aeab756725b3bdc880a15bJason Sams        if (api->ret.typeName[0]) {
3731a4efa363916977ef9aeab756725b3bdc880a15bJason Sams            fprintf(f, "    ");
3741a4efa363916977ef9aeab756725b3bdc880a15bJason Sams            printVarType(f, &api->ret);
3751a4efa363916977ef9aeab756725b3bdc880a15bJason Sams            fprintf(f, " retValue;\n");
376bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams            fprintf(f, "    io->%sGetReturn(&retValue, sizeof(retValue));\n", str);
3771a4efa363916977ef9aeab756725b3bdc880a15bJason Sams            fprintf(f, "    return retValue;\n");
378bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams        } else /*if (api->sync)*/ {
379bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams            fprintf(f, "    io->%sGetReturn(NULL, 0);\n", str);
3801a4efa363916977ef9aeab756725b3bdc880a15bJason Sams        }
3812008747941749ad27fe80663d23036ac320e998fJason Sams        fprintf(f, "}\n\n");
382326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
383c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams
384c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams    fprintf(f, "\n");
385c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams    fprintf(f, "static RsApiEntrypoints_t s_LocalTable = {\n");
386c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams    for (ct=0; ct < apiCount; ct++) {
387c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams        fprintf(f, "    LF_%s,\n", apis[ct].name);
388c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams    }
389c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams    fprintf(f, "};\n");
390c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams
3912008747941749ad27fe80663d23036ac320e998fJason Sams    fprintf(f, "\n");
3922008747941749ad27fe80663d23036ac320e998fJason Sams    fprintf(f, "static RsApiEntrypoints_t s_RemoteTable = {\n");
3932008747941749ad27fe80663d23036ac320e998fJason Sams    for (ct=0; ct < apiCount; ct++) {
3942008747941749ad27fe80663d23036ac320e998fJason Sams        fprintf(f, "    RF_%s,\n", apis[ct].name);
3952008747941749ad27fe80663d23036ac320e998fJason Sams    }
3962008747941749ad27fe80663d23036ac320e998fJason Sams    fprintf(f, "};\n");
397c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams
3982008747941749ad27fe80663d23036ac320e998fJason Sams    fprintf(f, "static RsApiEntrypoints_t *s_CurrentTable = &s_LocalTable;\n\n");
399c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams    for (ct=0; ct < apiCount; ct++) {
400c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams        int needFlush = 0;
401c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams        const ApiEntry * api = &apis[ct];
402c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams
403c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams        printFuncDecl(f, api, "rs", 0, 0);
404c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams        fprintf(f, "\n{\n");
405c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams        fprintf(f, "    ");
406c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams        if (api->ret.typeName[0]) {
407c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams            fprintf(f, "return ");
408c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams        }
409c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams        fprintf(f, "s_CurrentTable->%s(", api->name);
410c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams
411c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams        if (!api->nocontext) {
412c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams            fprintf(f, "(Context *)rsc");
413c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams        }
414c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams
415c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams        for (ct2=0; ct2 < api->paramCount; ct2++) {
416c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams            const VarType *vt = &api->params[ct2];
417c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams            if (ct2 > 0 || !api->nocontext) {
418c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams                fprintf(f, ", ");
419c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams            }
420c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams            fprintf(f, "%s", vt->name);
421c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams        }
422c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams        fprintf(f, ");\n");
423c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams        fprintf(f, "}\n\n");
424c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams    }
425c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams
426326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
427326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
428afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid printPlaybackCpp(FILE *f) {
429326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    int ct;
430326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    int ct2;
431326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
432326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    fprintf(f, "#include \"rsDevice.h\"\n");
433326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    fprintf(f, "#include \"rsContext.h\"\n");
434326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    fprintf(f, "#include \"rsThreadIO.h\"\n");
4354edf030cbb7c6ac08dc563335c2af73c20f6e2e5Alex Sakhartchouk    fprintf(f, "#include \"rsgApiStructs.h\"\n");
436326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    fprintf(f, "#include \"rsgApiFuncDecl.h\"\n");
437326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    fprintf(f, "\n");
438326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    fprintf(f, "namespace android {\n");
439326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    fprintf(f, "namespace renderscript {\n");
440326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    fprintf(f, "\n");
441326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
442afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk    for (ct=0; ct < apiCount; ct++) {
443326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        const ApiEntry * api = &apis[ct];
4445f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams        int needFlush = 0;
445326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
446186e59154a0fb86e05e283e9c083b69878c06720Jason Sams        if (api->direct) {
447186e59154a0fb86e05e283e9c083b69878c06720Jason Sams            continue;
448186e59154a0fb86e05e283e9c083b69878c06720Jason Sams        }
449186e59154a0fb86e05e283e9c083b69878c06720Jason Sams
4502008747941749ad27fe80663d23036ac320e998fJason Sams        fprintf(f, "void rsp_%s(Context *con, const void *vp, size_t cmdSizeBytes) {\n", api->name);
451186e59154a0fb86e05e283e9c083b69878c06720Jason Sams        fprintf(f, "    const RS_CMD_%s *cmd = static_cast<const RS_CMD_%s *>(vp);\n", api->name, api->name);
4525fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams
4535f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams        if (hasInlineDataPointers(api)) {
4545f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams            fprintf(f, "    const uint8_t *baseData = 0;\n");
4555f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams            fprintf(f, "    if (cmdSizeBytes != sizeof(RS_CMD_%s)) {\n", api->name);
4565f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams            fprintf(f, "        baseData = &((const uint8_t *)vp)[sizeof(*cmd)];\n");
4575f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams            fprintf(f, "    }\n");
4585f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams        }
4595f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams
460186e59154a0fb86e05e283e9c083b69878c06720Jason Sams        fprintf(f, "    ");
461186e59154a0fb86e05e283e9c083b69878c06720Jason Sams        if (api->ret.typeName[0]) {
4621a4efa363916977ef9aeab756725b3bdc880a15bJason Sams            fprintf(f, "\n    ");
4631a4efa363916977ef9aeab756725b3bdc880a15bJason Sams            printVarType(f, &api->ret);
4641a4efa363916977ef9aeab756725b3bdc880a15bJason Sams            fprintf(f, " ret = ");
465326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        }
466186e59154a0fb86e05e283e9c083b69878c06720Jason Sams        fprintf(f, "rsi_%s(con", api->name);
467186e59154a0fb86e05e283e9c083b69878c06720Jason Sams        for (ct2=0; ct2 < api->paramCount; ct2++) {
468186e59154a0fb86e05e283e9c083b69878c06720Jason Sams            const VarType *vt = &api->params[ct2];
4695f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams            needFlush += vt->ptrLevel;
4705f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams
4715f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams            if (hasInlineDataPointers(api) && vt->ptrLevel) {
4725f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams                fprintf(f, ",\n           (const %s *)&baseData[(intptr_t)cmd->%s]", vt->typeName, vt->name);
4735f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams            } else {
4745f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams                fprintf(f, ",\n           cmd->%s", vt->name);
4755f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams            }
476186e59154a0fb86e05e283e9c083b69878c06720Jason Sams        }
477186e59154a0fb86e05e283e9c083b69878c06720Jason Sams        fprintf(f, ");\n");
478186e59154a0fb86e05e283e9c083b69878c06720Jason Sams
4795f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams        if (hasInlineDataPointers(api)) {
480ee5cf0067c374e1c7e9a0736e24e55f4d19a0721Jason Sams            fprintf(f, "    size_t totalSize = 0;\n");
481ee5cf0067c374e1c7e9a0736e24e55f4d19a0721Jason Sams            for (ct2=0; ct2 < api->paramCount; ct2++) {
482ee5cf0067c374e1c7e9a0736e24e55f4d19a0721Jason Sams                if (api->params[ct2].ptrLevel) {
483ee5cf0067c374e1c7e9a0736e24e55f4d19a0721Jason Sams                    fprintf(f, "    totalSize += cmd->%s_length;\n", api->params[ct2].name);
484ee5cf0067c374e1c7e9a0736e24e55f4d19a0721Jason Sams                }
485ee5cf0067c374e1c7e9a0736e24e55f4d19a0721Jason Sams            }
486ee5cf0067c374e1c7e9a0736e24e55f4d19a0721Jason Sams
487ee5cf0067c374e1c7e9a0736e24e55f4d19a0721Jason Sams            fprintf(f, "    if ((totalSize != 0) && (cmdSizeBytes == sizeof(RS_CMD_%s))) {\n", api->name);
4885f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams            fprintf(f, "        con->mIO.coreSetReturn(NULL, 0);\n");
4895f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams            fprintf(f, "    }\n");
4905f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams        } else if (api->ret.typeName[0]) {
4911a4efa363916977ef9aeab756725b3bdc880a15bJason Sams            fprintf(f, "    con->mIO.coreSetReturn(&ret, sizeof(ret));\n");
4925f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams        } else if (api->sync || needFlush) {
4935f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams            fprintf(f, "    con->mIO.coreSetReturn(NULL, 0);\n");
4941a4efa363916977ef9aeab756725b3bdc880a15bJason Sams        }
4951a4efa363916977ef9aeab756725b3bdc880a15bJason Sams
496326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        fprintf(f, "};\n\n");
497326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
498326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
4992008747941749ad27fe80663d23036ac320e998fJason Sams    for (ct=0; ct < apiCount; ct++) {
5002008747941749ad27fe80663d23036ac320e998fJason Sams        const ApiEntry * api = &apis[ct];
5015f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams        int needFlush = 0;
5022008747941749ad27fe80663d23036ac320e998fJason Sams
503bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams        fprintf(f, "void rspr_%s(Context *con, ThreadIO *io) {\n", api->name);
5042008747941749ad27fe80663d23036ac320e998fJason Sams        fprintf(f, "    RS_CMD_%s cmd;\n", api->name);
5052008747941749ad27fe80663d23036ac320e998fJason Sams
5062008747941749ad27fe80663d23036ac320e998fJason Sams        for (ct2=0; ct2 < api->paramCount; ct2++) {
5072008747941749ad27fe80663d23036ac320e998fJason Sams            const VarType *vt = &api->params[ct2];
508bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams            if (vt->ptrLevel == 0) {
509bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams                fprintf(f, "    io->coreRead(&cmd.%s, sizeof(cmd.%s));\n", vt->name, vt->name);
510bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams            }
511bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams        }
512bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams        fprintf(f, "\n");
513bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams
514bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams        for (ct2=0; ct2 < api->paramCount; ct2++) {
515bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams            const VarType *vt = &api->params[ct2];
5162008747941749ad27fe80663d23036ac320e998fJason Sams            if (vt->ptrLevel == 1) {
5172008747941749ad27fe80663d23036ac320e998fJason Sams                fprintf(f, "    cmd.%s = (", vt->name);
5182008747941749ad27fe80663d23036ac320e998fJason Sams                printVarType(f, vt);
519bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams                fprintf(f, ")malloc(cmd.%s_length);\n", vt->name);
520bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams
521bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams                if (vt->isConst) {
522bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams                    fprintf(f, "    if (cmd.%s_length) io->coreRead((void *)cmd.%s, cmd.%s_length);\n", vt->name, vt->name, vt->name);
523bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams                }
5242008747941749ad27fe80663d23036ac320e998fJason Sams            }
525bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams        }
526bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams        fprintf(f, "\n");
527bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams
528bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams        for (ct2=0; ct2 < api->paramCount; ct2++) {
529bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams            const VarType *vt = &api->params[ct2];
5302008747941749ad27fe80663d23036ac320e998fJason Sams            if (vt->ptrLevel == 2) {
5312008747941749ad27fe80663d23036ac320e998fJason Sams                fprintf(f, "    for (size_t ct = 0; ct < (cmd.%s_length_length / sizeof(cmd.%s_length)); ct++) {\n", vt->name, vt->name);
532bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams                fprintf(f, "        cmd.%s = (", vt->name);
533bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams                printVarType(f, vt);
534bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams                fprintf(f, ")malloc(cmd.%s_length[ct]);\n", vt->name);
535bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams                fprintf(f, "        io->coreRead(& cmd.%s, cmd.%s_length[ct]);\n", vt->name, vt->name);
5362008747941749ad27fe80663d23036ac320e998fJason Sams                fprintf(f, "    }\n");
5372008747941749ad27fe80663d23036ac320e998fJason Sams            }
5382008747941749ad27fe80663d23036ac320e998fJason Sams        }
5392008747941749ad27fe80663d23036ac320e998fJason Sams        fprintf(f, "\n");
5402008747941749ad27fe80663d23036ac320e998fJason Sams
5412008747941749ad27fe80663d23036ac320e998fJason Sams        if (api->ret.typeName[0]) {
5422008747941749ad27fe80663d23036ac320e998fJason Sams            fprintf(f, "    ");
5432008747941749ad27fe80663d23036ac320e998fJason Sams            printVarType(f, &api->ret);
5442008747941749ad27fe80663d23036ac320e998fJason Sams            fprintf(f, " ret =\n");
5452008747941749ad27fe80663d23036ac320e998fJason Sams        }
5462008747941749ad27fe80663d23036ac320e998fJason Sams
5472008747941749ad27fe80663d23036ac320e998fJason Sams        fprintf(f, "    rsi_%s(", api->name);
5482008747941749ad27fe80663d23036ac320e998fJason Sams        if (!api->nocontext) {
5492008747941749ad27fe80663d23036ac320e998fJason Sams            fprintf(f, "con");
5502008747941749ad27fe80663d23036ac320e998fJason Sams        }
5512008747941749ad27fe80663d23036ac320e998fJason Sams        for (ct2=0; ct2 < api->paramCount; ct2++) {
5522008747941749ad27fe80663d23036ac320e998fJason Sams            const VarType *vt = &api->params[ct2];
5532008747941749ad27fe80663d23036ac320e998fJason Sams            if (ct2 > 0 || !api->nocontext) {
5542008747941749ad27fe80663d23036ac320e998fJason Sams                fprintf(f, ",\n");
5552008747941749ad27fe80663d23036ac320e998fJason Sams            }
5562008747941749ad27fe80663d23036ac320e998fJason Sams            fprintf(f, "           cmd.%s", vt->name);
5572008747941749ad27fe80663d23036ac320e998fJason Sams        }
5582008747941749ad27fe80663d23036ac320e998fJason Sams        fprintf(f, ");\n");
5592008747941749ad27fe80663d23036ac320e998fJason Sams
560bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams        for (ct2=0; ct2 < api->paramCount; ct2++) {
561bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams            const VarType *vt = &api->params[ct2];
562bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams            if ((vt->ptrLevel == 1) && (!vt->isConst)) {
563bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams                fprintf(f, "    io->coreSetReturn((void *)cmd.%s, cmd.%s_length);\n", vt->name, vt->name);
564bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams            }
565bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams        }
566bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams
567bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams        for (ct2=0; ct2 < api->paramCount; ct2++) {
568bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams            const VarType *vt = &api->params[ct2];
569bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams            if ((vt->ptrLevel == 2) && (!vt->isConst)) {
570bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams                fprintf(f, "    for (size_t ct = 0; ct < (cmd.%s_length_length / sizeof(cmd.%s_length)); ct++) {\n", vt->name, vt->name);
571bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams                fprintf(f, "        io->coreSetReturn((void *)cmd.%s[ct], cmd.%s_length[ct]);\n", vt->name, vt->name);
572bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams                fprintf(f, "    }\n");
573bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams            }
574bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams        }
575bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams        fprintf(f, "\n");
576bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams
5772008747941749ad27fe80663d23036ac320e998fJason Sams        if (api->ret.typeName[0]) {
578bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams            fprintf(f, "    io->coreSetReturn(&ret, sizeof(ret));\n");
579bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams        } else /*if (needFlush)*/ {
580bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams            fprintf(f, "    io->coreSetReturn(NULL, 0);\n");
581bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams        }
582bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams
583bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams        for (ct2=0; ct2 < api->paramCount; ct2++) {
584bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams            const VarType *vt = &api->params[ct2];
585bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams            if (vt->ptrLevel == 1) {
586bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams                fprintf(f, "    free((void *)cmd.%s);\n", vt->name);
587bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams            }
588bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams        }
589bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams        for (ct2=0; ct2 < api->paramCount; ct2++) {
590bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams            const VarType *vt = &api->params[ct2];
591bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams            if (vt->ptrLevel == 2) {
592bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams                fprintf(f, "    for (size_t ct = 0; ct < (cmd.%s_length_length / sizeof(cmd.%s_length)); ct++) {\n", vt->name, vt->name);
593bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams                fprintf(f, "        free((void *)cmd.%s);\n", vt->name);
594bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams                fprintf(f, "    }\n");
595bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams            }
5962008747941749ad27fe80663d23036ac320e998fJason Sams        }
5972008747941749ad27fe80663d23036ac320e998fJason Sams
5982008747941749ad27fe80663d23036ac320e998fJason Sams        fprintf(f, "};\n\n");
5992008747941749ad27fe80663d23036ac320e998fJason Sams    }
6002008747941749ad27fe80663d23036ac320e998fJason Sams
6012008747941749ad27fe80663d23036ac320e998fJason Sams    fprintf(f, "RsPlaybackLocalFunc gPlaybackFuncs[%i] = {\n", apiCount + 1);
602326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    fprintf(f, "    NULL,\n");
603afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk    for (ct=0; ct < apiCount; ct++) {
604186e59154a0fb86e05e283e9c083b69878c06720Jason Sams        if (apis[ct].direct) {
605186e59154a0fb86e05e283e9c083b69878c06720Jason Sams            fprintf(f, "    NULL,\n");
606186e59154a0fb86e05e283e9c083b69878c06720Jason Sams        } else {
607186e59154a0fb86e05e283e9c083b69878c06720Jason Sams            fprintf(f, "    %s%s,\n", "rsp_", apis[ct].name);
608186e59154a0fb86e05e283e9c083b69878c06720Jason Sams        }
609326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
610326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    fprintf(f, "};\n");
611326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
6122008747941749ad27fe80663d23036ac320e998fJason Sams    fprintf(f, "RsPlaybackRemoteFunc gPlaybackRemoteFuncs[%i] = {\n", apiCount + 1);
6132008747941749ad27fe80663d23036ac320e998fJason Sams    fprintf(f, "    NULL,\n");
6142008747941749ad27fe80663d23036ac320e998fJason Sams    for (ct=0; ct < apiCount; ct++) {
6152008747941749ad27fe80663d23036ac320e998fJason Sams        fprintf(f, "    %s%s,\n", "rspr_", apis[ct].name);
6162008747941749ad27fe80663d23036ac320e998fJason Sams    }
6172008747941749ad27fe80663d23036ac320e998fJason Sams    fprintf(f, "};\n");
6182008747941749ad27fe80663d23036ac320e998fJason Sams
619326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    fprintf(f, "};\n");
620326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    fprintf(f, "};\n");
621326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
622326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
6235fb1aeb6374f814d72117803682bc141cc6b0895Jason Samsvoid yylex();
6245fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams
625afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukint main(int argc, char **argv) {
626326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    if (argc != 3) {
627326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        fprintf(stderr, "usage: %s commandFile outFile\n", argv[0]);
628326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        return 1;
629326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
630326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    const char* rsgFile = argv[1];
631326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    const char* outFile = argv[2];
632326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    FILE* input = fopen(rsgFile, "r");
633326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
634326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    char choice = fgetc(input);
635326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    fclose(input);
636326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
637326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    if (choice < '0' || choice > '3') {
638326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        fprintf(stderr, "Uknown command: \'%c\'\n", choice);
639326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        return -2;
640326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
641326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
642326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    yylex();
643326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    // printf("# of lines = %d\n", num_lines);
644326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
645326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    FILE *f = fopen(outFile, "w");
646326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
647326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    printFileHeader(f);
648afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk    switch (choice) {
649326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        case '0': // rsgApiStructs.h
650326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        {
651326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams            fprintf(f, "\n");
652326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams            fprintf(f, "#include \"rsContext.h\"\n");
6532008747941749ad27fe80663d23036ac320e998fJason Sams            fprintf(f, "#include \"rsFifo.h\"\n");
654326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams            fprintf(f, "\n");
655326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams            fprintf(f, "namespace android {\n");
656326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams            fprintf(f, "namespace renderscript {\n");
657326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams            printStructures(f);
658326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams            printFuncDecls(f, "rsi_", 1);
659326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams            printPlaybackFuncs(f, "rsp_");
6602008747941749ad27fe80663d23036ac320e998fJason Sams            fprintf(f, "\n\ntypedef struct RsPlaybackRemoteHeaderRec {\n");
6612008747941749ad27fe80663d23036ac320e998fJason Sams            fprintf(f, "    uint32_t command;\n");
662099bc262f862cdeb547cf8a78fe9e0e92560f437Tim Murray            fprintf(f, "    size_t size;\n");
6632008747941749ad27fe80663d23036ac320e998fJason Sams            fprintf(f, "} RsPlaybackRemoteHeader;\n\n");
6642008747941749ad27fe80663d23036ac320e998fJason Sams            fprintf(f, "typedef void (*RsPlaybackLocalFunc)(Context *, const void *, size_t sizeBytes);\n");
665bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams            fprintf(f, "typedef void (*RsPlaybackRemoteFunc)(Context *, ThreadIO *);\n");
6662008747941749ad27fe80663d23036ac320e998fJason Sams            fprintf(f, "extern RsPlaybackLocalFunc gPlaybackFuncs[%i];\n", apiCount + 1);
6672008747941749ad27fe80663d23036ac320e998fJason Sams            fprintf(f, "extern RsPlaybackRemoteFunc gPlaybackRemoteFuncs[%i];\n", apiCount + 1);
668326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
669326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams            fprintf(f, "}\n");
670326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams            fprintf(f, "}\n");
671326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        }
672326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        break;
673326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
674326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        case '1': // rsgApiFuncDecl.h
675326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        {
676326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams            printFuncDecls(f, "rs", 0);
677326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        }
678326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        break;
679326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
680326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        case '2': // rsgApi.cpp
681326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        {
682326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams            printApiCpp(f);
683326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        }
684326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        break;
685326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
686326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        case '3': // rsgApiReplay.cpp
687326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        {
688326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams            printFileHeader(f);
689326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams            printPlaybackCpp(f);
690326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        }
691326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        break;
692c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams
693c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams        case '4': // rsgApiStream.cpp
694c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams        {
695c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams            printFileHeader(f);
696c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams            printPlaybackCpp(f);
697c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams        }
698c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams
699c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams        case '5': // rsgApiStreamReplay.cpp
700c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams        {
701c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams            printFileHeader(f);
702c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams            printPlaybackCpp(f);
703c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams        }
704c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams        break;
705326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
706326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    fclose(f);
707326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    return 0;
708326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
709