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 #include "EglGlobalInfo.h"
18 
19 #include <functional>
20 
EglConfig(EGLint red_size,EGLint green_size,EGLint blue_size,EGLint alpha_size,EGLint alpha_mask_size,EGLenum caveat,EGLint conformant,EGLint depth_size,EGLint frame_buffer_level,EGLint max_pbuffer_width,EGLint max_pbuffer_height,EGLint max_pbuffer_size,EGLBoolean native_renderable,EGLint renderable_type,EGLint native_visual_id,EGLint native_visual_type,EGLint sample_buffers_num,EGLint samples_per_pixel,EGLint stencil_size,EGLint luminance_size,EGLint wanted_buffer_size,EGLint surface_type,EGLenum transparent_type,EGLint trans_red_val,EGLint trans_green_val,EGLint trans_blue_val,EGLBoolean recordable_android,EGLBoolean framebuffer_target_android,EglOS::PixelFormat * frmt)21 EglConfig::EglConfig(EGLint     red_size,
22                      EGLint     green_size,
23                      EGLint     blue_size,
24                      EGLint     alpha_size,
25                      EGLint     alpha_mask_size,
26                      EGLenum    caveat,
27                      EGLint     conformant,
28                      EGLint     depth_size,
29                      EGLint     frame_buffer_level,
30                      EGLint     max_pbuffer_width,
31                      EGLint     max_pbuffer_height,
32                      EGLint     max_pbuffer_size,
33                      EGLBoolean native_renderable,
34                      EGLint     renderable_type,
35                      EGLint     native_visual_id,
36                      EGLint     native_visual_type,
37                      EGLint     sample_buffers_num,
38                      EGLint     samples_per_pixel,
39                      EGLint     stencil_size,
40                      EGLint     luminance_size,
41                      EGLint     wanted_buffer_size,
42                      EGLint     surface_type,
43                      EGLenum    transparent_type,
44                      EGLint     trans_red_val,
45                      EGLint     trans_green_val,
46                      EGLint     trans_blue_val,
47                      EGLBoolean recordable_android,
48                      EGLBoolean framebuffer_target_android,
49                      EglOS::PixelFormat* frmt):
50         m_buffer_size(red_size + green_size + blue_size + alpha_size),
51         m_red_size(red_size),
52         m_green_size(green_size),
53         m_blue_size(blue_size),
54         m_alpha_size(alpha_size),
55         m_alpha_mask_size(alpha_mask_size),
56         m_bind_to_tex_rgb(EGL_FALSE), //not supported for now
57         m_bind_to_tex_rgba(EGL_FALSE), //not supported for now
58         m_caveat(caveat),
59         m_frame_buffer_level(frame_buffer_level),
60         m_depth_size(depth_size),
61         m_max_pbuffer_width(max_pbuffer_width),
62         m_max_pbuffer_height(max_pbuffer_height),
63         m_max_pbuffer_size(max_pbuffer_size),
64         m_max_swap_interval(MAX_SWAP_INTERVAL),
65         m_min_swap_interval(MIN_SWAP_INTERVAL),
66         m_native_renderable(native_renderable),
67         m_renderable_type(renderable_type),
68         m_native_visual_id(native_visual_id),
69         m_native_visual_type(native_visual_type),
70         m_sample_buffers_num(sample_buffers_num),
71         m_samples_per_pixel(samples_per_pixel),
72         m_stencil_size(stencil_size),
73         m_luminance_size(luminance_size),
74         m_wanted_buffer_size(wanted_buffer_size),
75         m_surface_type(surface_type),
76         m_transparent_type(transparent_type),
77         m_trans_red_val(trans_red_val),
78         m_trans_green_val(trans_green_val),
79         m_trans_blue_val(trans_blue_val),
80         m_recordable_android(recordable_android),
81         m_framebuffer_target_android(framebuffer_target_android),
82         m_conformant(conformant),
83         m_nativeFormat(frmt),
84         m_color_buffer_type(EGL_RGB_BUFFER) {}
85 
86 
87 #define FB_TARGET_ANDROID_BUF_SIZE(size) (size == 16  || size == 32) ? EGL_TRUE : EGL_FALSE
88 
EglConfig(EGLint red_size,EGLint green_size,EGLint blue_size,EGLint alpha_size,EGLint alpha_mask_size,EGLenum caveat,EGLint depth_size,EGLint frame_buffer_level,EGLint max_pbuffer_width,EGLint max_pbuffer_height,EGLint max_pbuffer_size,EGLBoolean native_renderable,EGLint renderable_type,EGLint native_visual_id,EGLint native_visual_type,EGLint samples_per_pixel,EGLint stencil_size,EGLint surface_type,EGLenum transparent_type,EGLint trans_red_val,EGLint trans_green_val,EGLint trans_blue_val,EGLBoolean recordable_android,EglOS::PixelFormat * frmt)89 EglConfig::EglConfig(EGLint     red_size,
90                      EGLint     green_size,
91                      EGLint     blue_size,
92                      EGLint     alpha_size,
93                      EGLint     alpha_mask_size,
94                      EGLenum    caveat,
95                      EGLint     depth_size,
96                      EGLint     frame_buffer_level,
97                      EGLint     max_pbuffer_width,
98                      EGLint     max_pbuffer_height,
99                      EGLint     max_pbuffer_size,
100                      EGLBoolean native_renderable,
101                      EGLint     renderable_type,
102                      EGLint     native_visual_id,
103                      EGLint     native_visual_type,
104                      EGLint     samples_per_pixel,
105                      EGLint     stencil_size,
106                      EGLint     surface_type,
107                      EGLenum    transparent_type,
108                      EGLint     trans_red_val,
109                      EGLint     trans_green_val,
110                      EGLint     trans_blue_val,
111                      EGLBoolean recordable_android,
112                      EglOS::PixelFormat* frmt):
113         m_buffer_size(red_size + green_size + blue_size + alpha_size),
114         m_red_size(red_size),
115         m_green_size(green_size),
116         m_blue_size(blue_size),
117         m_alpha_size(alpha_size),
118         m_alpha_mask_size(alpha_mask_size),
119         m_bind_to_tex_rgb(EGL_FALSE), //not supported for now
120         m_bind_to_tex_rgba(EGL_FALSE), //not supported for now
121         m_caveat(caveat),
122         m_frame_buffer_level(frame_buffer_level),
123         m_depth_size(depth_size),
124         m_max_pbuffer_width(max_pbuffer_width),
125         m_max_pbuffer_height(max_pbuffer_height),
126         m_max_pbuffer_size(max_pbuffer_size),
127         m_max_swap_interval(MAX_SWAP_INTERVAL),
128         m_min_swap_interval(MIN_SWAP_INTERVAL),
129         m_native_renderable(native_renderable),
130         m_renderable_type(renderable_type),
131         m_native_visual_id(native_visual_id),
132         m_native_visual_type(native_visual_type),
133         m_sample_buffers_num(samples_per_pixel > 0 ? 1 : 0),
134         m_samples_per_pixel(samples_per_pixel),
135         m_stencil_size(stencil_size),
136         m_luminance_size(0),
137         m_wanted_buffer_size(EGL_DONT_CARE),
138         m_surface_type(surface_type),
139         m_transparent_type(transparent_type),
140         m_trans_red_val(trans_red_val),
141         m_trans_green_val(trans_green_val),
142         m_trans_blue_val(trans_blue_val),
143         m_recordable_android(recordable_android),
144         m_framebuffer_target_android(EGL_FALSE),
145         m_conformant(((red_size + green_size + blue_size + alpha_size > 0)  &&
146                      (caveat != EGL_NON_CONFORMANT_CONFIG)) ?
147                      m_renderable_type : 0),
148         m_nativeFormat(frmt),
149         m_color_buffer_type(EGL_RGB_BUFFER) {}
150 
151 
EglConfig(const EglConfig & conf)152 EglConfig::EglConfig(const EglConfig& conf) :
153         m_buffer_size(conf.m_buffer_size),
154         m_red_size(conf.m_red_size),
155         m_green_size(conf.m_green_size),
156         m_blue_size(conf.m_blue_size),
157         m_alpha_size(conf.m_alpha_size),
158         m_alpha_mask_size(conf.m_alpha_mask_size),
159         m_bind_to_tex_rgb(conf.m_bind_to_tex_rgb),
160         m_bind_to_tex_rgba(conf.m_bind_to_tex_rgba),
161         m_caveat(conf.m_caveat),
162         m_config_id(conf.m_config_id),
163         m_frame_buffer_level(conf.m_frame_buffer_level),
164         m_depth_size(conf.m_depth_size),
165         m_max_pbuffer_width(conf.m_max_pbuffer_width),
166         m_max_pbuffer_height(conf.m_max_pbuffer_height),
167         m_max_pbuffer_size(conf.m_max_pbuffer_size),
168         m_max_swap_interval(conf.m_max_swap_interval),
169         m_min_swap_interval(conf.m_min_swap_interval),
170         m_native_renderable(conf.m_native_renderable),
171         m_renderable_type(conf.m_renderable_type),
172         m_native_visual_id(conf.m_native_visual_id),
173         m_native_visual_type(conf.m_native_visual_type),
174         m_sample_buffers_num(conf.m_sample_buffers_num),
175         m_samples_per_pixel(conf.m_samples_per_pixel),
176         m_stencil_size(conf.m_stencil_size),
177         m_luminance_size(conf.m_luminance_size),
178         m_wanted_buffer_size(conf.m_wanted_buffer_size),
179         m_surface_type(conf.m_surface_type),
180         m_transparent_type(conf.m_transparent_type),
181         m_trans_red_val(conf.m_trans_red_val),
182         m_trans_green_val(conf.m_trans_green_val),
183         m_trans_blue_val(conf.m_trans_blue_val),
184         m_recordable_android(conf.m_recordable_android),
185         m_framebuffer_target_android(conf.m_framebuffer_target_android),
186         m_conformant(conf.m_conformant),
187         m_nativeFormat(conf.m_nativeFormat->clone()),
188         m_color_buffer_type(EGL_RGB_BUFFER) {}
189 
190 
EglConfig(const EglConfig & conf,EGLint red_size,EGLint green_size,EGLint blue_size,EGLint alpha_size)191 EglConfig::EglConfig(const EglConfig& conf,
192                      EGLint red_size,
193                      EGLint green_size,
194                      EGLint blue_size,
195                      EGLint alpha_size) :
196         m_buffer_size(red_size + green_size + blue_size + alpha_size),
197         m_red_size(red_size),
198         m_green_size(green_size),
199         m_blue_size(blue_size),
200         m_alpha_size(alpha_size),
201         m_alpha_mask_size(conf.m_alpha_mask_size),
202         m_bind_to_tex_rgb(conf.m_bind_to_tex_rgb),
203         m_bind_to_tex_rgba(conf.m_bind_to_tex_rgba),
204         m_caveat(conf.m_caveat),
205         m_frame_buffer_level(conf.m_frame_buffer_level),
206         m_depth_size(conf.m_depth_size),
207         m_max_pbuffer_width(conf.m_max_pbuffer_width),
208         m_max_pbuffer_height(conf.m_max_pbuffer_height),
209         m_max_pbuffer_size(conf.m_max_pbuffer_size),
210         m_max_swap_interval(conf.m_max_swap_interval),
211         m_min_swap_interval(conf.m_min_swap_interval),
212         m_native_renderable(conf.m_native_renderable),
213         m_renderable_type(conf.m_renderable_type),
214         m_native_visual_id(conf.m_native_visual_id),
215         m_native_visual_type(conf.m_native_visual_type),
216         m_sample_buffers_num(conf.m_sample_buffers_num),
217         m_samples_per_pixel(conf.m_samples_per_pixel),
218         m_stencil_size(conf.m_stencil_size),
219         m_luminance_size(conf.m_luminance_size),
220         m_wanted_buffer_size(conf.m_wanted_buffer_size),
221         m_surface_type(conf.m_surface_type),
222         m_transparent_type(conf.m_transparent_type),
223         m_trans_red_val(conf.m_trans_red_val),
224         m_trans_green_val(conf.m_trans_green_val),
225         m_trans_blue_val(conf.m_trans_blue_val),
226         m_recordable_android(conf.m_recordable_android),
227         m_framebuffer_target_android(FB_TARGET_ANDROID_BUF_SIZE(m_buffer_size)),
228         m_conformant(conf.m_conformant),
229         m_nativeFormat(conf.m_nativeFormat->clone()),
230         m_color_buffer_type(EGL_RGB_BUFFER) {};
231 
getConfAttrib(EGLint attrib,EGLint * val) const232 bool EglConfig::getConfAttrib(EGLint attrib,EGLint* val) const {
233     switch(attrib) {
234     case EGL_BUFFER_SIZE:
235         *val = m_buffer_size;
236         break;
237     case EGL_RED_SIZE:
238         *val = m_red_size;
239         break;
240     case EGL_GREEN_SIZE:
241         *val = m_green_size;
242         break;
243     case EGL_BLUE_SIZE:
244         *val = m_blue_size;
245         break;
246     case EGL_LUMINANCE_SIZE:
247         *val = m_luminance_size;
248         break;
249     case EGL_ALPHA_SIZE:
250         *val = m_alpha_size;
251         break;
252     case EGL_ALPHA_MASK_SIZE:
253         *val = m_alpha_mask_size;
254         break;
255     case EGL_BIND_TO_TEXTURE_RGB:
256         *val = m_bind_to_tex_rgb;
257         break;
258     case EGL_BIND_TO_TEXTURE_RGBA:
259         *val = m_bind_to_tex_rgba;
260         break;
261     case EGL_CONFIG_CAVEAT:
262         *val = m_caveat;
263         break;
264     case EGL_CONFORMANT:
265         *val = m_conformant;
266         break;
267     case EGL_CONFIG_ID:
268         *val = m_config_id;
269         break;
270     case EGL_DEPTH_SIZE:
271         *val = m_depth_size;
272         break;
273     case EGL_LEVEL:
274         *val = m_frame_buffer_level;
275         break;
276     case EGL_MAX_PBUFFER_WIDTH:
277         *val = m_max_pbuffer_width;
278         break;
279     case EGL_MAX_PBUFFER_HEIGHT:
280         *val = m_max_pbuffer_height;
281         break;
282     case EGL_MAX_PBUFFER_PIXELS:
283         *val = m_max_pbuffer_size;
284         break;
285     case EGL_MAX_SWAP_INTERVAL:
286         *val = m_max_swap_interval;
287         break;
288     case EGL_MIN_SWAP_INTERVAL:
289         *val = m_min_swap_interval;
290         break;
291     case EGL_NATIVE_RENDERABLE:
292         *val = m_native_renderable;
293         break;
294     case EGL_NATIVE_VISUAL_ID:
295         *val = m_native_visual_id;
296         break;
297     case EGL_NATIVE_VISUAL_TYPE:
298         *val = m_native_visual_type;
299         break;
300     case EGL_RENDERABLE_TYPE:
301         *val = m_renderable_type;
302         break;
303     case EGL_SAMPLE_BUFFERS:
304         *val = m_sample_buffers_num;
305         break;
306     case EGL_SAMPLES:
307         *val = m_samples_per_pixel;
308         break;
309     case EGL_STENCIL_SIZE:
310         *val = m_stencil_size;
311         break;
312     case EGL_SURFACE_TYPE:
313         *val = m_surface_type;
314         break;
315     case EGL_COLOR_BUFFER_TYPE:
316         *val = EGL_RGB_BUFFER;
317         break;
318     case EGL_TRANSPARENT_TYPE:
319         *val =m_transparent_type;
320         break;
321     case EGL_TRANSPARENT_RED_VALUE:
322         *val = m_trans_red_val;
323         break;
324     case EGL_TRANSPARENT_GREEN_VALUE:
325         *val = m_trans_green_val;
326         break;
327     case EGL_TRANSPARENT_BLUE_VALUE:
328         *val = m_trans_blue_val;
329         break;
330     case EGL_RECORDABLE_ANDROID:
331         *val = m_recordable_android;
332         break;
333     case EGL_FRAMEBUFFER_TARGET_ANDROID:
334         *val = m_framebuffer_target_android;
335         break;
336     default:
337         return false;
338     }
339     return true;
340 }
341 
getConfAttrib(EGLint attrib) const342 EGLint EglConfig::getConfAttrib(EGLint attrib) const {
343     EGLint res = 0;
344     getConfAttrib(attrib, &res);
345     return res;
346 }
347 
348 // checking compitabilty between *this configuration and another configuration
349 // the compitability is checked againsed red,green,blue,buffer stencil and depth sizes
compatibleWith(const EglConfig & conf) const350 bool EglConfig::compatibleWith(const EglConfig& conf) const {
351 
352     return m_buffer_size == conf.m_buffer_size &&
353            m_red_size == conf.m_red_size &&
354            m_green_size == conf.m_green_size &&
355            m_blue_size == conf.m_blue_size &&
356            m_depth_size == conf.m_depth_size &&
357            m_stencil_size == conf.m_stencil_size;
358 }
359 
360 // For fixing dEQP EGL tests. This is based on the EGL spec
361 // and is inspired by the dEQP EGL test code itself.
ColorBufferTypeVal(EGLenum type)362 static int ColorBufferTypeVal(EGLenum type) {
363     switch (type) {
364     case EGL_RGB_BUFFER: return 0;
365     case EGL_LUMINANCE_BUFFER: return 1;
366     case EGL_YUV_BUFFER_EXT: return 2;
367     }
368     return 3;
369 }
370 
371 //following the sorting EGLconfig as in spec
372 // Note that we also need to sort during eglChooseConfig
373 // when returning configs to user, as sorting order
374 // can depend on which attributes the user has requested.
operator <(const EglConfig & conf) const375 bool EglConfig::operator<(const EglConfig& conf) const {
376     //0
377     if(m_conformant != conf.m_conformant) {
378        return m_conformant != 0; //We want the conformant ones first
379     }
380     //1
381     if(m_caveat != conf.m_caveat) {
382        return m_caveat < conf.m_caveat; // EGL_NONE < EGL_SLOW_CONFIG < EGL_NON_CONFORMANT_CONFIG
383     }
384 
385     //2
386     if (m_color_buffer_type != conf.m_color_buffer_type) {
387         return ColorBufferTypeVal(m_color_buffer_type) <
388                ColorBufferTypeVal(conf.m_color_buffer_type);
389     }
390 
391     //3
392     if (m_buffer_size != conf.m_buffer_size) {
393         return m_buffer_size < conf.m_buffer_size;
394     }
395 
396     //4
397     if(m_sample_buffers_num != conf.m_sample_buffers_num) {
398        return m_sample_buffers_num < conf.m_sample_buffers_num;
399     }
400     //5
401     if(m_samples_per_pixel != conf.m_samples_per_pixel) {
402        return m_samples_per_pixel < conf.m_samples_per_pixel;
403     }
404     //6
405     if(m_depth_size != conf.m_depth_size) {
406        return m_depth_size < conf.m_depth_size;
407     }
408     //7
409     if(m_stencil_size != conf.m_stencil_size) {
410        return m_stencil_size < conf.m_stencil_size;
411     }
412 
413     return m_config_id < conf.m_config_id;
414 }
415 
operator >=(const EglConfig & conf) const416 bool EglConfig::operator>=(const EglConfig& conf) const {
417     return  !((*this) < conf);
418 }
419 
420 // static
operator ==(const EglConfig & other) const421 bool EglConfig::operator==(const EglConfig& other) const {
422 #define EGLCONFIG_EQ(field) \
423     (field == other.field)
424 
425     return
426     EGLCONFIG_EQ(m_buffer_size) &&
427     EGLCONFIG_EQ(m_red_size) &&
428     EGLCONFIG_EQ(m_green_size) &&
429     EGLCONFIG_EQ(m_blue_size) &&
430     EGLCONFIG_EQ(m_alpha_size) &&
431     EGLCONFIG_EQ(m_alpha_mask_size) &&
432     EGLCONFIG_EQ(m_bind_to_tex_rgb) &&
433     EGLCONFIG_EQ(m_bind_to_tex_rgba) &&
434     EGLCONFIG_EQ(m_caveat) &&
435     // Not using config id, we are only concerned with properties.
436     // EGLCONFIG_EQ(m_config_id) &&
437     // EGLCONFIG_EQ(m_native_config_id) &&
438     EGLCONFIG_EQ(m_frame_buffer_level) &&
439     EGLCONFIG_EQ(m_depth_size) &&
440     EGLCONFIG_EQ(m_max_pbuffer_width) &&
441     EGLCONFIG_EQ(m_max_pbuffer_height) &&
442     EGLCONFIG_EQ(m_max_pbuffer_size) &&
443     EGLCONFIG_EQ(m_max_swap_interval) &&
444     EGLCONFIG_EQ(m_min_swap_interval) &&
445     EGLCONFIG_EQ(m_native_renderable) &&
446     EGLCONFIG_EQ(m_renderable_type) &&
447     // EGLCONFIG_EQ(m_native_visual_id) &&
448     // EGLCONFIG_EQ(m_native_visual_type) &&
449     EGLCONFIG_EQ(m_sample_buffers_num) &&
450     EGLCONFIG_EQ(m_samples_per_pixel) &&
451     EGLCONFIG_EQ(m_stencil_size) &&
452     EGLCONFIG_EQ(m_luminance_size) &&
453     // EGLCONFIG_EQ(m_wanted_buffer_size) &&
454     EGLCONFIG_EQ(m_surface_type) &&
455     EGLCONFIG_EQ(m_transparent_type) &&
456     EGLCONFIG_EQ(m_trans_red_val) &&
457     EGLCONFIG_EQ(m_trans_green_val) &&
458     EGLCONFIG_EQ(m_trans_blue_val) &&
459     EGLCONFIG_EQ(m_recordable_android) &&
460     EGLCONFIG_EQ(m_framebuffer_target_android) &&
461     EGLCONFIG_EQ(m_conformant) &&
462     EGLCONFIG_EQ(m_color_buffer_type);
463 
464 #undef EGLCONFIG_EQ
465 }
466 
u32hash() const467 uint32_t EglConfig::u32hash() const {
468     uint32_t res = 0xabcd9001;
469 
470 #define EGLCONFIG_HASH(field) \
471     res = res * 16777213 + \
472           std::hash<unsigned int>()((unsigned int)field); \
473 
474     EGLCONFIG_HASH(m_buffer_size)
475     EGLCONFIG_HASH(m_red_size)
476     EGLCONFIG_HASH(m_green_size)
477     EGLCONFIG_HASH(m_blue_size)
478     EGLCONFIG_HASH(m_alpha_size)
479     EGLCONFIG_HASH(m_alpha_mask_size)
480     EGLCONFIG_HASH(m_bind_to_tex_rgb)
481     EGLCONFIG_HASH(m_bind_to_tex_rgba)
482     EGLCONFIG_HASH(m_caveat)
483     // Only properties
484     // EGLCONFIG_HASH(m_config_id)
485     // EGLCONFIG_HASH(m_native_config_id)
486     EGLCONFIG_HASH(m_frame_buffer_level)
487     EGLCONFIG_HASH(m_depth_size)
488     EGLCONFIG_HASH(m_max_pbuffer_width)
489     EGLCONFIG_HASH(m_max_pbuffer_height)
490     EGLCONFIG_HASH(m_max_pbuffer_size)
491     EGLCONFIG_HASH(m_max_swap_interval)
492     EGLCONFIG_HASH(m_min_swap_interval)
493     EGLCONFIG_HASH(m_native_renderable)
494     EGLCONFIG_HASH(m_renderable_type)
495     // EGLCONFIG_HASH(m_native_visual_id)
496     // EGLCONFIG_HASH(m_native_visual_type)
497     EGLCONFIG_HASH(m_sample_buffers_num)
498     EGLCONFIG_HASH(m_samples_per_pixel)
499     EGLCONFIG_HASH(m_stencil_size)
500     EGLCONFIG_HASH(m_luminance_size)
501     // EGLCONFIG_HASH(m_wanted_buffer_size)
502     EGLCONFIG_HASH(m_surface_type)
503     EGLCONFIG_HASH(m_transparent_type)
504     EGLCONFIG_HASH(m_trans_red_val)
505     EGLCONFIG_HASH(m_trans_green_val)
506     EGLCONFIG_HASH(m_trans_blue_val)
507     EGLCONFIG_HASH(m_recordable_android)
508     EGLCONFIG_HASH(m_framebuffer_target_android)
509     EGLCONFIG_HASH(m_conformant)
510     EGLCONFIG_HASH(m_color_buffer_type)
511 
512 #undef EGLCONFIG_HASH
513     return res;
514 }
515 
516 //checking if config stands for all the selection crateria of dummy as defined by EGL spec
517 #define CHECK_PROP(dummy,prop_name,op) \
518     if((dummy.prop_name != EGL_DONT_CARE) && (dummy.prop_name op prop_name)) { \
519         CHOOSE_CONFIG_DLOG(#prop_name " does not match: %d vs %d", dummy.prop_name, prop_name); \
520         return false; \
521     } else { \
522         CHOOSE_CONFIG_DLOG(#prop_name " compatible."); \
523     } \
524 
525 #define CHECK_PROP_CAST(dummy,prop_name,op) \
526     if((((EGLint)dummy.prop_name) != EGL_DONT_CARE) && (dummy.prop_name op prop_name)) { \
527         CHOOSE_CONFIG_DLOG(#prop_name " does not match."); \
528         return false; \
529     } else { \
530         CHOOSE_CONFIG_DLOG(#prop_name " compatible."); \
531     } \
532 
chosen(const EglConfig & dummy) const533 bool EglConfig::chosen(const EglConfig& dummy) const {
534 
535    CHOOSE_CONFIG_DLOG("checking config id 0x%x for compatibility\n", m_config_id);
536    CHOOSE_CONFIG_DLOG("config info for 0x%x: "
537                       "rgbads %d %d %d %d %d %d alpha mask size %d "
538                       "samp spp %d %d fblvl %d n.vistype %d maxswap %d minswap %d"
539                       "transrgb %d %d %d caveat %d n.renderable %d "
540                       "transptype %d surftype %d conform %d rendertype %d",
541                       m_config_id,
542 
543                       m_red_size,
544                       m_green_size,
545                       m_blue_size,
546                       m_alpha_size,
547                       m_depth_size,
548                       m_stencil_size,
549 
550                       m_alpha_mask_size,
551 
552                       m_sample_buffers_num,
553                       m_samples_per_pixel,
554 
555                       m_frame_buffer_level,
556 
557                       m_native_visual_type,
558 
559                       m_max_swap_interval,
560                       m_min_swap_interval,
561 
562                       m_trans_red_val,
563                       m_trans_green_val,
564                       m_trans_blue_val,
565 
566                       m_caveat,
567                       m_native_renderable,
568 
569                       m_transparent_type,
570                       m_surface_type,
571                       m_conformant,
572                       m_renderable_type);
573 
574    //atleast
575    CHECK_PROP(dummy,m_buffer_size,>);
576    CHECK_PROP(dummy,m_red_size,>);
577    CHECK_PROP(dummy,m_green_size,>);
578    CHECK_PROP(dummy,m_blue_size,>);
579    CHECK_PROP(dummy,m_alpha_size,>);
580    CHECK_PROP(dummy,m_alpha_mask_size,>);
581    CHECK_PROP(dummy,m_depth_size,>);
582    CHECK_PROP(dummy,m_stencil_size,>);
583 
584    CHECK_PROP(dummy,m_luminance_size,>);
585 
586    // We distinguish here between the buffer size
587    // desired by the user (dummy.m_wanted_buffer_size)
588    // versus the actual config's buffer size
589    // (m_wanted_buffer_size).
590    if (dummy.isWantedAttrib(EGL_BUFFER_SIZE)) {
591        if (dummy.m_wanted_buffer_size != EGL_DONT_CARE &&
592            dummy.m_wanted_buffer_size > m_buffer_size) {
593            return false;
594        }
595    }
596 
597    CHECK_PROP(dummy,m_sample_buffers_num,>);
598    CHECK_PROP(dummy,m_samples_per_pixel,>);
599 
600    //exact
601    CHECK_PROP(dummy,m_frame_buffer_level,!=);
602    CHECK_PROP(dummy,m_config_id,!=);
603 
604    CHECK_PROP(dummy,m_native_visual_type,!=);
605    CHECK_PROP(dummy,m_max_swap_interval ,!=);
606    CHECK_PROP(dummy,m_min_swap_interval ,!=);
607    CHECK_PROP(dummy,m_trans_red_val    ,!=);
608    CHECK_PROP(dummy,m_trans_green_val ,!=);
609    CHECK_PROP(dummy,m_trans_blue_val  ,!=);
610    //exact - when cast to EGLint is needed when comparing to EGL_DONT_CARE
611    CHECK_PROP_CAST(dummy,m_bind_to_tex_rgb ,!=);
612    CHECK_PROP_CAST(dummy,m_bind_to_tex_rgba,!=);
613    CHECK_PROP_CAST(dummy,m_caveat,!=);
614    CHECK_PROP_CAST(dummy,m_native_renderable ,!=);
615    CHECK_PROP_CAST(dummy,m_transparent_type   ,!=);
616 
617    //mask
618    if(dummy.m_surface_type != EGL_DONT_CARE &&
619       ((dummy.m_surface_type &
620        (m_surface_type | EGL_WINDOW_BIT)) != // Note that we always advertise our configs'
621                                              // EGL_SURFACE_TYPE has having EGL_WINDOW_BIT
622                                              // capability, so we must also respect that here.
623        dummy.m_surface_type)) {
624 
625        return false;
626    }
627 
628    if(dummy.m_conformant != (EGLenum)EGL_DONT_CARE &&
629       ((dummy.m_conformant & m_conformant) != dummy.m_conformant)) {
630        CHOOSE_CONFIG_DLOG("m_conformant does not match.");
631        return false;
632    }
633 
634    EGLint renderableType = dummy.m_renderable_type;
635    if (renderableType != EGL_DONT_CARE &&
636        ((renderableType & m_renderable_type) != renderableType)) {
637        CHOOSE_CONFIG_DLOG("m_renderable_type does not match.");
638        return false;
639    }
640 
641    if ((EGLint)(dummy.m_framebuffer_target_android) != EGL_DONT_CARE &&
642        dummy.m_framebuffer_target_android !=
643        m_framebuffer_target_android) {
644        CHOOSE_CONFIG_DLOG("m_framebuffer_target_android does not match.");
645        return false;
646    }
647 
648    CHOOSE_CONFIG_DLOG("config id 0x%x passes.", m_config_id);
649 
650    //passed all checks
651    return true;
652 }
653