241 lines
7.4 KiB
C
241 lines
7.4 KiB
C
/**************************************************************************
|
|
*
|
|
* Copyright 2008 VMware, Inc.
|
|
* Copyright 2009-2010 Chia-I Wu <olvaffe@gmail.com>
|
|
* Copyright 2010-2011 LunarG, Inc.
|
|
* All Rights Reserved.
|
|
*
|
|
* Permission is hereby granted, free of charge, to any person obtaining a
|
|
* copy of this software and associated documentation files (the
|
|
* "Software"), to deal in the Software without restriction, including
|
|
* without limitation the rights to use, copy, modify, merge, publish,
|
|
* distribute, sub license, and/or sell copies of the Software, and to
|
|
* permit persons to whom the Software is furnished to do so, subject to
|
|
* the following conditions:
|
|
*
|
|
* The above copyright notice and this permission notice (including the
|
|
* next paragraph) shall be included in all copies or substantial portions
|
|
* of the Software.
|
|
*
|
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
|
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
|
* DEALINGS IN THE SOFTWARE.
|
|
*
|
|
**************************************************************************/
|
|
|
|
|
|
#ifndef EGLCONFIG_INCLUDED
|
|
#define EGLCONFIG_INCLUDED
|
|
|
|
|
|
#include <assert.h>
|
|
#include <stddef.h>
|
|
#include "c99_compat.h"
|
|
|
|
#include "egltypedefs.h"
|
|
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
/* update _eglValidationTable and _eglOffsetOfConfig before updating this
|
|
* struct */
|
|
struct _egl_config
|
|
{
|
|
_EGLDisplay *Display;
|
|
|
|
/* core */
|
|
EGLint BufferSize;
|
|
EGLint AlphaSize;
|
|
EGLint BlueSize;
|
|
EGLint GreenSize;
|
|
EGLint RedSize;
|
|
EGLint DepthSize;
|
|
EGLint StencilSize;
|
|
EGLint ConfigCaveat;
|
|
EGLint ConfigID;
|
|
EGLint Level;
|
|
EGLint MaxPbufferHeight;
|
|
EGLint MaxPbufferPixels;
|
|
EGLint MaxPbufferWidth;
|
|
EGLint NativeRenderable;
|
|
EGLint NativeVisualID;
|
|
EGLint NativeVisualType;
|
|
EGLint Samples;
|
|
EGLint SampleBuffers;
|
|
EGLint SurfaceType;
|
|
EGLint TransparentType;
|
|
EGLint TransparentBlueValue;
|
|
EGLint TransparentGreenValue;
|
|
EGLint TransparentRedValue;
|
|
EGLint BindToTextureRGB;
|
|
EGLint BindToTextureRGBA;
|
|
EGLint MinSwapInterval;
|
|
EGLint MaxSwapInterval;
|
|
EGLint LuminanceSize;
|
|
EGLint AlphaMaskSize;
|
|
EGLint ColorBufferType;
|
|
EGLint RenderableType;
|
|
EGLint MatchNativePixmap;
|
|
EGLint Conformant;
|
|
|
|
/* extensions */
|
|
EGLint YInvertedNOK;
|
|
EGLint FramebufferTargetAndroid;
|
|
EGLint RecordableAndroid;
|
|
};
|
|
|
|
|
|
/**
|
|
* Map an EGL attribute enum to the offset of the member in _EGLConfig.
|
|
*/
|
|
static inline EGLint
|
|
_eglOffsetOfConfig(EGLint attr)
|
|
{
|
|
switch (attr) {
|
|
#define ATTRIB_MAP(attr, memb) case attr: return offsetof(_EGLConfig, memb)
|
|
/* core */
|
|
ATTRIB_MAP(EGL_BUFFER_SIZE, BufferSize);
|
|
ATTRIB_MAP(EGL_ALPHA_SIZE, AlphaSize);
|
|
ATTRIB_MAP(EGL_BLUE_SIZE, BlueSize);
|
|
ATTRIB_MAP(EGL_GREEN_SIZE, GreenSize);
|
|
ATTRIB_MAP(EGL_RED_SIZE, RedSize);
|
|
ATTRIB_MAP(EGL_DEPTH_SIZE, DepthSize);
|
|
ATTRIB_MAP(EGL_STENCIL_SIZE, StencilSize);
|
|
ATTRIB_MAP(EGL_CONFIG_CAVEAT, ConfigCaveat);
|
|
ATTRIB_MAP(EGL_CONFIG_ID, ConfigID);
|
|
ATTRIB_MAP(EGL_LEVEL, Level);
|
|
ATTRIB_MAP(EGL_MAX_PBUFFER_HEIGHT, MaxPbufferHeight);
|
|
ATTRIB_MAP(EGL_MAX_PBUFFER_PIXELS, MaxPbufferPixels);
|
|
ATTRIB_MAP(EGL_MAX_PBUFFER_WIDTH, MaxPbufferWidth);
|
|
ATTRIB_MAP(EGL_NATIVE_RENDERABLE, NativeRenderable);
|
|
ATTRIB_MAP(EGL_NATIVE_VISUAL_ID, NativeVisualID);
|
|
ATTRIB_MAP(EGL_NATIVE_VISUAL_TYPE, NativeVisualType);
|
|
ATTRIB_MAP(EGL_SAMPLES, Samples);
|
|
ATTRIB_MAP(EGL_SAMPLE_BUFFERS, SampleBuffers);
|
|
ATTRIB_MAP(EGL_SURFACE_TYPE, SurfaceType);
|
|
ATTRIB_MAP(EGL_TRANSPARENT_TYPE, TransparentType);
|
|
ATTRIB_MAP(EGL_TRANSPARENT_BLUE_VALUE, TransparentBlueValue);
|
|
ATTRIB_MAP(EGL_TRANSPARENT_GREEN_VALUE, TransparentGreenValue);
|
|
ATTRIB_MAP(EGL_TRANSPARENT_RED_VALUE, TransparentRedValue);
|
|
ATTRIB_MAP(EGL_BIND_TO_TEXTURE_RGB, BindToTextureRGB);
|
|
ATTRIB_MAP(EGL_BIND_TO_TEXTURE_RGBA, BindToTextureRGBA);
|
|
ATTRIB_MAP(EGL_MIN_SWAP_INTERVAL, MinSwapInterval);
|
|
ATTRIB_MAP(EGL_MAX_SWAP_INTERVAL, MaxSwapInterval);
|
|
ATTRIB_MAP(EGL_LUMINANCE_SIZE, LuminanceSize);
|
|
ATTRIB_MAP(EGL_ALPHA_MASK_SIZE, AlphaMaskSize);
|
|
ATTRIB_MAP(EGL_COLOR_BUFFER_TYPE, ColorBufferType);
|
|
ATTRIB_MAP(EGL_RENDERABLE_TYPE, RenderableType);
|
|
ATTRIB_MAP(EGL_MATCH_NATIVE_PIXMAP, MatchNativePixmap);
|
|
ATTRIB_MAP(EGL_CONFORMANT, Conformant);
|
|
/* extensions */
|
|
ATTRIB_MAP(EGL_Y_INVERTED_NOK, YInvertedNOK);
|
|
ATTRIB_MAP(EGL_FRAMEBUFFER_TARGET_ANDROID, FramebufferTargetAndroid);
|
|
ATTRIB_MAP(EGL_RECORDABLE_ANDROID, RecordableAndroid);
|
|
#undef ATTRIB_MAP
|
|
default:
|
|
return -1;
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
* Update a config for a given key.
|
|
*
|
|
* Note that a valid key is not necessarily a valid attribute. There are gaps
|
|
* in the attribute enums. The separation is to catch application errors.
|
|
* Drivers should never set a key that is an invalid attribute.
|
|
*/
|
|
static inline void
|
|
_eglSetConfigKey(_EGLConfig *conf, EGLint key, EGLint val)
|
|
{
|
|
EGLint offset = _eglOffsetOfConfig(key);
|
|
assert(offset >= 0);
|
|
*((EGLint *) ((char *) conf + offset)) = val;
|
|
}
|
|
|
|
|
|
/**
|
|
* Return the value for a given key.
|
|
*/
|
|
static inline EGLint
|
|
_eglGetConfigKey(const _EGLConfig *conf, EGLint key)
|
|
{
|
|
EGLint offset = _eglOffsetOfConfig(key);
|
|
assert(offset >= 0);
|
|
return *((EGLint *) ((char *) conf + offset));
|
|
}
|
|
|
|
|
|
extern void
|
|
_eglInitConfig(_EGLConfig *config, _EGLDisplay *dpy, EGLint id);
|
|
|
|
|
|
extern EGLConfig
|
|
_eglLinkConfig(_EGLConfig *conf);
|
|
|
|
|
|
extern _EGLConfig *
|
|
_eglLookupConfig(EGLConfig config, _EGLDisplay *dpy);
|
|
|
|
|
|
/**
|
|
* Return the handle of a linked config.
|
|
*/
|
|
static inline EGLConfig
|
|
_eglGetConfigHandle(_EGLConfig *conf)
|
|
{
|
|
return (EGLConfig) conf;
|
|
}
|
|
|
|
|
|
extern EGLBoolean
|
|
_eglValidateConfig(const _EGLConfig *conf, EGLBoolean for_matching);
|
|
|
|
|
|
extern EGLBoolean
|
|
_eglMatchConfig(const _EGLConfig *conf, const _EGLConfig *criteria);
|
|
|
|
|
|
extern EGLBoolean
|
|
_eglParseConfigAttribList(_EGLConfig *conf, _EGLDisplay *dpy,
|
|
const EGLint *attrib_list);
|
|
|
|
|
|
extern EGLint
|
|
_eglCompareConfigs(const _EGLConfig *conf1, const _EGLConfig *conf2,
|
|
const _EGLConfig *criteria, EGLBoolean compare_id);
|
|
|
|
|
|
extern EGLBoolean
|
|
_eglFilterConfigArray(_EGLArray *array, EGLConfig *configs,
|
|
EGLint config_size, EGLint *num_configs,
|
|
EGLBoolean (*match)(const _EGLConfig *, void *),
|
|
EGLint (*compare)(const _EGLConfig *, const _EGLConfig *,
|
|
void *),
|
|
void *filter_data);
|
|
|
|
|
|
extern EGLBoolean
|
|
_eglChooseConfig(_EGLDriver *drv, _EGLDisplay *dpy, const EGLint *attrib_list, EGLConfig *configs, EGLint config_size, EGLint *num_config);
|
|
|
|
|
|
extern EGLBoolean
|
|
_eglGetConfigAttrib(_EGLDriver *drv, _EGLDisplay *dpy, _EGLConfig *conf, EGLint attribute, EGLint *value);
|
|
|
|
|
|
extern EGLBoolean
|
|
_eglGetConfigs(_EGLDriver *drv, _EGLDisplay *dpy, EGLConfig *configs, EGLint config_size, EGLint *num_config);
|
|
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /* EGLCONFIG_INCLUDED */
|