mirror of
https://github.com/glfw/glfw.git
synced 2024-11-26 22:34:35 +00:00
Removed hard-coded EGL config limit.
This commit is contained in:
parent
af925681dd
commit
ddb497c5d5
@ -33,9 +33,6 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
// Max number of EGL configuration we handle
|
||||
#define _GLFW_EGL_CONFIG_IN 15
|
||||
|
||||
|
||||
//========================================================================
|
||||
// Returns the specified attribute of the specified EGLConfig
|
||||
@ -57,16 +54,26 @@ static _GLFWfbconfig* getFBConfigs(_GLFWwindow* window,
|
||||
const _GLFWwndconfig* wndconfig,
|
||||
unsigned int* found)
|
||||
{
|
||||
EGLConfig fbconfigs[_GLFW_EGL_CONFIG_IN];
|
||||
EGLConfig* fbconfigs;
|
||||
_GLFWfbconfig* result;
|
||||
int i, count = 0;
|
||||
|
||||
*found = 0;
|
||||
|
||||
eglGetConfigs(_glfwLibrary.EGL.display, fbconfigs,
|
||||
_GLFW_EGL_CONFIG_IN, &count);
|
||||
eglGetConfigs(_glfwLibrary.EGL.display, NULL, 0, &count);
|
||||
|
||||
fbconfigs = (EGLConfig*) malloc(sizeof(EGLConfig) * count);
|
||||
if (!fbconfigs)
|
||||
{
|
||||
_glfwSetError(GLFW_OUT_OF_MEMORY, NULL);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
eglGetConfigs(_glfwLibrary.EGL.display, fbconfigs, count, &count);
|
||||
if (!count)
|
||||
{
|
||||
free(fbconfigs);
|
||||
|
||||
_glfwSetError(GLFW_OPENGL_UNAVAILABLE,
|
||||
"X11/EGL: No EGLConfigs returned");
|
||||
return NULL;
|
||||
@ -75,8 +82,9 @@ static _GLFWfbconfig* getFBConfigs(_GLFWwindow* window,
|
||||
result = (_GLFWfbconfig*) malloc(sizeof(_GLFWfbconfig) * count);
|
||||
if (!result)
|
||||
{
|
||||
_glfwSetError(GLFW_OUT_OF_MEMORY,
|
||||
"X11/EGL: Failed to allocate _GLFWfbconfig array");
|
||||
free(fbconfigs);
|
||||
|
||||
_glfwSetError(GLFW_OUT_OF_MEMORY, NULL);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@ -130,6 +138,7 @@ static _GLFWfbconfig* getFBConfigs(_GLFWwindow* window,
|
||||
(*found)++;
|
||||
}
|
||||
|
||||
free(fbconfigs);
|
||||
return result;
|
||||
}
|
||||
|
||||
@ -140,18 +149,13 @@ static _GLFWfbconfig* getFBConfigs(_GLFWwindow* window,
|
||||
|
||||
static void refreshContextParams(_GLFWwindow* window, EGLint fbconfigID)
|
||||
{
|
||||
EGLint dummy;
|
||||
EGLConfig fbconfig[_GLFW_EGL_CONFIG_IN];
|
||||
EGLint count;
|
||||
EGLConfig fbconfig;
|
||||
|
||||
int attribs[] = { EGL_CONFIG_ID, fbconfigID, None };
|
||||
|
||||
eglChooseConfig(_glfwLibrary.EGL.display,
|
||||
attribs,
|
||||
fbconfig,
|
||||
_GLFW_EGL_CONFIG_IN,
|
||||
&dummy);
|
||||
|
||||
if (!dummy)
|
||||
eglChooseConfig(_glfwLibrary.EGL.display, attribs, &fbconfig, 1, &count);
|
||||
if (!count)
|
||||
{
|
||||
// This should never ever happen
|
||||
// TODO: Flag this as an error and propagate up
|
||||
@ -165,15 +169,15 @@ static void refreshContextParams(_GLFWwindow* window, EGLint fbconfigID)
|
||||
// true sounds better than false, so we hardcode true here
|
||||
window->accelerated = GL_TRUE;
|
||||
|
||||
window->redBits = getFBConfigAttrib(*fbconfig, EGL_RED_SIZE);
|
||||
window->greenBits = getFBConfigAttrib(*fbconfig, EGL_GREEN_SIZE);
|
||||
window->blueBits = getFBConfigAttrib(*fbconfig, EGL_BLUE_SIZE);
|
||||
window->redBits = getFBConfigAttrib(fbconfig, EGL_RED_SIZE);
|
||||
window->greenBits = getFBConfigAttrib(fbconfig, EGL_GREEN_SIZE);
|
||||
window->blueBits = getFBConfigAttrib(fbconfig, EGL_BLUE_SIZE);
|
||||
|
||||
window->alphaBits = getFBConfigAttrib(*fbconfig, EGL_ALPHA_SIZE);
|
||||
window->depthBits = getFBConfigAttrib(*fbconfig, EGL_DEPTH_SIZE);
|
||||
window->stencilBits = getFBConfigAttrib(*fbconfig, EGL_STENCIL_SIZE);
|
||||
window->alphaBits = getFBConfigAttrib(fbconfig, EGL_ALPHA_SIZE);
|
||||
window->depthBits = getFBConfigAttrib(fbconfig, EGL_DEPTH_SIZE);
|
||||
window->stencilBits = getFBConfigAttrib(fbconfig, EGL_STENCIL_SIZE);
|
||||
|
||||
window->samples = getFBConfigAttrib(*fbconfig, EGL_SAMPLES);
|
||||
window->samples = getFBConfigAttrib(fbconfig, EGL_SAMPLES);
|
||||
}
|
||||
|
||||
|
||||
@ -190,9 +194,9 @@ static int createContext(_GLFWwindow* window,
|
||||
EGLint fbconfigID)
|
||||
{
|
||||
int attribs[40], visMask;
|
||||
EGLint dummy, index, visualID = 0;
|
||||
EGLint count, index, visualID = 0;
|
||||
EGLint red_size, green_size, blue_size, alpha_size;
|
||||
EGLConfig fbconfig[_GLFW_EGL_CONFIG_IN];
|
||||
EGLConfig fbconfig;
|
||||
EGLContext share = NULL;
|
||||
XVisualInfo visTemplate;
|
||||
|
||||
@ -206,13 +210,8 @@ static int createContext(_GLFWwindow* window,
|
||||
setEGLattrib(attribs, index, EGL_CONFIG_ID, fbconfigID);
|
||||
setEGLattrib(attribs, index, EGL_NONE, EGL_NONE);
|
||||
|
||||
eglChooseConfig(_glfwLibrary.EGL.display,
|
||||
attribs,
|
||||
fbconfig,
|
||||
_GLFW_EGL_CONFIG_IN,
|
||||
&dummy);
|
||||
|
||||
if (!dummy)
|
||||
eglChooseConfig(_glfwLibrary.EGL.display, attribs, &fbconfig, 1, &count);
|
||||
if (!count)
|
||||
{
|
||||
_glfwSetError(GLFW_PLATFORM_ERROR,
|
||||
"X11/EGL: Failed to retrieve the selected EGLConfig");
|
||||
@ -223,7 +222,7 @@ static int createContext(_GLFWwindow* window,
|
||||
// Retrieve the corresponding visual
|
||||
// NOTE: This is the only non-portable code in this file.
|
||||
// Maybe it would not hurt too much to add #ifdefs for different platforms?
|
||||
eglGetConfigAttrib(_glfwLibrary.EGL.display, *fbconfig, EGL_NATIVE_VISUAL_ID, &visualID);
|
||||
eglGetConfigAttrib(_glfwLibrary.EGL.display, fbconfig, EGL_NATIVE_VISUAL_ID, &visualID);
|
||||
|
||||
// Init visual template
|
||||
visTemplate.screen = _glfwLibrary.X11.screen;
|
||||
@ -240,13 +239,13 @@ static int createContext(_GLFWwindow* window,
|
||||
// some EGL drivers don't implement the EGL_NATIVE_VISUAL_ID
|
||||
// attribute, so attempt to find the closest match.
|
||||
|
||||
eglGetConfigAttrib(_glfwLibrary.EGL.display, *fbconfig,
|
||||
eglGetConfigAttrib(_glfwLibrary.EGL.display, fbconfig,
|
||||
EGL_RED_SIZE, &red_size);
|
||||
eglGetConfigAttrib(_glfwLibrary.EGL.display, *fbconfig,
|
||||
eglGetConfigAttrib(_glfwLibrary.EGL.display, fbconfig,
|
||||
EGL_GREEN_SIZE, &green_size);
|
||||
eglGetConfigAttrib(_glfwLibrary.EGL.display, *fbconfig,
|
||||
eglGetConfigAttrib(_glfwLibrary.EGL.display, fbconfig,
|
||||
EGL_BLUE_SIZE, &blue_size);
|
||||
eglGetConfigAttrib(_glfwLibrary.EGL.display, *fbconfig,
|
||||
eglGetConfigAttrib(_glfwLibrary.EGL.display, fbconfig,
|
||||
EGL_ALPHA_SIZE, &alpha_size);
|
||||
|
||||
visTemplate.depth = red_size + green_size + blue_size + alpha_size;
|
||||
@ -254,7 +253,7 @@ static int createContext(_GLFWwindow* window,
|
||||
}
|
||||
|
||||
window->EGL.visual = XGetVisualInfo(_glfwLibrary.X11.display,
|
||||
visMask, &visTemplate, &dummy);
|
||||
visMask, &visTemplate, &count);
|
||||
|
||||
if (window->EGL.visual == NULL)
|
||||
{
|
||||
@ -278,7 +277,7 @@ static int createContext(_GLFWwindow* window,
|
||||
eglBindAPI(EGL_OPENGL_ES_API);
|
||||
|
||||
window->EGL.context = eglCreateContext(_glfwLibrary.EGL.display,
|
||||
*fbconfig, share, attribs);
|
||||
fbconfig, share, attribs);
|
||||
|
||||
if (window->EGL.context == EGL_NO_CONTEXT)
|
||||
{
|
||||
@ -289,7 +288,7 @@ static int createContext(_GLFWwindow* window,
|
||||
return GL_FALSE;
|
||||
}
|
||||
|
||||
window->EGL.config = *fbconfig;
|
||||
window->EGL.config = fbconfig;
|
||||
|
||||
refreshContextParams(window, fbconfigID);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user