Implement EGL fgPlatformGlutGetModeValues and partial/reusable fgPlatformGlutGet

git-svn-id: https://svn.code.sf.net/p/freeglut/code/trunk@1183 7f0cb862-5218-0410-a997-914c9d46530a
This commit is contained in:
beuc 2012-03-17 15:36:25 +00:00
parent a729bc608f
commit 604018bc92
4 changed files with 202 additions and 33 deletions

1
.gitattributes vendored
View File

@ -69,6 +69,7 @@ freeglut/freeglut/src/android/native_app_glue/android_native_app_glue.h -text
freeglut/freeglut/src/egl/fg_display_egl.c -text
freeglut/freeglut/src/egl/fg_init_egl.c -text
freeglut/freeglut/src/egl/fg_internal_egl.h -text
freeglut/freeglut/src/egl/fg_state_egl.c -text
freeglut/freeglut/src/egl/fg_structure_egl.c -text
freeglut/freeglut/src/egl/fg_structure_egl.h -text
freeglut/freeglut/src/egl/fg_window_egl.c -text

View File

@ -102,6 +102,7 @@ ELSEIF(ANDROID)
src/egl/fg_internal_egl.h
src/egl/fg_display_egl.c
src/egl/fg_init_egl.c
src/egl/fg_state_egl.c
src/egl/fg_structure_egl.c
src/egl/fg_structure_egl.h
src/egl/fg_window_egl.c

View File

@ -30,38 +30,43 @@
#include <android/native_window.h>
#include "fg_internal.h"
int fgPlatformGlutGet ( GLenum eWhat )
{
fprintf(stderr, "fgPlatformGlutGet: STUB\n");
switch (eWhat) {
case GLUT_WINDOW_WIDTH:
case GLUT_WINDOW_HEIGHT:
{
if ( fgStructure.CurrentWindow == NULL )
return 0;
int32_t width = ANativeWindow_getWidth(fgStructure.CurrentWindow->Window.Handle);
int32_t height = ANativeWindow_getHeight(fgStructure.CurrentWindow->Window.Handle);
switch ( eWhat )
{
case GLUT_WINDOW_WIDTH:
return width;
case GLUT_WINDOW_HEIGHT:
return height;
}
}
}
return -1;
}
int fgPlatformGlutDeviceGet ( GLenum eWhat )
{
fprintf(stderr, "fgPlatformGlutDeviceGet: STUB\n");
return -1;
}
int fgPlatformGlutGet ( GLenum eWhat )
{
fprintf(stderr, "fgPlatformGlutGet: STUB\n");
switch (eWhat) {
case GLUT_WINDOW_WIDTH:
case GLUT_WINDOW_HEIGHT:
{
if ( fgStructure.CurrentWindow == NULL )
return 0;
int32_t width = ANativeWindow_getWidth(fgStructure.CurrentWindow->Window.Handle);
int32_t height = ANativeWindow_getHeight(fgStructure.CurrentWindow->Window.Handle);
switch ( eWhat )
{
case GLUT_WINDOW_WIDTH:
return width;
case GLUT_WINDOW_HEIGHT:
return height;
}
}
default:
return fghPlatformGlutGetEGL(eWhat);
}
return -1;
}
int fgPlatformGlutLayerGet( GLenum eWhat )
{
fprintf(stderr, "fgPlatformGlutLayerGet: STUB\n");
/*
* This is easy as layers are not implemented ;-)
*
@ -102,12 +107,3 @@ int fgPlatformGlutLayerGet( GLenum eWhat )
/* And fail. That's good. Programs do love failing. */
return -1;
}
int *fgPlatformGlutGetModeValues(GLenum eWhat, int *size)
{
fprintf(stderr, "fgPlatformGlutGetModeValues: STUB\n");
return NULL;
}

View File

