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];
123c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams        strcpy(t, api->name);
124c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams        if (strlen(prefix) == 0) {
125c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams            if (t[0] > 'A' && t[0] < 'Z') {
126c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams                t[0] -= 'A' - 'a';
127c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams            }
128c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams        }
129c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams        fprintf(f, " (* %s%s) (", prefix, api->name);
130c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams    } else {
131c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams        fprintf(f, " %s%s (", prefix, api->name);
132c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams    }
133186e59154a0fb86e05e283e9c083b69878c06720Jason Sams    if (!api->nocontext) {
134186e59154a0fb86e05e283e9c083b69878c06720Jason Sams        if (addContext) {
135186e59154a0fb86e05e283e9c083b69878c06720Jason Sams            fprintf(f, "Context *");
136186e59154a0fb86e05e283e9c083b69878c06720Jason Sams        } else {
137186e59154a0fb86e05e283e9c083b69878c06720Jason Sams            fprintf(f, "RsContext rsc");
138186e59154a0fb86e05e283e9c083b69878c06720Jason Sams        }
139326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
140186e59154a0fb86e05e283e9c083b69878c06720Jason Sams    printArgList(f, api, !api->nocontext);
141326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    fprintf(f, ")");
142326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
143326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
144f6023e494e67bc9deaa8b96008180104cbf540c7Tim Murrayvoid printFuncDecls(FILE *f, const char *prefix, int addContext, int externC) {
145326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    int ct;
146afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk    for (ct=0; ct < apiCount; ct++) {
147f6023e494e67bc9deaa8b96008180104cbf540c7Tim Murray        if (externC) {
148f6023e494e67bc9deaa8b96008180104cbf540c7Tim Murray            fprintf(f, "extern \"C\" ");
149f6023e494e67bc9deaa8b96008180104cbf540c7Tim Murray        }
150c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams        printFuncDecl(f, &apis[ct], prefix, addContext, 0);
151326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        fprintf(f, ";\n");
152326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
153326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    fprintf(f, "\n\n");
154326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
155326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
156afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid printPlaybackFuncs(FILE *f, const char *prefix) {
157326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    int ct;
158afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk    for (ct=0; ct < apiCount; ct++) {
159186e59154a0fb86e05e283e9c083b69878c06720Jason Sams        if (apis[ct].direct) {
160186e59154a0fb86e05e283e9c083b69878c06720Jason Sams            continue;
161186e59154a0fb86e05e283e9c083b69878c06720Jason Sams        }
162186e59154a0fb86e05e283e9c083b69878c06720Jason Sams
163326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        fprintf(f, "void %s%s (Context *, const void *);\n", prefix, apis[ct].name);
164326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
165326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
166326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
1675fb1aeb6374f814d72117803682bc141cc6b0895Jason Samsstatic int hasInlineDataPointers(const ApiEntry * api) {
1685fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams    int ret = 0;
1695fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams    int ct;
170b693112b7513227b06d4a0a4e712ad3ce01451b4Jason Sams    if (api->sync || api->ret.typeName[0]) {
1715fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams        return 0;
1725fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams    }
1735fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams    for (ct=0; ct < api->paramCount; ct++) {
1745fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams        const VarType *vt = &api->params[ct];
1755fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams
1765fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams        if (!vt->isConst && vt->ptrLevel) {
1775fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams            // Non-const pointers cannot be inlined.
1785fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams            return 0;
1795fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams        }
1805fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams        if (vt->ptrLevel > 1) {
1815fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams            // not handled yet.
1825fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams            return 0;
1835fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams        }
1845fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams
1855fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams        if (vt->isConst && vt->ptrLevel) {
1865fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams            // Non-const pointers cannot be inlined.
1875fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams            ret = 1;
1885fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams        }
1895fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams    }
1905fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams    return ret;
1915fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams}
1925fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams
193afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid printApiCpp(FILE *f) {
194326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    int ct;
195326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    int ct2;
196326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
197b74514df6be14fd898ddd7906bc70408dc3bb63cMatt Wala    fprintf(f, RSG_API_CPP_DOC);
198b74514df6be14fd898ddd7906bc70408dc3bb63cMatt Wala
199326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    fprintf(f, "#include \"rsDevice.h\"\n");
200326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    fprintf(f, "#include \"rsContext.h\"\n");
201326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    fprintf(f, "#include \"rsThreadIO.h\"\n");
2024edf030cbb7c6ac08dc563335c2af73c20f6e2e5Alex Sakhartchouk    fprintf(f, "#include \"rsgApiStructs.h\"\n");
203326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    fprintf(f, "#include \"rsgApiFuncDecl.h\"\n");
2042008747941749ad27fe80663d23036ac320e998fJason Sams    fprintf(f, "#include \"rsFifo.h\"\n");
205326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    fprintf(f, "\n");
206326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    fprintf(f, "using namespace android;\n");
207326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    fprintf(f, "using namespace android::renderscript;\n");
208326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    fprintf(f, "\n");
209326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
210b74514df6be14fd898ddd7906bc70408dc3bb63cMatt Wala    // Generate RS funcs that send messages on the local FIFO.
211afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk    for (ct=0; ct < apiCount; ct++) {
212326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        int needFlush = 0;
213326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        const ApiEntry * api = &apis[ct];
214326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
215c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams        fprintf(f, "static ");
216b74514df6be14fd898ddd7906bc70408dc3bb63cMatt Wala        printFuncDecl(f, api, LOCAL_FIFO_PREFIX, 0, 0);
217326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        fprintf(f, "\n{\n");
2181a4efa363916977ef9aeab756725b3bdc880a15bJason Sams        if (api->direct) {
2191a4efa363916977ef9aeab756725b3bdc880a15bJason Sams            fprintf(f, "    ");
2201a4efa363916977ef9aeab756725b3bdc880a15bJason Sams            if (api->ret.typeName[0]) {
2211a4efa363916977ef9aeab756725b3bdc880a15bJason Sams                fprintf(f, "return ");
2221a4efa363916977ef9aeab756725b3bdc880a15bJason Sams            }
223b74514df6be14fd898ddd7906bc70408dc3bb63cMatt Wala            fprintf(f, RS_INTERNAL_PREFIX "%s(", api->name);
2241a4efa363916977ef9aeab756725b3bdc880a15bJason Sams            if (!api->nocontext) {
2251a4efa363916977ef9aeab756725b3bdc880a15bJason Sams                fprintf(f, "(Context *)rsc");
226c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams            }
227afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk            for (ct2=0; ct2 < api->paramCount; ct2++) {
2289397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams                const VarType *vt = &api->params[ct2];
229c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams                if (ct2 > 0 || !api->nocontext) {
230c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams                    fprintf(f, ", ");
231c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams                }
232c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams                fprintf(f, "%s", vt->name);
2339397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams            }
2349397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams            fprintf(f, ");\n");
235c2eca55c8b6de99130329a96b13498b700aa6344Tim Murray        } else if (api->handcodeApi) {
236c2eca55c8b6de99130329a96b13498b700aa6344Tim Murray            // handle handcode path
237b74514df6be14fd898ddd7906bc70408dc3bb63cMatt Wala            fprintf(f, "    " LOCAL_FIFO_PREFIX "%s_handcode(", api->name);
238c2eca55c8b6de99130329a96b13498b700aa6344Tim Murray            if (!api->nocontext) {
239c2eca55c8b6de99130329a96b13498b700aa6344Tim Murray                fprintf(f, "(Context *)rsc");
240c2eca55c8b6de99130329a96b13498b700aa6344Tim Murray            }
241c2eca55c8b6de99130329a96b13498b700aa6344Tim Murray            for (ct2=0; ct2 < api->paramCount; ct2++) {
242c2eca55c8b6de99130329a96b13498b700aa6344Tim Murray                const VarType *vt = &api->params[ct2];
243c2eca55c8b6de99130329a96b13498b700aa6344Tim Murray                if (ct2 > 0 || !api->nocontext) {
244c2eca55c8b6de99130329a96b13498b700aa6344Tim Murray                    fprintf(f, ", ");
245c2eca55c8b6de99130329a96b13498b700aa6344Tim Murray                }
246c2eca55c8b6de99130329a96b13498b700aa6344Tim Murray                fprintf(f, "%s", vt->name);
247c2eca55c8b6de99130329a96b13498b700aa6344Tim Murray            }
248c2eca55c8b6de99130329a96b13498b700aa6344Tim Murray            fprintf(f, ");\n");
249c2eca55c8b6de99130329a96b13498b700aa6344Tim Murray
2509397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams        } else {
2514d252d6e807b89764dad123ac845df298c52ca97Tim Murray            // handle synchronous path
2524d252d6e807b89764dad123ac845df298c52ca97Tim Murray            fprintf(f, "    if (((Context *)rsc)->isSynchronous()) {\n");
2534d252d6e807b89764dad123ac845df298c52ca97Tim Murray            fprintf(f, "        ");
2544d252d6e807b89764dad123ac845df298c52ca97Tim Murray            if (api->ret.typeName[0]) {
2554d252d6e807b89764dad123ac845df298c52ca97Tim Murray                fprintf(f, "return ");
2564d252d6e807b89764dad123ac845df298c52ca97Tim Murray            }
257b74514df6be14fd898ddd7906bc70408dc3bb63cMatt Wala            fprintf(f, RS_INTERNAL_PREFIX "%s(", api->name);
2584d252d6e807b89764dad123ac845df298c52ca97Tim Murray            if (!api->nocontext) {
2594d252d6e807b89764dad123ac845df298c52ca97Tim Murray                fprintf(f, "(Context *)rsc");
2604d252d6e807b89764dad123ac845df298c52ca97Tim Murray            }
2614d252d6e807b89764dad123ac845df298c52ca97Tim Murray            for (ct2=0; ct2 < api->paramCount; ct2++) {
2624d252d6e807b89764dad123ac845df298c52ca97Tim Murray                const VarType *vt = &api->params[ct2];
2634d252d6e807b89764dad123ac845df298c52ca97Tim Murray                if (ct2 > 0 || !api->nocontext) {
2644d252d6e807b89764dad123ac845df298c52ca97Tim Murray                    fprintf(f, ", ");
2654d252d6e807b89764dad123ac845df298c52ca97Tim Murray                }
2664d252d6e807b89764dad123ac845df298c52ca97Tim Murray                fprintf(f, "%s", vt->name);
2674d252d6e807b89764dad123ac845df298c52ca97Tim Murray            }
2684d252d6e807b89764dad123ac845df298c52ca97Tim Murray            fprintf(f, ");\n");
2694d252d6e807b89764dad123ac845df298c52ca97Tim Murray            if (!api->ret.typeName[0]) {
2704d252d6e807b89764dad123ac845df298c52ca97Tim Murray                fprintf(f, "    return;");
2714d252d6e807b89764dad123ac845df298c52ca97Tim Murray            }
2724d252d6e807b89764dad123ac845df298c52ca97Tim Murray            fprintf(f, "    }\n\n");
2734d252d6e807b89764dad123ac845df298c52ca97Tim Murray
2749397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams            fprintf(f, "    ThreadIO *io = &((Context *)rsc)->mIO;\n");
275099bc262f862cdeb547cf8a78fe9e0e92560f437Tim Murray            fprintf(f, "    const size_t size = sizeof(RS_CMD_%s);\n", api->name);
2765fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams            if (hasInlineDataPointers(api)) {
277099bc262f862cdeb547cf8a78fe9e0e92560f437Tim Murray                fprintf(f, "    size_t dataSize = 0;\n");
2785fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams                for (ct2=0; ct2 < api->paramCount; ct2++) {
2795fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams                    const VarType *vt = &api->params[ct2];
2805fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams                    if (vt->isConst && vt->ptrLevel) {
2815fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams                        fprintf(f, "    dataSize += %s_length;\n", vt->name);
2825fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams                    }
2835fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams                }
2845fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams            }
2855fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams
286af12ac6a08651464f8d823add667c706f993b587Steve Block            //fprintf(f, "    ALOGE(\"add command %s\\n\");\n", api->name);
2875fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams            if (hasInlineDataPointers(api)) {
288b693112b7513227b06d4a0a4e712ad3ce01451b4Jason Sams                fprintf(f, "    RS_CMD_%s *cmd = NULL;\n", api->name);
289bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams                fprintf(f, "    if (dataSize < io->getMaxInlineSize()) {;\n");
2901a4efa363916977ef9aeab756725b3bdc880a15bJason Sams                fprintf(f, "        cmd = static_cast<RS_CMD_%s *>(io->coreHeader(RS_CMD_ID_%s, dataSize + size));\n", api->name, api->name);
291b693112b7513227b06d4a0a4e712ad3ce01451b4Jason Sams                fprintf(f, "    } else {\n");
2921a4efa363916977ef9aeab756725b3bdc880a15bJason Sams                fprintf(f, "        cmd = static_cast<RS_CMD_%s *>(io->coreHeader(RS_CMD_ID_%s, size));\n", api->name, api->name);
293b693112b7513227b06d4a0a4e712ad3ce01451b4Jason Sams                fprintf(f, "    }\n");
2945fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams                fprintf(f, "    uint8_t *payload = (uint8_t *)&cmd[1];\n");
2956e58aef90ec70adf4e7d6d18b869aed143a2ec02Jason Sams            } else {
2961a4efa363916977ef9aeab756725b3bdc880a15bJason 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);
2975fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams            }
2989397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams
299afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk            for (ct2=0; ct2 < api->paramCount; ct2++) {
3009397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams                const VarType *vt = &api->params[ct2];
3019397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams                needFlush += vt->ptrLevel;
3025fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams                if (vt->ptrLevel && hasInlineDataPointers(api)) {
303db896f0918a7d79b9dd44a786e393206a0ac36a6Chris Wailes                    fprintf(f, "    if (%s_length == 0) {\n", vt->name);
304db896f0918a7d79b9dd44a786e393206a0ac36a6Chris Wailes                    fprintf(f, "        cmd->%s = NULL;\n", vt->name);
305db896f0918a7d79b9dd44a786e393206a0ac36a6Chris Wailes                    fprintf(f, "    } else if (dataSize < io->getMaxInlineSize()) {\n");
3065fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams                    fprintf(f, "        memcpy(payload, %s, %s_length);\n", vt->name, vt->name);
3075fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams                    fprintf(f, "        cmd->%s = (", vt->name);
3085fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams                    printVarType(f, vt);
3095f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams                    fprintf(f, ")(payload - ((uint8_t *)&cmd[1]));\n");
3105fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams                    fprintf(f, "        payload += %s_length;\n", vt->name);
3115fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams                    fprintf(f, "    } else {\n");
3125fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams                    fprintf(f, "        cmd->%s = %s;\n", vt->name, vt->name);
3135fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams                    fprintf(f, "    }\n");
3145fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams
3155fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams                } else {
3165fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams                    fprintf(f, "    cmd->%s = %s;\n", vt->name, vt->name);
3175fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams                }
3189397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams            }
3191a4efa363916977ef9aeab756725b3bdc880a15bJason Sams            if (api->ret.typeName[0] || api->sync) {
3209397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams                needFlush = 1;
3219397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams            }
3229397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams
3235f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams            fprintf(f, "    io->coreCommit();\n");
3245fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams            if (hasInlineDataPointers(api)) {
325bda75a977726835d74b2380d7e92360ed2a1ff7aJason Sams                fprintf(f, "    if (dataSize >= io->getMaxInlineSize()) {\n");
3265f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams                fprintf(f, "        io->coreGetReturn(NULL, 0);\n");
3275fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams                fprintf(f, "    }\n");
3285f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams            } else if (api->ret.typeName[0]) {
3291a4efa363916977ef9aeab756725b3bdc880a15bJason Sams                fprintf(f, "\n    ");
3302008747941749ad27fe80663d23036ac320e998fJason Sams                printVarType(f, &api->ret);
3311a4efa363916977ef9aeab756725b3bdc880a15bJason Sams                fprintf(f, " ret;\n");
3321a4efa363916977ef9aeab756725b3bdc880a15bJason Sams                fprintf(f, "    io->coreGetReturn(&ret, sizeof(ret));\n");
3331a4efa363916977ef9aeab756725b3bdc880a15bJason Sams                fprintf(f, "    return ret;\n");
3345f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams            } else if (needFlush) {
3355f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams                fprintf(f, "    io->coreGetReturn(NULL, 0);\n");
3369397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams            }
337326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        }
338326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        fprintf(f, "};\n\n");
339c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams    }
340c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams
3412008747941749ad27fe80663d23036ac320e998fJason Sams    fprintf(f, "\n");
342c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams
343c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams    for (ct=0; ct < apiCount; ct++) {
344c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams        int needFlush = 0;
345c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams        const ApiEntry * api = &apis[ct];
346c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams
347f6023e494e67bc9deaa8b96008180104cbf540c7Tim Murray        fprintf(f, "extern \"C\" ");
348f6023e494e67bc9deaa8b96008180104cbf540c7Tim Murray
349c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams        printFuncDecl(f, api, "rs", 0, 0);
350c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams        fprintf(f, "\n{\n");
351c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams        fprintf(f, "    ");
352c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams        if (api->ret.typeName[0]) {
353c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams            fprintf(f, "return ");
354c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams        }
355b74514df6be14fd898ddd7906bc70408dc3bb63cMatt Wala        fprintf(f, LOCAL_FIFO_PREFIX "%s(", api->name);
356c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams
357c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams        if (!api->nocontext) {
358c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams            fprintf(f, "(Context *)rsc");
359c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams        }
360c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams
361c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams        for (ct2=0; ct2 < api->paramCount; ct2++) {
362c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams            const VarType *vt = &api->params[ct2];
363c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams            if (ct2 > 0 || !api->nocontext) {
364c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams                fprintf(f, ", ");
365c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams            }
366c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams            fprintf(f, "%s", vt->name);
367c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams        }
368c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams        fprintf(f, ");\n");
369c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams        fprintf(f, "}\n\n");
370c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams    }
371c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams
372326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
373326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
374afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid printPlaybackCpp(FILE *f) {
375326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    int ct;
376326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    int ct2;
377326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
378b74514df6be14fd898ddd7906bc70408dc3bb63cMatt Wala    fprintf(f, RSG_API_REPLAY_CPP_DOC);
379b74514df6be14fd898ddd7906bc70408dc3bb63cMatt Wala
380326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    fprintf(f, "#include \"rsDevice.h\"\n");
381326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    fprintf(f, "#include \"rsContext.h\"\n");
382326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    fprintf(f, "#include \"rsThreadIO.h\"\n");
3834edf030cbb7c6ac08dc563335c2af73c20f6e2e5Alex Sakhartchouk    fprintf(f, "#include \"rsgApiStructs.h\"\n");
384326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    fprintf(f, "#include \"rsgApiFuncDecl.h\"\n");
385326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    fprintf(f, "\n");
386326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    fprintf(f, "namespace android {\n");
387326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    fprintf(f, "namespace renderscript {\n");
388326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    fprintf(f, "\n");
389326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
390b74514df6be14fd898ddd7906bc70408dc3bb63cMatt Wala    // Generate functions to play back messages sent from the local FIFO.
391afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk    for (ct=0; ct < apiCount; ct++) {
392326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        const ApiEntry * api = &apis[ct];
3935f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams        int needFlush = 0;
394326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
395186e59154a0fb86e05e283e9c083b69878c06720Jason Sams        if (api->direct) {
396186e59154a0fb86e05e283e9c083b69878c06720Jason Sams            continue;
397186e59154a0fb86e05e283e9c083b69878c06720Jason Sams        }
398186e59154a0fb86e05e283e9c083b69878c06720Jason Sams
399b74514df6be14fd898ddd7906bc70408dc3bb63cMatt Wala        fprintf(f, "void " RS_PLAYBACK_PREFIX "%s(Context *con, const void *vp, size_t cmdSizeBytes) {\n", api->name);
400186e59154a0fb86e05e283e9c083b69878c06720Jason Sams        fprintf(f, "    const RS_CMD_%s *cmd = static_cast<const RS_CMD_%s *>(vp);\n", api->name, api->name);
4015fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams
4025f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams        if (hasInlineDataPointers(api)) {
4035f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams            fprintf(f, "    const uint8_t *baseData = 0;\n");
4045f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams            fprintf(f, "    if (cmdSizeBytes != sizeof(RS_CMD_%s)) {\n", api->name);
4055f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams            fprintf(f, "        baseData = &((const uint8_t *)vp)[sizeof(*cmd)];\n");
4065f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams            fprintf(f, "    }\n");
4075f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams        }
4085f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams
409186e59154a0fb86e05e283e9c083b69878c06720Jason Sams        fprintf(f, "    ");
410186e59154a0fb86e05e283e9c083b69878c06720Jason Sams        if (api->ret.typeName[0]) {
4111a4efa363916977ef9aeab756725b3bdc880a15bJason Sams            fprintf(f, "\n    ");
4121a4efa363916977ef9aeab756725b3bdc880a15bJason Sams            printVarType(f, &api->ret);
4131a4efa363916977ef9aeab756725b3bdc880a15bJason Sams            fprintf(f, " ret = ");
414326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        }
415b74514df6be14fd898ddd7906bc70408dc3bb63cMatt Wala        fprintf(f, RS_INTERNAL_PREFIX "%s(con", api->name);
416186e59154a0fb86e05e283e9c083b69878c06720Jason Sams        for (ct2=0; ct2 < api->paramCount; ct2++) {
417186e59154a0fb86e05e283e9c083b69878c06720Jason Sams            const VarType *vt = &api->params[ct2];
4185f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams            needFlush += vt->ptrLevel;
4195f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams
4205f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams            if (hasInlineDataPointers(api) && vt->ptrLevel) {
421db896f0918a7d79b9dd44a786e393206a0ac36a6Chris Wailes                fprintf(f, ",\n           cmd->%s_length == 0 ? NULL : (const %s *)&baseData[(intptr_t)cmd->%s]",
422db896f0918a7d79b9dd44a786e393206a0ac36a6Chris Wailes                        vt->name, vt->typeName, vt->name);
4235f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams            } else {
4245f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams                fprintf(f, ",\n           cmd->%s", vt->name);
4255f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams            }
426186e59154a0fb86e05e283e9c083b69878c06720Jason Sams        }
427186e59154a0fb86e05e283e9c083b69878c06720Jason Sams        fprintf(f, ");\n");
428186e59154a0fb86e05e283e9c083b69878c06720Jason Sams
4295f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams        if (hasInlineDataPointers(api)) {
430ee5cf0067c374e1c7e9a0736e24e55f4d19a0721Jason Sams            fprintf(f, "    size_t totalSize = 0;\n");
431ee5cf0067c374e1c7e9a0736e24e55f4d19a0721Jason Sams            for (ct2=0; ct2 < api->paramCount; ct2++) {
432ee5cf0067c374e1c7e9a0736e24e55f4d19a0721Jason Sams                if (api->params[ct2].ptrLevel) {
433ee5cf0067c374e1c7e9a0736e24e55f4d19a0721Jason Sams                    fprintf(f, "    totalSize += cmd->%s_length;\n", api->params[ct2].name);
434ee5cf0067c374e1c7e9a0736e24e55f4d19a0721Jason Sams                }
435ee5cf0067c374e1c7e9a0736e24e55f4d19a0721Jason Sams            }
436ee5cf0067c374e1c7e9a0736e24e55f4d19a0721Jason Sams
437ee5cf0067c374e1c7e9a0736e24e55f4d19a0721Jason Sams            fprintf(f, "    if ((totalSize != 0) && (cmdSizeBytes == sizeof(RS_CMD_%s))) {\n", api->name);
4385f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams            fprintf(f, "        con->mIO.coreSetReturn(NULL, 0);\n");
4395f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams            fprintf(f, "    }\n");
4405f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams        } else if (api->ret.typeName[0]) {
4411a4efa363916977ef9aeab756725b3bdc880a15bJason Sams            fprintf(f, "    con->mIO.coreSetReturn(&ret, sizeof(ret));\n");
4425f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams        } else if (api->sync || needFlush) {
4435f27d6fb0b0b9184ba9820c629fc1354a635e515Jason Sams            fprintf(f, "    con->mIO.coreSetReturn(NULL, 0);\n");
4441a4efa363916977ef9aeab756725b3bdc880a15bJason Sams        }
4451a4efa363916977ef9aeab756725b3bdc880a15bJason Sams
446326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        fprintf(f, "};\n\n");
447326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
448326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
449b74514df6be14fd898ddd7906bc70408dc3bb63cMatt Wala    // Generate the globally accessible table of playback functions.
4502008747941749ad27fe80663d23036ac320e998fJason Sams    fprintf(f, "RsPlaybackLocalFunc gPlaybackFuncs[%i] = {\n", apiCount + 1);
451326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    fprintf(f, "    NULL,\n");
452afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk    for (ct=0; ct < apiCount; ct++) {
453186e59154a0fb86e05e283e9c083b69878c06720Jason Sams        if (apis[ct].direct) {
454186e59154a0fb86e05e283e9c083b69878c06720Jason Sams            fprintf(f, "    NULL,\n");
455186e59154a0fb86e05e283e9c083b69878c06720Jason Sams        } else {
456b74514df6be14fd898ddd7906bc70408dc3bb63cMatt Wala            fprintf(f, "    %s%s,\n", RS_PLAYBACK_PREFIX, apis[ct].name);
457186e59154a0fb86e05e283e9c083b69878c06720Jason Sams        }
458326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
459326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    fprintf(f, "};\n");
460326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
461326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    fprintf(f, "};\n");
462326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    fprintf(f, "};\n");
463326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
464326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
4655fb1aeb6374f814d72117803682bc141cc6b0895Jason Samsvoid yylex();
4665fb1aeb6374f814d72117803682bc141cc6b0895Jason Sams
467afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukint main(int argc, char **argv) {
468326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    if (argc != 3) {
469326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        fprintf(stderr, "usage: %s commandFile outFile\n", argv[0]);
470326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        return 1;
471326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
472326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    const char* rsgFile = argv[1];
473326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    const char* outFile = argv[2];
474326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    FILE* input = fopen(rsgFile, "r");
475326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
476326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    char choice = fgetc(input);
477326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    fclose(input);
478326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
479326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    if (choice < '0' || choice > '3') {
480326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        fprintf(stderr, "Uknown command: \'%c\'\n", choice);
481326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        return -2;
482326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
483326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
484326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    yylex();
485326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    // printf("# of lines = %d\n", num_lines);
486326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
487326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    FILE *f = fopen(outFile, "w");
488326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
489326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    printFileHeader(f);
490afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk    switch (choice) {
491326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        case '0': // rsgApiStructs.h
492326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        {
493326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams            fprintf(f, "\n");
494326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams            fprintf(f, "#include \"rsContext.h\"\n");
4952008747941749ad27fe80663d23036ac320e998fJason Sams            fprintf(f, "#include \"rsFifo.h\"\n");
496326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams            fprintf(f, "\n");
497326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams            fprintf(f, "namespace android {\n");
498326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams            fprintf(f, "namespace renderscript {\n");
499326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams            printStructures(f);
500b74514df6be14fd898ddd7906bc70408dc3bb63cMatt Wala            printFuncDecls(f, RS_INTERNAL_PREFIX, 1, 0);
501b74514df6be14fd898ddd7906bc70408dc3bb63cMatt Wala            printPlaybackFuncs(f, RS_PLAYBACK_PREFIX);
5022008747941749ad27fe80663d23036ac320e998fJason Sams            fprintf(f, "typedef void (*RsPlaybackLocalFunc)(Context *, const void *, size_t sizeBytes);\n");
5032008747941749ad27fe80663d23036ac320e998fJason Sams            fprintf(f, "extern RsPlaybackLocalFunc gPlaybackFuncs[%i];\n", apiCount + 1);
504326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
505326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams            fprintf(f, "}\n");
506326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams            fprintf(f, "}\n");
507326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        }
508326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        break;
509326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
510326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        case '1': // rsgApiFuncDecl.h
511326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        {
512f6023e494e67bc9deaa8b96008180104cbf540c7Tim Murray            printFuncDecls(f, "rs", 0, 1);
513326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        }
514326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        break;
515326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
516326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        case '2': // rsgApi.cpp
517326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        {
518326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams            printApiCpp(f);
519326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        }
520326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        break;
521326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
522326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        case '3': // rsgApiReplay.cpp
523326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        {
524326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams            printPlaybackCpp(f);
525326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        }
526326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        break;
527326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
528326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    fclose(f);
529326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    return 0;
530326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
531