184614dd02411e1cf9a4c37aa421898c471cfad20Joe Onorato#include "spec.h"
284614dd02411e1cf9a4c37aa421898c471cfad20Joe Onorato#include <stdio.h>
3da3b58d804b59595f1c618ff271fecd8a9ce59edShih-wei Liao#include <string.h>
4326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
5b74514df6be14fd898ddd7906bc70408dc3bb63cMatt Wala#define LOCAL_FIFO_PREFIX "LF_"
6b74514df6be14fd898ddd7906bc70408dc3bb63cMatt Wala#define RS_PLAYBACK_PREFIX "rsp_"
7b74514df6be14fd898ddd7906bc70408dc3bb63cMatt Wala#define RS_INTERNAL_PREFIX "rsi_"
8b74514df6be14fd898ddd7906bc70408dc3bb63cMatt Wala
9b74514df6be14fd898ddd7906bc70408dc3bb63cMatt Wala#define RSG_API_CPP_DOC                                                     \
10b74514df6be14fd898ddd7906bc70408dc3bb63cMatt Wala"/*\n"                                                                      \
11b74514df6be14fd898ddd7906bc70408dc3bb63cMatt Wala" * rsgApi.cpp\n"                                                           \
12b74514df6be14fd898ddd7906bc70408dc3bb63cMatt Wala" * This file implements the functions responsible for sending messages\n"  \
13b74514df6be14fd898ddd7906bc70408dc3bb63cMatt Wala" * to the RS driver layer. The messages are sent through a FIFO that is\n" \
14b74514df6be14fd898ddd7906bc70408dc3bb63cMatt Wala" * shared between the process's caller threads and driver thread.\n"       \
15b74514df6be14fd898ddd7906bc70408dc3bb63cMatt Wala" */\n\n"
16b74514df6be14fd898ddd7906bc70408dc3bb63cMatt Wala
17b74514df6be14fd898ddd7906bc70408dc3bb63cMatt Wala#define RSG_API_REPLAY_CPP_DOC                                              \
18b74514df6be14fd898ddd7906bc70408dc3bb63cMatt Wala"/*\n"                                                                      \
19b74514df6be14fd898ddd7906bc70408dc3bb63cMatt Wala" * rsgApiReplay.cpp\n"                                                     \
20b74514df6be14fd898ddd7906bc70408dc3bb63cMatt Wala" * This file implements the functions responsible for reading messages\n"  \
21b74514df6be14fd898ddd7906bc70408dc3bb63cMatt Wala" * sent to the RS driver layer.\n"                                         \
22b74514df6be14fd898ddd7906bc70408dc3bb63cMatt Wala" */\n\n"
23b74514df6be14fd898ddd7906bc70408dc3bb63cMatt Wala
24afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid printFileHeader(FILE *f) {
25326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    fprintf(f, "/*\n");
26b74514df6be14fd898ddd7906bc70408dc3bb63cMatt Wala    fprintf(f, " * Copyright (C) 2015 The Android Open Source Project\n");
27326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    fprintf(f, " *\n");
28326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    fprintf(f, " * Licensed under the Apache License, Version 2.0 (the \"License\");\n");
29326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    fprintf(f, " * you may not use this file except in compliance with the License.\n");
30326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    fprintf(f, " * You may obtain a copy of the License at\n");
31326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    fprintf(f, " *\n");
32326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    fprintf(f, " *      http://www.apache.org/licenses/LICENSE-2.0\n");
33326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    fprintf(f, " *\n");
34326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    fprintf(f, " * Unless required by applicable law or agreed to in writing, software\n");
35326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    fprintf(f, " * distributed under the License is distributed on an \"AS IS\" BASIS,\n");
36326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    fprintf(f, " * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n");
37326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    fprintf(f, " * See the License for the specific language governing permissions and\n");
38326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    fprintf(f, " * limitations under the License.\n");
39326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    fprintf(f, " */\n\n");
40326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
41326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
42afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid printVarType(FILE *f, const VarType *vt) {
43326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    int ct;
44326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    if (vt->isConst) {
45326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        fprintf(f, "const ");
46326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
47326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
48afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk    switch (vt->type) {
49326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    case 0:
50326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        fprintf(f, "void");
51326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        break;
52326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    case 1:
53326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        fprintf(f, "int%i_t", vt->bits);
54326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        break;
55326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    case 2:
56326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        fprintf(f, "uint%i_t", vt->bits);
57326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        break;
58326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    case 3:
59326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        if (vt->bits == 32)
60326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams            fprintf(f, "float");
61326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        else
62326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams            fprintf(f, "double");
63326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        break;
64326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    case 4:
6584614dd02411e1cf9a4c37aa421898c471cfad20Joe Onorato        fprintf(f, "%s", vt->typeName);
66326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        break;
67326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
68326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
69afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk    if (vt->ptrLevel) {
70326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        fprintf(f, " ");
71afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk        for (ct=0; ct < vt->ptrLevel; ct++) {
72326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams            fprintf(f, "*");
73326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        }
74326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
755fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams}
765fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams
775fb1aeb6374f814d72117803682bc141cc6b0895Jason Samsvoid printVarTypeAndName(FILE *f, const VarType *vt) {
785fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams    printVarType(f, vt);
79326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
80afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk    if (vt->name[0]) {
81326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        fprintf(f, " %s", vt->name);
82326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
83326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
84326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
85afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid printArgList(FILE *f, const ApiEntry * api, int assumePrevious) {
86326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    int ct;
87afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk    for (ct=0; ct < api->paramCount; ct++) {
88326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        if (ct || assumePrevious) {
89326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams            fprintf(f, ", ");
90326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        }
915fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams        printVarTypeAndName(f, &api->params[ct]);
92326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
93326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
94326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
95afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid printStructures(FILE *f) {
96326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    int ct;
97326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    int ct2;
98326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
99afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk    for (ct=0; ct < apiCount; ct++) {
100326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        fprintf(f, "typedef struct RS_CMD_%s_rec RS_CMD_%s;\n", apis[ct].name, apis[ct].name);
101326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
102326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    fprintf(f, "\n");
103326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
104afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk    for (ct=0; ct < apiCount; ct++) {
105326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        const ApiEntry * api = &apis[ct];
106326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        fprintf(f, "#define RS_CMD_ID_%s %i\n", api->name, ct+1);
107f047575af292b9d2f56a266250de7feb9987de18Stephen Hines        fprintf(f, "struct __attribute__((packed)) RS_CMD_%s_rec {\n", api->name);
108326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        //fprintf(f, "    RsCommandHeader _hdr;\n");
109326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
110afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk        for (ct2=0; ct2 < api->paramCount; ct2++) {
111326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams            fprintf(f, "    ");
1125fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams            printVarTypeAndName(f, &api->params[ct2]);
113326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams            fprintf(f, ";\n");
114326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        }
115326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        fprintf(f, "};\n\n");
116326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
117326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
118326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
119c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Samsvoid printFuncDecl(FILE *f, const ApiEntry *api, const char *prefix, int addContext, int isFnPtr) {
1205fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams    printVarTypeAndName(f, &api->ret);
121c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams    if (isFnPtr) {
122c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams        char t[1024];
123ca451c3280b6265a9b79273b4bf89e121a050cabMichael Butler        strncpy(t, api->name, sizeof(t)-1);
124ca451c3280b6265a9b79273b4bf89e121a050cabMichael Butler        t[sizeof(t)-1] = '\0';
125c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams        if (strlen(prefix) == 0) {
126c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams            if (t[0] > 'A' && t[0] < 'Z') {
127c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams                t[0] -= 'A' - 'a';
128c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams            }
129c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams        }
130c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams        fprintf(f, " (* %s%s) (", prefix, api->name);
131c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams    } else {
132c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams        fprintf(f, " %s%s (", prefix, api->name);
133c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams    }
134186e59154a0fb86e05e283e9c083b69878c06720Jason Sams    if (!api->nocontext) {
135186e59154a0fb86e05e283e9c083b69878c06720Jason Sams        if (addContext) {
136186e59154a0fb86e05e283e9c083b69878c06720Jason Sams            fprintf(f, "Context *");
137186e59154a0fb86e05e283e9c083b69878c06720Jason Sams        } else {
138186e59154a0fb86e05e283e9c083b69878c06720Jason Sams            fprintf(f, "RsContext rsc");
139186e59154a0fb86e05e283e9c083b69878c06720Jason Sams        }
140326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
141186e59154a0fb86e05e283e9c083b69878c06720Jason Sams    printArgList(f, api, !api->nocontext);
142326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    fprintf(f, ")");
143326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
144326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
145f6023e494e67bc9deaa8b96008180104cbf540c7Tim Murrayvoid printFuncDecls(FILE *f, const char *prefix, int addContext, int externC) {
146326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    int ct;
147afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk    for (ct=0; ct < apiCount; ct++) {
148f6023e494e67bc9deaa8b96008180104cbf540c7Tim Murray        if (externC) {
149f6023e494e67bc9deaa8b96008180104cbf540c7Tim Murray            fprintf(f, "extern \"C\" ");
150f6023e494e67bc9deaa8b96008180104cbf540c7Tim Murray        }
151c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams        printFuncDecl(f, &apis[ct], prefix, addContext, 0);
152326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        fprintf(f, ";\n");
153326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
154326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    fprintf(f, "\n\n");
155326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
156326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
157afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid printPlaybackFuncs(FILE *f, const char *prefix) {
158326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    int ct;
159afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk    for (ct=0; ct < apiCount; ct++) {
160186e59154a0fb86e05e283e9c083b69878c06720Jason Sams        if (apis[ct].direct) {
161186e59154a0fb86e05e283e9c083b69878c06720Jason Sams            continue;
162186e59154a0fb86e05e283e9c083b69878c06720Jason Sams        }
163186e59154a0fb86e05e283e9c083b69878c06720Jason Sams
164326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        fprintf(f, "void %s%s (Context *, const void *);\n", prefix, apis[ct].name);
165326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
166326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
167326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
1685fb1aeb6374f814d72117803682bc141cc6b0895Jason Samsstatic int hasInlineDataPointers(const ApiEntry * api) {
1695fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams    int ret = 0;
1705fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams    int ct;
171b693112b7513227b06d4a0a4e712ad3ce01451b4Jason Sams    if (api->sync || api->ret.typeName[0]) {
1725fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams        return 0;
1735fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams    }
1745fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams    for (ct=0; ct < api->paramCount; ct++) {
1755fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams        const VarType *vt = &api->params[ct];
1765fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams
1775fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams        if (!vt->isConst && vt->ptrLevel) {
1785fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams            // Non-const pointers cannot be inlined.
1795fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams            return 0;
1805fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams        }
1815fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams        if (vt->ptrLevel > 1) {
1825fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams            // not handled yet.
1835fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams            return 0;
1845fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams        }
1855fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams
1865fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams        if (vt->isConst && vt->ptrLevel) {
1875fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams            // Non-const pointers cannot be inlined.
1885fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams            ret = 1;
1895fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams        }
1905fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams    }
1915fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams    return ret;
1925fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams}
1935fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams
194afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid printApiCpp(FILE *f) {
195326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    int ct;
196326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    int ct2;
197326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
198b74514df6be14fd898ddd7906bc70408dc3bb63cMatt Wala    fprintf(f, RSG_API_CPP_DOC);
199b74514df6be14fd898ddd7906bc70408dc3bb63cMatt Wala
200326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    fprintf(f, "#include \"rsDevice.h\"\n");
201326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    fprintf(f, "#include \"rsContext.h\"\n");
202326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    fprintf(f, "#include \"rsThreadIO.h\"\n");
2034edf030cbb7c6ac08dc563335c2af73c20f6e2e5Alex Sakhartchouk    fprintf(f, "#include \"rsgApiStructs.h\"\n");
204326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    fprintf(f, "#include \"rsgApiFuncDecl.h\"\n");
2052008747941749ad27fe80663d23036ac320e998fJason Sams    fprintf(f, "#include \"rsFifo.h\"\n");
206326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    fprintf(f, "\n");
20711496ac131bb691edf5bdcab3029dceef5c1e4e1Chih-Hung Hsieh    fprintf(f, "using namespace android;  // NOLINT\n");
20811496ac131bb691edf5bdcab3029dceef5c1e4e1Chih-Hung Hsieh    fprintf(f, "using namespace android::renderscript;  // NOLINT\n");
209326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    fprintf(f, "\n");
210326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
211b74514df6be14fd898ddd7906bc70408dc3bb63cMatt Wala    // Generate RS funcs that send messages on the local FIFO.
212afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk    for (ct=0; ct < apiCount; ct++) {
213326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        int needFlush = 0;
214326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        const ApiEntry * api = &apis[ct];
215326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
216c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams        fprintf(f, "static ");
217b74514df6be14fd898ddd7906bc70408dc3bb63cMatt Wala        printFuncDecl(f, api, LOCAL_FIFO_PREFIX, 0, 0);
218326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        fprintf(f, "\n{\n");
2191a4efa363916977ef9aeab756725b3bdc880a15bJason Sams        if (api->direct) {
2201a4efa363916977ef9aeab756725b3bdc880a15bJason Sams            fprintf(f, "    ");
2211a4efa363916977ef9aeab756725b3bdc880a15bJason Sams            if (api->ret.typeName[0]) {
2221a4efa363916977ef9aeab756725b3bdc880a15bJason Sams                fprintf(f, "return ");
2231a4efa363916977ef9aeab756725b3bdc880a15bJason Sams            }
224b74514df6be14fd898ddd7906bc70408dc3bb63cMatt Wala            fprintf(f, RS_INTERNAL_PREFIX "%s(", api->name);
2251a4efa363916977ef9aeab756725b3bdc880a15bJason Sams            if (!api->nocontext) {
2261a4efa363916977ef9aeab756725b3bdc880a15bJason Sams                fprintf(f, "(Context *)rsc");
227c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams            }
228afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk            for (ct2=0; ct2 < api->paramCount; ct2++) {
2299397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams                const VarType *vt = &api->params[ct2];
230c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams                if (ct2 > 0 || !api->nocontext) {
231c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams                    fprintf(f, ", ");
232c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams                }
233c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams                fprintf(f, "%s", vt->name);
2349397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams            }
2359397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams            fprintf(f, ");\n");
236c2eca55c8b6de99130329a96b13498b700aa6344Tim Murray        } else if (api->handcodeApi) {
237c2eca55c8b6de99130329a96b13498b700aa6344Tim Murray            // handle handcode path
238b74514df6be14fd898ddd7906bc70408dc3bb63cMatt Wala            fprintf(f, "    " LOCAL_FIFO_PREFIX "%s_handcode(", api->name);
239c2eca55c8b6de99130329a96b13498b700aa6344Tim Murray            if (!api->nocontext) {
240c2eca55c8b6de99130329a96b13498b700aa6344Tim Murray                fprintf(f, "(Context *)rsc");
241c2eca55c8b6de99130329a96b13498b700aa6344Tim Murray            }
242c2eca55c8b6de99130329a96b13498b700aa6344Tim Murray            for (ct2=0; ct2 < api->paramCount; ct2++) {
243c2eca55c8b6de99130329a96b13498b700aa6344Tim Murray                const VarType *vt = &api->params[ct2];
244c2eca55c8b6de99130329a96b13498b700aa6344Tim Murray                if (ct2 > 0 || !api->nocontext) {
245c2eca55c8b6de99130329a96b13498b700aa6344Tim Murray                    fprintf(f, ", ");
246c2eca55c8b6de99130329a96b13498b700aa6344Tim Murray                }
247c2eca55c8b6de99130329a96b13498b700aa6344Tim Murray                fprintf(f, "%s", vt->name);
248c2eca55c8b6de99130329a96b13498b700aa6344Tim Murray            }
249c2eca55c8b6de99130329a96b13498b700aa6344Tim Murray            fprintf(f, ");\n");
250c2eca55c8b6de99130329a96b13498b700aa6344Tim Murray
2519397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams        } else {
2524d252d6e807b89764dad123ac845df298c52ca97Tim Murray            // handle synchronous path
2534d252d6e807b89764dad123ac845df298c52ca97Tim Murray            fprintf(f, "    if (((Context *)rsc)->isSynchronous()) {\n");
2544d252d6e807b89764dad123ac845df298c52ca97Tim Murray            fprintf(f, "        ");
2554d252d6e807b89764dad123ac845df298c52ca97Tim Murray            if (api->ret.typeName[0]) {
2564d252d6e807b89764dad123ac845df298c52ca97Tim Murray                fprintf(f, "return ");
2574d252d6e807b89764dad123ac845df298c52ca97Tim Murray            }
258b74514df6be14fd898ddd7906bc70408dc3bb63cMatt Wala            fprintf(f, RS_INTERNAL_PREFIX "%s(", api->name);
2594d252d6e807b89764dad123ac845df298c52ca97Tim Murray            if (!api->nocontext) {
2604d252d6e807b89764dad123ac845df298c52ca97Tim Murray                fprintf(f, "(Context *)rsc");
2614d252d6e807b89764dad123ac845df298c52ca97Tim Murray            }
2624d252d6e807b89764dad123ac845df298c52ca97Tim Murray            for (ct2=0; ct2 < api->paramCount; ct2++) {
2634d252d6e807b89764dad123ac845df298c52ca97Tim Murray                const VarType *vt = &api->params[ct2];
2644d252d6e807b89764dad123ac845df298c52ca97Tim Murray                if (ct2 > 0 || !api->nocontext) {
2654d252d6e807b89764dad123ac845df298c52ca97Tim Murray                    fprintf(f, ", ");
2664d252d6e807b89764dad123ac845df298c52ca97Tim Murray                }
2674d252d6e807b89764dad123ac845df298c52ca97Tim Murray                fprintf(f, "%s", vt->name);
2684d252d6e807b89764dad123ac845df298c52ca97Tim Murray            }
2694d252d6e807b89764dad123ac845df298c52ca97Tim Murray            fprintf(f, ");\n");
2704d252d6e807b89764dad123ac845df298c52ca97Tim Murray            if (!api->ret.typeName[0]) {
2714d252d6e807b89764dad123ac845df298c52ca97Tim Murray                fprintf(f, "    return;");
2724d252d6e807b89764dad123ac845df298c52ca97Tim Murray            }
2734d252d6e807b89764dad123ac845df298c52ca97Tim Murray            fprintf(f, "    }\n\n");
2744d252d6e807b89764dad123ac845df298c52ca97Tim Murray
2759397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams            fprintf(f, "    ThreadIO *io = &((Context *)rsc)->mIO;\n");
276099bc262f862cdeb547cf8a78fe9e0e92560f437Tim Murray            fprintf(f, "    const size_t size = sizeof(RS_CMD_%s);\n", api->name);
2775fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams            if (hasInlineDataPointers(api)) {
278099bc262f862cdeb547cf8a78fe9e0e92560f437Tim Murray                fprintf(f, "    size_t dataSize = 0;\n");
2795fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams                for (ct2=0; ct2 < api->paramCount; ct2++) {
2805fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams                    const VarType *vt = &api->params[ct2];
2815fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams                    if (vt->isConst && vt->ptrLevel) {
2825fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams                        fprintf(f, "    dataSize += %s_length;\n", vt->name);
2835fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams                    }
2845fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams                }
2855fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams            }
2865fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams
287af12ac6a08651464f8d823add667c706f993b587Steve Block            //fprintf(f, "    ALOGE(\"add command %s\\n\");\n", api->name);
2885fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams            if (hasInlineDataPointers(api)) {
289b693112b7513227b06d4a0a4e712ad3ce01451b4Jason Sams                fprintf(f, "    RS_CMD_%s *cmd = NULL;\n", api->name);
290bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams                fprintf(f, "    if (dataSize < io->getMaxInlineSize()) {;\n");
2911a4efa363916977ef9aeab756725b3bdc880a15bJason Sams                fprintf(f, "        cmd = static_cast<RS_CMD_%s *>(io->coreHeader(RS_CMD_ID_%s, dataSize + size));\n", api->name, api->name);
292b693112b7513227b06d4a0a4e712ad3ce01451b4Jason Sams                fprintf(f, "    } else {\n");
2931a4efa363916977ef9aeab756725b3bdc880a15bJason Sams                fprintf(f, "        cmd = static_cast<RS_CMD_%s *>(io->coreHeader(RS_CMD_ID_%s, size));\n", api->name, api->name);
294b693112b7513227b06d4a0a4e712ad3ce01451b4Jason Sams                fprintf(f, "    }\n");
2955fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams                fprintf(f, "    uint8_t *payload = (uint8_t *)&cmd[1];\n");
2966e58aef90ec70adf4e7d6d18b869aed143a2ec02Jason Sams            } else {
2971a4efa363916977ef9aeab756725b3bdc880a15bJason Sams                fprintf(f, "    RS_CMD_%s *cmd = static_cast<RS_CMD_%s *>(io->coreHeader(RS_CMD_ID_%s, size));\n", api->name, api->name, api->name);
2985fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams            }
2999397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams
300afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk            for (ct2=0; ct2 < api->paramCount; ct2++) {
3019397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams                const VarType *vt = &api->params[ct2];
3029397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams                needFlush += vt->ptrLevel;
3035fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams                if (vt->ptrLevel && hasInlineDataPointers(api)) {
304db896f0918a7d79b9dd44a786e393206a0ac36a6Chris Wailes                    fprintf(f, "    if (%s_length == 0) {\n", vt->name);
305db896f0918a7d79b9dd44a786e393206a0ac36a6Chris Wailes                    fprintf(f, "        cmd->%s = NULL;\n", vt->name);
306db896f0918a7d79b9dd44a786e393206a0ac36a6Chris Wailes                    fprintf(f, "    } else if (dataSize < io->getMaxInlineSize()) {\n");
3075fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams                    fprintf(f, "        memcpy(payload, %s, %s_length);\n", vt->name, vt->name);
3085fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams                    fprintf(f, "        cmd->%s = (", vt->name);
3095fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams                    printVarType(f, vt);
3105f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams                    fprintf(f, ")(payload - ((uint8_t *)&cmd[1]));\n");
3115fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams                    fprintf(f, "        payload += %s_length;\n", vt->name);
3125fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams                    fprintf(f, "    } else {\n");
3135fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams                    fprintf(f, "        cmd->%s = %s;\n", vt->name, vt->name);
3145fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams                    fprintf(f, "    }\n");
3155fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams
3165fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams                } else {
3175fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams                    fprintf(f, "    cmd->%s = %s;\n", vt->name, vt->name);
3185fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams                }
3199397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams            }
3201a4efa363916977ef9aeab756725b3bdc880a15bJason Sams            if (api->ret.typeName[0] || api->sync) {
3219397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams                needFlush = 1;
3229397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams            }
3239397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams
3245f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams            fprintf(f, "    io->coreCommit();\n");
3255fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams            if (hasInlineDataPointers(api)) {
326bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams                fprintf(f, "    if (dataSize >= io->getMaxInlineSize()) {\n");
3275f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams                fprintf(f, "        io->coreGetReturn(NULL, 0);\n");
3285fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams                fprintf(f, "    }\n");
3295f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams            } else if (api->ret.typeName[0]) {
3301a4efa363916977ef9aeab756725b3bdc880a15bJason Sams                fprintf(f, "\n    ");
3312008747941749ad27fe80663d23036ac320e998fJason Sams                printVarType(f, &api->ret);
3321a4efa363916977ef9aeab756725b3bdc880a15bJason Sams                fprintf(f, " ret;\n");
3331a4efa363916977ef9aeab756725b3bdc880a15bJason Sams                fprintf(f, "    io->coreGetReturn(&ret, sizeof(ret));\n");
3341a4efa363916977ef9aeab756725b3bdc880a15bJason Sams                fprintf(f, "    return ret;\n");
3355f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams            } else if (needFlush) {
3365f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams                fprintf(f, "    io->coreGetReturn(NULL, 0);\n");
3379397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams            }
338326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        }
339326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        fprintf(f, "};\n\n");
340c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams    }
341c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams
3422008747941749ad27fe80663d23036ac320e998fJason Sams    fprintf(f, "\n");
343c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams
344c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams    for (ct=0; ct < apiCount; ct++) {
345c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams        int needFlush = 0;
346c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams        const ApiEntry * api = &apis[ct];
347c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams
348f6023e494e67bc9deaa8b96008180104cbf540c7Tim Murray        fprintf(f, "extern \"C\" ");
349f6023e494e67bc9deaa8b96008180104cbf540c7Tim Murray
350c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams        printFuncDecl(f, api, "rs", 0, 0);
351c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams        fprintf(f, "\n{\n");
352c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams        fprintf(f, "    ");
353c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams        if (api->ret.typeName[0]) {
354c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams            fprintf(f, "return ");
355c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams        }
356b74514df6be14fd898ddd7906bc70408dc3bb63cMatt Wala        fprintf(f, LOCAL_FIFO_PREFIX "%s(", api->name);
357c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams
358c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams        if (!api->nocontext) {
359c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams            fprintf(f, "(Context *)rsc");
360c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams        }
361c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams
362c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams        for (ct2=0; ct2 < api->paramCount; ct2++) {
363c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams            const VarType *vt = &api->params[ct2];
364c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams            if (ct2 > 0 || !api->nocontext) {
365c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams                fprintf(f, ", ");
366c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams            }
367c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams            fprintf(f, "%s", vt->name);
368c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams        }
369c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams        fprintf(f, ");\n");
370c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams        fprintf(f, "}\n\n");
371c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams    }
372c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams
373326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
374326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
375afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid printPlaybackCpp(FILE *f) {
376326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    int ct;
377326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    int ct2;
378326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
379b74514df6be14fd898ddd7906bc70408dc3bb63cMatt Wala    fprintf(f, RSG_API_REPLAY_CPP_DOC);
380b74514df6be14fd898ddd7906bc70408dc3bb63cMatt Wala
381326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    fprintf(f, "#include \"rsDevice.h\"\n");
382326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    fprintf(f, "#include \"rsContext.h\"\n");
383326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    fprintf(f, "#include \"rsThreadIO.h\"\n");
3844edf030cbb7c6ac08dc563335c2af73c20f6e2e5Alex Sakhartchouk    fprintf(f, "#include \"rsgApiStructs.h\"\n");
385326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    fprintf(f, "#include \"rsgApiFuncDecl.h\"\n");
386326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    fprintf(f, "\n");
387326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    fprintf(f, "namespace android {\n");
388326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    fprintf(f, "namespace renderscript {\n");
389326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    fprintf(f, "\n");
390326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
391b74514df6be14fd898ddd7906bc70408dc3bb63cMatt Wala    // Generate functions to play back messages sent from the local FIFO.
392afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk    for (ct=0; ct < apiCount; ct++) {
393326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        const ApiEntry * api = &apis[ct];
3945f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams        int needFlush = 0;
395326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
396186e59154a0fb86e05e283e9c083b69878c06720Jason Sams        if (api->direct) {
397186e59154a0fb86e05e283e9c083b69878c06720Jason Sams            continue;
398186e59154a0fb86e05e283e9c083b69878c06720Jason Sams        }
399186e59154a0fb86e05e283e9c083b69878c06720Jason Sams
400b74514df6be14fd898ddd7906bc70408dc3bb63cMatt Wala        fprintf(f, "void " RS_PLAYBACK_PREFIX "%s(Context *con, const void *vp, size_t cmdSizeBytes) {\n", api->name);
401186e59154a0fb86e05e283e9c083b69878c06720Jason Sams        fprintf(f, "    const RS_CMD_%s *cmd = static_cast<const RS_CMD_%s *>(vp);\n", api->name, api->name);
4025fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams
4035f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams        if (hasInlineDataPointers(api)) {
4045f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams            fprintf(f, "    const uint8_t *baseData = 0;\n");
4055f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams            fprintf(f, "    if (cmdSizeBytes != sizeof(RS_CMD_%s)) {\n", api->name);
4065f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams            fprintf(f, "        baseData = &((const uint8_t *)vp)[sizeof(*cmd)];\n");
4075f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams            fprintf(f, "    }\n");
4085f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams        }
4095f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams
410186e59154a0fb86e05e283e9c083b69878c06720Jason Sams        fprintf(f, "    ");
411186e59154a0fb86e05e283e9c083b69878c06720Jason Sams        if (api->ret.typeName[0]) {
4121a4efa363916977ef9aeab756725b3bdc880a15bJason Sams            fprintf(f, "\n    ");
4131a4efa363916977ef9aeab756725b3bdc880a15bJason Sams            printVarType(f, &api->ret);
4141a4efa363916977ef9aeab756725b3bdc880a15bJason Sams            fprintf(f, " ret = ");
415326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        }
416b74514df6be14fd898ddd7906bc70408dc3bb63cMatt Wala        fprintf(f, RS_INTERNAL_PREFIX "%s(con", api->name);
417186e59154a0fb86e05e283e9c083b69878c06720Jason Sams        for (ct2=0; ct2 < api->paramCount; ct2++) {
418186e59154a0fb86e05e283e9c083b69878c06720Jason Sams            const VarType *vt = &api->params[ct2];
4195f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams            needFlush += vt->ptrLevel;
4205f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams
4215f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams            if (hasInlineDataPointers(api) && vt->ptrLevel) {
422db896f0918a7d79b9dd44a786e393206a0ac36a6Chris Wailes                fprintf(f, ",\n           cmd->%s_length == 0 ? NULL : (const %s *)&baseData[(intptr_t)cmd->%s]",
423db896f0918a7d79b9dd44a786e393206a0ac36a6Chris Wailes                        vt->name, vt->typeName, vt->name);
4245f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams            } else {
4255f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams                fprintf(f, ",\n           cmd->%s", vt->name);
4265f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams            }
427186e59154a0fb86e05e283e9c083b69878c06720Jason Sams        }
428186e59154a0fb86e05e283e9c083b69878c06720Jason Sams        fprintf(f, ");\n");
429186e59154a0fb86e05e283e9c083b69878c06720Jason Sams
4305f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams        if (hasInlineDataPointers(api)) {
431ee5cf0067c374e1c7e9a0736e24e55f4d19a0721Jason Sams            fprintf(f, "    size_t totalSize = 0;\n");
432ee5cf0067c374e1c7e9a0736e24e55f4d19a0721Jason Sams            for (ct2=0; ct2 < api->paramCount; ct2++) {
433ee5cf0067c374e1c7e9a0736e24e55f4d19a0721Jason Sams                if (api->params[ct2].ptrLevel) {
434ee5cf0067c374e1c7e9a0736e24e55f4d19a0721Jason Sams                    fprintf(f, "    totalSize += cmd->%s_length;\n", api->params[ct2].name);
435ee5cf0067c374e1c7e9a0736e24e55f4d19a0721Jason Sams                }
436ee5cf0067c374e1c7e9a0736e24e55f4d19a0721Jason Sams            }
437ee5cf0067c374e1c7e9a0736e24e55f4d19a0721Jason Sams
438ee5cf0067c374e1c7e9a0736e24e55f4d19a0721Jason Sams            fprintf(f, "    if ((totalSize != 0) && (cmdSizeBytes == sizeof(RS_CMD_%s))) {\n", api->name);
4395f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams            fprintf(f, "        con->mIO.coreSetReturn(NULL, 0);\n");
4405f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams            fprintf(f, "    }\n");
4415f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams        } else if (api->ret.typeName[0]) {
4421a4efa363916977ef9aeab756725b3bdc880a15bJason Sams            fprintf(f, "    con->mIO.coreSetReturn(&ret, sizeof(ret));\n");
4435f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams        } else if (api->sync || needFlush) {
4445f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams            fprintf(f, "    con->mIO.coreSetReturn(NULL, 0);\n");
4451a4efa363916977ef9aeab756725b3bdc880a15bJason Sams        }
4461a4efa363916977ef9aeab756725b3bdc880a15bJason Sams
447326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        fprintf(f, "};\n\n");
448326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
449326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
450b74514df6be14fd898ddd7906bc70408dc3bb63cMatt Wala    // Generate the globally accessible table of playback functions.
4512008747941749ad27fe80663d23036ac320e998fJason Sams    fprintf(f, "RsPlaybackLocalFunc gPlaybackFuncs[%i] = {\n", apiCount + 1);
452326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    fprintf(f, "    NULL,\n");
453afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk    for (ct=0; ct < apiCount; ct++) {
454186e59154a0fb86e05e283e9c083b69878c06720Jason Sams        if (apis[ct].direct) {
455186e59154a0fb86e05e283e9c083b69878c06720Jason Sams            fprintf(f, "    NULL,\n");
456186e59154a0fb86e05e283e9c083b69878c06720Jason Sams        } else {
457b74514df6be14fd898ddd7906bc70408dc3bb63cMatt Wala            fprintf(f, "    %s%s,\n", RS_PLAYBACK_PREFIX, apis[ct].name);
458186e59154a0fb86e05e283e9c083b69878c06720Jason Sams        }
459326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
460326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    fprintf(f, "};\n");
461326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
462326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    fprintf(f, "};\n");
463326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    fprintf(f, "};\n");
464326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
465326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
4665fb1aeb6374f814d72117803682bc141cc6b0895Jason Samsvoid yylex();
4675fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams
468afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukint main(int argc, char **argv) {
469326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    if (argc != 3) {
470326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        fprintf(stderr, "usage: %s commandFile outFile\n", argv[0]);
471326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        return 1;
472326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
473326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    const char* rsgFile = argv[1];
474326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    const char* outFile = argv[2];
475326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    FILE* input = fopen(rsgFile, "r");
476326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
477326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    char choice = fgetc(input);
478326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    fclose(input);
479326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
480326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    if (choice < '0' || choice > '3') {
481326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        fprintf(stderr, "Uknown command: \'%c\'\n", choice);
482326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        return -2;
483326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
484326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
485326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    yylex();
486326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    // printf("# of lines = %d\n", num_lines);
487326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
488326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    FILE *f = fopen(outFile, "w");
489326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
490326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    printFileHeader(f);
491afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk    switch (choice) {
492326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        case '0': // rsgApiStructs.h
493326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        {
494326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams            fprintf(f, "\n");
495326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams            fprintf(f, "#include \"rsContext.h\"\n");
4962008747941749ad27fe80663d23036ac320e998fJason Sams            fprintf(f, "#include \"rsFifo.h\"\n");
497326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams            fprintf(f, "\n");
498326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams            fprintf(f, "namespace android {\n");
499326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams            fprintf(f, "namespace renderscript {\n");
500326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams            printStructures(f);
501b74514df6be14fd898ddd7906bc70408dc3bb63cMatt Wala            printFuncDecls(f, RS_INTERNAL_PREFIX, 1, 0);
502b74514df6be14fd898ddd7906bc70408dc3bb63cMatt Wala            printPlaybackFuncs(f, RS_PLAYBACK_PREFIX);
5032008747941749ad27fe80663d23036ac320e998fJason Sams            fprintf(f, "typedef void (*RsPlaybackLocalFunc)(Context *, const void *, size_t sizeBytes);\n");
5042008747941749ad27fe80663d23036ac320e998fJason Sams            fprintf(f, "extern RsPlaybackLocalFunc gPlaybackFuncs[%i];\n", apiCount + 1);
505326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
506326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams            fprintf(f, "}\n");
507326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams            fprintf(f, "}\n");
508326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        }
509326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        break;
510326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
511326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        case '1': // rsgApiFuncDecl.h
512326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        {
513f6023e494e67bc9deaa8b96008180104cbf540c7Tim Murray            printFuncDecls(f, "rs", 0, 1);
514326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        }
515326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        break;
516326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
517326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        case '2': // rsgApi.cpp
518326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        {
519326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams            printApiCpp(f);
520326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        }
521326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        break;
522326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
523326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        case '3': // rsgApiReplay.cpp
524326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        {
525326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams            printPlaybackCpp(f);
526326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        }
527326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        break;
528326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
529326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    fclose(f);
530326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    return 0;
531326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
532