glx-dlopen-dlsym
glx-dlopen-gpa
glx-dlopen-gpaa
+egl-opengl-link-call
+
test_programs += $(dir)/glx-dlopen-dlsym
test_programs += $(dir)/glx-dlopen-gpa
test_programs += $(dir)/glx-dlopen-gpaa
+test_programs += $(dir)/egl-opengl-link-call
endif
glx_link_call_srcs = \
$(dir)/glx-dlopen-gpaa: $(glx_dlopen_gpaa_modules)
$(call quiet,$(FIPS_LINKER) $(CFLAGS)) $^ -ldl $(X11_LDFLAGS) -o $@
+egl_opengl_link_call_srcs = \
+ $(dir)/egl-opengl-link-call.c \
+ $(dir)/util-x11.c
+
+egl_opengl_link_call_modules = $(egl_opengl_link_call_srcs:.c=.o)
+
+$(dir)/egl-opengl-link-call: $(egl_opengl_link_call_modules)
+ $(call quiet,$(FIPS_LINKER) $(CFLAGS)) $^ $(EGL_LDFLAGS) $(GL_LDFLAGS) $(X11_LDFLAGS) -o $@
+
test: all $(test_programs)
@${dir}/fips-test
$(glx_link_gpa_srcs) \
$(glx_link_gpaa_srcs) \
$(glx_dlopen_dlsym_srcs) \
- $(glx_dlopen_gpa_srcs)
+ $(glx_dlopen_gpa_srcs) \
+ $(egl_opengl_link_call_srcs)
CLEAN += $(test_programs) \
$(glx_link_call_modules) \
$(glx_link_gpa_modules) \
$(glx_link_gpaa_modules) \
$(glx_dlopen_dlsym_modules) \
- $(glx_dlopen_gpa_modules)
+ $(glx_dlopen_gpa_modules) \
+ $(egl_opengl_link_call_modules)
/* This is C code intended to be included (yes, included) by test
* programs in the fips test suite.
*
- * It defines two functions for use by the test:
- *
- * static void
- * common_create_context (Display *dpy, GLXContext *ctx, XVisualInfo **vi);
- * and:
- * static void
- * common_handle_events (Display *dpy, Window window);
- *
* Before including this file, the test program must define a macro
* COMMON_GL_PREFIX to some prefix. This macro can be empty (to
* directly call functions in an OpenGL-library directly linked) or
* can be some custom prefix to call through symbols defined in the
* test program.
+ *
+ * Optionally, the test program may define the macro COMMON_USE_EGL to
+ * instruct the common code to use EGL (rather than GLX which it will
+ * use by default if COMMON_USE_EGL is not defined).
+ *
+ * If COMMON_USE_EGL is not defined, this file provides three
+ * functions for use by the test program:
+ *
+ * static void
+ * common_create_glx_context (Display *dpy,
+ * GLXContext *ctx, XVisualInfo **vi);
+ *
+ * static void
+ * common_make_current (Display *dpy, GLXContext ctx, Window window)
+ *
+ * static void
+ * common_handle_events (Display *dpy, GLXContext ctx, Window window);
+ *
+ * If COMMON_USE_EGL is defined, this file instead provides three
+ * similar functions:
+ *
+ * static void
+ * common_create_egl_context (Display *dpy, EGLenum api,
+ * EGLDisplay *egl_dpy, EGLContext *ctx,
+ * EGLConfig *config, XVisualInfo **vi);
+ *
+ * static void
+ * common_make_current (EGLDisplay egl_dpy, EGLContext ctx,
+ * EGLSurface surface)
+ *
+ * static void
+ * common_handle_event (Display *dpy, EGLDisplay egl_dpy,
+ * EGLSurface surface);
*/
+#include <stdio.h>
+#include <stdlib.h>
+
#ifndef COMMON_GL_PREFIX
#error Code including common.c must define COMMON_GL_PREFIX
#endif
+#ifdef COMMON_USE_EGL
+#define COMMON_CONTEXT EGLContext
+#define COMMON_SWAP_DISPLAY EGLDisplay
+#define COMMON_SWAP_WINDOW EGLSurface
+#define COMMON_SWAP_FUNCTION eglSwapBuffers
+#else
+#define COMMON_CONTEXT GLXContext
+#define COMMON_SWAP_DISPLAY Display*
+#define COMMON_SWAP_WINDOW Window
+#define COMMON_SWAP_FUNCTION glXSwapBuffers
+#endif
+
#define concat_(a,b) a ## b
#define concat(a,b) concat_(a,b)
#define _(func) concat(COMMON_GL_PREFIX, func)
_(glClear) (GL_COLOR_BUFFER_BIT);
}
+#ifdef COMMON_USE_EGL
+static void
+common_create_egl_context (Display *dpy, EGLenum api, EGLDisplay *egl_dpy_ret,
+ EGLContext *ctx_ret, EGLConfig *config_ret,
+ XVisualInfo **visual_info_ret)
+{
+ EGLDisplay egl_dpy;
+ int config_attr[] = {
+ EGL_RED_SIZE, 8,
+ EGL_GREEN_SIZE, 8,
+ EGL_BLUE_SIZE, 8,
+ EGL_ALPHA_SIZE, 8,
+ EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
+ EGL_RENDERABLE_TYPE, EGL_OPENGL_BIT,
+ EGL_NONE
+ };
+ EGLConfig config;
+ int num_configs;
+ EGLint major, minor;
+ EGLBoolean success;
+ int context_attr[] = {
+ EGL_NONE
+ };
+ EGLContext ctx;
+ XVisualInfo *visual_info, visual_attr;
+ int visualid, num_visuals;
+
+ egl_dpy = eglGetDisplay (dpy);
+
+ success = eglInitialize (egl_dpy, &major, &minor);
+ if (!success) {
+ fprintf (stderr, "Error: Failed to initialized EGL\n");
+ exit (1);
+ }
+
+ success = eglChooseConfig (egl_dpy, config_attr, &config, 1, &num_configs);
+ if (!success || num_configs == 0) {
+ fprintf (stderr, "Error: Failed to find EGL config\n");
+ exit (1);
+ }
+
+ success = eglGetConfigAttrib (egl_dpy, config, EGL_NATIVE_VISUAL_ID, &visualid);
+ if (!success) {
+ fprintf (stderr, "Error: Failed to find native Visual ID\n");
+ exit (1);
+ }
+
+ visual_attr.visualid = visualid;
+ visual_info = XGetVisualInfo (dpy, VisualIDMask, &visual_attr, &num_visuals);
+ if (!visual_info) {
+ fprintf (stderr, "Error: Failed to get XVisualInfo\n");
+ exit (1);
+ }
+
+ eglBindAPI (api);
+
+ ctx = eglCreateContext (egl_dpy, config, NULL, context_attr);
+ if (!ctx) {
+ fprintf (stderr, "Error: Failed to create EGL context\n");
+ exit (1);
+ }
+
+ *egl_dpy_ret = egl_dpy;
+ *ctx_ret = ctx;
+ *config_ret = config;
+ *visual_info_ret = visual_info;
+
+}
+#else
static void
-common_create_context (Display *dpy,
- GLXContext *ctx_ret, XVisualInfo **visual_info_ret)
+common_create_glx_context (Display *dpy,
+ GLXContext *ctx_ret, XVisualInfo **visual_info_ret)
{
int visual_attr[] = {
GLX_RGBA,
None
};
- /* Window and context setup. */
*visual_info_ret = _(glXChooseVisual) (dpy, 0, visual_attr);
*ctx_ret = _(glXCreateContext) (dpy, *visual_info_ret, NULL, True);
}
+#endif
+#ifdef COMMON_USE_EGL
static void
-draw (Display *dpy, GLXContext ctx, Window window, int width, int height)
+common_make_current (EGLDisplay egl_dpy, EGLContext ctx, EGLSurface surface)
{
- int i;
- _(glXMakeCurrent) (dpy, window, ctx);
+ _(eglMakeCurrent) (egl_dpy, surface, surface, ctx);
+}
+#else
+static void
+common_make_current (Display *dpy, GLXContext ctx, Window window)
+{
+ _(glXMakeCurrent) (dpy, window, ctx);
+}
+#endif
+static void
+draw (COMMON_SWAP_DISPLAY dpy, COMMON_SWAP_WINDOW window, int width, int height)
+{
+ int i;
_(glViewport) (0, 0, width, height);
set_2d_projection (width, height);
for (i = 0; i < 2; i++) {
/* Frame: Draw a solid (magenta) frame */
paint_rgb_using_clear (RGB(frame));
- _(glXSwapBuffers) (dpy, window);
+ _(COMMON_SWAP_FUNCTION) (dpy, window);
frame++;
/* Frame: Draw a solid (yellow) frame */
paint_rgb_using_clear (RGB(frame));
- _(glXSwapBuffers) (dpy, window);
+ _(COMMON_SWAP_FUNCTION) (dpy, window);
frame++;
/* Frame: Draw a solid (cyan) frame */
paint_rgb_using_clear (RGB(frame));
- _(glXSwapBuffers) (dpy, window);
+ _(COMMON_SWAP_FUNCTION) (dpy, window);
frame++;
}
-
- /* Cleanup */
- _(glXDestroyContext) (dpy, ctx);
}
static void
-common_handle_events(Display *dpy, GLXContext ctx, Window window)
+common_handle_events(Display *dpy, COMMON_SWAP_DISPLAY swap_dpy, COMMON_SWAP_WINDOW window)
{
XEvent xev;
int width = 0;
break;
case Expose:
if (xev.xexpose.count == 0) {
- draw (dpy, ctx, window, width, height);
+ draw (swap_dpy, window, width, height);
return;
}
break;
--- /dev/null
+/* Copyright © 2013, Intel Corporation
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+/* Perform some simple drawing via OpenGL as follows:
+ *
+ * 1. Using EGL to construct an OpenGL context
+ * 2. By directly linking with libEGL.so
+ * 3. By directly calling OpenGL functions
+ */
+
+#include <EGL/egl.h>
+#include <GL/gl.h>
+
+#include "util-x11.h"
+
+#define COMMON_USE_EGL
+#define COMMON_GL_PREFIX
+#include "common.c"
+
+int
+main (void)
+{
+ Display *dpy;
+ Window window;
+ EGLDisplay egl_dpy;
+ EGLContext ctx;
+ EGLConfig config;
+ EGLSurface surface;
+ XVisualInfo *visual_info;
+
+ dpy = util_x11_init_display ();
+
+ common_create_egl_context (dpy, EGL_OPENGL_API, &egl_dpy,
+ &ctx, &config, &visual_info);
+
+ window = util_x11_init_window (dpy, visual_info);
+
+ surface = eglCreateWindowSurface (egl_dpy, config, window, NULL);
+
+ common_make_current (egl_dpy, ctx, surface);
+
+ common_handle_events (dpy, egl_dpy, surface);
+
+ util_x11_fini_window (dpy, window);
+
+ util_x11_fini_display (dpy);
+
+ return 0;
+}
echo "OpenGL, different linking mechanisms, and different symbol-lookup."
echo ""
-printf " Win-sys Link-mode Lookup\n"
-printf " ------- ------------- -----------------\n"
+printf " Window sys. Link-mode Lookup\n"
+printf " ----------- ------------- -----------------\n"
-printf "Testing GLX link to libGL direct calls ... "
+printf "Testing GLX link to libGL direct calls ... "
test glx-link-call
-printf "Testing GLX link to libGL glXGetProcAddress ... "
+printf "Testing GLX link to libGL glXGetProcAddress ... "
test glx-link-gpa
-printf "Testing GLX link to libGL glXGetProcAddressARB ... "
+printf "Testing GLX link to libGL glXGetProcAddressARB ... "
test glx-link-gpaa
-printf "Testing GLX dlopen(libGL) dlsym ... "
+printf "Testing GLX dlopen(libGL) dlsym ... "
test glx-dlopen-dlsym
-printf "Testing GLX dlopen(libGL) glXGetProcAddress ... "
+printf "Testing GLX dlopen(libGL) glXGetProcAddress ... "
test glx-dlopen-gpa
-printf "Testing GLX dlopen(libGL) glXGetProcAddressARB ... "
+printf "Testing GLX dlopen(libGL) glXGetProcAddressARB ... "
test glx-dlopen-gpaa
+printf "Testing EGL/OpenGL link to libEGL direct calls ... "
+test egl-opengl-link-call
+
echo ""
if [ $errors -gt 0 ]; then
dpy = util_x11_init_display ();
- common_create_context (dpy, &ctx, &visual_info);
+ common_create_glx_context (dpy, &ctx, &visual_info);
window = util_x11_init_window (dpy, visual_info);
- common_handle_events (dpy, ctx, window);
+ common_make_current (dpy, ctx, window);
+
+ common_handle_events (dpy, dpy, window);
util_x11_fini_window (dpy, window);
dpy = util_x11_init_display ();
- common_create_context (dpy, &ctx, &visual_info);
+ common_create_glx_context (dpy, &ctx, &visual_info);
window = util_x11_init_window (dpy, visual_info);
- common_handle_events (dpy, ctx, window);
+ common_make_current (dpy, ctx, window);
+
+ common_handle_events (dpy, dpy, window);
util_x11_fini_window (dpy, window);
Bool (*my_glXMakeCurrent) (Display *, GLXDrawable, GLXContext);
void (*my_glXSwapBuffers) (Display *, GLXDrawable);
-#define HANDLE_EVENTS_GL_PREFIX my_
-#include "handle-events.c"
+#define COMMON_GL_PREFIX my_
+#include "common.c"
static void
resolve_symbols (void)
dpy = util_x11_init_display ();
- create_context (dpy, &ctx, &visual_info);
+ common_create_glx_context (dpy, &ctx, &visual_info);
window = util_x11_init_window (dpy, visual_info);
- handle_events (dpy, ctx, window);
+ common_make_current (dpy, ctx, window);
+
+ common_handle_events (dpy, dpy, window);
util_x11_fini_window (dpy, window);
dpy = util_x11_init_display ();
- common_create_context (dpy, &ctx, &visual_info);
+ common_create_glx_context (dpy, &ctx, &visual_info);
window = util_x11_init_window (dpy, visual_info);
- common_handle_events (dpy, ctx, window);
+ common_make_current (dpy, ctx, window);
+
+ common_handle_events (dpy, dpy, window);
util_x11_fini_window (dpy, window);
dpy = util_x11_init_display ();
- common_create_context (dpy, &ctx, &visual_info);
+ common_create_glx_context (dpy, &ctx, &visual_info);
window = util_x11_init_window (dpy, visual_info);
- common_handle_events (dpy, ctx, window);
+ common_make_current (dpy, ctx, window);
+
+ common_handle_events (dpy, dpy, window);
util_x11_fini_window (dpy, window);
dpy = util_x11_init_display ();
- common_create_context (dpy, &ctx, &visual_info);
+ common_create_glx_context (dpy, &ctx, &visual_info);
window = util_x11_init_window (dpy, visual_info);
- common_handle_events (dpy, ctx, window);
+ common_make_current (dpy, ctx, window);
+
+ common_handle_events (dpy, dpy, window);
util_x11_fini_window (dpy, window);