Further isolated X11-specific parts of EGL code.

This commit is contained in:
Camilla Berglund 2012-09-09 19:17:46 +02:00
parent 0ca1e67d7a
commit 74488bec67
5 changed files with 53 additions and 63 deletions

View File

@ -163,12 +163,10 @@ static int createContext(_GLFWwindow* window,
const _GLFWwndconfig* wndconfig, const _GLFWwndconfig* wndconfig,
EGLint fbconfigID) EGLint fbconfigID)
{ {
int attribs[40], visMask; int attribs[40];
EGLint count, index, visualID = 0; EGLint count, index;
EGLint redBits, greenBits, blueBits, alphaBits;
EGLConfig config; EGLConfig config;
EGLContext share = NULL; EGLContext share = NULL;
XVisualInfo visTemplate;
if (wndconfig->share) if (wndconfig->share)
share = wndconfig->share->EGL.context; share = wndconfig->share->EGL.context;
@ -192,45 +190,53 @@ static int createContext(_GLFWwindow* window,
// Retrieve the corresponding visual // Retrieve the corresponding visual
// NOTE: This is the only non-portable code in this file. // NOTE: This is the only non-portable code in this file.
// Maybe it would not hurt too much to add #ifdefs for different platforms? // Maybe it would not hurt too much to add #ifdefs for different platforms?
eglGetConfigAttrib(_glfwLibrary.EGL.display, config, EGL_NATIVE_VISUAL_ID, &visualID); #if defined(_GLFW_X11_EGL)
// Init visual template
visTemplate.screen = _glfwLibrary.X11.screen;
visMask = VisualScreenMask;
if (visualID)
{ {
// The X window visual must match the EGL config int mask;
visTemplate.visualid = visualID; EGLint redBits, greenBits, blueBits, alphaBits, visualID = 0;
visMask |= VisualIDMask; XVisualInfo info;
}
else eglGetConfigAttrib(_glfwLibrary.EGL.display, config,
{ EGL_NATIVE_VISUAL_ID, &visualID);
// some EGL drivers don't implement the EGL_NATIVE_VISUAL_ID
// attribute, so attempt to find the closest match. info.screen = _glfwLibrary.X11.screen;
mask = VisualScreenMask;
eglGetConfigAttrib(_glfwLibrary.EGL.display, config,
EGL_RED_SIZE, &redBits); if (visualID)
eglGetConfigAttrib(_glfwLibrary.EGL.display, config, {
EGL_GREEN_SIZE, &greenBits); // The X window visual must match the EGL config
eglGetConfigAttrib(_glfwLibrary.EGL.display, config, info.visualid = visualID;
EGL_BLUE_SIZE, &blueBits); mask |= VisualIDMask;
eglGetConfigAttrib(_glfwLibrary.EGL.display, config, }
EGL_ALPHA_SIZE, &alphaBits); else
{
visTemplate.depth = redBits + greenBits + blueBits + alphaBits; // some EGL drivers don't implement the EGL_NATIVE_VISUAL_ID
visMask |= VisualDepthMask; // attribute, so attempt to find the closest match.
}
eglGetConfigAttrib(_glfwLibrary.EGL.display, config,
window->EGL.visual = XGetVisualInfo(_glfwLibrary.X11.display, EGL_RED_SIZE, &redBits);
visMask, &visTemplate, &count); eglGetConfigAttrib(_glfwLibrary.EGL.display, config,
EGL_GREEN_SIZE, &greenBits);
if (window->EGL.visual == NULL) eglGetConfigAttrib(_glfwLibrary.EGL.display, config,
{ EGL_BLUE_SIZE, &blueBits);
_glfwSetError(GLFW_PLATFORM_ERROR, eglGetConfigAttrib(_glfwLibrary.EGL.display, config,
"EGL: Failed to retrieve visual for EGLConfig"); EGL_ALPHA_SIZE, &alphaBits);
return GL_FALSE;
info.depth = redBits + greenBits + blueBits + alphaBits;
mask |= VisualDepthMask;
}
window->EGL.visual = XGetVisualInfo(_glfwLibrary.X11.display,
mask, &info, &count);
if (window->EGL.visual == NULL)
{
_glfwSetError(GLFW_PLATFORM_ERROR,
"EGL: Failed to retrieve visual for EGLConfig");
return GL_FALSE;
}
} }
#endif
if (wndconfig->clientAPI == GLFW_OPENGL_ES_API) if (wndconfig->clientAPI == GLFW_OPENGL_ES_API)
{ {
@ -471,16 +477,6 @@ void _glfwDestroyContext(_GLFWwindow* window)
} }
//========================================================================
// Return the X visual associated with the specified context
//========================================================================
XVisualInfo* _glfwGetContextVisual(_GLFWwindow* window)
{
return window->EGL.visual;
}
//======================================================================== //========================================================================
// Make the OpenGL context associated with the specified window current // Make the OpenGL context associated with the specified window current
//======================================================================== //========================================================================

View File

@ -70,7 +70,10 @@ typedef struct _GLFWcontextEGL
EGLConfig config; EGLConfig config;
EGLContext context; EGLContext context;
EGLSurface surface; EGLSurface surface;
#if defined(_GLFW_X11_EGL)
XVisualInfo* visual; XVisualInfo* visual;
#endif
} _GLFWcontextEGL; } _GLFWcontextEGL;

View File

@ -611,16 +611,6 @@ void _glfwDestroyContext(_GLFWwindow* window)
} }
//========================================================================
// Return the X visual associated with the specified context
//========================================================================
XVisualInfo* _glfwGetContextVisual(_GLFWwindow* window)
{
return window->GLX.visual;
}
//======================================================================== //========================================================================
// Make the OpenGL context associated with the specified window current // Make the OpenGL context associated with the specified window current
//======================================================================== //========================================================================

