Home | History | Annotate | Download | only in EGL
      1 /*
      2 * Copyright (C) 2011 The Android Open Source Project
      3 *
      4 * Licensed under the Apache License, Version 2.0 (the "License");
      5 * you may not use this file except in compliance with the License.
      6 * You may obtain a copy of the License at
      7 *
      8 * http://www.apache.org/licenses/LICENSE-2.0
      9 *
     10 * Unless required by applicable law or agreed to in writing, software
     11 * distributed under the License is distributed on an "AS IS" BASIS,
     12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13 * See the License for the specific language governing permissions and
     14 * limitations under the License.
     15 */
     16 #include "EglConfig.h"
     17 
     18 EglConfig::EglConfig(EGLint     red_size,
     19                      EGLint     green_size,
     20                      EGLint     blue_size,
     21                      EGLint     alpha_size,
     22                      EGLenum    caveat,
     23                      EGLint     config_id,
     24                      EGLint     depth_size,
     25                      EGLint     frame_buffer_level,
     26                      EGLint     max_pbuffer_width,
     27                      EGLint     max_pbuffer_height,
     28                      EGLint     max_pbuffer_size,
     29                      EGLBoolean native_renderable,
     30                      EGLint     renderable_type,
     31                      EGLint     native_visual_id,
     32                      EGLint     native_visual_type,
     33                      EGLint     samples_per_pixel,
     34                      EGLint     stencil_size,
     35                      EGLint     surface_type,
     36                      EGLenum    transparent_type,
     37                      EGLint     trans_red_val,
     38                      EGLint     trans_green_val,
     39                      EGLint     trans_blue_val,
     40                      EGLNativePixelFormatType frmt):
     41 
     42                      m_buffer_size(red_size + green_size + blue_size + alpha_size),
     43                      m_red_size(red_size),
     44                      m_green_size(green_size),
     45                      m_blue_size(blue_size),
     46                      m_alpha_size(alpha_size),
     47                      m_bind_to_tex_rgb(EGL_FALSE), //not supported for now
     48                      m_bind_to_tex_rgba(EGL_FALSE), //not supported for now
     49                      m_caveat(caveat),
     50                      m_config_id(config_id),
     51                      m_native_config_id(config_id),
     52                      m_frame_buffer_level(frame_buffer_level),
     53                      m_depth_size(depth_size),
     54                      m_max_pbuffer_width(max_pbuffer_width),
     55                      m_max_pbuffer_height(max_pbuffer_height),
     56                      m_max_pbuffer_size(max_pbuffer_size),
     57                      m_max_swap_interval(MAX_SWAP_INTERVAL),
     58                      m_min_swap_interval(MIN_SWAP_INTERVAL),
     59                      m_native_renderable(native_renderable),
     60                      m_renderable_type(renderable_type),
     61                      m_native_visual_id(native_visual_id),
     62                      m_native_visual_type(native_visual_type),
     63                      m_sample_buffers_num(samples_per_pixel > 0 ?1:0),
     64                      m_samples_per_pixel(samples_per_pixel),
     65                      m_stencil_size(stencil_size),
     66                      m_surface_type(surface_type),
     67                      m_transparent_type(transparent_type),
     68                      m_trans_red_val(trans_red_val),
     69                      m_trans_green_val(trans_green_val),
     70                      m_trans_blue_val(trans_blue_val),
     71                      m_conformant(((red_size + green_size + blue_size + alpha_size > 0)  &&
     72                                   (caveat!=EGL_NON_CONFORMANT_CONFIG)) ?
     73                                     m_renderable_type : 0),
     74                      m_nativeFormat(frmt) {};
     75 
     76 
     77     EglConfig::EglConfig(const EglConfig& conf):m_buffer_size(conf.m_buffer_size),
     78                                                 m_red_size(conf.m_red_size),
     79                                                 m_green_size(conf.m_green_size),
     80                                                 m_blue_size(conf.m_blue_size),
     81                                                 m_alpha_size(conf.m_alpha_size),
     82                                                 m_bind_to_tex_rgb(conf.m_bind_to_tex_rgb),
     83                                                 m_bind_to_tex_rgba(conf.m_bind_to_tex_rgba),
     84                                                 m_caveat(conf.m_caveat),
     85                                                 m_config_id(conf.m_config_id),
     86                                                 m_native_config_id(conf.m_native_config_id),
     87                                                 m_frame_buffer_level(conf.m_frame_buffer_level),
     88                                                 m_depth_size(conf.m_depth_size),
     89                                                 m_max_pbuffer_width(conf.m_max_pbuffer_width),
     90                                                 m_max_pbuffer_height(conf.m_max_pbuffer_height),
     91                                                 m_max_pbuffer_size(conf.m_max_pbuffer_size),
     92                                                 m_max_swap_interval(conf.m_max_swap_interval),
     93                                                 m_min_swap_interval(conf.m_min_swap_interval),
     94                                                 m_native_renderable(conf.m_native_renderable),
     95                                                 m_renderable_type(conf.m_renderable_type),
     96                                                 m_native_visual_id(conf.m_native_visual_id),
     97                                                 m_native_visual_type(conf.m_native_visual_type),
     98                                                 m_sample_buffers_num(conf.m_sample_buffers_num),
     99                                                 m_samples_per_pixel(conf.m_samples_per_pixel),
    100                                                 m_stencil_size(conf.m_stencil_size),
    101                                                 m_surface_type(conf.m_surface_type),
    102                                                 m_transparent_type(conf.m_transparent_type),
    103                                                 m_trans_red_val(conf.m_trans_red_val),
    104                                                 m_trans_green_val(conf.m_trans_green_val),
    105                                                 m_trans_blue_val(conf.m_trans_blue_val),
    106                                                 m_conformant(conf.m_conformant),
    107                                                 m_nativeFormat(conf.m_nativeFormat) {};
    108 
    109 
    110 EglConfig::EglConfig(const EglConfig& conf,
    111                      EGLint config_id,
    112                      EGLint red_size,
    113                      EGLint green_size,
    114                      EGLint blue_size,
    115                      EGLint alpha_size):
    116 
    117                      m_buffer_size(red_size + green_size + blue_size + alpha_size),
    118                      m_red_size(red_size),
    119                      m_green_size(green_size),
    120                      m_blue_size(blue_size),
    121                      m_alpha_size(alpha_size),
    122                      m_bind_to_tex_rgb(conf.m_bind_to_tex_rgb),
    123                      m_bind_to_tex_rgba(conf.m_bind_to_tex_rgba),
    124                      m_caveat(conf.m_caveat),
    125                      m_config_id(config_id),
    126                      m_native_config_id(conf.m_native_config_id),
    127                      m_frame_buffer_level(conf.m_frame_buffer_level),
    128                      m_depth_size(conf.m_depth_size),
    129                      m_max_pbuffer_width(conf.m_max_pbuffer_width),
    130                      m_max_pbuffer_height(conf.m_max_pbuffer_height),
    131                      m_max_pbuffer_size(conf.m_max_pbuffer_size),
    132                      m_max_swap_interval(conf.m_max_swap_interval),
    133                      m_min_swap_interval(conf.m_min_swap_interval),
    134                      m_native_renderable(conf.m_native_renderable),
    135                      m_renderable_type(conf.m_renderable_type),
    136                      m_native_visual_id(conf.m_native_visual_id),
    137                      m_native_visual_type(conf.m_native_visual_type),
    138                      m_sample_buffers_num(conf.m_sample_buffers_num),
    139                      m_samples_per_pixel(conf.m_samples_per_pixel),
    140                      m_stencil_size(conf.m_stencil_size),
    141                      m_surface_type(conf.m_surface_type),
    142                      m_transparent_type(conf.m_transparent_type),
    143                      m_trans_red_val(conf.m_trans_red_val),
    144                      m_trans_green_val(conf.m_trans_green_val),
    145                      m_trans_blue_val(conf.m_trans_blue_val),
    146                      m_conformant(conf.m_conformant),
    147                      m_nativeFormat(conf.m_nativeFormat) {};
    148 
    149 
    150 bool EglConfig::getConfAttrib(EGLint attrib,EGLint* val) const {
    151     switch(attrib) {
    152     case EGL_BUFFER_SIZE:
    153         *val = m_buffer_size;
    154         break;
    155     case EGL_RED_SIZE:
    156         *val = m_red_size;
    157         break;
    158     case EGL_GREEN_SIZE:
    159         *val = m_green_size;
    160         break;
    161     case EGL_BLUE_SIZE:
    162         *val = m_blue_size;
    163         break;
    164     case EGL_ALPHA_SIZE:
    165         *val = m_alpha_size;
    166         break;
    167     case EGL_BIND_TO_TEXTURE_RGB:
    168         *val = m_bind_to_tex_rgb;
    169         break;
    170     case EGL_BIND_TO_TEXTURE_RGBA:
    171         *val = m_bind_to_tex_rgba;
    172         break;
    173     case EGL_CONFIG_CAVEAT:
    174         *val = m_caveat;
    175         break;
    176     case EGL_CONFIG_ID:
    177         *val = m_config_id;
    178         break;
    179     case EGL_DEPTH_SIZE:
    180         *val = m_depth_size;
    181         break;
    182     case EGL_LEVEL:
    183         *val = m_frame_buffer_level;
    184         break;
    185     case EGL_MAX_PBUFFER_WIDTH:
    186         *val = m_max_pbuffer_width;
    187         break;
    188     case EGL_MAX_PBUFFER_HEIGHT:
    189         *val = m_max_pbuffer_height;
    190         break;
    191     case EGL_MAX_PBUFFER_PIXELS:
    192         *val = m_max_pbuffer_size;
    193         break;
    194     case EGL_MAX_SWAP_INTERVAL:
    195         *val = m_max_swap_interval;
    196         break;
    197     case EGL_MIN_SWAP_INTERVAL:
    198         *val = m_min_swap_interval;
    199         break;
    200     case EGL_NATIVE_RENDERABLE:
    201         *val = m_native_renderable;
    202         break;
    203     case EGL_NATIVE_VISUAL_ID:
    204         *val = m_native_visual_id;
    205         break;
    206     case EGL_NATIVE_VISUAL_TYPE:
    207         *val = m_native_visual_type;
    208         break;
    209     case EGL_RENDERABLE_TYPE:
    210         *val = m_renderable_type;
    211         break;
    212     case EGL_SAMPLE_BUFFERS:
    213         *val = m_sample_buffers_num;
    214         break;
    215     case EGL_SAMPLES:
    216         *val = m_samples_per_pixel;
    217         break;
    218     case EGL_STENCIL_SIZE:
    219         *val = m_stencil_size;
    220         break;
    221     case EGL_SURFACE_TYPE:
    222         *val = m_surface_type;
    223         break;
    224     case EGL_TRANSPARENT_TYPE:
    225         *val =m_transparent_type;
    226         break;
    227     case EGL_TRANSPARENT_RED_VALUE:
    228         *val = m_trans_red_val;
    229         break;
    230     case EGL_TRANSPARENT_GREEN_VALUE:
    231         *val = m_trans_green_val;
    232         break;
    233     case EGL_TRANSPARENT_BLUE_VALUE:
    234         *val = m_trans_blue_val;
    235         break;
    236     case EGL_CONFORMANT:
    237         *val = m_conformant;
    238         break;
    239     default:
    240         return false;
    241     }
    242     return true;
    243 }
    244 
    245 // checking compitabilty between *this configuration and another configuration
    246 // the compitability is checked againsed red,green,blue,buffer stencil and depth sizes
    247 bool EglConfig::compitableWith(const EglConfig& conf) const {
    248 
    249     if(m_buffer_size != conf.m_buffer_size) return false;
    250     if(m_red_size != conf.m_red_size) return false;
    251     if(m_green_size != conf.m_green_size) return false;
    252     if(m_blue_size != conf.m_blue_size) return false;
    253     if(m_depth_size != conf.m_depth_size) return false;
    254     if(m_stencil_size != conf.m_stencil_size) return false;
    255 
    256     return true;
    257 }
    258 
    259 //following the sorting EGLconfig as in spec
    260 bool EglConfig::operator<(const EglConfig& conf) const {
    261     //0
    262     if(m_conformant != conf.m_conformant) {
    263        return m_conformant != 0; //We want the conformant ones first
    264     }
    265     //1
    266     if(m_caveat != conf.m_caveat) {
    267        return m_caveat < conf.m_caveat; // EGL_NONE < EGL_SLOW_CONFIG < EGL_NON_CONFORMANT_CONFIG
    268     }
    269     //2 TODO:
    270 
    271     //3
    272     if(m_buffer_size != conf.m_buffer_size) {
    273        return m_buffer_size < conf.m_buffer_size;
    274     }
    275     //4
    276     if(m_sample_buffers_num != conf.m_sample_buffers_num) {
    277        return m_sample_buffers_num < conf.m_sample_buffers_num;
    278     }
    279     //5
    280     if(m_samples_per_pixel != conf.m_samples_per_pixel) {
    281        return m_samples_per_pixel < conf.m_samples_per_pixel;
    282     }
    283     //6
    284     if(m_depth_size != conf.m_depth_size) {
    285        return m_depth_size < conf.m_depth_size;
    286     }
    287     //7
    288     if(m_stencil_size != conf.m_stencil_size) {
    289        return m_stencil_size < conf.m_stencil_size;
    290     }
    291     //8 implementation defined
    292     if(m_native_visual_type != conf.m_native_visual_type) {
    293        return m_native_visual_type < conf.m_native_visual_type;
    294     }
    295     //9
    296     return m_config_id < conf.m_config_id;
    297 }
    298 
    299 bool EglConfig::operator>=(const EglConfig& conf) const {
    300     return  !((*this) < conf);
    301 }
    302 #define CHECK_PROP(dummy,prop_name,op) \
    303                   if((dummy.prop_name != EGL_DONT_CARE) && (dummy.prop_name op prop_name)) return false;
    304 #define CHECK_PROP_CAST(dummy,prop_name,op) \
    305                   if((((EGLint)dummy.prop_name) != EGL_DONT_CARE) && (dummy.prop_name op prop_name)) return false;
    306 //checking if config stands for all the selection crateria of dummy as defined by EGL spec
    307 bool EglConfig::choosen(const EglConfig& dummy) {
    308 
    309    //atleast
    310    CHECK_PROP(dummy,m_buffer_size,>);
    311    CHECK_PROP(dummy,m_red_size,>);
    312    CHECK_PROP(dummy,m_green_size,>);
    313    CHECK_PROP(dummy,m_blue_size,>);
    314    CHECK_PROP(dummy,m_alpha_size,>);
    315    CHECK_PROP(dummy,m_depth_size,>);
    316    CHECK_PROP(dummy,m_stencil_size,>);
    317    CHECK_PROP(dummy,m_sample_buffers_num,>);
    318    CHECK_PROP(dummy,m_samples_per_pixel,>);
    319 
    320    //exact
    321    CHECK_PROP(dummy,m_frame_buffer_level,!=);
    322    CHECK_PROP(dummy,m_config_id,!=);
    323    CHECK_PROP(dummy,m_native_visual_type,!=);
    324    CHECK_PROP(dummy,m_max_swap_interval ,!=);
    325    CHECK_PROP(dummy,m_min_swap_interval ,!=);
    326    CHECK_PROP(dummy,m_trans_red_val    ,!=);
    327    CHECK_PROP(dummy,m_trans_green_val ,!=);
    328    CHECK_PROP(dummy,m_trans_blue_val  ,!=);
    329    //exact - when cast to EGLint is needed when comparing to EGL_DONT_CARE
    330    CHECK_PROP_CAST(dummy,m_bind_to_tex_rgb ,!=);
    331    CHECK_PROP_CAST(dummy,m_bind_to_tex_rgba,!=);
    332    CHECK_PROP_CAST(dummy,m_caveat,!=);
    333    CHECK_PROP_CAST(dummy,m_native_renderable ,!=);
    334    CHECK_PROP_CAST(dummy,m_transparent_type   ,!=);
    335 
    336    //mask
    337    if(dummy.m_surface_type != EGL_DONT_CARE &&
    338     ((dummy.m_surface_type & m_surface_type) != dummy.m_surface_type)) return false;
    339 
    340    if(dummy.m_conformant != (EGLenum)EGL_DONT_CARE &&
    341     ((dummy.m_conformant & m_conformant) != dummy.m_conformant)) return false;
    342 
    343    if(dummy.m_renderable_type != EGL_DONT_CARE &&
    344     ((dummy.m_renderable_type & m_renderable_type) != dummy.m_renderable_type)) return false;
    345 
    346    //passed all checks
    347    return true;
    348 }
    349