6ea75787931b75272e5daa606532ccfa2b13cd30
2 * Exercise EGL API functions
14 #define PIXEL_CENTER(x) ((long)(x) + 0.5)
20 #define OPENGL_WIDTH 48
21 #define OPENGL_HEIGHT 13
24 GLenum rgb
, doubleBuffer
, windType
;
29 GLubyte OpenGL_bits
[] = {
30 0x00, 0x03, 0x00, 0x00, 0x00, 0x00,
31 0x7f, 0xfb, 0xff, 0xff, 0xff, 0x01,
32 0x7f, 0xfb, 0xff, 0xff, 0xff, 0x01,
33 0x00, 0x03, 0x00, 0x00, 0x00, 0x00,
34 0x3e, 0x8f, 0xb7, 0xf9, 0xfc, 0x01,
35 0x63, 0xdb, 0xb0, 0x8d, 0x0d, 0x00,
36 0x63, 0xdb, 0xb7, 0x8d, 0x0d, 0x00,
37 0x63, 0xdb, 0xb6, 0x8d, 0x0d, 0x00,
38 0x63, 0x8f, 0xf3, 0xcc, 0x0d, 0x00,
39 0x63, 0x00, 0x00, 0x0c, 0x4c, 0x0a,
40 0x63, 0x00, 0x00, 0x0c, 0x4c, 0x0e,
41 0x63, 0x00, 0x00, 0x8c, 0xed, 0x0e,
42 0x3e, 0x00, 0x00, 0xf8, 0x0c, 0x00,
46 static void Init(void)
53 static void Reshape(int width
, int height
)
57 windH
= (GLint
)height
;
61 static void RotateColorMask(void)
63 static GLint rotation
= 0;
65 rotation
= (rotation
+ 1) & 0x3;
68 glColorMask(GL_TRUE
, GL_TRUE
, GL_TRUE
, GL_TRUE
);
72 glColorMask(GL_FALSE
, GL_TRUE
, GL_TRUE
, GL_TRUE
);
76 glColorMask(GL_TRUE
, GL_FALSE
, GL_TRUE
, GL_TRUE
);
80 glColorMask(GL_TRUE
, GL_TRUE
, GL_FALSE
, GL_TRUE
);
87 static void Viewport(GLint row
, GLint column
)
91 boxW
= (windW
- (COLS
+ 1) * GAP
) / COLS
;
92 boxH
= (windH
- (ROWS
+ 1) * GAP
) / ROWS
;
94 x
= GAP
+ column
* (boxW
+ GAP
);
95 y
= GAP
+ row
* (boxH
+ GAP
);
97 glViewport(x
, y
, boxW
, boxH
);
99 glMatrixMode(GL_PROJECTION
);
101 glOrtho(-boxW
/2, boxW
/2, -boxH
/2, boxH
/2, 0.0, 1.0);
102 glMatrixMode(GL_MODELVIEW
);
104 glEnable(GL_SCISSOR_TEST
);
105 glScissor(x
, y
, boxW
, boxH
);
119 static float RGBMap
[9][3] = {
131 static void SetColor(int c
)
133 glColor3fv(RGBMap
[c
]);
136 static void Point(void)
141 SetColor(COLOR_WHITE
);
143 for (i
= 1; i
< 8; i
++) {
145 SetColor(COLOR_BLACK
+i
);
158 static void Lines(void)
164 glTranslatef(-12, 0, 0);
165 for (i
= 1; i
< 8; i
++) {
166 SetColor(COLOR_BLACK
+i
);
168 glVertex2i(-boxW
/4, -boxH
/4);
169 glVertex2i(boxW
/4, boxH
/4);
171 glTranslatef(4, 0, 0);
181 static void LineStrip(void)
184 glBegin(GL_LINE_STRIP
);
186 glVertex2f(PIXEL_CENTER(-boxW
/4), PIXEL_CENTER(-boxH
/4));
187 SetColor(COLOR_GREEN
);
188 glVertex2f(PIXEL_CENTER(-boxW
/4), PIXEL_CENTER(boxH
/4));
189 SetColor(COLOR_BLUE
);
190 glVertex2f(PIXEL_CENTER(boxW
/4), PIXEL_CENTER(boxH
/4));
191 SetColor(COLOR_WHITE
);
192 glVertex2f(PIXEL_CENTER(boxW
/4), PIXEL_CENTER(-boxH
/4));
195 glBegin(GL_LINE_STRIP
);
200 static void LineLoop(void)
203 glBegin(GL_LINE_LOOP
);
205 glVertex2f(PIXEL_CENTER(-boxW
/4), PIXEL_CENTER(-boxH
/4));
206 SetColor(COLOR_GREEN
);
207 glVertex2f(PIXEL_CENTER(-boxW
/4), PIXEL_CENTER(boxH
/4));
208 SetColor(COLOR_BLUE
);
209 glVertex2f(PIXEL_CENTER(boxW
/4), PIXEL_CENTER(boxH
/4));
210 SetColor(COLOR_WHITE
);
211 glVertex2f(PIXEL_CENTER(boxW
/4), PIXEL_CENTER(-boxH
/4));
214 glEnable(GL_LOGIC_OP
);
218 glBlendFunc(GL_ONE
, GL_ONE
);
220 SetColor(COLOR_MAGENTA
);
221 glBegin(GL_LINE_LOOP
);
222 glVertex2f(PIXEL_CENTER(-boxW
/8), PIXEL_CENTER(-boxH
/8));
223 glVertex2f(PIXEL_CENTER(-boxW
/8), PIXEL_CENTER(boxH
/8));
225 glBegin(GL_LINE_LOOP
);
226 glVertex2f(PIXEL_CENTER(-boxW
/8), PIXEL_CENTER(boxH
/8+5));
227 glVertex2f(PIXEL_CENTER(boxW
/8), PIXEL_CENTER(boxH
/8+5));
229 glDisable(GL_LOGIC_OP
);
232 SetColor(COLOR_GREEN
);
237 glBegin(GL_LINE_LOOP
);
242 static void Bitmap(void)
246 SetColor(COLOR_GREEN
);
247 glVertex2i(-boxW
/2, 0);
248 glVertex2i(boxW
/2, 0);
249 glVertex2i(0, -boxH
/2);
250 glVertex2i(0, boxH
/2);
253 glVertex2i(0, -3+OPENGL_HEIGHT
);
254 SetColor(COLOR_BLUE
);
256 glVertex2i(OPENGL_WIDTH
, -3);
259 SetColor(COLOR_GREEN
);
261 glPixelStorei(GL_UNPACK_LSB_FIRST
, GL_TRUE
);
262 glPixelStorei(GL_UNPACK_ALIGNMENT
, 1);
265 glBitmap(OPENGL_WIDTH
, OPENGL_HEIGHT
, 0, 3, 0.0, 0.0, OpenGL_bits
);
268 static void Triangles(void)
271 glBegin(GL_TRIANGLES
);
272 SetColor(COLOR_GREEN
);
273 glVertex2i(-boxW
/4, -boxH
/4);
275 glVertex2i(-boxW
/8, -boxH
/16);
276 SetColor(COLOR_BLUE
);
277 glVertex2i(boxW
/8, -boxH
/16);
279 SetColor(COLOR_GREEN
);
280 glVertex2i(-boxW
/4, boxH
/4);
282 glVertex2i(-boxW
/8, boxH
/16);
283 SetColor(COLOR_BLUE
);
284 glVertex2i(boxW
/8, boxH
/16);
287 glBegin(GL_TRIANGLES
);
289 glVertex2i(-100, 100);
293 static void TriangleStrip(void)
296 glBegin(GL_TRIANGLE_STRIP
);
297 SetColor(COLOR_GREEN
);
298 glVertex2i(-boxW
/4, -boxH
/4);
300 glVertex2i(-boxW
/4, boxH
/4);
301 SetColor(COLOR_BLUE
);
302 glVertex2i(0, -boxH
/4);
303 SetColor(COLOR_WHITE
);
304 glVertex2i(0, boxH
/4);
305 SetColor(COLOR_CYAN
);
306 glVertex2i(boxW
/4, -boxH
/4);
307 SetColor(COLOR_YELLOW
);
308 glVertex2i(boxW
/4, boxH
/4);
311 glBegin(GL_TRIANGLE_STRIP
);
313 glVertex2i(-100, 100);
317 static void TriangleFan(void)
320 GLint x0
, y0
, x1
, y1
, x2
, y2
, x3
, y3
;
332 vx
[0][0] = x0
; vx
[0][1] = y1
;
333 vx
[1][0] = x0
; vx
[1][1] = y2
;
334 vx
[2][0] = x1
; vx
[2][1] = y3
;
335 vx
[3][0] = x2
; vx
[3][1] = y3
;
336 vx
[4][0] = x3
; vx
[4][1] = y2
;
337 vx
[5][0] = x3
; vx
[5][1] = y1
;
338 vx
[6][0] = x2
; vx
[6][1] = y0
;
339 vx
[7][0] = x1
; vx
[7][1] = y0
;
341 glBegin(GL_TRIANGLE_FAN
);
342 SetColor(COLOR_WHITE
);
344 for (i
= 0; i
< 8; i
++) {
345 SetColor(COLOR_WHITE
-i
);
350 glBegin(GL_TRIANGLE_FAN
);
352 glVertex2i(-100, 100);
356 static void Rect(void)
359 SetColor(COLOR_GREEN
);
360 glRecti(-boxW
/4, -boxH
/4, boxW
/4, boxH
/4);
363 static void PolygonFunc(void)
366 GLint x0
, y0
, x1
, y1
, x2
, y2
, x3
, y3
;
378 vx
[0][0] = x0
; vx
[0][1] = y1
;
379 vx
[1][0] = x0
; vx
[1][1] = y2
;
380 vx
[2][0] = x1
; vx
[2][1] = y3
;
381 vx
[3][0] = x2
; vx
[3][1] = y3
;
382 vx
[4][0] = x3
; vx
[4][1] = y2
;
383 vx
[5][0] = x3
; vx
[5][1] = y1
;
384 vx
[6][0] = x2
; vx
[6][1] = y0
;
385 vx
[7][0] = x1
; vx
[7][1] = y0
;
388 for (i
= 0; i
< 8; i
++) {
389 SetColor(COLOR_WHITE
-i
);
396 glVertex2i(100, 100);
400 static void Quads(void)
404 SetColor(COLOR_GREEN
);
405 glVertex2i(-boxW
/4, -boxH
/4);
407 glVertex2i(-boxW
/8, -boxH
/16);
408 SetColor(COLOR_BLUE
);
409 glVertex2i(boxW
/8, -boxH
/16);
410 SetColor(COLOR_WHITE
);
411 glVertex2i(boxW
/4, -boxH
/4);
413 SetColor(COLOR_GREEN
);
414 glVertex2i(-boxW
/4, boxH
/4);
416 glVertex2i(-boxW
/8, boxH
/16);
417 SetColor(COLOR_BLUE
);
418 glVertex2i(boxW
/8, boxH
/16);
419 SetColor(COLOR_WHITE
);
420 glVertex2i(boxW
/4, boxH
/4);
425 glVertex2i(100, 100);
426 glVertex2i(-100, 100);
430 static void QuadStrip(void)
433 glBegin(GL_QUAD_STRIP
);
434 SetColor(COLOR_GREEN
);
435 glVertex2i(-boxW
/4, -boxH
/4);
437 glVertex2i(-boxW
/4, boxH
/4);
438 SetColor(COLOR_BLUE
);
439 glVertex2i(0, -boxH
/4);
440 SetColor(COLOR_WHITE
);
441 glVertex2i(0, boxH
/4);
442 SetColor(COLOR_CYAN
);
443 glVertex2i(boxW
/4, -boxH
/4);
444 SetColor(COLOR_YELLOW
);
445 glVertex2i(boxW
/4, boxH
/4);
448 glBegin(GL_QUAD_STRIP
);
450 glVertex2i(100, 100);
451 glVertex2i(-100, 100);
455 static void Draw(EGLDisplay dpy
, EGLSurface surf
)
458 glViewport(0, 0, windW
, windH
);
459 glDisable(GL_SCISSOR_TEST
);
461 glPushAttrib(GL_COLOR_BUFFER_BIT
);
463 glColorMask(1, 1, 1, 1);
466 glClearColor(0.0, 0.0, 0.0, 0.0);
467 glClear(GL_COLOR_BUFFER_BIT
);
472 glShadeModel(GL_SMOOTH
);
474 glShadeModel(GL_FLAT
);
478 glPolygonMode(GL_FRONT_AND_BACK
, GL_FILL
);
480 glPolygonMode(GL_FRONT_AND_BACK
, GL_LINE
);
483 Viewport(0, 0); Point();
484 Viewport(0, 1); Lines();
485 Viewport(0, 2); LineStrip();
486 Viewport(0, 3); LineLoop();
488 Viewport(1, 0); Bitmap();
490 Viewport(1, 1); TriangleFan();
491 Viewport(1, 2); Triangles();
492 Viewport(1, 3); TriangleStrip();
494 Viewport(2, 0); Rect();
495 Viewport(2, 1); PolygonFunc();
496 Viewport(2, 2); Quads();
497 Viewport(2, 3); QuadStrip();
502 eglSwapBuffers(dpy
, surf
);
507 write_ppm(const char *filename
, const GLubyte
*buffer
, int width
, int height
)
509 const int binary
= 0;
510 FILE *f
= fopen( filename
, "w" );
513 const GLubyte
*ptr
= buffer
;
516 fprintf(f
,"# ppm-file created by osdemo.c\n");
517 fprintf(f
,"%i %i\n", width
,height
);
520 f
= fopen( filename
, "ab" ); /* reopen in binary append mode */
521 for (y
=height
-1; y
>=0; y
--) {
522 for (x
=0; x
<width
; x
++) {
523 i
= (y
*width
+ x
) * 4;
524 fputc(ptr
[i
], f
); /* write red */
525 fputc(ptr
[i
+1], f
); /* write green */
526 fputc(ptr
[i
+2], f
); /* write blue */
534 fprintf(f
,"# ascii ppm file created by osdemo.c\n");
535 fprintf(f
,"%i %i\n", width
, height
);
537 for (y
=height
-1; y
>=0; y
--) {
538 for (x
=0; x
<width
; x
++) {
539 i
= (y
*width
+ x
) * 4;
540 fprintf(f
, " %3d %3d %3d", ptr
[i
], ptr
[i
+1], ptr
[i
+2]);
542 if (counter
% 5 == 0)
551 #include "../src/egl/main/egldisplay.h"
553 typedef struct fb_display
555 _EGLDisplay Base
; /* base class/object */
561 main(int argc
, char *argv
[])
565 EGLSurface screen_surf
;
566 EGLConfig configs
[10];
567 EGLScreenMESA screen
;
569 EGLint numConfigs
, count
;
571 const EGLint screenAttribs
[] = {
578 EGLDisplay d = eglGetDisplay(EGL_DEFAULT_DISPLAY);
580 EGLDisplay d
= eglGetDisplay("!EGL_i915");
583 if (!eglInitialize(d
, &maj
, &min
)) {
584 printf("demo: eglInitialize failed\n");
588 printf("EGL version = %d.%d\n", maj
, min
);
589 printf("EGL_VENDOR = %s\n", eglQueryString(d
, EGL_VENDOR
));
591 eglGetConfigs(d
, configs
, 10, &numConfigs
);
592 eglGetScreensMESA(d
, &screen
, 1, &count
);
593 eglGetModesMESA(d
, screen
, &mode
, 1, &count
);
595 ctx
= eglCreateContext(d
, configs
[0], EGL_NO_CONTEXT
, NULL
);
596 if (ctx
== EGL_NO_CONTEXT
) {
597 printf("failed to create context\n");
601 screen_surf
= eglCreateScreenSurfaceMESA(d
, configs
[0], screenAttribs
);
602 if (screen_surf
== EGL_NO_SURFACE
) {
603 printf("failed to create screen surface\n");
607 eglShowScreenSurfaceMESA(d
, screen
, screen_surf
, mode
);
609 b
= eglMakeCurrent(d
, screen_surf
, screen_surf
, ctx
);
611 printf("make current failed\n");
614 glViewport(0, 0, 1024, 768);
620 glDrawBuffer( GL_FRONT
);
621 glClearColor( 0, 1.0, 0, 1);
623 glClear( GL_COLOR_BUFFER_BIT
);
626 glDrawBuffer( GL_BACK
);
628 Draw(d
, screen_surf
);
630 write_ppm("dump.ppm", ((struct fb_display
*)_eglLookupDisplay(d
))->pFB
, 1024, 768);
632 eglDestroySurface(d
, screen_surf
);
633 eglDestroyContext(d
, ctx
);