4 * EGL-specific freeglut state query methods.
6 * Copyright (C) 2012 Sylvain Beucler
8 * Permission is hereby granted, free of charge, to any person obtaining a
9 * copy of this software and associated documentation files (the "Software"),
10 * to deal in the Software without restriction, including without limitation
11 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
12 * and/or sell copies of the Software, and to permit persons to whom the
13 * Software is furnished to do so, subject to the following conditions:
15 * The above copyright notice and this permission notice shall be included
16 * in all copies or substantial portions of the Software.
18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
21 * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
22 * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
23 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
26 #include <GL/freeglut.h>
27 #include "fg_internal.h"
28 #include "egl/fg_window_egl.h"
31 * Queries the GL context about some attributes
33 static int fgPlatformGetConfig( int attribute )
36 int result __fg_unused; /* Not checked */
38 if( fgStructure.CurrentWindow )
39 result = eglGetConfigAttrib( fgDisplay.pDisplay.egl.Display,
40 fgStructure.CurrentWindow->Window.pContext.egl.Config,
47 int fghPlatformGlutGetEGL ( GLenum eWhat )
54 * The window/context specific queries are handled mostly by
55 * fgPlatformGetConfig().
57 case GLUT_WINDOW_NUM_SAMPLES:
58 glGetIntegerv(GL_SAMPLES, &nsamples);
62 * The rest of GLX queries under X are general enough to use a macro to
65 # define EGL_QUERY(a,b) case a: return fgPlatformGetConfig( b );
67 EGL_QUERY( GLUT_WINDOW_BUFFER_SIZE, EGL_BUFFER_SIZE );
68 EGL_QUERY( GLUT_WINDOW_STENCIL_SIZE, EGL_STENCIL_SIZE );
69 EGL_QUERY( GLUT_WINDOW_DEPTH_SIZE, EGL_DEPTH_SIZE );
70 EGL_QUERY( GLUT_WINDOW_RED_SIZE, EGL_RED_SIZE );
71 EGL_QUERY( GLUT_WINDOW_GREEN_SIZE, EGL_GREEN_SIZE );
72 EGL_QUERY( GLUT_WINDOW_BLUE_SIZE, EGL_BLUE_SIZE );
73 EGL_QUERY( GLUT_WINDOW_ALPHA_SIZE, EGL_ALPHA_SIZE );
77 /* I do not know yet if there will be a fgChooseVisual() function for Win32 */
78 case GLUT_DISPLAY_MODE_POSSIBLE:
80 /* We should not have to call fghChooseConfig again here. */
82 return fghChooseConfig(&config);
85 /* This is system-dependent */
86 case GLUT_WINDOW_FORMAT_ID:
87 if( fgStructure.CurrentWindow == NULL )
89 return fgPlatformGetConfig( EGL_NATIVE_VISUAL_ID );
91 case GLUT_WINDOW_DOUBLEBUFFER:
92 return 1; /* EGL is always double-buffered */
95 fgWarning( "glutGet(): missing enum handle %d", eWhat );
102 int* fgPlatformGlutGetModeValues(GLenum eWhat, int *size)
107 int attribute_name = 0;
117 case GLUT_MULTISAMPLE:
118 attributes[0] = EGL_BUFFER_SIZE;
119 attributes[1] = EGL_DONT_CARE;
120 attributes[2] = EGL_SAMPLE_BUFFERS;
122 attributes[4] = EGL_SAMPLES;
124 attributes[6] = EGL_NONE;
126 attribute_name = EGL_SAMPLES;
128 EGLConfig* configArray;
129 EGLint configArraySize = 0;
131 /* Get number of available configs */
132 if (!eglChooseConfig(fgDisplay.pDisplay.egl.Display,
136 configArray = calloc(configArraySize, sizeof(EGLConfig));
138 if (!eglChooseConfig(fgDisplay.pDisplay.egl.Display,
139 attributes, configArray, configArraySize,
143 /* We get results in ascending order */
145 int previous_value = 0;
148 array = malloc(sizeof(int) * configArraySize);
150 for (i = 0; i < configArraySize; i++) {
152 eglGetConfigAttrib(fgDisplay.pDisplay.egl.Display,
153 configArray[i], attribute_name, &value);
154 if (value > previous_value)
156 previous_value = value;
157 array[*size] = value;
162 array = realloc(array, sizeof(int) * (*size));