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;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fghChooseConfigEGL(&window->Window.pContext.egl.Config);
|
||||||
fghCreateNewContextEGL(window);
|
fghCreateNewContextEGL(window);
|
||||||
|
|
||||||
/* Wait until window is available and OpenGL context is created */
|
/* 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;
|
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);
|
fghPlatformOpenWindowEGL(window);
|
||||||
|
|
||||||
window->State.Visible = GL_TRUE;
|
window->State.Visible = GL_TRUE;
|
||||||
|
@ -47,6 +47,12 @@ void fgPlatformInitialize( const char* displayName )
|
|||||||
if (!eglInitialize(fgDisplay.pDisplay.egl.Display, NULL, NULL))
|
if (!eglInitialize(fgDisplay.pDisplay.egl.Display, NULL, NULL))
|
||||||
fgError("eglInitialize: error %x\n", eglGetError());
|
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.ScreenWidth = ...;
|
||||||
// fgDisplay.ScreenHeight = ...;
|
// fgDisplay.ScreenHeight = ...;
|
||||||
// fgDisplay.ScreenWidthMM = ...;
|
// fgDisplay.ScreenWidthMM = ...;
|
||||||
|
@ -47,8 +47,7 @@ typedef EGLContext SFG_WindowContextType ;
|
|||||||
struct tagSFG_PlatformContextEGL
|
struct tagSFG_PlatformContextEGL
|
||||||
{
|
{
|
||||||
EGLSurface Surface;
|
EGLSurface Surface;
|
||||||
EGLConfig ContextConfig;
|
EGLConfig Config;
|
||||||
EGLint ContextFormat;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -31,5 +31,5 @@ extern SFG_Structure fgStructure;
|
|||||||
void fgPlatformCreateWindow ( SFG_Window *window )
|
void fgPlatformCreateWindow ( SFG_Window *window )
|
||||||
{
|
{
|
||||||
window->Window.pContext.egl.Surface = EGL_NO_SURFACE;
|
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 <GL/freeglut.h>
|
||||||
#include "fg_internal.h"
|
#include "fg_internal.h"
|
||||||
|
|
||||||
/**
|
void fghChooseConfigEGL(EGLConfig* config) {
|
||||||
* 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));
|
|
||||||
const EGLint attribs[] = {
|
const EGLint attribs[] = {
|
||||||
EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
|
EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
|
||||||
|
#ifdef GL_ES_VERSION_2_0
|
||||||
EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
|
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_BLUE_SIZE, 1,
|
||||||
EGL_GREEN_SIZE, 1,
|
EGL_GREEN_SIZE, 1,
|
||||||
EGL_RED_SIZE, 1,
|
EGL_RED_SIZE, 1,
|
||||||
@ -51,33 +47,31 @@ void fghCreateNewContextEGL( SFG_Window* window ) {
|
|||||||
EGL_NONE
|
EGL_NONE
|
||||||
};
|
};
|
||||||
|
|
||||||
EGLint format;
|
EGLint num_config;
|
||||||
EGLint numConfigs;
|
if (!eglChooseConfig(fgDisplay.pDisplay.egl.Display,
|
||||||
EGLConfig config;
|
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;
|
EGLContext context;
|
||||||
|
|
||||||
EGLDisplay eglDisplay = fgDisplay.pDisplay.egl.Display;
|
EGLDisplay eglDisplay = fgDisplay.pDisplay.egl.Display;
|
||||||
|
EGLConfig eglConfig = window->Window.pContext.egl.Config;
|
||||||
/* 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);
|
|
||||||
|
|
||||||
/* Ensure OpenGLES 2.0 context */
|
/* Ensure OpenGLES 2.0 context */
|
||||||
static const EGLint ctx_attribs[] = {
|
static const EGLint ctx_attribs[] = {
|
||||||
|
#ifdef GL_ES_VERSION_2_0
|
||||||
EGL_CONTEXT_CLIENT_VERSION, 2,
|
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
|
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) {
|
if (context == EGL_NO_CONTEXT) {
|
||||||
fgWarning("Cannot initialize EGL context, err=%x\n", eglGetError());
|
fgWarning("Cannot initialize EGL context, err=%x\n", eglGetError());
|
||||||
fghContextCreationError();
|
fghContextCreationError();
|
||||||
@ -88,8 +82,6 @@ void fghCreateNewContextEGL( SFG_Window* window ) {
|
|||||||
fgError("Wrong GLES major version: %d\n", ver);
|
fgError("Wrong GLES major version: %d\n", ver);
|
||||||
|
|
||||||
window->Window.Context = context;
|
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 )
|
void fghPlatformOpenWindowEGL( SFG_Window* window )
|
||||||
{
|
{
|
||||||
EGLDisplay display = fgDisplay.pDisplay.egl.Display;
|
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);
|
EGLSurface surface = eglCreateWindowSurface(display, config, window->Window.Handle, NULL);
|
||||||
if (surface == EGL_NO_SURFACE)
|
if (surface == EGL_NO_SURFACE)
|
||||||
|
Reference in New Issue
Block a user