EGL: separate config and context code
git-svn-id: https://svn.code.sf.net/p/freeglut/code/trunk@1173 7f0cb862-5218-0410-a997-914c9d46530a
This commit is contained in:
parent
8b779d66dd
commit
40db28bb94
@ -52,6 +52,7 @@ void fgPlatformOpenWindow( SFG_Window* window, const char* title,
|
||||
return;
|
||||
}
|
||||
|
||||
fghChooseConfigEGL(&window->Window.pContext.egl.Config);
|
||||
fghCreateNewContextEGL(window);
|
||||
|
||||
/* Wait until window is available and OpenGL context is created */
|
||||
@ -67,8 +68,16 @@ void fgPlatformOpenWindow( SFG_Window* window, const char* title,
|
||||
}
|
||||
|
||||
EGLDisplay display = fgDisplay.pDisplay.egl.Display;
|
||||
EGLint format = fgDisplay.pDisplay.single_window->Window.pContext.egl.ContextFormat;
|
||||
ANativeWindow_setBuffersGeometry(window->Window.Handle, 0, 0, format);
|
||||
|
||||
/* EGL_NATIVE_VISUAL_ID is an attribute of the EGLConfig that is
|
||||
* guaranteed to be accepted by ANativeWindow_setBuffersGeometry().
|
||||
* As soon as we picked a EGLConfig, we can safely reconfigure the
|
||||
* ANativeWindow buffers to match, using EGL_NATIVE_VISUAL_ID. */
|
||||
EGLint vid;
|
||||
eglGetConfigAttrib(display, window->Window.pContext.egl.Config,
|
||||
EGL_NATIVE_VISUAL_ID, &vid);
|
||||
|
||||
ANativeWindow_setBuffersGeometry(window->Window.Handle, 0, 0, vid);
|
||||
fghPlatformOpenWindowEGL(window);
|
||||
|
||||
window->State.Visible = GL_TRUE;
|
||||
|
@ -47,6 +47,12 @@ void fgPlatformInitialize( const char* displayName )
|
||||
if (!eglInitialize(fgDisplay.pDisplay.egl.Display, NULL, NULL))
|
||||
fgError("eglInitialize: error %x\n", eglGetError());
|
||||
|
||||
# ifdef GL_VERSION_1_1 /* or later */
|
||||
eglBindAPI(EGL_OPENGL_API);
|
||||
# else
|
||||
eglBindAPI(EGL_OPENGL_ES_API);
|
||||
# endif
|
||||
|
||||
// fgDisplay.ScreenWidth = ...;
|
||||
// fgDisplay.ScreenHeight = ...;
|
||||
// fgDisplay.ScreenWidthMM = ...;
|
||||
|
@ -47,8 +47,7 @@ typedef EGLContext SFG_WindowContextType ;
|
||||
struct tagSFG_PlatformContextEGL
|
||||
{
|
||||
EGLSurface Surface;
|
||||
EGLConfig ContextConfig;
|
||||
EGLint ContextFormat;
|
||||
EGLConfig Config;
|
||||
};
|
||||
|
||||
|
||||
|
@ -31,5 +31,5 @@ extern SFG_Structure fgStructure;
|
||||
void fgPlatformCreateWindow ( SFG_Window *window )
|
||||
{
|
||||
window->Window.pContext.egl.Surface = EGL_NO_SURFACE;
|
||||
window->Window.pContext.egl.ContextConfig = NULL;
|
||||
window->Window.pContext.egl.Config = NULL;
|
||||
}
|
||||
|
@ -26,20 +26,16 @@
|
||||
#include <GL/freeglut.h>
|
||||
#include "fg_internal.h"
|
||||
|
||||
/**
|
||||
* Initialize an EGL context for the current display.
|
||||
*/
|
||||
void fghCreateNewContextEGL( SFG_Window* window ) {
|
||||
/*
|
||||
* Here specify the attributes of the desired configuration.
|
||||
* Below, we select an EGLConfig with at least 8 bits per color
|
||||
* component compatible with on-screen windows
|
||||
*/
|
||||
/* Ensure OpenGLES 2.0 context */
|
||||
printf("DisplayMode: %d (DEPTH %d)\n", fgState.DisplayMode, (fgState.DisplayMode & GLUT_DEPTH));
|
||||
void fghChooseConfigEGL(EGLConfig* config) {
|
||||
const EGLint attribs[] = {
|
||||
EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
|
||||
#ifdef GL_ES_VERSION_2_0
|
||||
EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
|
||||
#elif GL_VERSION_ES_CM_1_0 || GL_VERSION_ES_CL_1_0 || GL_VERSION_ES_CM_1_1 || GL_VERSION_ES_CL_1_1
|
||||
EGL_RENDERABLE_TYPE, EGL_OPENGL_ES_BIT,
|
||||
#else
|
||||
EGL_RENDERABLE_TYPE, EGL_OPENGL_BIT,
|
||||
#endif
|
||||
EGL_BLUE_SIZE, 1,
|
||||
EGL_GREEN_SIZE, 1,
|
||||
EGL_RED_SIZE, 1,
|
||||
@ -51,33 +47,31 @@ void fghCreateNewContextEGL( SFG_Window* window ) {
|
||||
EGL_NONE
|
||||
};
|
||||
|
||||
EGLint format;
|
||||
EGLint numConfigs;
|
||||
EGLConfig config;
|
||||
EGLint num_config;
|
||||
if (!eglChooseConfig(fgDisplay.pDisplay.egl.Display,
|
||||
attribs, config, 1, &num_config))
|
||||
fgError("eglChooseConfig: error %x\n", eglGetError());
|
||||
}
|
||||
|
||||
/**
|
||||
* Initialize an EGL context for the current display.
|
||||
*/
|
||||
void fghCreateNewContextEGL( SFG_Window* window ) {
|
||||
EGLContext context;
|
||||
|
||||
EGLDisplay eglDisplay = fgDisplay.pDisplay.egl.Display;
|
||||
|
||||
/* Here, the application chooses the configuration it desires. In this
|
||||
* sample, we have a very simplified selection process, where we pick
|
||||
* the first EGLConfig that matches our criteria */
|
||||
eglChooseConfig(eglDisplay, attribs, &config, 1, &numConfigs);
|
||||
|
||||
/* EGL_NATIVE_VISUAL_ID is an attribute of the EGLConfig that is
|
||||
* guaranteed to be accepted by ANativeWindow_setBuffersGeometry().
|
||||
* As soon as we picked a EGLConfig, we can safely reconfigure the
|
||||
* ANativeWindow buffers to match, using EGL_NATIVE_VISUAL_ID. */
|
||||
eglGetConfigAttrib(eglDisplay, config, EGL_NATIVE_VISUAL_ID, &format);
|
||||
|
||||
/* Default, but doesn't hurt */
|
||||
eglBindAPI(EGL_OPENGL_ES_API);
|
||||
EGLConfig eglConfig = window->Window.pContext.egl.Config;
|
||||
|
||||
/* Ensure OpenGLES 2.0 context */
|
||||
static const EGLint ctx_attribs[] = {
|
||||
#ifdef GL_ES_VERSION_2_0
|
||||
EGL_CONTEXT_CLIENT_VERSION, 2,
|
||||
#elif GL_VERSION_ES_CM_1_0 || GL_VERSION_ES_CL_1_0 || GL_VERSION_ES_CM_1_1 || GL_VERSION_ES_CL_1_1
|
||||
EGL_CONTEXT_CLIENT_VERSION, 1,
|
||||
#endif
|
||||
EGL_NONE
|
||||
};
|
||||
context = eglCreateContext(eglDisplay, config, EGL_NO_CONTEXT, ctx_attribs);
|
||||
context = eglCreateContext(eglDisplay, eglConfig, EGL_NO_CONTEXT, ctx_attribs);
|
||||
if (context == EGL_NO_CONTEXT) {
|
||||
fgWarning("Cannot initialize EGL context, err=%x\n", eglGetError());
|
||||
fghContextCreationError();
|
||||
@ -88,8 +82,6 @@ void fghCreateNewContextEGL( SFG_Window* window ) {
|
||||
fgError("Wrong GLES major version: %d\n", ver);
|
||||
|
||||
window->Window.Context = context;
|
||||
window->Window.pContext.egl.ContextConfig = config;
|
||||
window->Window.pContext.egl.ContextFormat = format;
|
||||
}
|
||||
|
||||
/*
|
||||
@ -98,7 +90,7 @@ void fghCreateNewContextEGL( SFG_Window* window ) {
|
||||
void fghPlatformOpenWindowEGL( SFG_Window* window )
|
||||
{
|
||||
EGLDisplay display = fgDisplay.pDisplay.egl.Display;
|
||||
EGLConfig config = window->Window.pContext.egl.ContextConfig;
|
||||
EGLConfig config = window->Window.pContext.egl.Config;
|
||||
|
||||
EGLSurface surface = eglCreateWindowSurface(display, config, window->Window.Handle, NULL);
|
||||
if (surface == EGL_NO_SURFACE)
|
||||
|
Reference in New Issue
Block a user