• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 
2 #include "spec.h"
3 #include <stdio.h>
4 
printFileHeader(FILE * f)5 void printFileHeader(FILE *f)
6 {
7     fprintf(f, "/*\n");
8     fprintf(f, " * Copyright (C) 2009 The Android Open Source Project\n");
9     fprintf(f, " *\n");
10     fprintf(f, " * Licensed under the Apache License, Version 2.0 (the \"License\");\n");
11     fprintf(f, " * you may not use this file except in compliance with the License.\n");
12     fprintf(f, " * You may obtain a copy of the License at\n");
13     fprintf(f, " *\n");
14     fprintf(f, " *      http://www.apache.org/licenses/LICENSE-2.0\n");
15     fprintf(f, " *\n");
16     fprintf(f, " * Unless required by applicable law or agreed to in writing, software\n");
17     fprintf(f, " * distributed under the License is distributed on an \"AS IS\" BASIS,\n");
18     fprintf(f, " * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n");
19     fprintf(f, " * See the License for the specific language governing permissions and\n");
20     fprintf(f, " * limitations under the License.\n");
21     fprintf(f, " */\n\n");
22 }
23 
printVarType(FILE * f,const VarType * vt)24 void printVarType(FILE *f, const VarType *vt)
25 {
26     int ct;
27     if (vt->isConst) {
28         fprintf(f, "const ");
29     }
30 
31     switch(vt->type) {
32     case 0:
33         fprintf(f, "void");
34         break;
35     case 1:
36         fprintf(f, "int%i_t", vt->bits);
37         break;
38     case 2:
39         fprintf(f, "uint%i_t", vt->bits);
40         break;
41     case 3:
42         if (vt->bits == 32)
43             fprintf(f, "float");
44         else
45             fprintf(f, "double");
46         break;
47     case 4:
48         fprintf(f, "%s", vt->typeName);
49         break;
50     }
51 
52     if(vt->ptrLevel) {
53         fprintf(f, " ");
54         for(ct=0; ct < vt->ptrLevel; ct++) {
55             fprintf(f, "*");
56         }
57     }
58 
59     if(vt->name[0]) {
60         fprintf(f, " %s", vt->name);
61     }
62 }
63 
printArgList(FILE * f,const ApiEntry * api,int assumePrevious)64 void printArgList(FILE *f, const ApiEntry * api, int assumePrevious)
65 {
66     int ct;
67     for(ct=0; ct < api->paramCount; ct++) {
68         if (ct || assumePrevious) {
69             fprintf(f, ", ");
70         }
71         printVarType(f, &api->params[ct]);
72     }
73 }
74 
printStructures(FILE * f)75 void printStructures(FILE *f)
76 {
77     int ct;
78     int ct2;
79 
80     for(ct=0; ct < apiCount; ct++) {
81         fprintf(f, "typedef struct RS_CMD_%s_rec RS_CMD_%s;\n", apis[ct].name, apis[ct].name);
82     }
83     fprintf(f, "\n");
84 
85     for(ct=0; ct < apiCount; ct++) {
86         const ApiEntry * api = &apis[ct];
87         fprintf(f, "#define RS_CMD_ID_%s %i\n", api->name, ct+1);
88         fprintf(f, "struct RS_CMD_%s_rec {\n", api->name);
89         //fprintf(f, "    RsCommandHeader _hdr;\n");
90 
91         for(ct2=0; ct2 < api->paramCount; ct2++) {
92             fprintf(f, "    ");
93             printVarType(f, &api->params[ct2]);
94             fprintf(f, ";\n");
95         }
96         fprintf(f, "};\n\n");
97     }
98 }
99 
printFuncDecl(FILE * f,const ApiEntry * api,const char * prefix,int addContext)100 void printFuncDecl(FILE *f, const ApiEntry *api, const char *prefix, int addContext)
101 {
102     printVarType(f, &api->ret);
103     fprintf(f, " %s%s (", prefix, api->name);
104     if (addContext) {
105         fprintf(f, "Context *");
106     } else {
107         fprintf(f, "RsContext rsc");
108     }
109     printArgList(f, api, 1);
110     fprintf(f, ")");
111 }
112 
printFuncDecls(FILE * f,const char * prefix,int addContext)113 void printFuncDecls(FILE *f, const char *prefix, int addContext)
114 {
115     int ct;
116     for(ct=0; ct < apiCount; ct++) {
117         printFuncDecl(f, &apis[ct], prefix, addContext);
118         fprintf(f, ";\n");
119     }
120     fprintf(f, "\n\n");
121 }
122 
printPlaybackFuncs(FILE * f,const char * prefix)123 void printPlaybackFuncs(FILE *f, const char *prefix)
124 {
125     int ct;
126     for(ct=0; ct < apiCount; ct++) {
127         fprintf(f, "void %s%s (Context *, const void *);\n", prefix, apis[ct].name);
128     }
129 }
130 
printApiCpp(FILE * f)131 void printApiCpp(FILE *f)
132 {
133     int ct;
134     int ct2;
135 
136     fprintf(f, "#include \"rsDevice.h\"\n");
137     fprintf(f, "#include \"rsContext.h\"\n");
138     fprintf(f, "#include \"rsThreadIO.h\"\n");
139     //fprintf(f, "#include \"rsgApiStructs.h\"\n");
140     fprintf(f, "#include \"rsgApiFuncDecl.h\"\n");
141     fprintf(f, "\n");
142     fprintf(f, "using namespace android;\n");
143     fprintf(f, "using namespace android::renderscript;\n");
144     fprintf(f, "#include \"rsHandcode.h\"\n");
145     fprintf(f, "\n");
146 
147     for(ct=0; ct < apiCount; ct++) {
148         int needFlush = 0;
149         const ApiEntry * api = &apis[ct];
150 
151         printFuncDecl(f, api, "rs", 0);
152         fprintf(f, "\n{\n");
153         if (api->handcodeApi) {
154             fprintf(f, "    rsHCAPI_%s(rsc", api->name);
155             for(ct2=0; ct2 < api->paramCount; ct2++) {
156                 const VarType *vt = &api->params[ct2];
157                 fprintf(f, ", %s", vt->name);
158             }
159             fprintf(f, ");\n");
160         } else {
161             fprintf(f, "    ThreadIO *io = &((Context *)rsc)->mIO;\n");
162             //fprintf(f, "    LOGE(\"add command %s\\n\");\n", api->name);
163             fprintf(f, "    RS_CMD_%s *cmd = static_cast<RS_CMD_%s *>(io->mToCore.reserve(sizeof(RS_CMD_%s)));\n", api->name, api->name, api->name);
164             fprintf(f, "    uint32_t size = sizeof(RS_CMD_%s);\n", api->name);
165 
166             for(ct2=0; ct2 < api->paramCount; ct2++) {
167                 const VarType *vt = &api->params[ct2];
168                 needFlush += vt->ptrLevel;
169                 fprintf(f, "    cmd->%s = %s;\n", vt->name, vt->name);
170             }
171             if (api->ret.typeName[0]) {
172                 needFlush = 1;
173             }
174 
175             fprintf(f, "    io->mToCore.commit");
176             if (needFlush) {
177                 fprintf(f, "Sync");
178             }
179             fprintf(f, "(RS_CMD_ID_%s, size);\n", api->name);
180 
181             if (api->ret.typeName[0]) {
182                 fprintf(f, "    return reinterpret_cast<");
183                 printVarType(f, &api->ret);
184                 fprintf(f, ">(io->mToCoreRet);\n");
185             }
186         }
187         fprintf(f, "};\n\n");
188     }
189 }
190 
printPlaybackCpp(FILE * f)191 void printPlaybackCpp(FILE *f)
192 {
193     int ct;
194     int ct2;
195 
196     fprintf(f, "#include \"rsDevice.h\"\n");
197     fprintf(f, "#include \"rsContext.h\"\n");
198     fprintf(f, "#include \"rsThreadIO.h\"\n");
199     //fprintf(f, "#include \"rsgApiStructs.h\"\n");
200     fprintf(f, "#include \"rsgApiFuncDecl.h\"\n");
201     fprintf(f, "\n");
202     fprintf(f, "namespace android {\n");
203     fprintf(f, "namespace renderscript {\n");
204     fprintf(f, "#include \"rsHandcode.h\"\n");
205     fprintf(f, "\n");
206 
207     for(ct=0; ct < apiCount; ct++) {
208         const ApiEntry * api = &apis[ct];
209 
210         fprintf(f, "void rsp_%s(Context *con, const void *vp)\n", api->name);
211         fprintf(f, "{\n");
212         if (api->handcodePlay) {
213             fprintf(f, "    rsHCPLAY_%s(con, vp);\n", api->name);
214         } else {
215             //fprintf(f, "    LOGE(\"play command %s\\n\");\n", api->name);
216             fprintf(f, "    const RS_CMD_%s *cmd = static_cast<const RS_CMD_%s *>(vp);\n", api->name, api->name);
217             fprintf(f, "    ");
218             if (api->ret.typeName[0]) {
219                 fprintf(f, "con->mIO.mToCoreRet = (intptr_t)");
220             }
221             fprintf(f, "rsi_%s(con", api->name);
222             for(ct2=0; ct2 < api->paramCount; ct2++) {
223                 const VarType *vt = &api->params[ct2];
224                 fprintf(f, ",\n           cmd->%s", vt->name);
225             }
226             fprintf(f, ");\n");
227         }
228         fprintf(f, "};\n\n");
229     }
230 
231     fprintf(f, "RsPlaybackFunc gPlaybackFuncs[] = {\n");
232     fprintf(f, "    NULL,\n");
233     for(ct=0; ct < apiCount; ct++) {
234         fprintf(f, "    %s%s,\n", "rsp_", apis[ct].name);
235     }
236     fprintf(f, "};\n");
237 
238     fprintf(f, "};\n");
239     fprintf(f, "};\n");
240 }
241 
main(int argc,char ** argv)242 int main(int argc, char **argv)
243 {
244     if (argc != 3) {
245         fprintf(stderr, "usage: %s commandFile outFile\n", argv[0]);
246         return 1;
247     }
248     const char* rsgFile = argv[1];
249     const char* outFile = argv[2];
250     FILE* input = fopen(rsgFile, "r");
251 
252     char choice = fgetc(input);
253     fclose(input);
254 
255     if (choice < '0' || choice > '3') {
256         fprintf(stderr, "Uknown command: \'%c\'\n", choice);
257         return -2;
258     }
259 
260     yylex();
261     // printf("# of lines = %d\n", num_lines);
262 
263     FILE *f = fopen(outFile, "w");
264 
265     printFileHeader(f);
266     switch(choice) {
267         case '0': // rsgApiStructs.h
268         {
269             fprintf(f, "\n");
270             fprintf(f, "#include \"rsContext.h\"\n");
271             fprintf(f, "\n");
272             fprintf(f, "namespace android {\n");
273             fprintf(f, "namespace renderscript {\n");
274             printStructures(f);
275             printFuncDecls(f, "rsi_", 1);
276             printPlaybackFuncs(f, "rsp_");
277             fprintf(f, "\n\ntypedef void (*RsPlaybackFunc)(Context *, const void *);\n");
278             fprintf(f, "extern RsPlaybackFunc gPlaybackFuncs[];\n");
279 
280             fprintf(f, "}\n");
281             fprintf(f, "}\n");
282         }
283         break;
284 
285         case '1': // rsgApiFuncDecl.h
286         {
287             printFuncDecls(f, "rs", 0);
288         }
289         break;
290 
291         case '2': // rsgApi.cpp
292         {
293             printApiCpp(f);
294         }
295         break;
296 
297         case '3': // rsgApiReplay.cpp
298         {
299             printFileHeader(f);
300             printPlaybackCpp(f);
301         }
302         break;
303     }
304     fclose(f);
305     return 0;
306 }
307