• Home
  • History
  • Annotate
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright © 2014 Intel Corporation
3  *
4  * Permission is hereby granted, free of charge, to any person obtaining a
5  * copy of this software and associated documentation files (the "Software"),
6  * to deal in the Software without restriction, including without limitation
7  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8  * and/or sell copies of the Software, and to permit persons to whom the
9  * Software is furnished to do so, subject to the following conditions:
10  *
11  * The above copyright notice and this permission notice (including the next
12  * paragraph) shall be included in all copies or substantial portions of the
13  * Software.
14  *
15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
21  * IN THE SOFTWARE.
22  */
23 
24 /**
25  * @file egl_gl.c
26  *
27  * Tests that epoxy works with EGL using desktop OpenGL.
28  */
29 
30 #define _GNU_SOURCE
31 
32 #include <stdio.h>
33 #include <string.h>
34 #include <stdlib.h>
35 #include <assert.h>
36 #include <err.h>
37 #include <dlfcn.h>
38 #include "epoxy/gl.h"
39 #include "epoxy/egl.h"
40 #include "epoxy/glx.h"
41 
42 #include "egl_common.h"
43 #include "glx_common.h"
44 #include "dlwrap.h"
45 
46 static bool
make_egl_current_and_test(EGLDisplay * dpy,EGLContext ctx)47 make_egl_current_and_test(EGLDisplay *dpy, EGLContext ctx)
48 {
49     const char *string;
50     GLuint shader;
51     bool pass = true;
52 
53     eglMakeCurrent(dpy, NULL, NULL, ctx);
54 
55     if (!epoxy_is_desktop_gl()) {
56         fputs("Claimed to be desktop\n", stderr);
57         pass = false;
58     }
59 
60     if (epoxy_gl_version() < 20) {
61         fprintf(stderr, "Claimed to be GL version %d\n",
62                 epoxy_gl_version());
63         pass = false;
64     }
65 
66     string = (const char *)glGetString(GL_VERSION);
67     printf("GL version: %s\n", string);
68 
69     shader = glCreateShader(GL_FRAGMENT_SHADER);
70     pass = glIsShader(shader);
71 
72     return pass;
73 }
74 
75 static void
init_egl(EGLDisplay ** out_dpy,EGLContext * out_ctx)76 init_egl(EGLDisplay **out_dpy, EGLContext *out_ctx)
77 {
78     EGLDisplay *dpy = get_egl_display_or_skip();
79     static const EGLint config_attribs[] = {
80 	EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
81 	EGL_RED_SIZE, 1,
82 	EGL_GREEN_SIZE, 1,
83 	EGL_BLUE_SIZE, 1,
84 	EGL_RENDERABLE_TYPE, EGL_OPENGL_BIT,
85 	EGL_NONE
86     };
87     static const EGLint context_attribs[] = {
88         EGL_CONTEXT_CLIENT_VERSION, 2,
89         EGL_NONE
90     };
91     EGLContext ctx;
92     EGLConfig cfg;
93     EGLint count;
94 
95     if (!epoxy_has_egl_extension(dpy, "EGL_KHR_surfaceless_context"))
96         errx(77, "Test requires EGL_KHR_surfaceless_context");
97 
98     if (!eglBindAPI(EGL_OPENGL_API))
99         errx(77, "Couldn't initialize EGL with desktop GL\n");
100 
101     if (!eglChooseConfig(dpy, config_attribs, &cfg, 1, &count))
102         errx(77, "Couldn't get an EGLConfig\n");
103 
104     ctx = eglCreateContext(dpy, cfg, NULL, context_attribs);
105     if (!ctx)
106         errx(77, "Couldn't create a GL context\n");
107 
108     *out_dpy = dpy;
109     *out_ctx = ctx;
110 }
111 
112 int
main(int argc,char ** argv)113 main(int argc, char **argv)
114 {
115     bool pass = true;
116     EGLDisplay *egl_dpy;
117     EGLContext egl_ctx;
118 
119     /* Force epoxy to have loaded both EGL and GLX libs already -- we
120      * can't assume anything about symbol resolution based on having
121      * EGL or GLX loaded.
122      */
123     (void)glXGetCurrentContext();
124     (void)eglGetCurrentContext();
125 
126     init_egl(&egl_dpy, &egl_ctx);
127     pass = make_egl_current_and_test(egl_dpy, egl_ctx) && pass;
128 
129     return pass != true;
130 }
131