1d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
2daed524c35f5fe4d35f403d2279947605d161b2eJoe Onorato#include "spec.h"
3daed524c35f5fe4d35f403d2279947605d161b2eJoe Onorato#include <stdio.h>
4d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
5ed9f210568082dd6d1d8a0c92c693d574d87d545Alex Sakhartchoukvoid printFileHeader(FILE *f) {
6d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    fprintf(f, "/*\n");
765bdaf1c6d463d9441125d2c87a36015bfef2d95Jason Sams    fprintf(f, " * Copyright (C) 2011 The Android Open Source Project\n");
8d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    fprintf(f, " *\n");
9d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    fprintf(f, " * Licensed under the Apache License, Version 2.0 (the \"License\");\n");
10d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    fprintf(f, " * you may not use this file except in compliance with the License.\n");
11d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    fprintf(f, " * You may obtain a copy of the License at\n");
12d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    fprintf(f, " *\n");
13d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    fprintf(f, " *      http://www.apache.org/licenses/LICENSE-2.0\n");
14d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    fprintf(f, " *\n");
15d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    fprintf(f, " * Unless required by applicable law or agreed to in writing, software\n");
16d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    fprintf(f, " * distributed under the License is distributed on an \"AS IS\" BASIS,\n");
17d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    fprintf(f, " * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n");
18d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    fprintf(f, " * See the License for the specific language governing permissions and\n");
19d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    fprintf(f, " * limitations under the License.\n");
20d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    fprintf(f, " */\n\n");
21d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
22d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
23ed9f210568082dd6d1d8a0c92c693d574d87d545Alex Sakhartchoukvoid printVarType(FILE *f, const VarType *vt) {
24d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    int ct;
25d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    if (vt->isConst) {
26d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        fprintf(f, "const ");
27d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    }
28d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
29ed9f210568082dd6d1d8a0c92c693d574d87d545Alex Sakhartchouk    switch (vt->type) {
30d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    case 0:
31d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        fprintf(f, "void");
32d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        break;
33d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    case 1:
34d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        fprintf(f, "int%i_t", vt->bits);
35d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        break;
36d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    case 2:
37d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        fprintf(f, "uint%i_t", vt->bits);
38d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        break;
39d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    case 3:
40d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        if (vt->bits == 32)
41d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams            fprintf(f, "float");
42d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        else
43d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams            fprintf(f, "double");
44d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        break;
45d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    case 4:
46daed524c35f5fe4d35f403d2279947605d161b2eJoe Onorato        fprintf(f, "%s", vt->typeName);
47d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        break;
48d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    }
49d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
50ed9f210568082dd6d1d8a0c92c693d574d87d545Alex Sakhartchouk    if (vt->ptrLevel) {
51d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        fprintf(f, " ");
52ed9f210568082dd6d1d8a0c92c693d574d87d545Alex Sakhartchouk        for (ct=0; ct < vt->ptrLevel; ct++) {
53d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams            fprintf(f, "*");
54d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        }
55d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    }
56a08526ac42b3da98926ae921a6d8cfb9bbc90553Jason Sams}
57a08526ac42b3da98926ae921a6d8cfb9bbc90553Jason Sams
58a08526ac42b3da98926ae921a6d8cfb9bbc90553Jason Samsvoid printVarTypeAndName(FILE *f, const VarType *vt) {
59a08526ac42b3da98926ae921a6d8cfb9bbc90553Jason Sams    printVarType(f, vt);
60d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
61ed9f210568082dd6d1d8a0c92c693d574d87d545Alex Sakhartchouk    if (vt->name[0]) {
62d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        fprintf(f, " %s", vt->name);
63d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    }
64d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
65d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
66ed9f210568082dd6d1d8a0c92c693d574d87d545Alex Sakhartchoukvoid printArgList(FILE *f, const ApiEntry * api, int assumePrevious) {
67d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    int ct;
68ed9f210568082dd6d1d8a0c92c693d574d87d545Alex Sakhartchouk    for (ct=0; ct < api->paramCount; ct++) {
69d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        if (ct || assumePrevious) {
70d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams            fprintf(f, ", ");
71d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        }
72a08526ac42b3da98926ae921a6d8cfb9bbc90553Jason Sams        printVarTypeAndName(f, &api->params[ct]);
73d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    }
74d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
75d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
76ed9f210568082dd6d1d8a0c92c693d574d87d545Alex Sakhartchoukvoid printStructures(FILE *f) {
77d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    int ct;
78d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    int ct2;
79d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
80ed9f210568082dd6d1d8a0c92c693d574d87d545Alex Sakhartchouk    for (ct=0; ct < apiCount; ct++) {
81d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        fprintf(f, "typedef struct RS_CMD_%s_rec RS_CMD_%s;\n", apis[ct].name, apis[ct].name);
82d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    }
83d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    fprintf(f, "\n");
84d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
85ed9f210568082dd6d1d8a0c92c693d574d87d545Alex Sakhartchouk    for (ct=0; ct < apiCount; ct++) {
86d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        const ApiEntry * api = &apis[ct];
87d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        fprintf(f, "#define RS_CMD_ID_%s %i\n", api->name, ct+1);
88d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        fprintf(f, "struct RS_CMD_%s_rec {\n", api->name);
89d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        //fprintf(f, "    RsCommandHeader _hdr;\n");
90d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
91ed9f210568082dd6d1d8a0c92c693d574d87d545Alex Sakhartchouk        for (ct2=0; ct2 < api->paramCount; ct2++) {
92d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams            fprintf(f, "    ");
93a08526ac42b3da98926ae921a6d8cfb9bbc90553Jason Sams            printVarTypeAndName(f, &api->params[ct2]);
94d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams            fprintf(f, ";\n");
95d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        }
96d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        fprintf(f, "};\n\n");
97d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    }
98d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
99d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
100c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Samsvoid printFuncDecl(FILE *f, const ApiEntry *api, const char *prefix, int addContext, int isFnPtr) {
101a08526ac42b3da98926ae921a6d8cfb9bbc90553Jason Sams    printVarTypeAndName(f, &api->ret);
102c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams    if (isFnPtr) {
103c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams        char t[1024];
104c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams        strcpy(t, api->name);
105c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams        if (strlen(prefix) == 0) {
106c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams            if (t[0] > 'A' && t[0] < 'Z') {
107c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams                t[0] -= 'A' - 'a';
108c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams            }
109c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams        }
110c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams        fprintf(f, " (* %s%s) (", prefix, api->name);
111c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams    } else {
112c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams        fprintf(f, " %s%s (", prefix, api->name);
113c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams    }
11465bdaf1c6d463d9441125d2c87a36015bfef2d95Jason Sams    if (!api->nocontext) {
11565bdaf1c6d463d9441125d2c87a36015bfef2d95Jason Sams        if (addContext) {
11665bdaf1c6d463d9441125d2c87a36015bfef2d95Jason Sams            fprintf(f, "Context *");
11765bdaf1c6d463d9441125d2c87a36015bfef2d95Jason Sams        } else {
11865bdaf1c6d463d9441125d2c87a36015bfef2d95Jason Sams            fprintf(f, "RsContext rsc");
11965bdaf1c6d463d9441125d2c87a36015bfef2d95Jason Sams        }
120d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    }
12165bdaf1c6d463d9441125d2c87a36015bfef2d95Jason Sams    printArgList(f, api, !api->nocontext);
122d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    fprintf(f, ")");
123d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
124d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
125ed9f210568082dd6d1d8a0c92c693d574d87d545Alex Sakhartchoukvoid printFuncDecls(FILE *f, const char *prefix, int addContext) {
126d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    int ct;
127ed9f210568082dd6d1d8a0c92c693d574d87d545Alex Sakhartchouk    for (ct=0; ct < apiCount; ct++) {
128c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams        printFuncDecl(f, &apis[ct], prefix, addContext, 0);
129d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        fprintf(f, ";\n");
130d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    }
131d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    fprintf(f, "\n\n");
132d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
133d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
134c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Samsvoid printFuncPointers(FILE *f, int addContext) {
135c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams    fprintf(f, "\n");
136c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams    fprintf(f, "typedef struct RsApiEntrypoints {\n");
137c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams    int ct;
138c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams    for (ct=0; ct < apiCount; ct++) {
139c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams        fprintf(f, "    ");
140c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams        printFuncDecl(f, &apis[ct], "", addContext, 1);
141c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams        fprintf(f, ";\n");
142c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams    }
143c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams    fprintf(f, "} RsApiEntrypoints_t;\n\n");
144c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams}
145c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams
146ed9f210568082dd6d1d8a0c92c693d574d87d545Alex Sakhartchoukvoid printPlaybackFuncs(FILE *f, const char *prefix) {
147d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    int ct;
148ed9f210568082dd6d1d8a0c92c693d574d87d545Alex Sakhartchouk    for (ct=0; ct < apiCount; ct++) {
14965bdaf1c6d463d9441125d2c87a36015bfef2d95Jason Sams        if (apis[ct].direct) {
15065bdaf1c6d463d9441125d2c87a36015bfef2d95Jason Sams            continue;
15165bdaf1c6d463d9441125d2c87a36015bfef2d95Jason Sams        }
15265bdaf1c6d463d9441125d2c87a36015bfef2d95Jason Sams
153d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        fprintf(f, "void %s%s (Context *, const void *);\n", prefix, apis[ct].name);
154d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    }
155d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
156d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
157a08526ac42b3da98926ae921a6d8cfb9bbc90553Jason Samsstatic int hasInlineDataPointers(const ApiEntry * api) {
158a08526ac42b3da98926ae921a6d8cfb9bbc90553Jason Sams    int ret = 0;
159a08526ac42b3da98926ae921a6d8cfb9bbc90553Jason Sams    int ct;
160b96e9517affa31c2f9b5c8c005c85d2cc99453b4Jason Sams    if (api->sync || api->ret.typeName[0]) {
161a08526ac42b3da98926ae921a6d8cfb9bbc90553Jason Sams        return 0;
162a08526ac42b3da98926ae921a6d8cfb9bbc90553Jason Sams    }
163a08526ac42b3da98926ae921a6d8cfb9bbc90553Jason Sams    for (ct=0; ct < api->paramCount; ct++) {
164a08526ac42b3da98926ae921a6d8cfb9bbc90553Jason Sams        const VarType *vt = &api->params[ct];
165a08526ac42b3da98926ae921a6d8cfb9bbc90553Jason Sams
166a08526ac42b3da98926ae921a6d8cfb9bbc90553Jason Sams        if (!vt->isConst && vt->ptrLevel) {
167a08526ac42b3da98926ae921a6d8cfb9bbc90553Jason Sams            // Non-const pointers cannot be inlined.
168a08526ac42b3da98926ae921a6d8cfb9bbc90553Jason Sams            return 0;
169a08526ac42b3da98926ae921a6d8cfb9bbc90553Jason Sams        }
170a08526ac42b3da98926ae921a6d8cfb9bbc90553Jason Sams        if (vt->ptrLevel > 1) {
171a08526ac42b3da98926ae921a6d8cfb9bbc90553Jason Sams            // not handled yet.
172a08526ac42b3da98926ae921a6d8cfb9bbc90553Jason Sams            return 0;
173a08526ac42b3da98926ae921a6d8cfb9bbc90553Jason Sams        }
174a08526ac42b3da98926ae921a6d8cfb9bbc90553Jason Sams
175a08526ac42b3da98926ae921a6d8cfb9bbc90553Jason Sams        if (vt->isConst && vt->ptrLevel) {
176a08526ac42b3da98926ae921a6d8cfb9bbc90553Jason Sams            // Non-const pointers cannot be inlined.
177a08526ac42b3da98926ae921a6d8cfb9bbc90553Jason Sams            ret = 1;
178a08526ac42b3da98926ae921a6d8cfb9bbc90553Jason Sams        }
179a08526ac42b3da98926ae921a6d8cfb9bbc90553Jason Sams    }
180a08526ac42b3da98926ae921a6d8cfb9bbc90553Jason Sams    return ret;
181a08526ac42b3da98926ae921a6d8cfb9bbc90553Jason Sams}
182a08526ac42b3da98926ae921a6d8cfb9bbc90553Jason Sams
183ed9f210568082dd6d1d8a0c92c693d574d87d545Alex Sakhartchoukvoid printApiCpp(FILE *f) {
184d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    int ct;
185d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    int ct2;
186d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
187d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    fprintf(f, "#include \"rsDevice.h\"\n");
188d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    fprintf(f, "#include \"rsContext.h\"\n");
189d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    fprintf(f, "#include \"rsThreadIO.h\"\n");
190d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    //fprintf(f, "#include \"rsgApiStructs.h\"\n");
191d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    fprintf(f, "#include \"rsgApiFuncDecl.h\"\n");
1927a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams    fprintf(f, "#include \"rsFifo.h\"\n");
193d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    fprintf(f, "\n");
194d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    fprintf(f, "using namespace android;\n");
195d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    fprintf(f, "using namespace android::renderscript;\n");
196d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    fprintf(f, "\n");
197d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
198c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams    printFuncPointers(f, 0);
199c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams
200c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams    // Generate RS funcs for local fifo
201ed9f210568082dd6d1d8a0c92c693d574d87d545Alex Sakhartchouk    for (ct=0; ct < apiCount; ct++) {
202d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        int needFlush = 0;
203d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        const ApiEntry * api = &apis[ct];
204d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
205c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams        fprintf(f, "static ");
206c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams        printFuncDecl(f, api, "LF_", 0, 0);
207d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        fprintf(f, "\n{\n");
208edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams        if (api->direct) {
209edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams            fprintf(f, "    ");
210edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams            if (api->ret.typeName[0]) {
211edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams                fprintf(f, "return ");
212edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams            }
213edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams            fprintf(f, "rsi_%s(", api->name);
214edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams            if (!api->nocontext) {
215edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams                fprintf(f, "(Context *)rsc");
216c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams            }
217ed9f210568082dd6d1d8a0c92c693d574d87d545Alex Sakhartchouk            for (ct2=0; ct2 < api->paramCount; ct2++) {
21807ae40623737a6060b8a925fd2e6bba76780dcd4Jason Sams                const VarType *vt = &api->params[ct2];
219c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams                if (ct2 > 0 || !api->nocontext) {
220c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams                    fprintf(f, ", ");
221c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams                }
222c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams                fprintf(f, "%s", vt->name);
22307ae40623737a6060b8a925fd2e6bba76780dcd4Jason Sams            }
22407ae40623737a6060b8a925fd2e6bba76780dcd4Jason Sams            fprintf(f, ");\n");
22507ae40623737a6060b8a925fd2e6bba76780dcd4Jason Sams        } else {
22607ae40623737a6060b8a925fd2e6bba76780dcd4Jason Sams            fprintf(f, "    ThreadIO *io = &((Context *)rsc)->mIO;\n");
227b96e9517affa31c2f9b5c8c005c85d2cc99453b4Jason Sams            fprintf(f, "    const uint32_t size = sizeof(RS_CMD_%s);\n", api->name);
228a08526ac42b3da98926ae921a6d8cfb9bbc90553Jason Sams            if (hasInlineDataPointers(api)) {
229a08526ac42b3da98926ae921a6d8cfb9bbc90553Jason Sams                fprintf(f, "    uint32_t dataSize = 0;\n");
230a08526ac42b3da98926ae921a6d8cfb9bbc90553Jason Sams                for (ct2=0; ct2 < api->paramCount; ct2++) {
231a08526ac42b3da98926ae921a6d8cfb9bbc90553Jason Sams                    const VarType *vt = &api->params[ct2];
232a08526ac42b3da98926ae921a6d8cfb9bbc90553Jason Sams                    if (vt->isConst && vt->ptrLevel) {
233a08526ac42b3da98926ae921a6d8cfb9bbc90553Jason Sams                        fprintf(f, "    dataSize += %s_length;\n", vt->name);
234a08526ac42b3da98926ae921a6d8cfb9bbc90553Jason Sams                    }
235a08526ac42b3da98926ae921a6d8cfb9bbc90553Jason Sams                }
236a08526ac42b3da98926ae921a6d8cfb9bbc90553Jason Sams            }
237a08526ac42b3da98926ae921a6d8cfb9bbc90553Jason Sams
23807ae40623737a6060b8a925fd2e6bba76780dcd4Jason Sams            //fprintf(f, "    LOGE(\"add command %s\\n\");\n", api->name);
239a08526ac42b3da98926ae921a6d8cfb9bbc90553Jason Sams            if (hasInlineDataPointers(api)) {
240b96e9517affa31c2f9b5c8c005c85d2cc99453b4Jason Sams                fprintf(f, "    RS_CMD_%s *cmd = NULL;\n", api->name);
241b96e9517affa31c2f9b5c8c005c85d2cc99453b4Jason Sams                fprintf(f, "    if (dataSize < 1024) {;\n");
242edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams                fprintf(f, "        cmd = static_cast<RS_CMD_%s *>(io->coreHeader(RS_CMD_ID_%s, dataSize + size));\n", api->name, api->name);
243b96e9517affa31c2f9b5c8c005c85d2cc99453b4Jason Sams                fprintf(f, "    } else {\n");
244edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams                fprintf(f, "        cmd = static_cast<RS_CMD_%s *>(io->coreHeader(RS_CMD_ID_%s, size));\n", api->name, api->name);
245b96e9517affa31c2f9b5c8c005c85d2cc99453b4Jason Sams                fprintf(f, "    }\n");
246a08526ac42b3da98926ae921a6d8cfb9bbc90553Jason Sams                fprintf(f, "    uint8_t *payload = (uint8_t *)&cmd[1];\n");
247eccf6c6483564bbe21020e2affb490ced2345e5eJason Sams            } else {
248edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason 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);
249a08526ac42b3da98926ae921a6d8cfb9bbc90553Jason Sams            }
25007ae40623737a6060b8a925fd2e6bba76780dcd4Jason Sams
251ed9f210568082dd6d1d8a0c92c693d574d87d545Alex Sakhartchouk            for (ct2=0; ct2 < api->paramCount; ct2++) {
25207ae40623737a6060b8a925fd2e6bba76780dcd4Jason Sams                const VarType *vt = &api->params[ct2];
25307ae40623737a6060b8a925fd2e6bba76780dcd4Jason Sams                needFlush += vt->ptrLevel;
254a08526ac42b3da98926ae921a6d8cfb9bbc90553Jason Sams                if (vt->ptrLevel && hasInlineDataPointers(api)) {
255a08526ac42b3da98926ae921a6d8cfb9bbc90553Jason Sams                    fprintf(f, "    if (dataSize < 1024) {\n");
256a08526ac42b3da98926ae921a6d8cfb9bbc90553Jason Sams                    fprintf(f, "        memcpy(payload, %s, %s_length);\n", vt->name, vt->name);
257a08526ac42b3da98926ae921a6d8cfb9bbc90553Jason Sams                    fprintf(f, "        cmd->%s = (", vt->name);
258a08526ac42b3da98926ae921a6d8cfb9bbc90553Jason Sams                    printVarType(f, vt);
259a08526ac42b3da98926ae921a6d8cfb9bbc90553Jason Sams                    fprintf(f, ")payload;\n");
260a08526ac42b3da98926ae921a6d8cfb9bbc90553Jason Sams                    fprintf(f, "        payload += %s_length;\n", vt->name);
261a08526ac42b3da98926ae921a6d8cfb9bbc90553Jason Sams                    fprintf(f, "    } else {\n");
262a08526ac42b3da98926ae921a6d8cfb9bbc90553Jason Sams                    fprintf(f, "        cmd->%s = %s;\n", vt->name, vt->name);
263a08526ac42b3da98926ae921a6d8cfb9bbc90553Jason Sams                    fprintf(f, "    }\n");
264a08526ac42b3da98926ae921a6d8cfb9bbc90553Jason Sams
265a08526ac42b3da98926ae921a6d8cfb9bbc90553Jason Sams                } else {
266a08526ac42b3da98926ae921a6d8cfb9bbc90553Jason Sams                    fprintf(f, "    cmd->%s = %s;\n", vt->name, vt->name);
267a08526ac42b3da98926ae921a6d8cfb9bbc90553Jason Sams                }
26807ae40623737a6060b8a925fd2e6bba76780dcd4Jason Sams            }
269edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams            if (api->ret.typeName[0] || api->sync) {
27007ae40623737a6060b8a925fd2e6bba76780dcd4Jason Sams                needFlush = 1;
27107ae40623737a6060b8a925fd2e6bba76780dcd4Jason Sams            }
27207ae40623737a6060b8a925fd2e6bba76780dcd4Jason Sams
273a08526ac42b3da98926ae921a6d8cfb9bbc90553Jason Sams            if (hasInlineDataPointers(api)) {
274a08526ac42b3da98926ae921a6d8cfb9bbc90553Jason Sams                fprintf(f, "    if (dataSize < 1024) {\n");
275edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams                fprintf(f, "        io->coreCommit();\n");
276a08526ac42b3da98926ae921a6d8cfb9bbc90553Jason Sams                fprintf(f, "    } else {\n");
277edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams                fprintf(f, "        io->coreCommitSync();\n");
278a08526ac42b3da98926ae921a6d8cfb9bbc90553Jason Sams                fprintf(f, "    }\n");
279a08526ac42b3da98926ae921a6d8cfb9bbc90553Jason Sams            } else {
280edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams                fprintf(f, "    io->coreCommit");
281a08526ac42b3da98926ae921a6d8cfb9bbc90553Jason Sams                if (needFlush) {
282a08526ac42b3da98926ae921a6d8cfb9bbc90553Jason Sams                    fprintf(f, "Sync");
283a08526ac42b3da98926ae921a6d8cfb9bbc90553Jason Sams                }
284edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams                fprintf(f, "();\n");
28507ae40623737a6060b8a925fd2e6bba76780dcd4Jason Sams            }
28607ae40623737a6060b8a925fd2e6bba76780dcd4Jason Sams
28707ae40623737a6060b8a925fd2e6bba76780dcd4Jason Sams            if (api->ret.typeName[0]) {
288edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams                fprintf(f, "\n    ");
2897a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams                printVarType(f, &api->ret);
290edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams                fprintf(f, " ret;\n");
291edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams                fprintf(f, "    io->coreGetReturn(&ret, sizeof(ret));\n");
292edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams                fprintf(f, "    return ret;\n");
29307ae40623737a6060b8a925fd2e6bba76780dcd4Jason Sams            }
294d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        }
295d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        fprintf(f, "};\n\n");
2967a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams
2977a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams
2987a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams        fprintf(f, "static ");
2997a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams        printFuncDecl(f, api, "RF_", 0, 0);
3007a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams        fprintf(f, "\n{\n");
3017a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams        fprintf(f, "    Fifo *f = NULL;\n");
3027a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams        fprintf(f, "    RS_CMD_%s cmd;\n", api->name);
3037a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams        fprintf(f, "    const uint32_t cmdSize = sizeof(cmd);\n");
3047a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams        fprintf(f, "    const uint32_t cmdID = RS_CMD_ID_%s;\n", api->name);
3057a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams        fprintf(f, "    f->writeAsync(&cmdID, sizeof(cmdID));\n");
306edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams        fprintf(f, "    intptr_t offset = cmdSize;\n");
307edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams        fprintf(f, "    uint32_t dataSize = 0;\n");
308edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams        for (ct2=0; ct2 < api->paramCount; ct2++) {
309edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams            const VarType *vt = &api->params[ct2];
310edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams            if (vt->isConst && vt->ptrLevel) {
3117a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams                switch(vt->ptrLevel) {
3127a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams                case 1:
313edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams                    fprintf(f, "    dataSize += %s_length;\n", vt->name);
3147a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams                    break;
3157a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams                case 2:
3167a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams                    fprintf(f, "    for (size_t ct = 0; ct < (%s_length_length / sizeof(%s_length)); ct++) {\n", vt->name, vt->name);
317edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams                    fprintf(f, "        dataSize += %s_length[ct];\n", vt->name);
3187a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams                    fprintf(f, "    }\n");
3197a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams                    break;
3207a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams                default:
3217a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams                    printf("pointer level not handled!!");
3227a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams                }
3237a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams            }
324edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams        }
325edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams        fprintf(f, "\n");
3267a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams
327edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams        for (ct2=0; ct2 < api->paramCount; ct2++) {
328edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams            const VarType *vt = &api->params[ct2];
329edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams            switch(vt->ptrLevel) {
330edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams            case 0:
331edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams                fprintf(f, "    cmd.%s = %s;\n", vt->name, vt->name);
332edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams                break;
333edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams            case 1:
334edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams                fprintf(f, "    cmd.%s = (", vt->name);
335edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams                printVarType(f, vt);
336edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams                fprintf(f, ")offset;\n");
337edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams                fprintf(f, "    offset += %s_length;\n", vt->name);
338edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams                break;
339edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams            case 2:
340edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams                fprintf(f, "    cmd.%s = (", vt->name);
341edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams                printVarType(f, vt);
342edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams                fprintf(f, ")offset;\n");
343edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams                fprintf(f, "    for (size_t ct = 0; ct < (%s_length_length / sizeof(%s_length)); ct++) {\n", vt->name, vt->name);
344edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams                fprintf(f, "        offset += %s_length[ct];\n", vt->name);
345edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams                fprintf(f, "    }\n");
346edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams                break;
347edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams            default:
348edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams                fprintf(stderr, "pointer level not handled!!");
3497a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams            }
350edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams        }
351edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams        fprintf(f, "\n");
3527a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams
353edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams        fprintf(f, "    f->writeAsync(&cmd, cmdSize);\n");
354edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams        for (ct2=0; ct2 < api->paramCount; ct2++) {
355edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams            const VarType *vt = &api->params[ct2];
356edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams            if (vt->ptrLevel == 1) {
357edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams                fprintf(f, "    f->writeAsync(%s, %s_length);\n", vt->name, vt->name);
358edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams            }
359edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams            if (vt->ptrLevel == 2) {
360edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams                fprintf(f, "    for (size_t ct = 0; ct < (%s_length_length / sizeof(%s_length)); ct++) {\n", vt->name, vt->name);
361edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams                fprintf(f, "        f->writeAsync(%s, %s_length[ct]);\n", vt->name, vt->name);
362edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams                fprintf(f, "        offset += %s_length[ct];\n", vt->name);
363edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams                fprintf(f, "    }\n");
3647a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams            }
3657a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams        }
366edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams
367edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams        if (api->ret.typeName[0]) {
368edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams            fprintf(f, "    ");
369edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams            printVarType(f, &api->ret);
370edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams            fprintf(f, " retValue;\n");
371edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams            fprintf(f, "    f->writeWaitReturn(&retValue, sizeof(retValue));\n");
372edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams            fprintf(f, "    return retValue;\n");
373edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams        }
3747a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams        fprintf(f, "}\n\n");
375d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    }
376c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams
377c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams    fprintf(f, "\n");
378c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams    fprintf(f, "static RsApiEntrypoints_t s_LocalTable = {\n");
379c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams    for (ct=0; ct < apiCount; ct++) {
380c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams        fprintf(f, "    LF_%s,\n", apis[ct].name);
381c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams    }
382c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams    fprintf(f, "};\n");
383c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams
3847a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams    fprintf(f, "\n");
3857a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams    fprintf(f, "static RsApiEntrypoints_t s_RemoteTable = {\n");
3867a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams    for (ct=0; ct < apiCount; ct++) {
3877a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams        fprintf(f, "    RF_%s,\n", apis[ct].name);
3887a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams    }
3897a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams    fprintf(f, "};\n");
390c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams
3917a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams    fprintf(f, "static RsApiEntrypoints_t *s_CurrentTable = &s_LocalTable;\n\n");
392c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams    for (ct=0; ct < apiCount; ct++) {
393c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams        int needFlush = 0;
394c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams        const ApiEntry * api = &apis[ct];
395c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams
396c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams        printFuncDecl(f, api, "rs", 0, 0);
397c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams        fprintf(f, "\n{\n");
398c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams        fprintf(f, "    ");
399c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams        if (api->ret.typeName[0]) {
400c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams            fprintf(f, "return ");
401c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams        }
402c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams        fprintf(f, "s_CurrentTable->%s(", api->name);
403c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams
404c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams        if (!api->nocontext) {
405c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams            fprintf(f, "(Context *)rsc");
406c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams        }
407c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams
408c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams        for (ct2=0; ct2 < api->paramCount; ct2++) {
409c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams            const VarType *vt = &api->params[ct2];
410c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams            if (ct2 > 0 || !api->nocontext) {
411c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams                fprintf(f, ", ");
412c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams            }
413c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams            fprintf(f, "%s", vt->name);
414c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams        }
415c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams        fprintf(f, ");\n");
416c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams        fprintf(f, "}\n\n");
417c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams    }
418c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams
419d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
420d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
421ed9f210568082dd6d1d8a0c92c693d574d87d545Alex Sakhartchoukvoid printPlaybackCpp(FILE *f) {
422d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    int ct;
423d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    int ct2;
424d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
425d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    fprintf(f, "#include \"rsDevice.h\"\n");
426d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    fprintf(f, "#include \"rsContext.h\"\n");
427d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    fprintf(f, "#include \"rsThreadIO.h\"\n");
428d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    //fprintf(f, "#include \"rsgApiStructs.h\"\n");
429d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    fprintf(f, "#include \"rsgApiFuncDecl.h\"\n");
430d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    fprintf(f, "\n");
431d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    fprintf(f, "namespace android {\n");
432d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    fprintf(f, "namespace renderscript {\n");
433d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    fprintf(f, "\n");
434d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
435ed9f210568082dd6d1d8a0c92c693d574d87d545Alex Sakhartchouk    for (ct=0; ct < apiCount; ct++) {
436d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        const ApiEntry * api = &apis[ct];
437d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
43865bdaf1c6d463d9441125d2c87a36015bfef2d95Jason Sams        if (api->direct) {
43965bdaf1c6d463d9441125d2c87a36015bfef2d95Jason Sams            continue;
44065bdaf1c6d463d9441125d2c87a36015bfef2d95Jason Sams        }
44165bdaf1c6d463d9441125d2c87a36015bfef2d95Jason Sams
4427a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams        fprintf(f, "void rsp_%s(Context *con, const void *vp, size_t cmdSizeBytes) {\n", api->name);
44365bdaf1c6d463d9441125d2c87a36015bfef2d95Jason Sams
44465bdaf1c6d463d9441125d2c87a36015bfef2d95Jason Sams        //fprintf(f, "    LOGE(\"play command %s\\n\");\n", api->name);
44565bdaf1c6d463d9441125d2c87a36015bfef2d95Jason Sams        fprintf(f, "    const RS_CMD_%s *cmd = static_cast<const RS_CMD_%s *>(vp);\n", api->name, api->name);
446a08526ac42b3da98926ae921a6d8cfb9bbc90553Jason Sams
44765bdaf1c6d463d9441125d2c87a36015bfef2d95Jason Sams        fprintf(f, "    ");
44865bdaf1c6d463d9441125d2c87a36015bfef2d95Jason Sams        if (api->ret.typeName[0]) {
449edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams            fprintf(f, "\n    ");
450edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams            printVarType(f, &api->ret);
451edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams            fprintf(f, " ret = ");
452d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        }
45365bdaf1c6d463d9441125d2c87a36015bfef2d95Jason Sams        fprintf(f, "rsi_%s(con", api->name);
45465bdaf1c6d463d9441125d2c87a36015bfef2d95Jason Sams        for (ct2=0; ct2 < api->paramCount; ct2++) {
45565bdaf1c6d463d9441125d2c87a36015bfef2d95Jason Sams            const VarType *vt = &api->params[ct2];
45665bdaf1c6d463d9441125d2c87a36015bfef2d95Jason Sams            fprintf(f, ",\n           cmd->%s", vt->name);
45765bdaf1c6d463d9441125d2c87a36015bfef2d95Jason Sams        }
45865bdaf1c6d463d9441125d2c87a36015bfef2d95Jason Sams        fprintf(f, ");\n");
45965bdaf1c6d463d9441125d2c87a36015bfef2d95Jason Sams
460edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams        if (api->ret.typeName[0]) {
461edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams            fprintf(f, "    con->mIO.coreSetReturn(&ret, sizeof(ret));\n");
462edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams        }
463edbfabdb98a2974f973d6c042e6efd547dc02fc5Jason Sams
464d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        fprintf(f, "};\n\n");
465d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    }
466d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
4677a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams    for (ct=0; ct < apiCount; ct++) {
4687a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams        const ApiEntry * api = &apis[ct];
4697a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams
4707a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams        fprintf(f, "void rspr_%s(Context *con, Fifo *f, uint8_t *scratch, size_t scratchSize) {\n", api->name);
4717a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams
4727a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams        //fprintf(f, "    LOGE(\"play command %s\\n\");\n", api->name);
4737a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams        fprintf(f, "    RS_CMD_%s cmd;\n", api->name);
4747a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams        fprintf(f, "    f->read(&cmd, sizeof(cmd));\n");
4757a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams
4767a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams        for (ct2=0; ct2 < api->paramCount; ct2++) {
4777a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams            const VarType *vt = &api->params[ct2];
4787a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams            if (vt->ptrLevel == 1) {
4797a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams                fprintf(f, "    cmd.%s = (", vt->name);
4807a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams                printVarType(f, vt);
4817a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams                fprintf(f, ")scratch;\n");
4827a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams                fprintf(f, "    f->read(scratch, cmd.%s_length);\n", vt->name);
4837a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams                fprintf(f, "    scratch += cmd.%s_length;\n", vt->name);
4847a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams            }
4857a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams            if (vt->ptrLevel == 2) {
4867a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams                fprintf(f, "    size_t sum_%s = 0;\n", vt->name);
4877a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams                fprintf(f, "    for (size_t ct = 0; ct < (cmd.%s_length_length / sizeof(cmd.%s_length)); ct++) {\n", vt->name, vt->name);
4887a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams                fprintf(f, "        ((size_t *)scratch)[ct] = cmd.%s_length[ct];\n", vt->name);
4897a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams                fprintf(f, "        sum_%s += cmd.%s_length[ct];\n", vt->name, vt->name);
4907a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams                fprintf(f, "    }\n");
4917a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams                fprintf(f, "    f->read(scratch, sum_%s);\n", vt->name);
4927a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams                fprintf(f, "    scratch += sum_%s;\n", vt->name);
4937a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams            }
4947a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams        }
4957a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams        fprintf(f, "\n");
4967a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams
4977a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams        if (api->ret.typeName[0]) {
4987a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams            fprintf(f, "    ");
4997a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams            printVarType(f, &api->ret);
5007a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams            fprintf(f, " ret =\n");
5017a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams        }
5027a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams
5037a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams        fprintf(f, "    rsi_%s(", api->name);
5047a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams        if (!api->nocontext) {
5057a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams            fprintf(f, "con");
5067a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams        }
5077a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams        for (ct2=0; ct2 < api->paramCount; ct2++) {
5087a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams            const VarType *vt = &api->params[ct2];
5097a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams            if (ct2 > 0 || !api->nocontext) {
5107a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams                fprintf(f, ",\n");
5117a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams            }
5127a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams            fprintf(f, "           cmd.%s", vt->name);
5137a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams        }
5147a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams        fprintf(f, ");\n");
5157a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams
5167a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams        if (api->ret.typeName[0]) {
5177a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams            fprintf(f, "    f->readReturn(&ret, sizeof(ret));\n");
5187a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams        }
5197a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams
5207a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams        fprintf(f, "};\n\n");
5217a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams    }
5227a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams
5237a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams    fprintf(f, "RsPlaybackLocalFunc gPlaybackFuncs[%i] = {\n", apiCount + 1);
524d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    fprintf(f, "    NULL,\n");
525ed9f210568082dd6d1d8a0c92c693d574d87d545Alex Sakhartchouk    for (ct=0; ct < apiCount; ct++) {
52665bdaf1c6d463d9441125d2c87a36015bfef2d95Jason Sams        if (apis[ct].direct) {
52765bdaf1c6d463d9441125d2c87a36015bfef2d95Jason Sams            fprintf(f, "    NULL,\n");
52865bdaf1c6d463d9441125d2c87a36015bfef2d95Jason Sams        } else {
52965bdaf1c6d463d9441125d2c87a36015bfef2d95Jason Sams            fprintf(f, "    %s%s,\n", "rsp_", apis[ct].name);
53065bdaf1c6d463d9441125d2c87a36015bfef2d95Jason Sams        }
531d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    }
532d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    fprintf(f, "};\n");
533d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
5347a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams    fprintf(f, "RsPlaybackRemoteFunc gPlaybackRemoteFuncs[%i] = {\n", apiCount + 1);
5357a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams    fprintf(f, "    NULL,\n");
5367a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams    for (ct=0; ct < apiCount; ct++) {
5377a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams        fprintf(f, "    %s%s,\n", "rspr_", apis[ct].name);
5387a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams    }
5397a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams    fprintf(f, "};\n");
5407a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams
541d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    fprintf(f, "};\n");
542d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    fprintf(f, "};\n");
543d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
544d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
545a08526ac42b3da98926ae921a6d8cfb9bbc90553Jason Samsvoid yylex();
546a08526ac42b3da98926ae921a6d8cfb9bbc90553Jason Sams
547ed9f210568082dd6d1d8a0c92c693d574d87d545Alex Sakhartchoukint main(int argc, char **argv) {
548d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    if (argc != 3) {
549d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        fprintf(stderr, "usage: %s commandFile outFile\n", argv[0]);
550d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        return 1;
551d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    }
552d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    const char* rsgFile = argv[1];
553d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    const char* outFile = argv[2];
554d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    FILE* input = fopen(rsgFile, "r");
555d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
556d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    char choice = fgetc(input);
557d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    fclose(input);
558d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
559d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    if (choice < '0' || choice > '3') {
560d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        fprintf(stderr, "Uknown command: \'%c\'\n", choice);
561d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        return -2;
562d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    }
563d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
564d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    yylex();
565d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    // printf("# of lines = %d\n", num_lines);
566d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
567d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    FILE *f = fopen(outFile, "w");
568d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
569d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    printFileHeader(f);
570ed9f210568082dd6d1d8a0c92c693d574d87d545Alex Sakhartchouk    switch (choice) {
571d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        case '0': // rsgApiStructs.h
572d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        {
573d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams            fprintf(f, "\n");
574d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams            fprintf(f, "#include \"rsContext.h\"\n");
5757a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams            fprintf(f, "#include \"rsFifo.h\"\n");
576d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams            fprintf(f, "\n");
577d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams            fprintf(f, "namespace android {\n");
578d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams            fprintf(f, "namespace renderscript {\n");
579d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams            printStructures(f);
580d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams            printFuncDecls(f, "rsi_", 1);
581d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams            printPlaybackFuncs(f, "rsp_");
5827a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams            fprintf(f, "\n\ntypedef struct RsPlaybackRemoteHeaderRec {\n");
5837a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams            fprintf(f, "    uint32_t command;\n");
5847a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams            fprintf(f, "    uint32_t size;\n");
5857a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams            fprintf(f, "} RsPlaybackRemoteHeader;\n\n");
5867a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams            fprintf(f, "typedef void (*RsPlaybackLocalFunc)(Context *, const void *, size_t sizeBytes);\n");
5877a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams            fprintf(f, "typedef void (*RsPlaybackRemoteFunc)(Context *, Fifo *, uint8_t *scratch, size_t scratchSize);\n");
5887a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams            fprintf(f, "extern RsPlaybackLocalFunc gPlaybackFuncs[%i];\n", apiCount + 1);
5897a22e107d100caea2a661ec73e4525d69f0f9759Jason Sams            fprintf(f, "extern RsPlaybackRemoteFunc gPlaybackRemoteFuncs[%i];\n", apiCount + 1);
590d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
591d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams            fprintf(f, "}\n");
592d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams            fprintf(f, "}\n");
593d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        }
594d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        break;
595d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
596d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        case '1': // rsgApiFuncDecl.h
597d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        {
598d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams            printFuncDecls(f, "rs", 0);
599d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        }
600d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        break;
601d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
602d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        case '2': // rsgApi.cpp
603d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        {
604d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams            printApiCpp(f);
605d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        }
606d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        break;
607d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
608d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        case '3': // rsgApiReplay.cpp
609d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        {
610d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams            printFileHeader(f);
611d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams            printPlaybackCpp(f);
612d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        }
613d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        break;
614c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams
615c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams        case '4': // rsgApiStream.cpp
616c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams        {
617c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams            printFileHeader(f);
618c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams            printPlaybackCpp(f);
619c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams        }
620c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams
621c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams        case '5': // rsgApiStreamReplay.cpp
622c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams        {
623c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams            printFileHeader(f);
624c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams            printPlaybackCpp(f);
625c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams        }
626c576537166fa3f829e4b5d8c6617a36b47e75fc3Jason Sams        break;
627d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    }
628d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    fclose(f);
629d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    return 0;
630d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
631