xref: /aosp_15_r20/external/libepoxy/test/egl_epoxy_api.c (revision 706d0b42ae4182339789e08d473a0b312ecdc60f)
1 /*
2  * Copyright 2018  Emmanuele Bassi
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 epoxy_api.c
26  *
27  * Tests the Epoxy API using EGL.
28  */
29 
30 #ifdef __sun
31 #define __EXTENSIONS__
32 #else
33 #define _GNU_SOURCE
34 #endif
35 #include <stdio.h>
36 #include <string.h>
37 #include <stdlib.h>
38 #include <assert.h>
39 #include <err.h>
40 #include "epoxy/gl.h"
41 #include "epoxy/egl.h"
42 
43 #include "egl_common.h"
44 
45 static bool
make_egl_current_and_test(EGLDisplay * dpy,EGLContext ctx)46 make_egl_current_and_test(EGLDisplay *dpy, EGLContext ctx)
47 {
48     const char *string;
49     GLuint shader;
50     bool pass = true;
51 
52     eglMakeCurrent(dpy, NULL, NULL, ctx);
53 
54     if (!epoxy_is_desktop_gl()) {
55         fputs("Claimed to be desktop\n", stderr);
56         pass = false;
57     }
58 
59     if (epoxy_gl_version() < 20) {
60         fprintf(stderr, "Claimed to be GL version %d\n",
61                 epoxy_gl_version());
62         pass = false;
63     }
64 
65     if (epoxy_glsl_version() < 100) {
66         fprintf(stderr, "Claimed to have GLSL version %d\n",
67                 epoxy_glsl_version());
68         pass = false;
69     }
70 
71     string = (const char *)glGetString(GL_VERSION);
72     printf("GL version: %s - Epoxy: %d\n", string, epoxy_gl_version());
73 
74     string = (const char *)glGetString(GL_SHADING_LANGUAGE_VERSION);
75     printf("GLSL version: %s - Epoxy: %d\n", string, epoxy_glsl_version());
76 
77     shader = glCreateShader(GL_FRAGMENT_SHADER);
78     pass = glIsShader(shader);
79 
80     return pass;
81 }
82 
83 static void
init_egl(EGLDisplay * dpy,EGLContext * out_ctx)84 init_egl(EGLDisplay *dpy, EGLContext *out_ctx)
85 {
86     static const EGLint config_attribs[] = {
87 	EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
88 	EGL_RED_SIZE, 1,
89 	EGL_GREEN_SIZE, 1,
90 	EGL_BLUE_SIZE, 1,
91 	EGL_RENDERABLE_TYPE, EGL_OPENGL_BIT,
92 	EGL_NONE
93     };
94     static const EGLint context_attribs[] = {
95         EGL_CONTEXT_CLIENT_VERSION, 2,
96         EGL_NONE
97     };
98     EGLContext ctx;
99     EGLConfig cfg;
100     EGLint count;
101 
102     if (!epoxy_has_egl_extension(dpy, "EGL_KHR_surfaceless_context"))
103         errx(77, "Test requires EGL_KHR_surfaceless_context");
104 
105     if (!eglBindAPI(EGL_OPENGL_API))
106         errx(77, "Couldn't initialize EGL with desktop GL\n");
107 
108     if (!eglChooseConfig(dpy, config_attribs, &cfg, 1, &count))
109         errx(77, "Couldn't get an EGLConfig\n");
110 
111     ctx = eglCreateContext(dpy, cfg, NULL, context_attribs);
112     if (!ctx)
113         errx(77, "Couldn't create a GL context\n");
114 
115     *out_ctx = ctx;
116 }
117 
118 int
main(int argc,char ** argv)119 main(int argc, char **argv)
120 {
121     bool pass = true;
122 
123     EGLContext egl_ctx;
124     EGLDisplay *dpy = get_egl_display_or_skip();
125     const char *extensions = eglQueryString(dpy, EGL_EXTENSIONS);
126     char *first_space;
127     char *an_extension;
128 
129     /* We don't have any extensions guaranteed by the ABI, so for the
130      * touch test we just check if the first one is reported to be there.
131      */
132     first_space = strstr(extensions, " ");
133     if (first_space) {
134         an_extension = strndup(extensions, first_space - extensions);
135     } else {
136         an_extension = strdup(extensions);
137     }
138 
139     if (!epoxy_extension_in_string(extensions, an_extension))
140         errx(1, "Implementation reported absence of %s", an_extension);
141 
142     free(an_extension);
143 
144     init_egl(dpy, &egl_ctx);
145     pass = make_egl_current_and_test(dpy, egl_ctx);
146 
147     return pass != true;
148 }
149