2 * Exercise EGL API functions
5 #define EGL_EGLEXT_PROTOTYPES
8 #include <EGL/eglext.h>
17 #define PIXEL_CENTER(x) ((long)(x) + 0.5)
23 #define OPENGL_WIDTH 48
24 #define OPENGL_HEIGHT 13
27 GLenum rgb
, doubleBuffer
, windType
;
32 GLubyte OpenGL_bits
[] = {
33 0x00, 0x03, 0x00, 0x00, 0x00, 0x00,
34 0x7f, 0xfb, 0xff, 0xff, 0xff, 0x01,
35 0x7f, 0xfb, 0xff, 0xff, 0xff, 0x01,
36 0x00, 0x03, 0x00, 0x00, 0x00, 0x00,
37 0x3e, 0x8f, 0xb7, 0xf9, 0xfc, 0x01,
38 0x63, 0xdb, 0xb0, 0x8d, 0x0d, 0x00,
39 0x63, 0xdb, 0xb7, 0x8d, 0x0d, 0x00,
40 0x63, 0xdb, 0xb6, 0x8d, 0x0d, 0x00,
41 0x63, 0x8f, 0xf3, 0xcc, 0x0d, 0x00,
42 0x63, 0x00, 0x00, 0x0c, 0x4c, 0x0a,
43 0x63, 0x00, 0x00, 0x0c, 0x4c, 0x0e,
44 0x63, 0x00, 0x00, 0x8c, 0xed, 0x0e,
45 0x3e, 0x00, 0x00, 0xf8, 0x0c, 0x00,
49 static void Init(void)
56 static void Reshape(int width
, int height
)
60 windH
= (GLint
)height
;
64 static void RotateColorMask(void)
66 static GLint rotation
= 0;
68 rotation
= (rotation
+ 1) & 0x3;
71 glColorMask(GL_TRUE
, GL_TRUE
, GL_TRUE
, GL_TRUE
);
75 glColorMask(GL_FALSE
, GL_TRUE
, GL_TRUE
, GL_TRUE
);
79 glColorMask(GL_TRUE
, GL_FALSE
, GL_TRUE
, GL_TRUE
);
83 glColorMask(GL_TRUE
, GL_TRUE
, GL_FALSE
, GL_TRUE
);
90 static void Viewport(GLint row
, GLint column
)
94 boxW
= (windW
- (COLS
+ 1) * GAP
) / COLS
;
95 boxH
= (windH
- (ROWS
+ 1) * GAP
) / ROWS
;
97 x
= GAP
+ column
* (boxW
+ GAP
);
98 y
= GAP
+ row
* (boxH
+ GAP
);
100 glViewport(x
, y
, boxW
, boxH
);
102 glMatrixMode(GL_PROJECTION
);
104 glOrtho(-boxW
/2, boxW
/2, -boxH
/2, boxH
/2, 0.0, 1.0);
105 glMatrixMode(GL_MODELVIEW
);
107 glEnable(GL_SCISSOR_TEST
);
108 glScissor(x
, y
, boxW
, boxH
);
122 static float RGBMap
[9][3] = {
134 static void SetColor(int c
)
136 glColor3fv(RGBMap
[c
]);
139 static void Point(void)
144 SetColor(COLOR_WHITE
);
146 for (i
= 1; i
< 8; i
++) {
148 SetColor(COLOR_BLACK
+i
);
161 static void Lines(void)
167 glTranslatef(-12, 0, 0);
168 for (i
= 1; i
< 8; i
++) {
169 SetColor(COLOR_BLACK
+i
);
171 glVertex2i(-boxW
/4, -boxH
/4);
172 glVertex2i(boxW
/4, boxH
/4);
174 glTranslatef(4, 0, 0);
184 static void LineStrip(void)
187 glBegin(GL_LINE_STRIP
);
189 glVertex2f(PIXEL_CENTER(-boxW
/4), PIXEL_CENTER(-boxH
/4));
190 SetColor(COLOR_GREEN
);
191 glVertex2f(PIXEL_CENTER(-boxW
/4), PIXEL_CENTER(boxH
/4));
192 SetColor(COLOR_BLUE
);
193 glVertex2f(PIXEL_CENTER(boxW
/4), PIXEL_CENTER(boxH
/4));
194 SetColor(COLOR_WHITE
);
195 glVertex2f(PIXEL_CENTER(boxW
/4), PIXEL_CENTER(-boxH
/4));
198 glBegin(GL_LINE_STRIP
);
203 static void LineLoop(void)
206 glBegin(GL_LINE_LOOP
);
208 glVertex2f(PIXEL_CENTER(-boxW
/4), PIXEL_CENTER(-boxH
/4));
209 SetColor(COLOR_GREEN
);
210 glVertex2f(PIXEL_CENTER(-boxW
/4), PIXEL_CENTER(boxH
/4));
211 SetColor(COLOR_BLUE
);
212 glVertex2f(PIXEL_CENTER(boxW
/4), PIXEL_CENTER(boxH
/4));
213 SetColor(COLOR_WHITE
);
214 glVertex2f(PIXEL_CENTER(boxW
/4), PIXEL_CENTER(-boxH
/4));
217 glEnable(GL_LOGIC_OP
);
221 glBlendFunc(GL_ONE
, GL_ONE
);
223 SetColor(COLOR_MAGENTA
);
224 glBegin(GL_LINE_LOOP
);
225 glVertex2f(PIXEL_CENTER(-boxW
/8), PIXEL_CENTER(-boxH
/8));
226 glVertex2f(PIXEL_CENTER(-boxW
/8), PIXEL_CENTER(boxH
/8));
228 glBegin(GL_LINE_LOOP
);
229 glVertex2f(PIXEL_CENTER(-boxW
/8), PIXEL_CENTER(boxH
/8+5));
230 glVertex2f(PIXEL_CENTER(boxW
/8), PIXEL_CENTER(boxH
/8+5));
232 glDisable(GL_LOGIC_OP
);
235 SetColor(COLOR_GREEN
);
240 glBegin(GL_LINE_LOOP
);
245 static void Bitmap(void)
249 SetColor(COLOR_GREEN
);
250 glVertex2i(-boxW
/2, 0);
251 glVertex2i(boxW
/2, 0);
252 glVertex2i(0, -boxH
/2);
253 glVertex2i(0, boxH
/2);
256 glVertex2i(0, -3+OPENGL_HEIGHT
);
257 SetColor(COLOR_BLUE
);
259 glVertex2i(OPENGL_WIDTH
, -3);
262 SetColor(COLOR_GREEN
);
264 glPixelStorei(GL_UNPACK_LSB_FIRST
, GL_TRUE
);
265 glPixelStorei(GL_UNPACK_ALIGNMENT
, 1);
268 glBitmap(OPENGL_WIDTH
, OPENGL_HEIGHT
, 0, 3, 0.0, 0.0, OpenGL_bits
);
271 static void Triangles(void)
274 glBegin(GL_TRIANGLES
);
275 SetColor(COLOR_GREEN
);
276 glVertex2i(-boxW
/4, -boxH
/4);
278 glVertex2i(-boxW
/8, -boxH
/16);
279 SetColor(COLOR_BLUE
);
280 glVertex2i(boxW
/8, -boxH
/16);
282 SetColor(COLOR_GREEN
);
283 glVertex2i(-boxW
/4, boxH
/4);
285 glVertex2i(-boxW
/8, boxH
/16);
286 SetColor(COLOR_BLUE
);
287 glVertex2i(boxW
/8, boxH
/16);
290 glBegin(GL_TRIANGLES
);
292 glVertex2i(-100, 100);
296 static void TriangleStrip(void)
299 glBegin(GL_TRIANGLE_STRIP
);
300 SetColor(COLOR_GREEN
);
301 glVertex2i(-boxW
/4, -boxH
/4);
303 glVertex2i(-boxW
/4, boxH
/4);
304 SetColor(COLOR_BLUE
);
305 glVertex2i(0, -boxH
/4);
306 SetColor(COLOR_WHITE
);
307 glVertex2i(0, boxH
/4);
308 SetColor(COLOR_CYAN
);
309 glVertex2i(boxW
/4, -boxH
/4);
310 SetColor(COLOR_YELLOW
);
311 glVertex2i(boxW
/4, boxH
/4);
314 glBegin(GL_TRIANGLE_STRIP
);
316 glVertex2i(-100, 100);
320 static void TriangleFan(void)
323 GLint x0
, y0
, x1
, y1
, x2
, y2
, x3
, y3
;
335 vx
[0][0] = x0
; vx
[0][1] = y1
;
336 vx
[1][0] = x0
; vx
[1][1] = y2
;
337 vx
[2][0] = x1
; vx
[2][1] = y3
;
338 vx
[3][0] = x2
; vx
[3][1] = y3
;
339 vx
[4][0] = x3
; vx
[4][1] = y2
;
340 vx
[5][0] = x3
; vx
[5][1] = y1
;
341 vx
[6][0] = x2
; vx
[6][1] = y0
;
342 vx
[7][0] = x1
; vx
[7][1] = y0
;
344 glBegin(GL_TRIANGLE_FAN
);
345 SetColor(COLOR_WHITE
);
347 for (i
= 0; i
< 8; i
++) {
348 SetColor(COLOR_WHITE
-i
);
353 glBegin(GL_TRIANGLE_FAN
);
355 glVertex2i(-100, 100);
359 static void Rect(void)
362 SetColor(COLOR_GREEN
);
363 glRecti(-boxW
/4, -boxH
/4, boxW
/4, boxH
/4);
366 static void PolygonFunc(void)
369 GLint x0
, y0
, x1
, y1
, x2
, y2
, x3
, y3
;
381 vx
[0][0] = x0
; vx
[0][1] = y1
;
382 vx
[1][0] = x0
; vx
[1][1] = y2
;
383 vx
[2][0] = x1
; vx
[2][1] = y3
;
384 vx
[3][0] = x2
; vx
[3][1] = y3
;
385 vx
[4][0] = x3
; vx
[4][1] = y2
;
386 vx
[5][0] = x3
; vx
[5][1] = y1
;
387 vx
[6][0] = x2
; vx
[6][1] = y0
;
388 vx
[7][0] = x1
; vx
[7][1] = y0
;
391 for (i
= 0; i
< 8; i
++) {
392 SetColor(COLOR_WHITE
-i
);
399 glVertex2i(100, 100);
403 static void Quads(void)
407 SetColor(COLOR_GREEN
);
408 glVertex2i(-boxW
/4, -boxH
/4);
410 glVertex2i(-boxW
/8, -boxH
/16);
411 SetColor(COLOR_BLUE
);
412 glVertex2i(boxW
/8, -boxH
/16);
413 SetColor(COLOR_WHITE
);
414 glVertex2i(boxW
/4, -boxH
/4);
416 SetColor(COLOR_GREEN
);
417 glVertex2i(-boxW
/4, boxH
/4);
419 glVertex2i(-boxW
/8, boxH
/16);
420 SetColor(COLOR_BLUE
);
421 glVertex2i(boxW
/8, boxH
/16);
422 SetColor(COLOR_WHITE
);
423 glVertex2i(boxW
/4, boxH
/4);
428 glVertex2i(100, 100);
429 glVertex2i(-100, 100);
433 static void QuadStrip(void)
436 glBegin(GL_QUAD_STRIP
);
437 SetColor(COLOR_GREEN
);
438 glVertex2i(-boxW
/4, -boxH
/4);
440 glVertex2i(-boxW
/4, boxH
/4);
441 SetColor(COLOR_BLUE
);
442 glVertex2i(0, -boxH
/4);
443 SetColor(COLOR_WHITE
);
444 glVertex2i(0, boxH
/4);
445 SetColor(COLOR_CYAN
);
446 glVertex2i(boxW
/4, -boxH
/4);
447 SetColor(COLOR_YELLOW
);
448 glVertex2i(boxW
/4, boxH
/4);
451 glBegin(GL_QUAD_STRIP
);
453 glVertex2i(100, 100);
454 glVertex2i(-100, 100);
458 static void Draw(EGLDisplay dpy
, EGLSurface surf
)
461 glViewport(0, 0, windW
, windH
);
462 glDisable(GL_SCISSOR_TEST
);
464 glPushAttrib(GL_COLOR_BUFFER_BIT
);
466 glColorMask(1, 1, 1, 1);
469 glClearColor(0.0, 0.0, 0.0, 0.0);
470 glClear(GL_COLOR_BUFFER_BIT
);
475 glShadeModel(GL_SMOOTH
);
477 glShadeModel(GL_FLAT
);
481 glPolygonMode(GL_FRONT_AND_BACK
, GL_FILL
);
483 glPolygonMode(GL_FRONT_AND_BACK
, GL_LINE
);
486 Viewport(0, 0); Point();
487 Viewport(0, 1); Lines();
488 Viewport(0, 2); LineStrip();
489 Viewport(0, 3); LineLoop();
491 Viewport(1, 0); Bitmap();
493 Viewport(1, 1); TriangleFan();
494 Viewport(1, 2); Triangles();
495 Viewport(1, 3); TriangleStrip();
497 Viewport(2, 0); Rect();
498 Viewport(2, 1); PolygonFunc();
499 Viewport(2, 2); Quads();
500 Viewport(2, 3); QuadStrip();
505 eglSwapBuffers(dpy
, surf
);
510 write_ppm(const char *filename
, const GLubyte
*buffer
, int width
, int height
)
512 const int binary
= 0;
513 FILE *f
= fopen( filename
, "w" );
516 const GLubyte
*ptr
= buffer
;
519 fprintf(f
,"# ppm-file created by osdemo.c\n");
520 fprintf(f
,"%i %i\n", width
,height
);
523 f
= fopen( filename
, "ab" ); /* reopen in binary append mode */
524 for (y
=height
-1; y
>=0; y
--) {
525 for (x
=0; x
<width
; x
++) {
526 i
= (y
*width
+ x
) * 4;
527 fputc(ptr
[i
], f
); /* write red */
528 fputc(ptr
[i
+1], f
); /* write green */
529 fputc(ptr
[i
+2], f
); /* write blue */
537 fprintf(f
,"# ascii ppm file created by osdemo.c\n");
538 fprintf(f
,"%i %i\n", width
, height
);
540 for (y
=height
-1; y
>=0; y
--) {
541 for (x
=0; x
<width
; x
++) {
542 i
= (y
*width
+ x
) * 4;
543 fprintf(f
, " %3d %3d %3d", ptr
[i
], ptr
[i
+1], ptr
[i
+2]);
545 if (counter
% 5 == 0)
554 #include "../src/egl/main/egldisplay.h"
556 typedef struct fb_display
558 _EGLDisplay Base
; /* base class/object */
564 main(int argc
, char *argv
[])
568 EGLSurface screen_surf
;
569 EGLConfig configs
[10];
570 EGLScreenMESA screen
;
572 EGLint numConfigs
, count
;
574 const EGLint screenAttribs
[] = {
581 EGLDisplay d = eglGetDisplay(EGL_DEFAULT_DISPLAY);
583 EGLDisplay d
= eglGetDisplay("!EGL_i915");
586 if (!eglInitialize(d
, &maj
, &min
)) {
587 printf("demo: eglInitialize failed\n");
591 printf("EGL version = %d.%d\n", maj
, min
);
592 printf("EGL_VENDOR = %s\n", eglQueryString(d
, EGL_VENDOR
));
594 eglGetConfigs(d
, configs
, 10, &numConfigs
);
595 eglGetScreensMESA(d
, &screen
, 1, &count
);
596 eglGetModesMESA(d
, screen
, &mode
, 1, &count
);
598 ctx
= eglCreateContext(d
, configs
[0], EGL_NO_CONTEXT
, NULL
);
599 if (ctx
== EGL_NO_CONTEXT
) {
600 printf("failed to create context\n");
604 screen_surf
= eglCreateScreenSurfaceMESA(d
, configs
[0], screenAttribs
);
605 if (screen_surf
== EGL_NO_SURFACE
) {
606 printf("failed to create screen surface\n");
610 eglShowScreenSurfaceMESA(d
, screen
, screen_surf
, mode
);
612 b
= eglMakeCurrent(d
, screen_surf
, screen_surf
, ctx
);
614 printf("make current failed\n");
617 glViewport(0, 0, 1024, 768);
623 glDrawBuffer( GL_FRONT
);
624 glClearColor( 0, 1.0, 0, 1);
626 glClear( GL_COLOR_BUFFER_BIT
);
629 glDrawBuffer( GL_BACK
);
631 Draw(d
, screen_surf
);
633 write_ppm("dump.ppm", ((struct fb_display
*)_eglLookupDisplay(d
))->pFB
, 1024, 768);
635 eglDestroySurface(d
, screen_surf
);
636 eglDestroyContext(d
, ctx
);