123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196 |
- /*
- * Copyright (c) 2012 Rob Clark <robdclark@gmail.com>
- *
- * 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 (including the next
- * paragraph) 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.
- */
- #ifndef TEST_UTIL_3D_H_
- #define TEST_UTIL_3D_H_
- #include <EGL/egl.h>
- #ifndef GL_ES_VERSION_2_0
- #include <GLES2/gl2.h>
- #include <GLES2/gl2ext.h>
- #endif
- #include <ctype.h>
- #include <unistd.h>
- #include <fcntl.h>
- #include <string.h>
- #include <stdio.h>
- #include <stdlib.h>
- # include <X11/Xlib.h>
- # include <X11/Xutil.h>
- # include <X11/keysym.h>
- static EGLNativeDisplayType native_dpy;
- static EGLDisplay
- get_display(void)
- {
- EGLDisplay display;
- EGLint egl_major, egl_minor;
- #ifdef BIONIC
- native_dpy = EGL_DEFAULT_DISPLAY;
- #else
- native_dpy = XOpenDisplay(NULL);
- #endif
- display = eglGetDisplay(native_dpy);
- if (display == EGL_NO_DISPLAY) {
- exit(-1);
- }
- eglInitialize(display, &egl_major, &egl_minor);
- return display;
- }
- static EGLSurface make_window(EGLDisplay display, EGLConfig config, int width, int height)
- {
- EGLSurface surface;
- XVisualInfo *visInfo, visTemplate;
- int num_visuals;
- Window root, xwin;
- XSetWindowAttributes attr;
- unsigned long mask;
- EGLint vid;
- const char *title = "egl";
- eglGetConfigAttrib(display, config, EGL_NATIVE_VISUAL_ID, &vid);
- /* The X window visual must match the EGL config */
- visTemplate.visualid = vid;
- visInfo = XGetVisualInfo(native_dpy, VisualIDMask, &visTemplate, &num_visuals);
- if (!visInfo) {
- exit(-1);
- }
- root = RootWindow(native_dpy, DefaultScreen(native_dpy));
- /* window attributes */
- attr.background_pixel = 0;
- attr.border_pixel = 0;
- attr.colormap = XCreateColormap(native_dpy,
- root, visInfo->visual, AllocNone);
- attr.event_mask = StructureNotifyMask | ExposureMask | KeyPressMask;
- mask = CWBackPixel | CWBorderPixel | CWColormap | CWEventMask;
- xwin = XCreateWindow(native_dpy, root, 0, 0, width, height,
- 0, visInfo->depth, InputOutput, visInfo->visual, mask, &attr);
- if (!xwin) {
- exit (-1);
- }
- XFree(visInfo);
- /* set hints and properties */
- {
- XSizeHints sizehints;
- sizehints.x = 0;
- sizehints.y = 0;
- sizehints.width = width;
- sizehints.height = height;
- sizehints.flags = USSize | USPosition;
- XSetNormalHints(native_dpy, xwin, &sizehints);
- XSetStandardProperties(native_dpy, xwin,
- title, title, None, (char **) NULL, 0, &sizehints);
- }
- XMapWindow(native_dpy, xwin);
- surface = eglCreateWindowSurface(display, config, xwin, NULL);
- return surface;
- }
- static GLuint
- get_shader(GLenum stage, const char *stage_name, const char *source)
- {
- GLuint shader;
- GLint ret;
- shader = glCreateShader(stage);
- glShaderSource(shader, 1, &source, NULL);
- glCompileShader(shader);
- glGetShaderiv(shader, GL_COMPILE_STATUS, &ret);
- if (!ret) {
- char *log;
- glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &ret);
- if (ret > 1) {
- log = malloc(ret);
- glGetShaderInfoLog(shader, ret, NULL, log);
- printf("%s", log);
- }
- exit(-1);
- }
- return shader;
- }
- static GLuint
- get_program(const char *vertex_shader_source, const char *fragment_shader_source)
- {
- GLuint vertex_shader, fragment_shader, program;
- vertex_shader = get_shader(GL_VERTEX_SHADER, "vertex", vertex_shader_source);
- fragment_shader = get_shader(GL_FRAGMENT_SHADER, "fragment", fragment_shader_source);
- program = glCreateProgram();
- glAttachShader(program, vertex_shader);
- glAttachShader(program, fragment_shader);
- return program;
- }
- static void
- link_program(GLuint program)
- {
- GLint ret, len;
- GLenum binary_format;
- void *binary;
- glLinkProgram(program);
- glGetProgramiv(program, GL_LINK_STATUS, &ret);
- if (!ret) {
- char *log;
- glGetProgramiv(program, GL_INFO_LOG_LENGTH, &ret);
- if (ret > 1) {
- log = malloc(ret);
- glGetProgramInfoLog(program, ret, NULL, log);
- printf("%s", log);
- }
- exit(-1);
- }
- glUseProgram(program);
- }
- #endif /* TEST_UTIL_3D_H_ */
|