mirror of
https://github.com/SFML/SFML.git
synced 2024-12-01 15:51:04 +08:00
Implemented getBestConfig() in EglContext to retrieve the best EGL config
This commit is contained in:
parent
2627c3579f
commit
ba0555fd1a
@ -73,32 +73,23 @@ namespace priv
|
|||||||
EglContext::EglContext(EglContext* shared) :
|
EglContext::EglContext(EglContext* shared) :
|
||||||
m_display (EGL_NO_DISPLAY),
|
m_display (EGL_NO_DISPLAY),
|
||||||
m_context (EGL_NO_CONTEXT),
|
m_context (EGL_NO_CONTEXT),
|
||||||
m_surface (EGL_NO_SURFACE)
|
m_surface (EGL_NO_SURFACE),
|
||||||
|
m_config (NULL)
|
||||||
{
|
{
|
||||||
// Get the intialized EGL display
|
// Get the intialized EGL display
|
||||||
m_display = getInitializedDisplay();
|
m_display = getInitializedDisplay();
|
||||||
|
|
||||||
// Create the EGL surface
|
// Get the best EGL config matching the default video settings
|
||||||
const EGLint attribs[] = {
|
m_config = getBestConfig(m_display, VideoMode::getDesktopMode().bitsPerPixel, ContextSettings());
|
||||||
EGL_SURFACE_TYPE, EGL_WINDOW_BIT | EGL_PBUFFER_BIT,
|
|
||||||
EGL_BLUE_SIZE, 8,
|
|
||||||
EGL_GREEN_SIZE, 8,
|
|
||||||
EGL_RED_SIZE, 8,
|
|
||||||
EGL_RENDERABLE_TYPE, EGL_OPENGL_ES_BIT,
|
|
||||||
EGL_NONE
|
|
||||||
};
|
|
||||||
|
|
||||||
EGLint numConfigs;
|
|
||||||
EGLConfig config[1];
|
|
||||||
eglCheck(eglChooseConfig(m_display, attribs, &config[0], 1, &numConfigs));
|
|
||||||
|
|
||||||
// Note: The EGL specs say that attrib_list can be NULL when passed to eglCreatePbufferSurface,
|
// Note: The EGL specs say that attrib_list can be NULL when passed to eglCreatePbufferSurface,
|
||||||
// but this is resulting in a segfault. Bug in Android?
|
// but this is resulting in a segfault. Bug in Android?
|
||||||
EGLint attrib_list[] = { EGL_NONE };
|
EGLint attrib_list[] = { EGL_NONE };
|
||||||
m_surface = eglCheck(eglCreatePbufferSurface(m_display, config[0], attrib_list));
|
|
||||||
|
m_surface = eglCheck(eglCreatePbufferSurface(m_display, m_config, attrib_list));
|
||||||
|
|
||||||
// Create the context
|
// Create the context
|
||||||
createContext(shared, 0, config[0]);
|
createContext(shared);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -106,7 +97,8 @@ m_surface (EGL_NO_SURFACE)
|
|||||||
EglContext::EglContext(EglContext* shared, const ContextSettings& settings, const WindowImpl* owner, unsigned int bitsPerPixel) :
|
EglContext::EglContext(EglContext* shared, const ContextSettings& settings, const WindowImpl* owner, unsigned int bitsPerPixel) :
|
||||||
m_display (EGL_NO_DISPLAY),
|
m_display (EGL_NO_DISPLAY),
|
||||||
m_context (EGL_NO_CONTEXT),
|
m_context (EGL_NO_CONTEXT),
|
||||||
m_surface (EGL_NO_SURFACE)
|
m_surface (EGL_NO_SURFACE),
|
||||||
|
m_config (NULL)
|
||||||
{
|
{
|
||||||
#ifdef SFML_SYSTEM_ANDROID
|
#ifdef SFML_SYSTEM_ANDROID
|
||||||
|
|
||||||
@ -121,22 +113,11 @@ m_surface (EGL_NO_SURFACE)
|
|||||||
// Get the intialized EGL display
|
// Get the intialized EGL display
|
||||||
m_display = getInitializedDisplay();
|
m_display = getInitializedDisplay();
|
||||||
|
|
||||||
// Create the EGL surface
|
// Get the best EGL config matching the requested video settings
|
||||||
const EGLint attribs[] = {
|
m_config = getBestConfig(m_display, bitsPerPixel, settings);
|
||||||
EGL_SURFACE_TYPE, EGL_WINDOW_BIT | EGL_PBUFFER_BIT,
|
|
||||||
EGL_BLUE_SIZE, 8,
|
|
||||||
EGL_GREEN_SIZE, 8,
|
|
||||||
EGL_RED_SIZE, 8,
|
|
||||||
EGL_RENDERABLE_TYPE, EGL_OPENGL_ES_BIT,
|
|
||||||
EGL_NONE
|
|
||||||
};
|
|
||||||
|
|
||||||
EGLint numConfigs;
|
|
||||||
EGLConfig config[1];
|
|
||||||
eglCheck(eglChooseConfig(m_display, attribs, &config[0], 1, &numConfigs));
|
|
||||||
|
|
||||||
// Create the context
|
// Create the context
|
||||||
createContext(shared, 0, config[0]);
|
createContext(shared);
|
||||||
|
|
||||||
#ifdef SFML_OS_LINUX
|
#ifdef SFML_OS_LINUX
|
||||||
createSurface((EGLNativeWindowType)owner->getSystemHandle());
|
createSurface((EGLNativeWindowType)owner->getSystemHandle());
|
||||||
@ -148,7 +129,8 @@ m_surface (EGL_NO_SURFACE)
|
|||||||
EglContext::EglContext(EglContext* shared, const ContextSettings& settings, unsigned int width, unsigned int height) :
|
EglContext::EglContext(EglContext* shared, const ContextSettings& settings, unsigned int width, unsigned int height) :
|
||||||
m_display (EGL_NO_DISPLAY),
|
m_display (EGL_NO_DISPLAY),
|
||||||
m_context (EGL_NO_CONTEXT),
|
m_context (EGL_NO_CONTEXT),
|
||||||
m_surface (EGL_NO_SURFACE)
|
m_surface (EGL_NO_SURFACE),
|
||||||
|
m_config (NULL)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -200,9 +182,12 @@ void EglContext::setVerticalSyncEnabled(bool enabled)
|
|||||||
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////
|
||||||
void EglContext::createContext(EglContext* shared, unsigned int bitsPerPixel, const EGLConfig settings)
|
void EglContext::createContext(EglContext* shared)
|
||||||
{
|
{
|
||||||
EGLint contextVersion[] = { EGL_CONTEXT_CLIENT_VERSION, 1, EGL_NONE };
|
const EGLint contextVersion[] = {
|
||||||
|
EGL_CONTEXT_CLIENT_VERSION, 1,
|
||||||
|
EGL_NONE
|
||||||
|
};
|
||||||
|
|
||||||
EGLContext toShared;
|
EGLContext toShared;
|
||||||
|
|
||||||
@ -212,28 +197,14 @@ void EglContext::createContext(EglContext* shared, unsigned int bitsPerPixel, co
|
|||||||
toShared = EGL_NO_CONTEXT;
|
toShared = EGL_NO_CONTEXT;
|
||||||
|
|
||||||
// Create the EGL context
|
// Create the EGL context
|
||||||
m_context = eglCheck(eglCreateContext(m_display, settings, toShared, contextVersion));
|
m_context = eglCheck(eglCreateContext(m_display, m_config, toShared, contextVersion));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////
|
||||||
void EglContext::createSurface(EGLNativeWindowType window)
|
void EglContext::createSurface(EGLNativeWindowType window)
|
||||||
{
|
{
|
||||||
// Create the EGL surface
|
m_surface = eglCheck(eglCreateWindowSurface(m_display, m_config, window, NULL));
|
||||||
const EGLint attribs[] = {
|
|
||||||
EGL_SURFACE_TYPE, EGL_WINDOW_BIT | EGL_PBUFFER_BIT,
|
|
||||||
EGL_BLUE_SIZE, 8,
|
|
||||||
EGL_GREEN_SIZE, 8,
|
|
||||||
EGL_RED_SIZE, 8,
|
|
||||||
EGL_RENDERABLE_TYPE, EGL_OPENGL_ES_BIT,
|
|
||||||
EGL_NONE
|
|
||||||
};
|
|
||||||
|
|
||||||
EGLint numConfigs;
|
|
||||||
EGLConfig config[1];
|
|
||||||
eglCheck(eglChooseConfig(m_display, attribs, &config[0], 1, &numConfigs));
|
|
||||||
|
|
||||||
m_surface = eglCheck(eglCreateWindowSurface(m_display, config[0], window, NULL));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -248,6 +219,30 @@ void EglContext::destroySurface()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
EGLConfig EglContext::getBestConfig(EGLDisplay display, unsigned int bitsPerPixel, const ContextSettings& settings)
|
||||||
|
{
|
||||||
|
// Set our video settings constraint
|
||||||
|
const EGLint attributes[] = {
|
||||||
|
EGL_BUFFER_SIZE, bitsPerPixel,
|
||||||
|
EGL_DEPTH_SIZE, settings.depthBits,
|
||||||
|
EGL_STENCIL_SIZE, settings.stencilBits,
|
||||||
|
EGL_SAMPLE_BUFFERS, settings.antialiasingLevel,
|
||||||
|
EGL_SURFACE_TYPE, EGL_WINDOW_BIT | EGL_PBUFFER_BIT,
|
||||||
|
EGL_RENDERABLE_TYPE, EGL_OPENGL_ES_BIT,
|
||||||
|
EGL_NONE
|
||||||
|
};
|
||||||
|
|
||||||
|
EGLint configCount;
|
||||||
|
EGLConfig configs[1];
|
||||||
|
|
||||||
|
// Ask EGL for the best config matching our video settings
|
||||||
|
eglCheck(eglChooseConfig(display, attributes, configs, 1, &configCount));
|
||||||
|
|
||||||
|
return configs[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
#ifdef SFML_SYSTEM_LINUX
|
#ifdef SFML_SYSTEM_LINUX
|
||||||
////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////
|
||||||
XVisualInfo EglContext::selectBestVisual(::Display* display, unsigned int bitsPerPixel, const ContextSettings& settings)
|
XVisualInfo EglContext::selectBestVisual(::Display* display, unsigned int bitsPerPixel, const ContextSettings& settings)
|
||||||
|
@ -115,7 +115,7 @@ public :
|
|||||||
/// \param settings Creation parameters
|
/// \param settings Creation parameters
|
||||||
///
|
///
|
||||||
////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////
|
||||||
void createContext(EglContext* shared, unsigned int bitsPerPixel, const EGLConfig settings);
|
void createContext(EglContext* shared);
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////
|
||||||
/// \brief Create the EGL surface
|
/// \brief Create the EGL surface
|
||||||
@ -137,6 +137,18 @@ public :
|
|||||||
////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////
|
||||||
void destroySurface();
|
void destroySurface();
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
/// \brief Get the best EGL visual for a given set of video settings
|
||||||
|
///
|
||||||
|
/// \param display EGL display
|
||||||
|
/// \param bitsPerPixel Pixel depth, in bits per pixel
|
||||||
|
/// \param settings Requested context settings
|
||||||
|
///
|
||||||
|
/// \return The best EGL config
|
||||||
|
///
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
static EGLConfig getBestConfig(EGLDisplay display, unsigned int bitsPerPixel, const ContextSettings& settings);
|
||||||
|
|
||||||
#ifdef SFML_SYSTEM_LINUX
|
#ifdef SFML_SYSTEM_LINUX
|
||||||
////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////
|
||||||
/// \brief Select the best EGL visual for a given set of settings
|
/// \brief Select the best EGL visual for a given set of settings
|
||||||
@ -159,6 +171,7 @@ private :
|
|||||||
EGLDisplay m_display; ///< The internal EGL display
|
EGLDisplay m_display; ///< The internal EGL display
|
||||||
EGLContext m_context; ///< The internal EGL context
|
EGLContext m_context; ///< The internal EGL context
|
||||||
EGLSurface m_surface; ///< The internal EGL surface
|
EGLSurface m_surface; ///< The internal EGL surface
|
||||||
|
EGLConfig m_config; ///< The internal EGL config
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user