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