1/************************************************************************** 2 * 3 * Copyright 2008 Tungsten Graphics, Inc., Cedar Park, Texas. 4 * Copyright 2009-2010 Chia-I Wu <olvaffe@gmail.com> 5 * Copyright 2010-2011 LunarG, Inc. 6 * All Rights Reserved. 7 * 8 * Permission is hereby granted, free of charge, to any person obtaining a 9 * copy of this software and associated documentation files (the 10 * "Software"), to deal in the Software without restriction, including 11 * without limitation the rights to use, copy, modify, merge, publish, 12 * distribute, sub license, and/or sell copies of the Software, and to 13 * permit persons to whom the Software is furnished to do so, subject to 14 * the following conditions: 15 * 16 * The above copyright notice and this permission notice (including the 17 * next paragraph) shall be included in all copies or substantial portions 18 * of the Software. 19 * 20 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 21 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 22 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 23 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 24 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 25 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 26 * DEALINGS IN THE SOFTWARE. 27 * 28 **************************************************************************/ 29 30 31#ifndef EGLCONFIG_INCLUDED 32#define EGLCONFIG_INCLUDED 33 34 35#include <assert.h> 36#include <stddef.h> 37#include "egltypedefs.h" 38 39 40/* update _eglValidationTable and _eglOffsetOfConfig before updating this 41 * struct */ 42struct _egl_config 43{ 44 _EGLDisplay *Display; 45 46 /* core */ 47 EGLint BufferSize; 48 EGLint AlphaSize; 49 EGLint BlueSize; 50 EGLint GreenSize; 51 EGLint RedSize; 52 EGLint DepthSize; 53 EGLint StencilSize; 54 EGLint ConfigCaveat; 55 EGLint ConfigID; 56 EGLint Level; 57 EGLint MaxPbufferHeight; 58 EGLint MaxPbufferPixels; 59 EGLint MaxPbufferWidth; 60 EGLint NativeRenderable; 61 EGLint NativeVisualID; 62 EGLint NativeVisualType; 63 EGLint Samples; 64 EGLint SampleBuffers; 65 EGLint SurfaceType; 66 EGLint TransparentType; 67 EGLint TransparentBlueValue; 68 EGLint TransparentGreenValue; 69 EGLint TransparentRedValue; 70 EGLint BindToTextureRGB; 71 EGLint BindToTextureRGBA; 72 EGLint MinSwapInterval; 73 EGLint MaxSwapInterval; 74 EGLint LuminanceSize; 75 EGLint AlphaMaskSize; 76 EGLint ColorBufferType; 77 EGLint RenderableType; 78 EGLint MatchNativePixmap; 79 EGLint Conformant; 80 81 /* extensions */ 82 EGLint YInvertedNOK; 83}; 84 85 86/** 87 * Map an EGL attribute enum to the offset of the member in _EGLConfig. 88 */ 89static INLINE EGLint 90_eglOffsetOfConfig(EGLint attr) 91{ 92 switch (attr) { 93#define ATTRIB_MAP(attr, memb) case attr: return offsetof(_EGLConfig, memb) 94 /* core */ 95 ATTRIB_MAP(EGL_BUFFER_SIZE, BufferSize); 96 ATTRIB_MAP(EGL_ALPHA_SIZE, AlphaSize); 97 ATTRIB_MAP(EGL_BLUE_SIZE, BlueSize); 98 ATTRIB_MAP(EGL_GREEN_SIZE, GreenSize); 99 ATTRIB_MAP(EGL_RED_SIZE, RedSize); 100 ATTRIB_MAP(EGL_DEPTH_SIZE, DepthSize); 101 ATTRIB_MAP(EGL_STENCIL_SIZE, StencilSize); 102 ATTRIB_MAP(EGL_CONFIG_CAVEAT, ConfigCaveat); 103 ATTRIB_MAP(EGL_CONFIG_ID, ConfigID); 104 ATTRIB_MAP(EGL_LEVEL, Level); 105 ATTRIB_MAP(EGL_MAX_PBUFFER_HEIGHT, MaxPbufferHeight); 106 ATTRIB_MAP(EGL_MAX_PBUFFER_PIXELS, MaxPbufferPixels); 107 ATTRIB_MAP(EGL_MAX_PBUFFER_WIDTH, MaxPbufferWidth); 108 ATTRIB_MAP(EGL_NATIVE_RENDERABLE, NativeRenderable); 109 ATTRIB_MAP(EGL_NATIVE_VISUAL_ID, NativeVisualID); 110 ATTRIB_MAP(EGL_NATIVE_VISUAL_TYPE, NativeVisualType); 111 ATTRIB_MAP(EGL_SAMPLES, Samples); 112 ATTRIB_MAP(EGL_SAMPLE_BUFFERS, SampleBuffers); 113 ATTRIB_MAP(EGL_SURFACE_TYPE, SurfaceType); 114 ATTRIB_MAP(EGL_TRANSPARENT_TYPE, TransparentType); 115 ATTRIB_MAP(EGL_TRANSPARENT_BLUE_VALUE, TransparentBlueValue); 116 ATTRIB_MAP(EGL_TRANSPARENT_GREEN_VALUE, TransparentGreenValue); 117 ATTRIB_MAP(EGL_TRANSPARENT_RED_VALUE, TransparentRedValue); 118 ATTRIB_MAP(EGL_BIND_TO_TEXTURE_RGB, BindToTextureRGB); 119 ATTRIB_MAP(EGL_BIND_TO_TEXTURE_RGBA, BindToTextureRGBA); 120 ATTRIB_MAP(EGL_MIN_SWAP_INTERVAL, MinSwapInterval); 121 ATTRIB_MAP(EGL_MAX_SWAP_INTERVAL, MaxSwapInterval); 122 ATTRIB_MAP(EGL_LUMINANCE_SIZE, LuminanceSize); 123 ATTRIB_MAP(EGL_ALPHA_MASK_SIZE, AlphaMaskSize); 124 ATTRIB_MAP(EGL_COLOR_BUFFER_TYPE, ColorBufferType); 125 ATTRIB_MAP(EGL_RENDERABLE_TYPE, RenderableType); 126 ATTRIB_MAP(EGL_MATCH_NATIVE_PIXMAP, MatchNativePixmap); 127 ATTRIB_MAP(EGL_CONFORMANT, Conformant); 128 /* extensions */ 129 ATTRIB_MAP(EGL_Y_INVERTED_NOK, YInvertedNOK); 130#undef ATTRIB_MAP 131 default: 132 return -1; 133 } 134} 135 136 137/** 138 * Update a config for a given key. 139 * 140 * Note that a valid key is not necessarily a valid attribute. There are gaps 141 * in the attribute enums. The separation is to catch application errors. 142 * Drivers should never set a key that is an invalid attribute. 143 */ 144static INLINE void 145_eglSetConfigKey(_EGLConfig *conf, EGLint key, EGLint val) 146{ 147 EGLint offset = _eglOffsetOfConfig(key); 148 assert(offset >= 0); 149 *((EGLint *) ((char *) conf + offset)) = val; 150} 151 152 153/** 154 * Return the value for a given key. 155 */ 156static INLINE EGLint 157_eglGetConfigKey(const _EGLConfig *conf, EGLint key) 158{ 159 EGLint offset = _eglOffsetOfConfig(key); 160 assert(offset >= 0); 161 return *((EGLint *) ((char *) conf + offset)); 162} 163 164 165PUBLIC void 166_eglInitConfig(_EGLConfig *config, _EGLDisplay *dpy, EGLint id); 167 168 169PUBLIC EGLConfig 170_eglLinkConfig(_EGLConfig *conf); 171 172 173extern _EGLConfig * 174_eglLookupConfig(EGLConfig config, _EGLDisplay *dpy); 175 176 177/** 178 * Return the handle of a linked config. 179 */ 180static INLINE EGLConfig 181_eglGetConfigHandle(_EGLConfig *conf) 182{ 183 return (EGLConfig) conf; 184} 185 186 187PUBLIC EGLBoolean 188_eglValidateConfig(const _EGLConfig *conf, EGLBoolean for_matching); 189 190 191PUBLIC EGLBoolean 192_eglMatchConfig(const _EGLConfig *conf, const _EGLConfig *criteria); 193 194 195PUBLIC EGLBoolean 196_eglParseConfigAttribList(_EGLConfig *conf, _EGLDisplay *dpy, 197 const EGLint *attrib_list); 198 199 200PUBLIC EGLint 201_eglCompareConfigs(const _EGLConfig *conf1, const _EGLConfig *conf2, 202 const _EGLConfig *criteria, EGLBoolean compare_id); 203 204 205PUBLIC EGLBoolean 206_eglFilterConfigArray(_EGLArray *array, EGLConfig *configs, 207 EGLint config_size, EGLint *num_configs, 208 EGLBoolean (*match)(const _EGLConfig *, void *), 209 EGLint (*compare)(const _EGLConfig *, const _EGLConfig *, 210 void *), 211 void *filter_data); 212 213 214extern EGLBoolean 215_eglChooseConfig(_EGLDriver *drv, _EGLDisplay *dpy, const EGLint *attrib_list, EGLConfig *configs, EGLint config_size, EGLint *num_config); 216 217 218extern EGLBoolean 219_eglGetConfigAttrib(_EGLDriver *drv, _EGLDisplay *dpy, _EGLConfig *conf, EGLint attribute, EGLint *value); 220 221 222extern EGLBoolean 223_eglGetConfigs(_EGLDriver *drv, _EGLDisplay *dpy, EGLConfig *configs, EGLint config_size, EGLint *num_config); 224 225 226#endif /* EGLCONFIG_INCLUDED */ 227