0,0 → 1,236 |
/************************************************************************** |
* |
* 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; |
}; |
|
|
/** |
* 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); |
#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 */ |