egl: Add a function to convert __GLcontextModes to _EGLConfig.
_eglConfigFromContextModesRec is used to convert a __GLcontextModes to a _EGLConfig. Note that the config is not validated. An invalid mode is likely to give an invalid config. Signed-off-by: Chia-I Wu <olvaffe@gmail.com>
This commit is contained in:
@@ -52,6 +52,78 @@ _eglConfigToContextModesRec(const _EGLConfig *config, __GLcontextModes *mode)
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Convert a __GLcontextModes object to an _EGLConfig.
|
||||
*/
|
||||
EGLBoolean
|
||||
_eglConfigFromContextModesRec(_EGLConfig *conf, const __GLcontextModes *m,
|
||||
EGLint conformant, EGLint renderable_type)
|
||||
{
|
||||
EGLint config_caveat, surface_type;
|
||||
|
||||
/* must be RGBA */
|
||||
if (!m->rgbMode || !(m->renderType & GLX_RGBA_BIT))
|
||||
return EGL_FALSE;
|
||||
|
||||
config_caveat = EGL_NONE;
|
||||
if (m->visualRating == GLX_SLOW_CONFIG)
|
||||
config_caveat = EGL_SLOW_CONFIG;
|
||||
|
||||
if (m->visualRating == GLX_NON_CONFORMANT_CONFIG)
|
||||
conformant &= ~EGL_OPENGL_BIT;
|
||||
if (!(conformant & EGL_OPENGL_ES_BIT))
|
||||
config_caveat = EGL_NON_CONFORMANT_CONFIG;
|
||||
|
||||
surface_type = 0;
|
||||
if (m->drawableType & GLX_WINDOW_BIT)
|
||||
surface_type |= EGL_WINDOW_BIT;
|
||||
if (m->drawableType & GLX_PIXMAP_BIT)
|
||||
surface_type |= EGL_PIXMAP_BIT;
|
||||
if (m->drawableType & GLX_PBUFFER_BIT)
|
||||
surface_type |= EGL_PBUFFER_BIT;
|
||||
|
||||
SET_CONFIG_ATTRIB(conf, EGL_BUFFER_SIZE, m->rgbBits);
|
||||
SET_CONFIG_ATTRIB(conf, EGL_RED_SIZE, m->redBits);
|
||||
SET_CONFIG_ATTRIB(conf, EGL_GREEN_SIZE, m->greenBits);
|
||||
SET_CONFIG_ATTRIB(conf, EGL_BLUE_SIZE, m->blueBits);
|
||||
SET_CONFIG_ATTRIB(conf, EGL_ALPHA_SIZE, m->alphaBits);
|
||||
|
||||
SET_CONFIG_ATTRIB(conf, EGL_BIND_TO_TEXTURE_RGB, m->bindToTextureRgb);
|
||||
SET_CONFIG_ATTRIB(conf, EGL_BIND_TO_TEXTURE_RGBA, m->bindToTextureRgba);
|
||||
SET_CONFIG_ATTRIB(conf, EGL_COLOR_BUFFER_TYPE, EGL_RGB_BUFFER);
|
||||
SET_CONFIG_ATTRIB(conf, EGL_CONFIG_CAVEAT, config_caveat);
|
||||
|
||||
SET_CONFIG_ATTRIB(conf, EGL_CONFORMANT, conformant);
|
||||
SET_CONFIG_ATTRIB(conf, EGL_DEPTH_SIZE, m->depthBits);
|
||||
SET_CONFIG_ATTRIB(conf, EGL_LEVEL, m->level);
|
||||
SET_CONFIG_ATTRIB(conf, EGL_MAX_PBUFFER_WIDTH, m->maxPbufferWidth);
|
||||
SET_CONFIG_ATTRIB(conf, EGL_MAX_PBUFFER_HEIGHT, m->maxPbufferHeight);
|
||||
SET_CONFIG_ATTRIB(conf, EGL_MAX_PBUFFER_PIXELS, m->maxPbufferPixels);
|
||||
|
||||
SET_CONFIG_ATTRIB(conf, EGL_NATIVE_RENDERABLE, m->xRenderable);
|
||||
SET_CONFIG_ATTRIB(conf, EGL_NATIVE_VISUAL_ID, m->visualID);
|
||||
SET_CONFIG_ATTRIB(conf, EGL_NATIVE_VISUAL_TYPE, m->visualType);
|
||||
SET_CONFIG_ATTRIB(conf, EGL_RENDERABLE_TYPE, renderable_type);
|
||||
SET_CONFIG_ATTRIB(conf, EGL_SAMPLE_BUFFERS, m->sampleBuffers);
|
||||
SET_CONFIG_ATTRIB(conf, EGL_SAMPLES, m->samples);
|
||||
SET_CONFIG_ATTRIB(conf, EGL_STENCIL_SIZE, m->stencilBits);
|
||||
|
||||
SET_CONFIG_ATTRIB(conf, EGL_SURFACE_TYPE, surface_type);
|
||||
|
||||
/* what to do with GLX_TRANSPARENT_INDEX? */
|
||||
if (m->transparentPixel == GLX_TRANSPARENT_RGB) {
|
||||
SET_CONFIG_ATTRIB(conf, EGL_TRANSPARENT_TYPE, EGL_TRANSPARENT_RGB);
|
||||
SET_CONFIG_ATTRIB(conf, EGL_TRANSPARENT_RED_VALUE, m->transparentRed);
|
||||
SET_CONFIG_ATTRIB(conf, EGL_TRANSPARENT_GREEN_VALUE, m->transparentGreen);
|
||||
SET_CONFIG_ATTRIB(conf, EGL_TRANSPARENT_BLUE_VALUE, m->transparentBlue);
|
||||
}
|
||||
else {
|
||||
SET_CONFIG_ATTRIB(conf, EGL_TRANSPARENT_TYPE, EGL_NONE);
|
||||
}
|
||||
|
||||
return EGL_TRUE;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Creates a set of \c _EGLConfigs that a driver will expose.
|
||||
|
||||
@@ -11,6 +11,11 @@ extern void
|
||||
_eglConfigToContextModesRec(const _EGLConfig *config, __GLcontextModes *mode);
|
||||
|
||||
|
||||
extern EGLBoolean
|
||||
_eglConfigFromContextModesRec(_EGLConfig *conf, const __GLcontextModes *m,
|
||||
EGLint conformant, EGLint renderable_type);
|
||||
|
||||
|
||||
extern EGLBoolean
|
||||
_eglFillInConfigs( _EGLConfig *configs,
|
||||
EGLenum fb_format, EGLenum fb_type,
|
||||
|
||||
Reference in New Issue
Block a user