blob: a38553f7337960d32b414b82489c0dc054537b11 [file] [log] [blame]
Jason Sams7eecbf22010-02-23 15:27:51 -08001#define NO_RS_FUNCS 1
2
3#include "stdio.h"
4#include "RenderScript.h"
5#include <vector>
6
7struct Element;
8
9struct ElementField {
Jason Samsc1d726c2010-03-18 11:39:44 -070010 // An Element Field is a combination of an Element with a name assigned.
11
Jason Sams7eecbf22010-02-23 15:27:51 -080012 const char *name;
13 Element *e;
Jason Samsc1d726c2010-03-18 11:39:44 -070014
15
Jason Sams7eecbf22010-02-23 15:27:51 -080016 ElementField(const char *n, Element *_e) {
17 name = n;
18 e = _e;
19 }
20 ElementField() {
21 name = NULL;
22 e = NULL;
23 }
24};
25
26struct Element {
Jason Samsc1d726c2010-03-18 11:39:44 -070027 // An Element can take one of two forms.
28 // 1: Basic. It contains a single basic type and vector size.
29 // 2: Complex. It contains a list of fields with names. Each field
30 // will in turn be another element.
31
Jason Sams7eecbf22010-02-23 15:27:51 -080032 ElementField *fields;
Jason Samsc1d726c2010-03-18 11:39:44 -070033 size_t fieldCount; // If field count is 0, the element is a Basic type.
Jason Sams7eecbf22010-02-23 15:27:51 -080034 const char *name;
35 bool generated;
36
Jason Samsc1d726c2010-03-18 11:39:44 -070037 // The basic data type from RenderScript.h
Jason Sams7eecbf22010-02-23 15:27:51 -080038 RsDataType compType;
Jason Samsc1d726c2010-03-18 11:39:44 -070039
40 // The vector size of the data type for float2, float3, ....
41 // Allowed sizes are 2,3,4,8,16
Jason Sams7eecbf22010-02-23 15:27:51 -080042 uint32_t compVectorSize;
43
44 Element() {
45 fields = NULL;
46 fieldCount = 0;
47 name = NULL;
48 generated = false;
49 compType = RS_TYPE_ELEMENT;
50 compVectorSize = 0;
51 }
52
53 Element(uint32_t _fieldCount, const char *_name) {
54 fields = new ElementField[_fieldCount];
55 fieldCount = _fieldCount;
56 name = _name;
57 generated = false;
58 compType = RS_TYPE_ELEMENT;
59 compVectorSize = 0;
60 }
61
62 Element(RsDataType t, uint32_t s) {
63 fields = NULL;
64 fieldCount = 0;
65 name = NULL;
66 generated = false;
67 compType = t;
68 compVectorSize = s;
69 }
70
71};
72
73
Alex Sakhartchouked9f2102010-11-09 17:00:54 -080074static void genHeader(FILE *f, const char *packageName) {
Jason Sams7eecbf22010-02-23 15:27:51 -080075 fprintf(f, "package %s;\n", packageName);
76 fprintf(f, "\n");
77 fprintf(f, "import android.renderscript.*;\n");
78 fprintf(f, "\n");
79 fprintf(f, "\n");
80}
81
Alex Sakhartchouked9f2102010-11-09 17:00:54 -080082static const char * RSTypeToJava(RsDataType dt) {
83 switch (dt) {
Jason Sams7eecbf22010-02-23 15:27:51 -080084 //case RS_TYPE_FLOAT_16: return "float";
85 case RS_TYPE_FLOAT_32: return "float";
86 //case RS_TYPE_FLOAT_64: return "double";
87
88 case RS_TYPE_SIGNED_8: return "byte";
89 case RS_TYPE_SIGNED_16: return "short";
90 case RS_TYPE_SIGNED_32: return "int";
91 //case RS_TYPE_SIGNED_64: return "long";
92
93 case RS_TYPE_UNSIGNED_8: return "short";
94 case RS_TYPE_UNSIGNED_16: return "int";
95 case RS_TYPE_UNSIGNED_32: return "long";
96 //case RS_TYPE_UNSIGNED_64: return NULL;
97
98 //case RS_TYPE_ELEMENT: return "android.renderscript.Element";
99 //case RS_TYPE_TYPE: return "android.renderscript.Type";
100 //case RS_TYPE_ALLOCATION: return "android.renderscript.Allocation";
101 //case RS_TYPE_SAMPLER: return "android.renderscript.Sampler";
102 //case RS_TYPE_SCRIPT: return "android.renderscript.Script";
103 //case RS_TYPE_MESH: return "android.renderscript.Mesh";
104 //case RS_TYPE_PROGRAM_FRAGMENT: return "android.renderscript.ProgramFragment";
105 //case RS_TYPE_PROGRAM_VERTEX: return "android.renderscript.ProgramVertex";
106 //case RS_TYPE_PROGRAM_RASTER: return "android.renderscript.ProgramRaster";
107 //case RS_TYPE_PROGRAM_STORE: return "android.renderscript.ProgramStore";
108 default: return NULL;
109 }
110 return NULL;
111}
112
Alex Sakhartchouked9f2102010-11-09 17:00:54 -0800113static const char * RSTypeToString(RsDataType dt) {
114 switch (dt) {
Jason Sams7eecbf22010-02-23 15:27:51 -0800115 case RS_TYPE_FLOAT_16: return "F16";
116 case RS_TYPE_FLOAT_32: return "F32";
117 case RS_TYPE_FLOAT_64: return "F64";
118
119 case RS_TYPE_SIGNED_8: return "I8";
120 case RS_TYPE_SIGNED_16: return "I16";
121 case RS_TYPE_SIGNED_32: return "I32";
122 case RS_TYPE_SIGNED_64: return "I64";
123
124 case RS_TYPE_UNSIGNED_8: return "U8";
125 case RS_TYPE_UNSIGNED_16: return "U16";
126 case RS_TYPE_UNSIGNED_32: return "U32";
127 case RS_TYPE_UNSIGNED_64: return "U64";
128
129 //case RS_TYPE_ELEMENT: return "android.renderscript.Element";
130 //case RS_TYPE_TYPE: return "android.renderscript.Type";
131 //case RS_TYPE_ALLOCATION: return "android.renderscript.Allocation";
132 //case RS_TYPE_SAMPLER: return "android.renderscript.Sampler";
133 //case RS_TYPE_SCRIPT: return "android.renderscript.Script";
134 //case RS_TYPE_MESH: return "android.renderscript.Mesh";
135 //case RS_TYPE_PROGRAM_FRAGMENT: return "android.renderscript.ProgramFragment";
136 //case RS_TYPE_PROGRAM_VERTEX: return "android.renderscript.ProgramVertex";
137 //case RS_TYPE_PROGRAM_RASTER: return "android.renderscript.ProgramRaster";
138 //case RS_TYPE_PROGRAM_STORE: return "android.renderscript.ProgramStore";
139 default: return NULL;
140 }
141 return NULL;
142}
143
Alex Sakhartchouked9f2102010-11-09 17:00:54 -0800144bool rsGenerateElementClass(const Element *e, const char *packageName, FILE *f) {
Jason Sams7eecbf22010-02-23 15:27:51 -0800145 genHeader(f, packageName);
146
147 fprintf(f, "class Element_%s {\n", e->name);
148
149 for (size_t ct=0; ct < e->fieldCount; ct++) {
150 const char *ts = RSTypeToJava(e->fields[ct].e->compType);
151 if (ts == NULL) {
152 return false;
153 }
154 fprintf(f, " public %s %s;\n", ts, e->fields[ct].name);
155 }
156
157 fprintf(f, "\n");
158 fprintf(f, " static Element getElement(RenderScript rs) {\n");
159 fprintf(f, " Element.Builder eb = new Element.Builder(rs);\n");
160 for (size_t ct=0; ct < e->fieldCount; ct++) {
161 const char *ts = RSTypeToString(e->fields[ct].e->compType);
162 fprintf(f, " eb.add(Element.USER_%s(rs), \"%s\");\n", ts, e->fields[ct].name);
163 }
164 fprintf(f, " return eb.create();\n");
165 fprintf(f, " }\n");
166
167 fprintf(f, " static Allocation createAllocation(RenderScript rs) {\n");
168 fprintf(f, " Element e = getElement(rs);\n");
169 fprintf(f, " Allocation a = Allocation.createSized(rs, e, 1);\n");
170 fprintf(f, " return a;\n");
171 fprintf(f, " }\n");
172
173
174 fprintf(f, " void copyToAllocation(Allocation a) {\n");
175 fprintf(f, " mIOBuffer.reset();\n");
176 for (size_t ct=0; ct < e->fieldCount; ct++) {
177 const char *ts = RSTypeToString(e->fields[ct].e->compType);
178 fprintf(f, " mIOBuffer.add%s(%s);\n", ts, e->fields[ct].name);
179 }
180 fprintf(f, " a.data(mIOBuffer.getData());\n");
181 fprintf(f, " }\n");
182
183
184
185 fprintf(f, " private FieldPacker mIOBuffer[];\n");
186 fprintf(f, " public Element_%s() {\n", e->name);
187 fprintf(f, " mIOBuffer = new FieldPacker(%i);\n", 100/*element->getSizeBytes()*/);
188 fprintf(f, " }\n");
189
190
191 fprintf(f, "}\n");
192
193 return true;
194}
195
Alex Sakhartchouked9f2102010-11-09 17:00:54 -0800196bool rsGenerateElementClassFile(Element *e, const char *packageName) {
Jason Sams7eecbf22010-02-23 15:27:51 -0800197 char buf[1024];
198 sprintf(buf, "Element_%s.java", e->name);
199 printf("Creating file %s \n", buf);
200 FILE *f = fopen(buf, "w");
201 bool ret = rsGenerateElementClass(e, packageName, f);
202 fclose(f);
203 return ret;
204}
205
206
207
208
209/*
210bool rsGenerateScriptClass(const ScriptC *script, const char *packageName, FILE *f)
211{
212 genHeader(f, packageName);
213
214 fprintf(f, "class ScriptC_%s {\n", script->getName());
215
216
217
218 ObjectBaseRef<const Type> mTypes[MAX_SCRIPT_BANKS];
219 String8 mSlotNames[MAX_SCRIPT_BANKS];
220 bool mSlotWritable[MAX_SCRIPT_BANKS];
221
222
223}
224*/
225
226
227
Alex Sakhartchouked9f2102010-11-09 17:00:54 -0800228int main(int argc, const char *argv) {
Jason Sams7eecbf22010-02-23 15:27:51 -0800229 Element *u8 = new Element(RS_TYPE_UNSIGNED_8, 1);
230 Element *i32 = new Element(RS_TYPE_SIGNED_32, 1);
231 Element *f32 = new Element(RS_TYPE_FLOAT_32, 1);
232
233 Element *e_Pixel = new Element(4, "Pixel");
234 e_Pixel->fields[0].e = u8;
235 e_Pixel->fields[0].name = "a";
236 e_Pixel->fields[1].e = u8;
237 e_Pixel->fields[1].name = "b";
238 e_Pixel->fields[2].e = u8;
239 e_Pixel->fields[2].name = "g";
240 e_Pixel->fields[3].e = u8;
241 e_Pixel->fields[3].name = "r";
242
243 Element *e_Params = new Element(5, "Params");
244 e_Params->fields[0].e = i32;
245 e_Params->fields[0].name = "inHeight";
246 e_Params->fields[1].e = i32;
247 e_Params->fields[1].name = "inWidth";
248 e_Params->fields[2].e = i32;
249 e_Params->fields[2].name = "outHeight";
250 e_Params->fields[3].e = i32;
251 e_Params->fields[3].name = "outWidth";
252 e_Params->fields[4].e = f32;
253 e_Params->fields[4].name = "threshold";
254
255
256 printf("1\n");
257 rsGenerateElementClassFile(e_Pixel, "android");
258 rsGenerateElementClassFile(e_Params, "android");
Jason Sams7eecbf22010-02-23 15:27:51 -0800259}
260