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