xref: /aosp_15_r20/frameworks/rs/rsg_generator.c (revision e1eccf28f96817838ad6867f7f39d2351ec11f56)
1*e1eccf28SAndroid Build Coastguard Worker #include "spec.h"
2*e1eccf28SAndroid Build Coastguard Worker #include <stdio.h>
3*e1eccf28SAndroid Build Coastguard Worker #include <string.h>
4*e1eccf28SAndroid Build Coastguard Worker 
5*e1eccf28SAndroid Build Coastguard Worker #define LOCAL_FIFO_PREFIX "LF_"
6*e1eccf28SAndroid Build Coastguard Worker #define RS_PLAYBACK_PREFIX "rsp_"
7*e1eccf28SAndroid Build Coastguard Worker #define RS_INTERNAL_PREFIX "rsi_"
8*e1eccf28SAndroid Build Coastguard Worker 
9*e1eccf28SAndroid Build Coastguard Worker #define RSG_API_CPP_DOC                                                     \
10*e1eccf28SAndroid Build Coastguard Worker "/*\n"                                                                      \
11*e1eccf28SAndroid Build Coastguard Worker " * rsgApi.cpp\n"                                                           \
12*e1eccf28SAndroid Build Coastguard Worker " * This file implements the functions responsible for sending messages\n"  \
13*e1eccf28SAndroid Build Coastguard Worker " * to the RS driver layer. The messages are sent through a FIFO that is\n" \
14*e1eccf28SAndroid Build Coastguard Worker " * shared between the process's caller threads and driver thread.\n"       \
15*e1eccf28SAndroid Build Coastguard Worker " */\n\n"
16*e1eccf28SAndroid Build Coastguard Worker 
17*e1eccf28SAndroid Build Coastguard Worker #define RSG_API_REPLAY_CPP_DOC                                              \
18*e1eccf28SAndroid Build Coastguard Worker "/*\n"                                                                      \
19*e1eccf28SAndroid Build Coastguard Worker " * rsgApiReplay.cpp\n"                                                     \
20*e1eccf28SAndroid Build Coastguard Worker " * This file implements the functions responsible for reading messages\n"  \
21*e1eccf28SAndroid Build Coastguard Worker " * sent to the RS driver layer.\n"                                         \
22*e1eccf28SAndroid Build Coastguard Worker " */\n\n"
23*e1eccf28SAndroid Build Coastguard Worker 
printFileHeader(FILE * f)24*e1eccf28SAndroid Build Coastguard Worker void printFileHeader(FILE *f) {
25*e1eccf28SAndroid Build Coastguard Worker     fprintf(f, "/*\n");
26*e1eccf28SAndroid Build Coastguard Worker     fprintf(f, " * Copyright (C) 2015 The Android Open Source Project\n");
27*e1eccf28SAndroid Build Coastguard Worker     fprintf(f, " *\n");
28*e1eccf28SAndroid Build Coastguard Worker     fprintf(f, " * Licensed under the Apache License, Version 2.0 (the \"License\");\n");
29*e1eccf28SAndroid Build Coastguard Worker     fprintf(f, " * you may not use this file except in compliance with the License.\n");
30*e1eccf28SAndroid Build Coastguard Worker     fprintf(f, " * You may obtain a copy of the License at\n");
31*e1eccf28SAndroid Build Coastguard Worker     fprintf(f, " *\n");
32*e1eccf28SAndroid Build Coastguard Worker     fprintf(f, " *      http://www.apache.org/licenses/LICENSE-2.0\n");
33*e1eccf28SAndroid Build Coastguard Worker     fprintf(f, " *\n");
34*e1eccf28SAndroid Build Coastguard Worker     fprintf(f, " * Unless required by applicable law or agreed to in writing, software\n");
35*e1eccf28SAndroid Build Coastguard Worker     fprintf(f, " * distributed under the License is distributed on an \"AS IS\" BASIS,\n");
36*e1eccf28SAndroid Build Coastguard Worker     fprintf(f, " * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n");
37*e1eccf28SAndroid Build Coastguard Worker     fprintf(f, " * See the License for the specific language governing permissions and\n");
38*e1eccf28SAndroid Build Coastguard Worker     fprintf(f, " * limitations under the License.\n");
39*e1eccf28SAndroid Build Coastguard Worker     fprintf(f, " */\n\n");
40*e1eccf28SAndroid Build Coastguard Worker }
41*e1eccf28SAndroid Build Coastguard Worker 
printVarType(FILE * f,const VarType * vt)42*e1eccf28SAndroid Build Coastguard Worker void printVarType(FILE *f, const VarType *vt) {
43*e1eccf28SAndroid Build Coastguard Worker     int ct;
44*e1eccf28SAndroid Build Coastguard Worker     if (vt->isConst) {
45*e1eccf28SAndroid Build Coastguard Worker         fprintf(f, "const ");
46*e1eccf28SAndroid Build Coastguard Worker     }
47*e1eccf28SAndroid Build Coastguard Worker 
48*e1eccf28SAndroid Build Coastguard Worker     switch (vt->type) {
49*e1eccf28SAndroid Build Coastguard Worker     case 0:
50*e1eccf28SAndroid Build Coastguard Worker         fprintf(f, "void");
51*e1eccf28SAndroid Build Coastguard Worker         break;
52*e1eccf28SAndroid Build Coastguard Worker     case 1:
53*e1eccf28SAndroid Build Coastguard Worker         fprintf(f, "int%i_t", vt->bits);
54*e1eccf28SAndroid Build Coastguard Worker         break;
55*e1eccf28SAndroid Build Coastguard Worker     case 2:
56*e1eccf28SAndroid Build Coastguard Worker         fprintf(f, "uint%i_t", vt->bits);
57*e1eccf28SAndroid Build Coastguard Worker         break;
58*e1eccf28SAndroid Build Coastguard Worker     case 3:
59*e1eccf28SAndroid Build Coastguard Worker         if (vt->bits == 32)
60*e1eccf28SAndroid Build Coastguard Worker             fprintf(f, "float");
61*e1eccf28SAndroid Build Coastguard Worker         else
62*e1eccf28SAndroid Build Coastguard Worker             fprintf(f, "double");
63*e1eccf28SAndroid Build Coastguard Worker         break;
64*e1eccf28SAndroid Build Coastguard Worker     case 4:
65*e1eccf28SAndroid Build Coastguard Worker         fprintf(f, "%s", vt->typeName);
66*e1eccf28SAndroid Build Coastguard Worker         break;
67*e1eccf28SAndroid Build Coastguard Worker     }
68*e1eccf28SAndroid Build Coastguard Worker 
69*e1eccf28SAndroid Build Coastguard Worker     if (vt->ptrLevel) {
70*e1eccf28SAndroid Build Coastguard Worker         fprintf(f, " ");
71*e1eccf28SAndroid Build Coastguard Worker         for (ct=0; ct < vt->ptrLevel; ct++) {
72*e1eccf28SAndroid Build Coastguard Worker             fprintf(f, "*");
73*e1eccf28SAndroid Build Coastguard Worker         }
74*e1eccf28SAndroid Build Coastguard Worker     }
75*e1eccf28SAndroid Build Coastguard Worker }
76*e1eccf28SAndroid Build Coastguard Worker 
printVarTypeAndName(FILE * f,const VarType * vt)77*e1eccf28SAndroid Build Coastguard Worker void printVarTypeAndName(FILE *f, const VarType *vt) {
78*e1eccf28SAndroid Build Coastguard Worker     printVarType(f, vt);
79*e1eccf28SAndroid Build Coastguard Worker 
80*e1eccf28SAndroid Build Coastguard Worker     if (vt->name[0]) {
81*e1eccf28SAndroid Build Coastguard Worker         fprintf(f, " %s", vt->name);
82*e1eccf28SAndroid Build Coastguard Worker     }
83*e1eccf28SAndroid Build Coastguard Worker }
84*e1eccf28SAndroid Build Coastguard Worker 
printArgList(FILE * f,const ApiEntry * api,int assumePrevious)85*e1eccf28SAndroid Build Coastguard Worker void printArgList(FILE *f, const ApiEntry * api, int assumePrevious) {
86*e1eccf28SAndroid Build Coastguard Worker     int ct;
87*e1eccf28SAndroid Build Coastguard Worker     for (ct=0; ct < api->paramCount; ct++) {
88*e1eccf28SAndroid Build Coastguard Worker         if (ct || assumePrevious) {
89*e1eccf28SAndroid Build Coastguard Worker             fprintf(f, ", ");
90*e1eccf28SAndroid Build Coastguard Worker         }
91*e1eccf28SAndroid Build Coastguard Worker         printVarTypeAndName(f, &api->params[ct]);
92*e1eccf28SAndroid Build Coastguard Worker     }
93*e1eccf28SAndroid Build Coastguard Worker }
94*e1eccf28SAndroid Build Coastguard Worker 
printStructures(FILE * f)95*e1eccf28SAndroid Build Coastguard Worker void printStructures(FILE *f) {
96*e1eccf28SAndroid Build Coastguard Worker     int ct;
97*e1eccf28SAndroid Build Coastguard Worker     int ct2;
98*e1eccf28SAndroid Build Coastguard Worker 
99*e1eccf28SAndroid Build Coastguard Worker     for (ct=0; ct < apiCount; ct++) {
100*e1eccf28SAndroid Build Coastguard Worker         fprintf(f, "typedef struct RS_CMD_%s_rec RS_CMD_%s;\n", apis[ct].name, apis[ct].name);
101*e1eccf28SAndroid Build Coastguard Worker     }
102*e1eccf28SAndroid Build Coastguard Worker     fprintf(f, "\n");
103*e1eccf28SAndroid Build Coastguard Worker 
104*e1eccf28SAndroid Build Coastguard Worker     for (ct=0; ct < apiCount; ct++) {
105*e1eccf28SAndroid Build Coastguard Worker         const ApiEntry * api = &apis[ct];
106*e1eccf28SAndroid Build Coastguard Worker         fprintf(f, "#define RS_CMD_ID_%s %i\n", api->name, ct+1);
107*e1eccf28SAndroid Build Coastguard Worker         fprintf(f, "struct __attribute__((packed)) RS_CMD_%s_rec {\n", api->name);
108*e1eccf28SAndroid Build Coastguard Worker         //fprintf(f, "    RsCommandHeader _hdr;\n");
109*e1eccf28SAndroid Build Coastguard Worker 
110*e1eccf28SAndroid Build Coastguard Worker         for (ct2=0; ct2 < api->paramCount; ct2++) {
111*e1eccf28SAndroid Build Coastguard Worker             fprintf(f, "    ");
112*e1eccf28SAndroid Build Coastguard Worker             printVarTypeAndName(f, &api->params[ct2]);
113*e1eccf28SAndroid Build Coastguard Worker             fprintf(f, ";\n");
114*e1eccf28SAndroid Build Coastguard Worker         }
115*e1eccf28SAndroid Build Coastguard Worker         fprintf(f, "};\n\n");
116*e1eccf28SAndroid Build Coastguard Worker     }
117*e1eccf28SAndroid Build Coastguard Worker }
118*e1eccf28SAndroid Build Coastguard Worker 
printFuncDecl(FILE * f,const ApiEntry * api,const char * prefix,int addContext,int isFnPtr)119*e1eccf28SAndroid Build Coastguard Worker void printFuncDecl(FILE *f, const ApiEntry *api, const char *prefix, int addContext, int isFnPtr) {
120*e1eccf28SAndroid Build Coastguard Worker     printVarTypeAndName(f, &api->ret);
121*e1eccf28SAndroid Build Coastguard Worker     if (isFnPtr) {
122*e1eccf28SAndroid Build Coastguard Worker         char t[1024];
123*e1eccf28SAndroid Build Coastguard Worker         strncpy(t, api->name, sizeof(t)-1);
124*e1eccf28SAndroid Build Coastguard Worker         t[sizeof(t)-1] = '\0';
125*e1eccf28SAndroid Build Coastguard Worker         if (strlen(prefix) == 0) {
126*e1eccf28SAndroid Build Coastguard Worker             if (t[0] > 'A' && t[0] < 'Z') {
127*e1eccf28SAndroid Build Coastguard Worker                 t[0] -= 'A' - 'a';
128*e1eccf28SAndroid Build Coastguard Worker             }
129*e1eccf28SAndroid Build Coastguard Worker         }
130*e1eccf28SAndroid Build Coastguard Worker         fprintf(f, " (* %s%s) (", prefix, api->name);
131*e1eccf28SAndroid Build Coastguard Worker     } else {
132*e1eccf28SAndroid Build Coastguard Worker         fprintf(f, " %s%s (", prefix, api->name);
133*e1eccf28SAndroid Build Coastguard Worker     }
134*e1eccf28SAndroid Build Coastguard Worker     if (!api->nocontext) {
135*e1eccf28SAndroid Build Coastguard Worker         if (addContext) {
136*e1eccf28SAndroid Build Coastguard Worker             fprintf(f, "Context *");
137*e1eccf28SAndroid Build Coastguard Worker         } else {
138*e1eccf28SAndroid Build Coastguard Worker             fprintf(f, "RsContext rsc");
139*e1eccf28SAndroid Build Coastguard Worker         }
140*e1eccf28SAndroid Build Coastguard Worker     }
141*e1eccf28SAndroid Build Coastguard Worker     printArgList(f, api, !api->nocontext);
142*e1eccf28SAndroid Build Coastguard Worker     fprintf(f, ")");
143*e1eccf28SAndroid Build Coastguard Worker }
144*e1eccf28SAndroid Build Coastguard Worker 
printFuncDecls(FILE * f,const char * prefix,int addContext,int externC)145*e1eccf28SAndroid Build Coastguard Worker void printFuncDecls(FILE *f, const char *prefix, int addContext, int externC) {
146*e1eccf28SAndroid Build Coastguard Worker     int ct;
147*e1eccf28SAndroid Build Coastguard Worker     for (ct=0; ct < apiCount; ct++) {
148*e1eccf28SAndroid Build Coastguard Worker         if (externC) {
149*e1eccf28SAndroid Build Coastguard Worker             fprintf(f, "extern \"C\" ");
150*e1eccf28SAndroid Build Coastguard Worker         }
151*e1eccf28SAndroid Build Coastguard Worker         printFuncDecl(f, &apis[ct], prefix, addContext, 0);
152*e1eccf28SAndroid Build Coastguard Worker         fprintf(f,
153*e1eccf28SAndroid Build Coastguard Worker                 " __DEPRECATED_IN(31, \"RenderScript is deprecated. See "
154*e1eccf28SAndroid Build Coastguard Worker                 "https://developer.android.com/guide/topics/renderscript/"
155*e1eccf28SAndroid Build Coastguard Worker                 "migrate\");\n");
156*e1eccf28SAndroid Build Coastguard Worker     }
157*e1eccf28SAndroid Build Coastguard Worker     fprintf(f, "\n\n");
158*e1eccf28SAndroid Build Coastguard Worker }
159*e1eccf28SAndroid Build Coastguard Worker 
printPlaybackFuncs(FILE * f,const char * prefix)160*e1eccf28SAndroid Build Coastguard Worker void printPlaybackFuncs(FILE *f, const char *prefix) {
161*e1eccf28SAndroid Build Coastguard Worker     int ct;
162*e1eccf28SAndroid Build Coastguard Worker     for (ct=0; ct < apiCount; ct++) {
163*e1eccf28SAndroid Build Coastguard Worker         if (apis[ct].direct) {
164*e1eccf28SAndroid Build Coastguard Worker             continue;
165*e1eccf28SAndroid Build Coastguard Worker         }
166*e1eccf28SAndroid Build Coastguard Worker 
167*e1eccf28SAndroid Build Coastguard Worker         fprintf(f, "void %s%s (Context *, const void *);\n", prefix, apis[ct].name);
168*e1eccf28SAndroid Build Coastguard Worker     }
169*e1eccf28SAndroid Build Coastguard Worker }
170*e1eccf28SAndroid Build Coastguard Worker 
hasInlineDataPointers(const ApiEntry * api)171*e1eccf28SAndroid Build Coastguard Worker static int hasInlineDataPointers(const ApiEntry * api) {
172*e1eccf28SAndroid Build Coastguard Worker     int ret = 0;
173*e1eccf28SAndroid Build Coastguard Worker     int ct;
174*e1eccf28SAndroid Build Coastguard Worker     if (api->sync || api->ret.typeName[0]) {
175*e1eccf28SAndroid Build Coastguard Worker         return 0;
176*e1eccf28SAndroid Build Coastguard Worker     }
177*e1eccf28SAndroid Build Coastguard Worker     for (ct=0; ct < api->paramCount; ct++) {
178*e1eccf28SAndroid Build Coastguard Worker         const VarType *vt = &api->params[ct];
179*e1eccf28SAndroid Build Coastguard Worker 
180*e1eccf28SAndroid Build Coastguard Worker         if (!vt->isConst && vt->ptrLevel) {
181*e1eccf28SAndroid Build Coastguard Worker             // Non-const pointers cannot be inlined.
182*e1eccf28SAndroid Build Coastguard Worker             return 0;
183*e1eccf28SAndroid Build Coastguard Worker         }
184*e1eccf28SAndroid Build Coastguard Worker         if (vt->ptrLevel > 1) {
185*e1eccf28SAndroid Build Coastguard Worker             // not handled yet.
186*e1eccf28SAndroid Build Coastguard Worker             return 0;
187*e1eccf28SAndroid Build Coastguard Worker         }
188*e1eccf28SAndroid Build Coastguard Worker 
189*e1eccf28SAndroid Build Coastguard Worker         if (vt->isConst && vt->ptrLevel) {
190*e1eccf28SAndroid Build Coastguard Worker             // Non-const pointers cannot be inlined.
191*e1eccf28SAndroid Build Coastguard Worker             ret = 1;
192*e1eccf28SAndroid Build Coastguard Worker         }
193*e1eccf28SAndroid Build Coastguard Worker     }
194*e1eccf28SAndroid Build Coastguard Worker     return ret;
195*e1eccf28SAndroid Build Coastguard Worker }
196*e1eccf28SAndroid Build Coastguard Worker 
printApiCpp(FILE * f)197*e1eccf28SAndroid Build Coastguard Worker void printApiCpp(FILE *f) {
198*e1eccf28SAndroid Build Coastguard Worker     int ct;
199*e1eccf28SAndroid Build Coastguard Worker     int ct2;
200*e1eccf28SAndroid Build Coastguard Worker 
201*e1eccf28SAndroid Build Coastguard Worker     fprintf(f, RSG_API_CPP_DOC);
202*e1eccf28SAndroid Build Coastguard Worker 
203*e1eccf28SAndroid Build Coastguard Worker     fprintf(f, "#include \"rsDevice.h\"\n");
204*e1eccf28SAndroid Build Coastguard Worker     fprintf(f, "#include \"rsContext.h\"\n");
205*e1eccf28SAndroid Build Coastguard Worker     fprintf(f, "#include \"rsThreadIO.h\"\n");
206*e1eccf28SAndroid Build Coastguard Worker     fprintf(f, "#include \"rsgApiStructs.h\"\n");
207*e1eccf28SAndroid Build Coastguard Worker     fprintf(f, "#include \"rsgApiFuncDecl.h\"\n");
208*e1eccf28SAndroid Build Coastguard Worker     fprintf(f, "#include \"rsFifo.h\"\n");
209*e1eccf28SAndroid Build Coastguard Worker     fprintf(f, "\n");
210*e1eccf28SAndroid Build Coastguard Worker     fprintf(f, "using namespace android;  // NOLINT\n");
211*e1eccf28SAndroid Build Coastguard Worker     fprintf(f, "using namespace android::renderscript;  // NOLINT\n");
212*e1eccf28SAndroid Build Coastguard Worker     fprintf(f, "\n");
213*e1eccf28SAndroid Build Coastguard Worker 
214*e1eccf28SAndroid Build Coastguard Worker     // Generate RS funcs that send messages on the local FIFO.
215*e1eccf28SAndroid Build Coastguard Worker     for (ct=0; ct < apiCount; ct++) {
216*e1eccf28SAndroid Build Coastguard Worker         int needFlush = 0;
217*e1eccf28SAndroid Build Coastguard Worker         const ApiEntry * api = &apis[ct];
218*e1eccf28SAndroid Build Coastguard Worker 
219*e1eccf28SAndroid Build Coastguard Worker         fprintf(f, "static ");
220*e1eccf28SAndroid Build Coastguard Worker         printFuncDecl(f, api, LOCAL_FIFO_PREFIX, 0, 0);
221*e1eccf28SAndroid Build Coastguard Worker         fprintf(f, "\n{\n");
222*e1eccf28SAndroid Build Coastguard Worker         if (api->direct) {
223*e1eccf28SAndroid Build Coastguard Worker             fprintf(f, "    ");
224*e1eccf28SAndroid Build Coastguard Worker             if (api->ret.typeName[0]) {
225*e1eccf28SAndroid Build Coastguard Worker                 fprintf(f, "return ");
226*e1eccf28SAndroid Build Coastguard Worker             }
227*e1eccf28SAndroid Build Coastguard Worker             fprintf(f, RS_INTERNAL_PREFIX "%s(", api->name);
228*e1eccf28SAndroid Build Coastguard Worker             if (!api->nocontext) {
229*e1eccf28SAndroid Build Coastguard Worker                 fprintf(f, "(Context *)rsc");
230*e1eccf28SAndroid Build Coastguard Worker             }
231*e1eccf28SAndroid Build Coastguard Worker             for (ct2=0; ct2 < api->paramCount; ct2++) {
232*e1eccf28SAndroid Build Coastguard Worker                 const VarType *vt = &api->params[ct2];
233*e1eccf28SAndroid Build Coastguard Worker                 if (ct2 > 0 || !api->nocontext) {
234*e1eccf28SAndroid Build Coastguard Worker                     fprintf(f, ", ");
235*e1eccf28SAndroid Build Coastguard Worker                 }
236*e1eccf28SAndroid Build Coastguard Worker                 fprintf(f, "%s", vt->name);
237*e1eccf28SAndroid Build Coastguard Worker             }
238*e1eccf28SAndroid Build Coastguard Worker             fprintf(f, ");\n");
239*e1eccf28SAndroid Build Coastguard Worker         } else if (api->handcodeApi) {
240*e1eccf28SAndroid Build Coastguard Worker             // handle handcode path
241*e1eccf28SAndroid Build Coastguard Worker             fprintf(f, "    " LOCAL_FIFO_PREFIX "%s_handcode(", api->name);
242*e1eccf28SAndroid Build Coastguard Worker             if (!api->nocontext) {
243*e1eccf28SAndroid Build Coastguard Worker                 fprintf(f, "(Context *)rsc");
244*e1eccf28SAndroid Build Coastguard Worker             }
245*e1eccf28SAndroid Build Coastguard Worker             for (ct2=0; ct2 < api->paramCount; ct2++) {
246*e1eccf28SAndroid Build Coastguard Worker                 const VarType *vt = &api->params[ct2];
247*e1eccf28SAndroid Build Coastguard Worker                 if (ct2 > 0 || !api->nocontext) {
248*e1eccf28SAndroid Build Coastguard Worker                     fprintf(f, ", ");
249*e1eccf28SAndroid Build Coastguard Worker                 }
250*e1eccf28SAndroid Build Coastguard Worker                 fprintf(f, "%s", vt->name);
251*e1eccf28SAndroid Build Coastguard Worker             }
252*e1eccf28SAndroid Build Coastguard Worker             fprintf(f, ");\n");
253*e1eccf28SAndroid Build Coastguard Worker 
254*e1eccf28SAndroid Build Coastguard Worker         } else {
255*e1eccf28SAndroid Build Coastguard Worker             // handle synchronous path
256*e1eccf28SAndroid Build Coastguard Worker             fprintf(f, "    if (((Context *)rsc)->isSynchronous()) {\n");
257*e1eccf28SAndroid Build Coastguard Worker             fprintf(f, "        ");
258*e1eccf28SAndroid Build Coastguard Worker             if (api->ret.typeName[0]) {
259*e1eccf28SAndroid Build Coastguard Worker                 fprintf(f, "return ");
260*e1eccf28SAndroid Build Coastguard Worker             }
261*e1eccf28SAndroid Build Coastguard Worker             fprintf(f, RS_INTERNAL_PREFIX "%s(", api->name);
262*e1eccf28SAndroid Build Coastguard Worker             if (!api->nocontext) {
263*e1eccf28SAndroid Build Coastguard Worker                 fprintf(f, "(Context *)rsc");
264*e1eccf28SAndroid Build Coastguard Worker             }
265*e1eccf28SAndroid Build Coastguard Worker             for (ct2=0; ct2 < api->paramCount; ct2++) {
266*e1eccf28SAndroid Build Coastguard Worker                 const VarType *vt = &api->params[ct2];
267*e1eccf28SAndroid Build Coastguard Worker                 if (ct2 > 0 || !api->nocontext) {
268*e1eccf28SAndroid Build Coastguard Worker                     fprintf(f, ", ");
269*e1eccf28SAndroid Build Coastguard Worker                 }
270*e1eccf28SAndroid Build Coastguard Worker                 fprintf(f, "%s", vt->name);
271*e1eccf28SAndroid Build Coastguard Worker             }
272*e1eccf28SAndroid Build Coastguard Worker             fprintf(f, ");\n");
273*e1eccf28SAndroid Build Coastguard Worker             if (!api->ret.typeName[0]) {
274*e1eccf28SAndroid Build Coastguard Worker                 fprintf(f, "    return;");
275*e1eccf28SAndroid Build Coastguard Worker             }
276*e1eccf28SAndroid Build Coastguard Worker             fprintf(f, "    }\n\n");
277*e1eccf28SAndroid Build Coastguard Worker 
278*e1eccf28SAndroid Build Coastguard Worker             fprintf(f, "    ThreadIO *io = &((Context *)rsc)->mIO;\n");
279*e1eccf28SAndroid Build Coastguard Worker             fprintf(f, "    const size_t size = sizeof(RS_CMD_%s);\n", api->name);
280*e1eccf28SAndroid Build Coastguard Worker             if (hasInlineDataPointers(api)) {
281*e1eccf28SAndroid Build Coastguard Worker                 fprintf(f, "    size_t dataSize = 0;\n");
282*e1eccf28SAndroid Build Coastguard Worker                 for (ct2=0; ct2 < api->paramCount; ct2++) {
283*e1eccf28SAndroid Build Coastguard Worker                     const VarType *vt = &api->params[ct2];
284*e1eccf28SAndroid Build Coastguard Worker                     if (vt->isConst && vt->ptrLevel) {
285*e1eccf28SAndroid Build Coastguard Worker                         fprintf(f, "    dataSize += %s_length;\n", vt->name);
286*e1eccf28SAndroid Build Coastguard Worker                     }
287*e1eccf28SAndroid Build Coastguard Worker                 }
288*e1eccf28SAndroid Build Coastguard Worker             }
289*e1eccf28SAndroid Build Coastguard Worker 
290*e1eccf28SAndroid Build Coastguard Worker             //fprintf(f, "    ALOGE(\"add command %s\\n\");\n", api->name);
291*e1eccf28SAndroid Build Coastguard Worker             if (hasInlineDataPointers(api)) {
292*e1eccf28SAndroid Build Coastguard Worker                 fprintf(f, "    RS_CMD_%s *cmd = NULL;\n", api->name);
293*e1eccf28SAndroid Build Coastguard Worker                 fprintf(f, "    if (dataSize < io->getMaxInlineSize()) {;\n");
294*e1eccf28SAndroid Build Coastguard Worker                 fprintf(f, "        cmd = static_cast<RS_CMD_%s *>(io->coreHeader(RS_CMD_ID_%s, dataSize + size));\n", api->name, api->name);
295*e1eccf28SAndroid Build Coastguard Worker                 fprintf(f, "    } else {\n");
296*e1eccf28SAndroid Build Coastguard Worker                 fprintf(f, "        cmd = static_cast<RS_CMD_%s *>(io->coreHeader(RS_CMD_ID_%s, size));\n", api->name, api->name);
297*e1eccf28SAndroid Build Coastguard Worker                 fprintf(f, "    }\n");
298*e1eccf28SAndroid Build Coastguard Worker                 fprintf(f, "    uint8_t *payload = (uint8_t *)&cmd[1];\n");
299*e1eccf28SAndroid Build Coastguard Worker             } else {
300*e1eccf28SAndroid Build Coastguard Worker                 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);
301*e1eccf28SAndroid Build Coastguard Worker             }
302*e1eccf28SAndroid Build Coastguard Worker 
303*e1eccf28SAndroid Build Coastguard Worker             for (ct2=0; ct2 < api->paramCount; ct2++) {
304*e1eccf28SAndroid Build Coastguard Worker                 const VarType *vt = &api->params[ct2];
305*e1eccf28SAndroid Build Coastguard Worker                 needFlush += vt->ptrLevel;
306*e1eccf28SAndroid Build Coastguard Worker                 if (vt->ptrLevel && hasInlineDataPointers(api)) {
307*e1eccf28SAndroid Build Coastguard Worker                     fprintf(f, "    if (%s_length == 0) {\n", vt->name);
308*e1eccf28SAndroid Build Coastguard Worker                     fprintf(f, "        cmd->%s = NULL;\n", vt->name);
309*e1eccf28SAndroid Build Coastguard Worker                     fprintf(f, "    } else if (dataSize < io->getMaxInlineSize()) {\n");
310*e1eccf28SAndroid Build Coastguard Worker                     fprintf(f, "        memcpy(payload, %s, %s_length);\n", vt->name, vt->name);
311*e1eccf28SAndroid Build Coastguard Worker                     fprintf(f, "        cmd->%s = (", vt->name);
312*e1eccf28SAndroid Build Coastguard Worker                     printVarType(f, vt);
313*e1eccf28SAndroid Build Coastguard Worker                     fprintf(f, ")(payload - ((uint8_t *)&cmd[1]));\n");
314*e1eccf28SAndroid Build Coastguard Worker                     fprintf(f, "        payload += %s_length;\n", vt->name);
315*e1eccf28SAndroid Build Coastguard Worker                     fprintf(f, "    } else {\n");
316*e1eccf28SAndroid Build Coastguard Worker                     fprintf(f, "        cmd->%s = %s;\n", vt->name, vt->name);
317*e1eccf28SAndroid Build Coastguard Worker                     fprintf(f, "    }\n");
318*e1eccf28SAndroid Build Coastguard Worker 
319*e1eccf28SAndroid Build Coastguard Worker                 } else {
320*e1eccf28SAndroid Build Coastguard Worker                     fprintf(f, "    cmd->%s = %s;\n", vt->name, vt->name);
321*e1eccf28SAndroid Build Coastguard Worker                 }
322*e1eccf28SAndroid Build Coastguard Worker             }
323*e1eccf28SAndroid Build Coastguard Worker             if (api->ret.typeName[0] || api->sync) {
324*e1eccf28SAndroid Build Coastguard Worker                 needFlush = 1;
325*e1eccf28SAndroid Build Coastguard Worker             }
326*e1eccf28SAndroid Build Coastguard Worker 
327*e1eccf28SAndroid Build Coastguard Worker             fprintf(f, "    io->coreCommit();\n");
328*e1eccf28SAndroid Build Coastguard Worker             if (hasInlineDataPointers(api)) {
329*e1eccf28SAndroid Build Coastguard Worker                 fprintf(f, "    if (dataSize >= io->getMaxInlineSize()) {\n");
330*e1eccf28SAndroid Build Coastguard Worker                 fprintf(f, "        io->coreGetReturn(NULL, 0);\n");
331*e1eccf28SAndroid Build Coastguard Worker                 fprintf(f, "    }\n");
332*e1eccf28SAndroid Build Coastguard Worker             } else if (api->ret.typeName[0]) {
333*e1eccf28SAndroid Build Coastguard Worker                 fprintf(f, "\n    ");
334*e1eccf28SAndroid Build Coastguard Worker                 printVarType(f, &api->ret);
335*e1eccf28SAndroid Build Coastguard Worker                 fprintf(f, " ret;\n");
336*e1eccf28SAndroid Build Coastguard Worker                 fprintf(f, "    io->coreGetReturn(&ret, sizeof(ret));\n");
337*e1eccf28SAndroid Build Coastguard Worker                 fprintf(f, "    return ret;\n");
338*e1eccf28SAndroid Build Coastguard Worker             } else if (needFlush) {
339*e1eccf28SAndroid Build Coastguard Worker                 fprintf(f, "    io->coreGetReturn(NULL, 0);\n");
340*e1eccf28SAndroid Build Coastguard Worker             }
341*e1eccf28SAndroid Build Coastguard Worker         }
342*e1eccf28SAndroid Build Coastguard Worker         fprintf(f, "};\n\n");
343*e1eccf28SAndroid Build Coastguard Worker     }
344*e1eccf28SAndroid Build Coastguard Worker 
345*e1eccf28SAndroid Build Coastguard Worker     fprintf(f, "\n");
346*e1eccf28SAndroid Build Coastguard Worker 
347*e1eccf28SAndroid Build Coastguard Worker     for (ct=0; ct < apiCount; ct++) {
348*e1eccf28SAndroid Build Coastguard Worker         const ApiEntry * api = &apis[ct];
349*e1eccf28SAndroid Build Coastguard Worker 
350*e1eccf28SAndroid Build Coastguard Worker         fprintf(f, "extern \"C\" ");
351*e1eccf28SAndroid Build Coastguard Worker 
352*e1eccf28SAndroid Build Coastguard Worker         printFuncDecl(f, api, "rs", 0, 0);
353*e1eccf28SAndroid Build Coastguard Worker         fprintf(f, "\n{\n");
354*e1eccf28SAndroid Build Coastguard Worker         fprintf(f, "    ");
355*e1eccf28SAndroid Build Coastguard Worker         if (api->ret.typeName[0]) {
356*e1eccf28SAndroid Build Coastguard Worker             fprintf(f, "return ");
357*e1eccf28SAndroid Build Coastguard Worker         }
358*e1eccf28SAndroid Build Coastguard Worker         fprintf(f, LOCAL_FIFO_PREFIX "%s(", api->name);
359*e1eccf28SAndroid Build Coastguard Worker 
360*e1eccf28SAndroid Build Coastguard Worker         if (!api->nocontext) {
361*e1eccf28SAndroid Build Coastguard Worker             fprintf(f, "(Context *)rsc");
362*e1eccf28SAndroid Build Coastguard Worker         }
363*e1eccf28SAndroid Build Coastguard Worker 
364*e1eccf28SAndroid Build Coastguard Worker         for (ct2=0; ct2 < api->paramCount; ct2++) {
365*e1eccf28SAndroid Build Coastguard Worker             const VarType *vt = &api->params[ct2];
366*e1eccf28SAndroid Build Coastguard Worker             if (ct2 > 0 || !api->nocontext) {
367*e1eccf28SAndroid Build Coastguard Worker                 fprintf(f, ", ");
368*e1eccf28SAndroid Build Coastguard Worker             }
369*e1eccf28SAndroid Build Coastguard Worker             fprintf(f, "%s", vt->name);
370*e1eccf28SAndroid Build Coastguard Worker         }
371*e1eccf28SAndroid Build Coastguard Worker         fprintf(f, ");\n");
372*e1eccf28SAndroid Build Coastguard Worker         fprintf(f, "}\n\n");
373*e1eccf28SAndroid Build Coastguard Worker     }
374*e1eccf28SAndroid Build Coastguard Worker 
375*e1eccf28SAndroid Build Coastguard Worker }
376*e1eccf28SAndroid Build Coastguard Worker 
printPlaybackCpp(FILE * f)377*e1eccf28SAndroid Build Coastguard Worker void printPlaybackCpp(FILE *f) {
378*e1eccf28SAndroid Build Coastguard Worker     int ct;
379*e1eccf28SAndroid Build Coastguard Worker     int ct2;
380*e1eccf28SAndroid Build Coastguard Worker 
381*e1eccf28SAndroid Build Coastguard Worker     fprintf(f, RSG_API_REPLAY_CPP_DOC);
382*e1eccf28SAndroid Build Coastguard Worker 
383*e1eccf28SAndroid Build Coastguard Worker     fprintf(f, "#include \"rsDevice.h\"\n");
384*e1eccf28SAndroid Build Coastguard Worker     fprintf(f, "#include \"rsContext.h\"\n");
385*e1eccf28SAndroid Build Coastguard Worker     fprintf(f, "#include \"rsThreadIO.h\"\n");
386*e1eccf28SAndroid Build Coastguard Worker     fprintf(f, "#include \"rsgApiStructs.h\"\n");
387*e1eccf28SAndroid Build Coastguard Worker     fprintf(f, "#include \"rsgApiFuncDecl.h\"\n");
388*e1eccf28SAndroid Build Coastguard Worker     fprintf(f, "\n");
389*e1eccf28SAndroid Build Coastguard Worker     fprintf(f, "namespace android {\n");
390*e1eccf28SAndroid Build Coastguard Worker     fprintf(f, "namespace renderscript {\n");
391*e1eccf28SAndroid Build Coastguard Worker     fprintf(f, "\n");
392*e1eccf28SAndroid Build Coastguard Worker 
393*e1eccf28SAndroid Build Coastguard Worker     // Generate functions to play back messages sent from the local FIFO.
394*e1eccf28SAndroid Build Coastguard Worker     for (ct=0; ct < apiCount; ct++) {
395*e1eccf28SAndroid Build Coastguard Worker         const ApiEntry * api = &apis[ct];
396*e1eccf28SAndroid Build Coastguard Worker         int needFlush = 0;
397*e1eccf28SAndroid Build Coastguard Worker 
398*e1eccf28SAndroid Build Coastguard Worker         if (api->direct) {
399*e1eccf28SAndroid Build Coastguard Worker             continue;
400*e1eccf28SAndroid Build Coastguard Worker         }
401*e1eccf28SAndroid Build Coastguard Worker 
402*e1eccf28SAndroid Build Coastguard Worker         fprintf(f, "void " RS_PLAYBACK_PREFIX "%s(Context *con, const void *vp, size_t cmdSizeBytes) {\n", api->name);
403*e1eccf28SAndroid Build Coastguard Worker         fprintf(f, "    const RS_CMD_%s *cmd = static_cast<const RS_CMD_%s *>(vp);\n", api->name, api->name);
404*e1eccf28SAndroid Build Coastguard Worker 
405*e1eccf28SAndroid Build Coastguard Worker         if (hasInlineDataPointers(api)) {
406*e1eccf28SAndroid Build Coastguard Worker             fprintf(f, "    const uint8_t *baseData = 0;\n");
407*e1eccf28SAndroid Build Coastguard Worker             fprintf(f, "    if (cmdSizeBytes != sizeof(RS_CMD_%s)) {\n", api->name);
408*e1eccf28SAndroid Build Coastguard Worker             fprintf(f, "        baseData = &((const uint8_t *)vp)[sizeof(*cmd)];\n");
409*e1eccf28SAndroid Build Coastguard Worker             fprintf(f, "    }\n");
410*e1eccf28SAndroid Build Coastguard Worker         }
411*e1eccf28SAndroid Build Coastguard Worker 
412*e1eccf28SAndroid Build Coastguard Worker         fprintf(f, "    ");
413*e1eccf28SAndroid Build Coastguard Worker         if (api->ret.typeName[0]) {
414*e1eccf28SAndroid Build Coastguard Worker             fprintf(f, "\n    ");
415*e1eccf28SAndroid Build Coastguard Worker             printVarType(f, &api->ret);
416*e1eccf28SAndroid Build Coastguard Worker             fprintf(f, " ret = ");
417*e1eccf28SAndroid Build Coastguard Worker         }
418*e1eccf28SAndroid Build Coastguard Worker         fprintf(f, RS_INTERNAL_PREFIX "%s(con", api->name);
419*e1eccf28SAndroid Build Coastguard Worker         for (ct2=0; ct2 < api->paramCount; ct2++) {
420*e1eccf28SAndroid Build Coastguard Worker             const VarType *vt = &api->params[ct2];
421*e1eccf28SAndroid Build Coastguard Worker             needFlush += vt->ptrLevel;
422*e1eccf28SAndroid Build Coastguard Worker 
423*e1eccf28SAndroid Build Coastguard Worker             if (hasInlineDataPointers(api) && vt->ptrLevel) {
424*e1eccf28SAndroid Build Coastguard Worker                 fprintf(f, ",\n           cmd->%s_length == 0 ? NULL : (const %s *)&baseData[(intptr_t)cmd->%s]",
425*e1eccf28SAndroid Build Coastguard Worker                         vt->name, vt->typeName, vt->name);
426*e1eccf28SAndroid Build Coastguard Worker             } else {
427*e1eccf28SAndroid Build Coastguard Worker                 fprintf(f, ",\n           cmd->%s", vt->name);
428*e1eccf28SAndroid Build Coastguard Worker             }
429*e1eccf28SAndroid Build Coastguard Worker         }
430*e1eccf28SAndroid Build Coastguard Worker         fprintf(f, ");\n");
431*e1eccf28SAndroid Build Coastguard Worker 
432*e1eccf28SAndroid Build Coastguard Worker         if (hasInlineDataPointers(api)) {
433*e1eccf28SAndroid Build Coastguard Worker             fprintf(f, "    size_t totalSize = 0;\n");
434*e1eccf28SAndroid Build Coastguard Worker             for (ct2=0; ct2 < api->paramCount; ct2++) {
435*e1eccf28SAndroid Build Coastguard Worker                 if (api->params[ct2].ptrLevel) {
436*e1eccf28SAndroid Build Coastguard Worker                     fprintf(f, "    totalSize += cmd->%s_length;\n", api->params[ct2].name);
437*e1eccf28SAndroid Build Coastguard Worker                 }
438*e1eccf28SAndroid Build Coastguard Worker             }
439*e1eccf28SAndroid Build Coastguard Worker 
440*e1eccf28SAndroid Build Coastguard Worker             fprintf(f, "    if ((totalSize != 0) && (cmdSizeBytes == sizeof(RS_CMD_%s))) {\n", api->name);
441*e1eccf28SAndroid Build Coastguard Worker             fprintf(f, "        con->mIO.coreSetReturn(NULL, 0);\n");
442*e1eccf28SAndroid Build Coastguard Worker             fprintf(f, "    }\n");
443*e1eccf28SAndroid Build Coastguard Worker         } else if (api->ret.typeName[0]) {
444*e1eccf28SAndroid Build Coastguard Worker             fprintf(f, "    con->mIO.coreSetReturn(&ret, sizeof(ret));\n");
445*e1eccf28SAndroid Build Coastguard Worker         } else if (api->sync || needFlush) {
446*e1eccf28SAndroid Build Coastguard Worker             fprintf(f, "    con->mIO.coreSetReturn(NULL, 0);\n");
447*e1eccf28SAndroid Build Coastguard Worker         }
448*e1eccf28SAndroid Build Coastguard Worker 
449*e1eccf28SAndroid Build Coastguard Worker         fprintf(f, "};\n\n");
450*e1eccf28SAndroid Build Coastguard Worker     }
451*e1eccf28SAndroid Build Coastguard Worker 
452*e1eccf28SAndroid Build Coastguard Worker     // Generate the globally accessible table of playback functions.
453*e1eccf28SAndroid Build Coastguard Worker     fprintf(f, "RsPlaybackLocalFunc gPlaybackFuncs[%i] = {\n", apiCount + 1);
454*e1eccf28SAndroid Build Coastguard Worker     fprintf(f, "    NULL,\n");
455*e1eccf28SAndroid Build Coastguard Worker     for (ct=0; ct < apiCount; ct++) {
456*e1eccf28SAndroid Build Coastguard Worker         if (apis[ct].direct) {
457*e1eccf28SAndroid Build Coastguard Worker             fprintf(f, "    NULL,\n");
458*e1eccf28SAndroid Build Coastguard Worker         } else {
459*e1eccf28SAndroid Build Coastguard Worker             fprintf(f, "    %s%s,\n", RS_PLAYBACK_PREFIX, apis[ct].name);
460*e1eccf28SAndroid Build Coastguard Worker         }
461*e1eccf28SAndroid Build Coastguard Worker     }
462*e1eccf28SAndroid Build Coastguard Worker     fprintf(f, "};\n");
463*e1eccf28SAndroid Build Coastguard Worker 
464*e1eccf28SAndroid Build Coastguard Worker     fprintf(f, "};\n");
465*e1eccf28SAndroid Build Coastguard Worker     fprintf(f, "};\n");
466*e1eccf28SAndroid Build Coastguard Worker }
467*e1eccf28SAndroid Build Coastguard Worker 
468*e1eccf28SAndroid Build Coastguard Worker void yylex();
469*e1eccf28SAndroid Build Coastguard Worker 
main(int argc,char ** argv)470*e1eccf28SAndroid Build Coastguard Worker int main(int argc, char **argv) {
471*e1eccf28SAndroid Build Coastguard Worker     if (argc != 3) {
472*e1eccf28SAndroid Build Coastguard Worker         fprintf(stderr, "usage: %s commandFile outFile\n", argv[0]);
473*e1eccf28SAndroid Build Coastguard Worker         return 1;
474*e1eccf28SAndroid Build Coastguard Worker     }
475*e1eccf28SAndroid Build Coastguard Worker     const char* rsgFile = argv[1];
476*e1eccf28SAndroid Build Coastguard Worker     const char* outFile = argv[2];
477*e1eccf28SAndroid Build Coastguard Worker     FILE* input = fopen(rsgFile, "re");
478*e1eccf28SAndroid Build Coastguard Worker 
479*e1eccf28SAndroid Build Coastguard Worker     char choice = fgetc(input);
480*e1eccf28SAndroid Build Coastguard Worker     fclose(input);
481*e1eccf28SAndroid Build Coastguard Worker 
482*e1eccf28SAndroid Build Coastguard Worker     if (choice < '0' || choice > '3') {
483*e1eccf28SAndroid Build Coastguard Worker         fprintf(stderr, "Uknown command: \'%c\'\n", choice);
484*e1eccf28SAndroid Build Coastguard Worker         return -2;
485*e1eccf28SAndroid Build Coastguard Worker     }
486*e1eccf28SAndroid Build Coastguard Worker 
487*e1eccf28SAndroid Build Coastguard Worker     yylex();
488*e1eccf28SAndroid Build Coastguard Worker     // printf("# of lines = %d\n", num_lines);
489*e1eccf28SAndroid Build Coastguard Worker 
490*e1eccf28SAndroid Build Coastguard Worker     FILE *f = fopen(outFile, "we");
491*e1eccf28SAndroid Build Coastguard Worker 
492*e1eccf28SAndroid Build Coastguard Worker     printFileHeader(f);
493*e1eccf28SAndroid Build Coastguard Worker     switch (choice) {
494*e1eccf28SAndroid Build Coastguard Worker         case '0': // rsgApiStructs.h
495*e1eccf28SAndroid Build Coastguard Worker         {
496*e1eccf28SAndroid Build Coastguard Worker             fprintf(f, "\n");
497*e1eccf28SAndroid Build Coastguard Worker             fprintf(f, "#include \"rsContext.h\"\n");
498*e1eccf28SAndroid Build Coastguard Worker             fprintf(f, "#include \"rsFifo.h\"\n");
499*e1eccf28SAndroid Build Coastguard Worker             fprintf(f, "\n");
500*e1eccf28SAndroid Build Coastguard Worker             fprintf(f, "namespace android {\n");
501*e1eccf28SAndroid Build Coastguard Worker             fprintf(f, "namespace renderscript {\n");
502*e1eccf28SAndroid Build Coastguard Worker             printStructures(f);
503*e1eccf28SAndroid Build Coastguard Worker             printFuncDecls(f, RS_INTERNAL_PREFIX, 1, 0);
504*e1eccf28SAndroid Build Coastguard Worker             printPlaybackFuncs(f, RS_PLAYBACK_PREFIX);
505*e1eccf28SAndroid Build Coastguard Worker             fprintf(f, "typedef void (*RsPlaybackLocalFunc)(Context *, const void *, size_t sizeBytes);\n");
506*e1eccf28SAndroid Build Coastguard Worker             fprintf(f, "extern RsPlaybackLocalFunc gPlaybackFuncs[%i];\n", apiCount + 1);
507*e1eccf28SAndroid Build Coastguard Worker 
508*e1eccf28SAndroid Build Coastguard Worker             fprintf(f, "}\n");
509*e1eccf28SAndroid Build Coastguard Worker             fprintf(f, "}\n");
510*e1eccf28SAndroid Build Coastguard Worker         }
511*e1eccf28SAndroid Build Coastguard Worker         break;
512*e1eccf28SAndroid Build Coastguard Worker 
513*e1eccf28SAndroid Build Coastguard Worker         case '1': // rsgApiFuncDecl.h
514*e1eccf28SAndroid Build Coastguard Worker         {
515*e1eccf28SAndroid Build Coastguard Worker             printFuncDecls(f, "rs", 0, 1);
516*e1eccf28SAndroid Build Coastguard Worker         }
517*e1eccf28SAndroid Build Coastguard Worker         break;
518*e1eccf28SAndroid Build Coastguard Worker 
519*e1eccf28SAndroid Build Coastguard Worker         case '2': // rsgApi.cpp
520*e1eccf28SAndroid Build Coastguard Worker         {
521*e1eccf28SAndroid Build Coastguard Worker             printApiCpp(f);
522*e1eccf28SAndroid Build Coastguard Worker         }
523*e1eccf28SAndroid Build Coastguard Worker         break;
524*e1eccf28SAndroid Build Coastguard Worker 
525*e1eccf28SAndroid Build Coastguard Worker         case '3': // rsgApiReplay.cpp
526*e1eccf28SAndroid Build Coastguard Worker         {
527*e1eccf28SAndroid Build Coastguard Worker             printPlaybackCpp(f);
528*e1eccf28SAndroid Build Coastguard Worker         }
529*e1eccf28SAndroid Build Coastguard Worker         break;
530*e1eccf28SAndroid Build Coastguard Worker     }
531*e1eccf28SAndroid Build Coastguard Worker     fclose(f);
532*e1eccf28SAndroid Build Coastguard Worker     return 0;
533*e1eccf28SAndroid Build Coastguard Worker }
534