@ -0,0 +1,171 @@
/*
* fg_state_egl.c
*
* EGL-specific freeglut state query methods.
*
* Copyright (C) 2012 Sylvain Beucler
*
* 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
* PAWEL W. OLSZTA 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.
*/
#include <GL/freeglut.h>
#include "fg_internal.h"
/*
* Queries the GL context about some attributes
*/
static int fgPlatformGetConfig( int attribute )
{
int returnValue = 0;
int result; /* Not checked */
if( fgStructure.CurrentWindow )
result = eglGetConfigAttrib( fgDisplay.pDisplay.egl.Display,
fgStructure.CurrentWindow->Window.pContext.egl.Config,
attribute,
&returnValue );
return returnValue;
}
int fghPlatformGlutGetEGL ( GLenum eWhat )
{
int nsamples = 0;
switch( eWhat )
{
/*
* The window/context specific queries are handled mostly by
* fgPlatformGetConfig().
*/
case GLUT_WINDOW_NUM_SAMPLES:
glGetIntegerv(GL_SAMPLES, &nsamples);
return nsamples;
/*
* The rest of GLX queries under X are general enough to use a macro to
* check them
*/
# define EGL_QUERY(a,b) case a: return fgPlatformGetConfig( b );
EGL_QUERY( GLUT_WINDOW_BUFFER_SIZE, EGL_BUFFER_SIZE );
EGL_QUERY( GLUT_WINDOW_STENCIL_SIZE, EGL_STENCIL_SIZE );
EGL_QUERY( GLUT_WINDOW_DEPTH_SIZE, EGL_DEPTH_SIZE );
EGL_QUERY( GLUT_WINDOW_RED_SIZE, EGL_RED_SIZE );
EGL_QUERY( GLUT_WINDOW_GREEN_SIZE, EGL_GREEN_SIZE );
EGL_QUERY( GLUT_WINDOW_BLUE_SIZE, EGL_BLUE_SIZE );
EGL_QUERY( GLUT_WINDOW_ALPHA_SIZE, EGL_ALPHA_SIZE );
# undef EGL_QUERY
/* I do not know yet if there will be a fgChooseVisual() function for Win32 */
case GLUT_DISPLAY_MODE_POSSIBLE:
{
/* We should not have to call fgPlatformChooseFBConfig again here. */
EGLConfig config;
return fghChooseConfigEGL(&config);
}
/* This is system-dependant */
case GLUT_WINDOW_FORMAT_ID:
if( fgStructure.CurrentWindow == NULL )
return 0;
return fgPlatformGetConfig( EGL_NATIVE_VISUAL_ID );
default:
fgWarning( "glutGet(): missing enum handle %d", eWhat );
break;
}
return -1;
}
int* fgPlatformGlutGetModeValues(GLenum eWhat, int *size)
{
int *array;
int attributes[9];
int attribute_name = 0;
array = NULL;
*size = 0;
switch (eWhat)
{
case GLUT_AUX:
break;
case GLUT_MULTISAMPLE:
attributes[0] = EGL_BUFFER_SIZE;
attributes[1] = EGL_DONT_CARE;
attributes[2] = EGL_SAMPLE_BUFFERS;
attributes[3] = 1;
attributes[4] = EGL_SAMPLES;
attributes[5] = 1;
attributes[6] = EGL_NONE;
attribute_name = EGL_SAMPLES;
EGLConfig* configArray;
EGLConfig* config;
EGLint configArraySize = 0;
/* Get number of available configs */
if (!eglChooseConfig(fgDisplay.pDisplay.egl.Display,
attributes, NULL, 0,
&configArraySize))
break;
configArray = calloc(configArraySize, sizeof(EGLConfig));
if (!eglChooseConfig(fgDisplay.pDisplay.egl.Display,
attributes, configArray, configArraySize,
&configArraySize))
break;
/* We get results in ascending order */
{
int * temp_array;
int previous_value;
int i;
array = malloc(sizeof(int) * configArraySize);
previous_value = 0;
for (i = 0; i < configArraySize; i++) {
int value;
eglGetConfigAttrib(fgDisplay.pDisplay.egl.Display,
configArray[i], attribute_name, &value);
if (value > previous_value)
{
previous_value = value;
temp_array[*size] = value;
(*size)++;
}
}
array = realloc(array, sizeof(int) * (*size));
}
free(configArray);
break;
default:
break;
}
return array;
}