View File

@ -54,8 +54,10 @@
#endif #endif
#if defined(_GLFW_X11_GLX) #if defined(_GLFW_X11_GLX)
#define _GLFW_X11_CONTEXT_VISUAL window->GLX.visual
#include "x11_glx_platform.h" #include "x11_glx_platform.h"
#elif defined(_GLFW_X11_EGL) #elif defined(_GLFW_X11_EGL)
#define _GLFW_X11_CONTEXT_VISUAL window->EGL.visual
#define _GLFW_EGL_NATIVE_WINDOW window->X11.handle #define _GLFW_EGL_NATIVE_WINDOW window->X11.handle
#define _GLFW_EGL_NATIVE_DISPLAY _glfwLibrary.X11.display #define _GLFW_EGL_NATIVE_DISPLAY _glfwLibrary.X11.display
#include "x11_egl_platform.h" #include "x11_egl_platform.h"
@ -225,7 +227,6 @@ int _glfwCreateContext(_GLFWwindow* window,
const _GLFWwndconfig* wndconfig, const _GLFWwndconfig* wndconfig,
const _GLFWfbconfig* fbconfig); const _GLFWfbconfig* fbconfig);
void _glfwDestroyContext(_GLFWwindow* window); void _glfwDestroyContext(_GLFWwindow* window);
XVisualInfo* _glfwGetContextVisual(_GLFWwindow* window);
// Fullscreen support // Fullscreen support
int _glfwGetClosestVideoMode(int* width, int* height, int* rate); int _glfwGetClosestVideoMode(int* width, int* height, int* rate);

View File

@ -83,7 +83,7 @@ static GLboolean createWindow(_GLFWwindow* window,
{ {
unsigned long wamask; unsigned long wamask;
XSetWindowAttributes wa; XSetWindowAttributes wa;
XVisualInfo* visual = _glfwGetContextVisual(window); XVisualInfo* visual = _GLFW_X11_CONTEXT_VISUAL;
// Every window needs a colormap // Every window needs a colormap
// Create one based on the visual used by the current context // Create one based on the visual used by the current context