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