• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2 * Copyright 2011 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16 
17 #include <stdio.h>
18 #include <string.h>
19 #include <stdlib.h>
20 #include <unistd.h>
21 
22 //#define GL_API
23 //#define GL_APIENTRY
24 
25 #undef ANDROID
26 #include <EGL/egl.h>
27 #include <GLES/gl.h>
28 
29 #ifdef __APPLE__
30 extern "C" void * createGLView(void *nsWindowPtr, int x, int y, int width, int height);
31 #endif
32 
33 #undef HAVE_MALLOC_H
34 #include <SDL.h>
35 #include <SDL_syswm.h>
36 
37 
38 #define WINDOW_WIDTH    500
39 #define WINDOW_HEIGHT   500
40 
41 #define TEX_WIDTH 256
42 #define TEX_HEIGHT 256
43 
44 
45 #define F_to_X(d) ((d) > 32767.65535 ? 32767 * 65536 + 65535 :  \
46                (d) < -32768.65535 ? -32768 * 65536 + 65535 : \
47                ((GLfixed) ((d) * 65536)))
48 #define X_to_F(x)  ((float)(x))/65536.0f
49 
50 static EGLint const attribute_list[] = {
51     EGL_RED_SIZE, 1,
52     EGL_GREEN_SIZE, 1,
53     EGL_BLUE_SIZE, 1,
54     EGL_NONE
55 };
56 
genTexture(int width,int height,int comp)57 unsigned char *genTexture(int width, int height, int comp)
58 {
59     unsigned char *img = new unsigned char[width * height * comp];
60     unsigned char *ptr = img;
61     for (int i = 0; i < height; i++) {
62         for (int j = 0; j < width; j++) {
63             unsigned char col = ((i / 8 + j / 8) % 2) * 255 ;
64             if (j>(width/2)) col/=2;
65             for (int c = 0; c < comp; c++) {
66                 *ptr = col; ptr++;
67             }
68         }
69     }
70     return img;
71 }
72 
genRedTexture(int width,int height,int comp)73 unsigned char *genRedTexture(int width, int height, int comp)
74 {
75     unsigned char *img = new unsigned char[width * height * comp];
76         memset(img,0,width*height*comp);
77     unsigned char *ptr = img;
78     for (int i = 0; i < height; i++) {
79         for (int j = 0; j < width; j++) {
80             unsigned char col = ((i / 8 + j / 8) % 2) * 255 ;
81                         *ptr = col;
82                          ptr+=comp;
83         }
84     }
85     return img;
86 }
87 
88 //mip 0;
genPalette4_rgb8(int width,int height,int color)89 unsigned char *genPalette4_rgb8(int width, int height,int color)
90 {
91         int size = width*height/2 + 16*3/*palette size*/;
92     unsigned char *img = new unsigned char[size];
93 
94         memset(img,0,size);
95         img[0] = 255; img[1] = 0; img[2] = 0;     // red
96         img[3] = 0; img[4] = 0; img[5] = 255;    //blue
97         img[7] = 128; img[8] = 0; img[9] = 128;  //fucsia
98         //rest of the palette is empty
99 
100     unsigned char *ptr = img+(16*3);
101     for (int i = 0; i < (height*width/2); i++) {
102              ptr[i] = (i%2)?0x0|color:0x11|color;
103     }
104     return img;
105 }
106 
usage(const char * progname)107 void usage(const char *progname)
108 {
109     fprintf(stderr, "usage: %s [-n <nframes> -i -h]\n", progname);
110     fprintf(stderr, "\t-h: this message\n");
111     fprintf(stderr, "\t-i: immidate mode\n");
112     fprintf(stderr, "\t-n nframes: generate nframes\n");
113     fprintf(stderr, "\t-e: use index arrays\n");
114     fprintf(stderr, "\t-t: use texture\n");
115     fprintf(stderr, "\t-f: use fixed points\n");
116     fprintf(stderr, "\t-p: use point size OES extention\n");
117 }
118 
119 #define SWITCH_SOURCE(add)\
120             if(useConvertedType){                            \
121                 if(useFixed){                                \
122                       data = (GLvoid*)(fixedVertices+(add)); \
123                 } else {                                     \
124                       data = (GLvoid*)(byteVertices +(add)); \
125                 }                                            \
126             } else {                                         \
127                       data = (GLvoid*)(afVertices+(add));    \
128             }                                                \
129 
130 #ifdef _WIN32
WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd)131 int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
132 #else
133 int main(int argc, char **argv)
134 #endif
135 {
136     GLuint  ui32Vbo = 0; // Vertex buffer object handle
137     GLuint  ui32IndexVbo;
138     GLuint  ui32Texture;
139 
140     int nframes = 100;
141     bool immidateMode     = false;
142     bool useIndices       = true;
143     bool useTexture       = false;
144     bool useCompTexture   = false;
145     bool useConvertedType = true;
146     bool useFixed         = false;
147     bool usePoints        = false;
148     bool useCopy          = false;
149     bool useSubCopy       = false;
150 
151     int c;
152     extern char *optarg;
153 
154     #ifdef _WIN32
155         HWND   windowId = NULL;
156     #elif __linux__
157         Window windowId = NULL;
158     #elif __APPLE__
159         void* windowId = NULL;
160     #endif
161 
162         //      // Inialize SDL window
163         //
164         if (SDL_Init(SDL_INIT_NOPARACHUTE | SDL_INIT_VIDEO)) {
165             fprintf(stderr,"SDL init failed: %s\n", SDL_GetError());
166             return -1;
167         }
168 
169         SDL_Surface *surface = SDL_SetVideoMode(WINDOW_WIDTH,WINDOW_HEIGHT, 32, SDL_HWSURFACE);
170         if (surface == NULL) {
171             fprintf(stderr,"Failed to set video mode: %s\n", SDL_GetError());
172             return -1;
173         }
174 
175         SDL_SysWMinfo  wminfo;
176         memset(&wminfo, 0, sizeof(wminfo));
177         SDL_GetWMInfo(&wminfo);
178     #ifdef _WIN32
179         windowId = wminfo.window;
180     #elif __linux__
181         windowId = wminfo.info.x11.window;
182     #elif __APPLE__
183         windowId = createGLView(wminfo.nsWindowPtr,0,0,WINDOW_WIDTH,WINDOW_HEIGHT);
184 
185     #endif
186 
187         int major,minor,num_config;
188         EGLConfig configs[150];
189         EGLSurface egl_surface;
190         EGLContext ctx;
191         EGLDisplay d = eglGetDisplay(EGL_DEFAULT_DISPLAY);
192         eglInitialize(d,&major,&minor);
193         printf("DISPLAY == %p major =%d minor = %d\n",d,major,minor);
194         eglChooseConfig(d, attribute_list, configs, 150, &num_config);
195         printf("config returned %d\n",num_config);
196         egl_surface = eglCreateWindowSurface(d,configs[0],windowId,NULL);
197         printf("before creating context..\n");
198         ctx = eglCreateContext(d,configs[0],EGL_NO_CONTEXT,NULL);
199         printf("SURFACE == %p CONTEXT == %p\n",egl_surface,ctx);
200         if(eglMakeCurrent(d,egl_surface,egl_surface,ctx)!= EGL_TRUE){
201             printf("make current failed\n");
202             return false;
203         }
204         printf("after make current\n");
205 
206         GLenum err = glGetError();
207         if(err != GL_NO_ERROR) {
208         printf("error before drawing ->>> %d  \n",err);
209         } else {
210         printf("no error before drawing\n");
211         }
212 
213     if (useTexture) {
214 
215         glEnable(GL_TEXTURE_2D);
216         ui32Texture = 1;
217         glBindTexture(GL_TEXTURE_2D, ui32Texture);
218                 GLenum err = glGetError();
219 
220         unsigned char *pixels = NULL;
221                 if(useCompTexture) {
222                         pixels = genPalette4_rgb8(TEX_WIDTH,TEX_HEIGHT,3);
223                         glCompressedTexImage2D(GL_TEXTURE_2D,0,GL_PALETTE4_RGB8_OES,TEX_WIDTH,TEX_HEIGHT,0,3*16+TEX_WIDTH*TEX_HEIGHT/2,pixels);
224 
225                 } else {
226                         pixels = genTexture(TEX_WIDTH, TEX_HEIGHT, 4);
227             glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, TEX_WIDTH, TEX_HEIGHT, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
228                 }
229 
230         delete pixels;
231 
232                 err = glGetError();
233                 if(err != GL_NO_ERROR)
234             printf("error %d after image \n",err);
235         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
236                 err = glGetError();
237                 if(err != GL_NO_ERROR)
238             printf("error after min filter \n");
239         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
240                 err = glGetError();
241                 if(err != GL_NO_ERROR)
242             printf("error after mag filter \n");
243         glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
244                 err = glGetError();
245                 if(err != GL_NO_ERROR)
246             printf("error after env mode \n");
247 
248                 if(useCompTexture) {
249                     pixels = genPalette4_rgb8(TEX_WIDTH,TEX_HEIGHT,1);
250                     glCompressedTexSubImage2D(GL_TEXTURE_2D,0,TEX_WIDTH/4,TEX_HEIGHT/4,TEX_WIDTH/8,TEX_HEIGHT/8,GL_PALETTE4_RGB8_OES,3*16+(TEX_WIDTH*TEX_HEIGHT/128),pixels);
251                 } else {
252             pixels = genRedTexture(TEX_WIDTH/8, TEX_HEIGHT/8, 4);
253                     glTexSubImage2D(GL_TEXTURE_2D,0,TEX_WIDTH/4,TEX_HEIGHT/4,TEX_WIDTH/8,TEX_HEIGHT/8,GL_RGBA,GL_UNSIGNED_BYTE,pixels);
254                 }
255                  err = glGetError();
256                 if(err != GL_NO_ERROR)
257             printf("error %d after subimage \n",err);
258         delete pixels;
259 
260     }
261 
262     glClearColor(0.6f, 0.8f, 1.0f, 1.0f); // clear blue
263 
264     float afVertices[] = {  -0.4f,-0.4f,0.0f, // Position
265                  1.0f,0.0f,0.0f,1.0f, // Color
266                  0.0f, 0.0f, // texture
267                  12.f, //point size
268 
269                  0.4f,-0.4f,0.0f,
270                  0.0f,1.0f,0.0f,1.0f,
271                  1.0f, 0.0f,
272                  47.0f,
273 
274                  0.0f,0.4f,0.0f,
275                  0.0f,0.0f,1.0f,1.0f,
276                  0.5f, 1.0f,
277                  14.0f
278     };
279 
280 #define MAX_T 1
281 #define MID_T 0
282 #define MIN_T 0
283 
284     GLbyte byteVertices[] = { -1,-1,0, // Position
285                              255,0,0,255, // Color
286                              MIN_T, MIN_T, // texture
287                              12, //point size
288 
289                              1,-1,0,
290                              0,255,0,255,
291                              MAX_T,MIN_T,
292                              47,
293 
294                             0,1,0,
295                             0,0,255,255,
296                             MID_T, MAX_T,
297                             14
298     };
299 
300     GLfixed fixedVertices[] = { F_to_X(-0.4f),F_to_X(-0.4f),F_to_X(0.0f), // Position
301                     F_to_X(1.0f),F_to_X(0.0f),F_to_X(0.0f),F_to_X(1.0f), // Color
302                     F_to_X(0.0f),F_to_X(0.0f), // texture
303                     F_to_X(12.0f),//points size
304 
305                     F_to_X(0.4f),F_to_X(-0.4f),F_to_X(0.0f),
306                     F_to_X(0.0f),F_to_X(1.0f),F_to_X(0.0f),F_to_X(1.0f),
307                     F_to_X(1.0f),F_to_X( 0.0f),
308                     F_to_X(30.0f),
309 
310                     F_to_X(0.0f),F_to_X(0.4f),F_to_X(0.0f),
311                     F_to_X(0.0f),F_to_X(0.0f),F_to_X(1.0f),F_to_X(1.0f),
312                     F_to_X(0.5f), F_to_X(1.0f),
313                     F_to_X(30.0)
314     };
315 
316     unsigned short indices[] = { 2, 1, 0 };
317 
318     if (!immidateMode) {
319         glGenBuffers(1, &ui32Vbo);
320         ui32Vbo = 1;
321          printf("ui32Vbo = %d\n", ui32Vbo);
322 
323         glBindBuffer(GL_ARRAY_BUFFER, ui32Vbo);
324         void* data = (void*)afVertices;
325         unsigned int uiSize = 3*(sizeof(float)*10);
326         if(useConvertedType){
327            if(useFixed){
328                data = (void*)fixedVertices;
329            } else {
330                data   = (void*)byteVertices;
331                uiSize = 3*(sizeof(GLbyte)*10);
332            }
333         }
334         glBufferData(GL_ARRAY_BUFFER, uiSize,data, GL_STATIC_DRAW);
335 
336         ui32IndexVbo = 2;
337         glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ui32IndexVbo);
338         glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);
339     }
340 
341     // Draws a triangle for 800 frames
342     float angle = 0.0;
343     glMatrixMode(GL_PROJECTION);
344     glLoadIdentity();
345     glMatrixMode(GL_MODELVIEW);
346     glLoadIdentity();
347 
348     GLvoid* arr = NULL;
349     GLenum  type;
350     GLenum  drawType;
351     GLenum  colorType;
352     int     size_of;
353 
354     if(useConvertedType){
355         if(useFixed)
356         {
357             arr = fixedVertices;
358             colorType = type = GL_FIXED;
359             size_of = sizeof(GLfixed);
360         } else {
361             arr = byteVertices;
362             colorType = GL_UNSIGNED_BYTE;
363             type = GL_BYTE;
364             size_of = sizeof(GLbyte);
365         }
366     }else {
367         arr = afVertices;
368         colorType = type = GL_FLOAT;
369         size_of = sizeof(float);
370     }
371 
372     if(usePoints)
373     {
374         drawType = GL_POINTS;
375     }
376     else
377         drawType = GL_TRIANGLES;
378 
379     GLvoid* data = NULL;
380     for (int i = 0; i < 100; i++) {
381 
382         glClear(GL_COLOR_BUFFER_BIT);
383         glPushMatrix();
384         glRotatef(angle, 0.0, 0.0, 1.0);
385         angle += 360.0 / nframes;
386         // Enable vertex arrays
387         glEnableClientState(GL_VERTEX_ARRAY);
388         if (immidateMode) {
389             glVertexPointer(3,type, size_of * 10, arr);
390         } else {
391             glVertexPointer(3,type, size_of * 10, 0);
392         }
393 
394         // Set color data in the same way
395         glEnableClientState(GL_COLOR_ARRAY);
396         if (immidateMode) {
397             SWITCH_SOURCE(3)
398             glColorPointer(4, colorType, size_of * 10, data);
399         } else {
400             glColorPointer(4,colorType,size_of * 10, (GLvoid*) (size_of * 3) );
401         }
402         if (useTexture) {
403             glEnableClientState(GL_TEXTURE_COORD_ARRAY);
404             if (immidateMode) {
405                 SWITCH_SOURCE(7)
406                 glTexCoordPointer(2, type, size_of * 10,data);
407             } else {
408                 glTexCoordPointer(2, type, size_of * 10, (GLvoid*)(size_of * 7));
409             }
410         }
411         if(usePoints)
412         {
413             glEnableClientState(GL_POINT_SIZE_ARRAY_OES);
414             if (immidateMode) {
415                 SWITCH_SOURCE(9)
416                 glPointSizePointerOES(type,size_of * 10,data);
417                         } else {
418                 glPointSizePointerOES(type,size_of * 10,(GLvoid*)(size_of * 9));
419                         }
420         }
421 
422         if (useIndices) {
423             if (immidateMode) {
424                 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
425                 glDrawElements(drawType, 3, GL_UNSIGNED_SHORT, indices);
426             } else {
427                 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ui32IndexVbo);
428                 glDrawElements(drawType, 3, GL_UNSIGNED_SHORT, 0);
429             }
430         } else {
431             glDrawArrays(drawType, 0, 3);
432         }
433 
434                 GLenum err = glGetError();
435                 if(err != GL_NO_ERROR)
436             printf(" error %d has occured while drawing\n",err);
437 
438 
439         glPopMatrix();
440                 eglSwapBuffers(d,egl_surface);
441 
442                 if(useTexture && useCopy)
443                     glCopyTexImage2D(GL_TEXTURE_2D,0,GL_RGBA,0,0,256,256,0);
444                 else if(useTexture && useSubCopy)
445                     glCopyTexSubImage2D(GL_TEXTURE_2D,0,100,100,WINDOW_WIDTH/2,WINDOW_HEIGHT/2,50,50);
446     }
447                 err = glGetError();
448                 if(err != GL_NO_ERROR)
449             printf("error ->>> %d  \n",err);
450         eglDestroySurface(d,egl_surface);
451         eglDestroyContext(d,ctx);
452 
453 // Just wait until the window is closed
454         SDL_Event ev;
455         while( SDL_WaitEvent(&ev) ) {
456             if (ev.type == SDL_QUIT) {
457                 break;
458             }
459         }
460     return 0;
461 }
462 
463 
464