diff options
Diffstat (limited to 'progs/egl/opengl/demo2.c')
-rw-r--r-- | progs/egl/opengl/demo2.c | 216 |
1 files changed, 216 insertions, 0 deletions
diff --git a/progs/egl/opengl/demo2.c b/progs/egl/opengl/demo2.c new file mode 100644 index 00000000000..b9e92f62ac2 --- /dev/null +++ b/progs/egl/opengl/demo2.c @@ -0,0 +1,216 @@ +/* + * Exercise EGL API functions + */ + +#define EGL_EGLEXT_PROTOTYPES + +#include <assert.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> + +#include <EGL/egl.h> +#include <EGL/eglext.h> +#include <GLES/gl.h> + +/*#define FRONTBUFFER*/ + +static void _subset_Rectf(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2, + GLfloat r, GLfloat g, GLfloat b) +{ + GLfloat v[4][2], c[4][4]; + int i; + + v[0][0] = x1; v[0][1] = y1; + v[1][0] = x2; v[1][1] = y1; + v[2][0] = x2; v[2][1] = y2; + v[3][0] = x1; v[3][1] = y2; + + for (i = 0; i < 4; i++) { + c[i][0] = r; + c[i][1] = g; + c[i][2] = b; + c[i][3] = 1.0; + } + + glVertexPointer(2, GL_FLOAT, 0, v); + glColorPointer(4, GL_FLOAT, 0, v); + glEnableClientState(GL_VERTEX_ARRAY); + glEnableClientState(GL_COLOR_ARRAY); + + glDrawArrays(GL_TRIANGLE_FAN, 0, 4); + + glDisableClientState(GL_VERTEX_ARRAY); + glDisableClientState(GL_COLOR_ARRAY); +} + + +static void redraw(EGLDisplay dpy, EGLSurface surf, int rot) +{ + GLfloat r, g, b; + + printf("Redraw event\n"); + + glClearColor( rand()/(float)RAND_MAX, + rand()/(float)RAND_MAX, + rand()/(float)RAND_MAX, + 1); + + glClear( GL_COLOR_BUFFER_BIT ); + + r = rand()/(float)RAND_MAX; + g = rand()/(float)RAND_MAX; + b = rand()/(float)RAND_MAX; + + glPushMatrix(); + glRotatef(rot, 0, 0, 1); + glScalef(.5, .5, .5); + _subset_Rectf( -1, -1, 1, 1, r, g, b ); + glPopMatrix(); + +#ifdef FRONTBUFFER + glFlush(); +#else + eglSwapBuffers( dpy, surf ); +#endif + glFinish(); +} + + +/** + * Test EGL_MESA_screen_surface functions + */ +static void +TestScreens(EGLDisplay dpy) +{ +#define MAX 8 + EGLScreenMESA screens[MAX]; + EGLint numScreens; + EGLint i; + + eglGetScreensMESA(dpy, screens, MAX, &numScreens); + printf("Found %d screens\n", numScreens); + for (i = 0; i < numScreens; i++) { + printf(" Screen %d handle: %d\n", i, (int) screens[i]); + } +} + + +int +main(int argc, char *argv[]) +{ + int maj, min; + EGLContext ctx; + EGLSurface pbuffer, screen_surf; + EGLConfig configs[10]; + EGLint numConfigs, i; + EGLBoolean b; + const EGLint pbufAttribs[] = { + EGL_WIDTH, 500, + EGL_HEIGHT, 500, + EGL_NONE + }; + EGLint screenAttribs[32]; + EGLModeMESA mode; + EGLScreenMESA screen; + EGLint count; + + EGLDisplay d = eglGetDisplay(EGL_DEFAULT_DISPLAY); + assert(d); + + if (!eglInitialize(d, &maj, &min)) { + printf("demo: eglInitialize failed\n"); + exit(1); + } + + printf("EGL version = %d.%d\n", maj, min); + printf("EGL_VENDOR = %s\n", eglQueryString(d, EGL_VENDOR)); + if (!strstr(eglQueryString(d, EGL_EXTENSIONS), + "EGL_MESA_screen_surface")) { + printf("EGL_MESA_screen_surface is not supported\n"); + exit(1); + } + + eglGetConfigs(d, configs, 10, &numConfigs); + printf("Got %d EGL configs:\n", numConfigs); + for (i = 0; i < numConfigs; i++) { + EGLint id, red, depth; + eglGetConfigAttrib(d, configs[i], EGL_CONFIG_ID, &id); + eglGetConfigAttrib(d, configs[i], EGL_RED_SIZE, &red); + eglGetConfigAttrib(d, configs[i], EGL_DEPTH_SIZE, &depth); + printf("%2d: Red Size = %d Depth Size = %d\n", id, red, depth); + } + + eglGetScreensMESA(d, &screen, 1, &count); + eglGetModesMESA(d, screen, &mode, 1, &count); + + eglBindAPI(EGL_OPENGL_API); + ctx = eglCreateContext(d, configs[0], EGL_NO_CONTEXT, NULL); + if (ctx == EGL_NO_CONTEXT) { + printf("failed to create context\n"); + return 0; + } + + pbuffer = eglCreatePbufferSurface(d, configs[0], pbufAttribs); + if (pbuffer == EGL_NO_SURFACE) { + printf("failed to create pbuffer\n"); + return 0; + } + + b = eglMakeCurrent(d, pbuffer, pbuffer, ctx); + if (!b) { + printf("make current failed\n"); + return 0; + } + + b = eglMakeCurrent(d, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); + + i = 0; + screenAttribs[i++] = EGL_WIDTH; + eglGetModeAttribMESA(d, mode, EGL_WIDTH, &screenAttribs[i++]); + screenAttribs[i++] = EGL_HEIGHT; + eglGetModeAttribMESA(d, mode, EGL_HEIGHT, &screenAttribs[i++]); + screenAttribs[i] = EGL_NONE; + + screen_surf = eglCreateScreenSurfaceMESA(d, configs[0], screenAttribs); + if (screen_surf == EGL_NO_SURFACE) { + printf("failed to create screen surface\n"); + return 0; + } + + eglShowScreenSurfaceMESA(d, screen, screen_surf, mode); + + b = eglMakeCurrent(d, screen_surf, screen_surf, ctx); + if (!b) { + printf("make current failed\n"); + return 0; + } + + glViewport(0, 0, 1024, 768); + + glClearColor( 0, + 1.0, + 0, + 1); + + glClear( GL_COLOR_BUFFER_BIT ); + + + TestScreens(d); + + glShadeModel( GL_FLAT ); + + for (i = 0; i < 6; i++) { + redraw(d, screen_surf, i*10 ); + + printf("sleep(1)\n"); + sleep(1); + } + + eglDestroySurface(d, pbuffer); + eglDestroyContext(d, ctx); + eglTerminate(d); + + return 0; +} |