summaryrefslogtreecommitdiffstats
path: root/emulator/opengl/host/libs/Translator/EGL/EglConfig.cpp
blob: 66a691c5e11c4c21e8f933cfddfa8b0e3899567c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
/*
* Copyright (C) 2011 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "EglConfig.h"

EglConfig::EglConfig(EGLint     red_size,
                     EGLint     green_size,
                     EGLint     blue_size,
                     EGLint     alpha_size,
                     EGLenum    caveat,
                     EGLint     config_id,
                     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,
                     EGLNativePixelFormatType frmt):

                     m_buffer_size(red_size + green_size + blue_size + alpha_size),
                     m_red_size(red_size),
                     m_green_size(green_size),
                     m_blue_size(blue_size),
                     m_alpha_size(alpha_size),
                     m_bind_to_tex_rgb(EGL_FALSE), //not supported for now
                     m_bind_to_tex_rgba(EGL_FALSE), //not supported for now
                     m_caveat(caveat),
                     m_config_id(config_id),
                     m_native_config_id(config_id),
                     m_frame_buffer_level(frame_buffer_level),
                     m_depth_size(depth_size),
                     m_max_pbuffer_width(max_pbuffer_width),
                     m_max_pbuffer_height(max_pbuffer_height),
                     m_max_pbuffer_size(max_pbuffer_size),
                     m_max_swap_interval(MAX_SWAP_INTERVAL),
                     m_min_swap_interval(MIN_SWAP_INTERVAL),
                     m_native_renderable(native_renderable),
                     m_renderable_type(renderable_type),
                     m_native_visual_id(native_visual_id),
                     m_native_visual_type(native_visual_type),
                     m_sample_buffers_num(samples_per_pixel > 0 ?1:0),
                     m_samples_per_pixel(samples_per_pixel),
                     m_stencil_size(stencil_size),
                     m_surface_type(surface_type),
                     m_transparent_type(transparent_type),
                     m_trans_red_val(trans_red_val),
                     m_trans_green_val(trans_green_val),
                     m_trans_blue_val(trans_blue_val),
                     m_conformant(((red_size + green_size + blue_size + alpha_size > 0)  &&
                                  (caveat!=EGL_NON_CONFORMANT_CONFIG)) ?
                                    m_renderable_type : 0),
                     m_nativeFormat(frmt) {};


    EglConfig::EglConfig(const EglConfig& conf):m_buffer_size(conf.m_buffer_size),
                                                m_red_size(conf.m_red_size),
                                                m_green_size(conf.m_green_size),
                                                m_blue_size(conf.m_blue_size),
                                                m_alpha_size(conf.m_alpha_size),
                                                m_bind_to_tex_rgb(conf.m_bind_to_tex_rgb),
                                                m_bind_to_tex_rgba(conf.m_bind_to_tex_rgba),
                                                m_caveat(conf.m_caveat),
                                                m_config_id(conf.m_config_id),
                                                m_native_config_id(conf.m_native_config_id),
                                                m_frame_buffer_level(conf.m_frame_buffer_level),
                                                m_depth_size(conf.m_depth_size),
                                                m_max_pbuffer_width(conf.m_max_pbuffer_width),
                                                m_max_pbuffer_height(conf.m_max_pbuffer_height),
                                                m_max_pbuffer_size(conf.m_max_pbuffer_size),
                                                m_max_swap_interval(conf.m_max_swap_interval),
                                                m_min_swap_interval(conf.m_min_swap_interval),
                                                m_native_renderable(conf.m_native_renderable),
                                                m_renderable_type(conf.m_renderable_type),
                                                m_native_visual_id(conf.m_native_visual_id),
                                                m_native_visual_type(conf.m_native_visual_type),
                                                m_sample_buffers_num(conf.m_sample_buffers_num),
                                                m_samples_per_pixel(conf.m_samples_per_pixel),
                                                m_stencil_size(conf.m_stencil_size),
                                                m_surface_type(conf.m_surface_type),
                                                m_transparent_type(conf.m_transparent_type),
                                                m_trans_red_val(conf.m_trans_red_val),
                                                m_trans_green_val(conf.m_trans_green_val),
                                                m_trans_blue_val(conf.m_trans_blue_val),
                                                m_conformant(conf.m_conformant),
                                                m_nativeFormat(conf.m_nativeFormat) {};


EglConfig::EglConfig(const EglConfig& conf,
                     EGLint config_id,
                     EGLint red_size,
                     EGLint green_size,
                     EGLint blue_size,
                     EGLint alpha_size):

                     m_buffer_size(red_size + green_size + blue_size + alpha_size),
                     m_red_size(red_size),
                     m_green_size(green_size),
                     m_blue_size(blue_size),
                     m_alpha_size(alpha_size),
                     m_bind_to_tex_rgb(conf.m_bind_to_tex_rgb),
                     m_bind_to_tex_rgba(conf.m_bind_to_tex_rgba),
                     m_caveat(conf.m_caveat),
                     m_config_id(config_id),
                     m_native_config_id(conf.m_native_config_id),
                     m_frame_buffer_level(conf.m_frame_buffer_level),
                     m_depth_size(conf.m_depth_size),
                     m_max_pbuffer_width(conf.m_max_pbuffer_width),
                     m_max_pbuffer_height(conf.m_max_pbuffer_height),
                     m_max_pbuffer_size(conf.m_max_pbuffer_size),
                     m_max_swap_interval(conf.m_max_swap_interval),
                     m_min_swap_interval(conf.m_min_swap_interval),
                     m_native_renderable(conf.m_native_renderable),
                     m_renderable_type(conf.m_renderable_type),
                     m_native_visual_id(conf.m_native_visual_id),
                     m_native_visual_type(conf.m_native_visual_type),
                     m_sample_buffers_num(conf.m_sample_buffers_num),
                     m_samples_per_pixel(conf.m_samples_per_pixel),
                     m_stencil_size(conf.m_stencil_size),
                     m_surface_type(conf.m_surface_type),
                     m_transparent_type(conf.m_transparent_type),
                     m_trans_red_val(conf.m_trans_red_val),
                     m_trans_green_val(conf.m_trans_green_val),
                     m_trans_blue_val(conf.m_trans_blue_val),
                     m_conformant(conf.m_conformant),
                     m_nativeFormat(conf.m_nativeFormat) {};


bool EglConfig::getConfAttrib(EGLint attrib,EGLint* val) const {
    switch(attrib) {
    case EGL_BUFFER_SIZE:
        *val = m_buffer_size;
        break;
    case EGL_RED_SIZE:
        *val = m_red_size;
        break;
    case EGL_GREEN_SIZE:
        *val = m_green_size;
        break;
    case EGL_BLUE_SIZE:
        *val = m_blue_size;
        break;
    case EGL_ALPHA_SIZE:
        *val = m_alpha_size;
        break;
    case EGL_BIND_TO_TEXTURE_RGB:
        *val = m_bind_to_tex_rgb;
        break;
    case EGL_BIND_TO_TEXTURE_RGBA:
        *val = m_bind_to_tex_rgba;
        break;
    case EGL_CONFIG_CAVEAT:
        *val = m_caveat;
        break;
    case EGL_CONFIG_ID:
        *val = m_config_id;
        break;
    case EGL_DEPTH_SIZE:
        *val = m_depth_size;
        break;
    case EGL_LEVEL:
        *val = m_frame_buffer_level;
        break;
    case EGL_MAX_PBUFFER_WIDTH:
        *val = m_max_pbuffer_width;
        break;
    case EGL_MAX_PBUFFER_HEIGHT:
        *val = m_max_pbuffer_height;
        break;
    case EGL_MAX_PBUFFER_PIXELS:
        *val = m_max_pbuffer_size;
        break;
    case EGL_MAX_SWAP_INTERVAL:
        *val = m_max_swap_interval;
        break;
    case EGL_MIN_SWAP_INTERVAL:
        *val = m_min_swap_interval;
        break;
    case EGL_NATIVE_RENDERABLE:
        *val = m_native_renderable;
        break;
    case EGL_NATIVE_VISUAL_ID:
        *val = m_native_visual_id;
        break;
    case EGL_NATIVE_VISUAL_TYPE:
        *val = m_native_visual_type;
        break;
    case EGL_RENDERABLE_TYPE:
        *val = m_renderable_type;
        break;
    case EGL_SAMPLE_BUFFERS:
        *val = m_sample_buffers_num;
        break;
    case EGL_SAMPLES:
        *val = m_samples_per_pixel;
        break;
    case EGL_STENCIL_SIZE:
        *val = m_stencil_size;
        break;
    case EGL_SURFACE_TYPE:
        *val = m_surface_type;
        break;
    case EGL_TRANSPARENT_TYPE:
        *val =m_transparent_type;
        break;
    case EGL_TRANSPARENT_RED_VALUE:
        *val = m_trans_red_val;
        break;
    case EGL_TRANSPARENT_GREEN_VALUE:
        *val = m_trans_green_val;
        break;
    case EGL_TRANSPARENT_BLUE_VALUE:
        *val = m_trans_blue_val;
        break;
    case EGL_CONFORMANT:
        *val = m_conformant;
        break;
    default:
        return false;
    }
    return true;
}

// checking compitabilty between *this configuration and another configuration
// the compitability is checked againsed red,green,blue,buffer stencil and depth sizes
bool EglConfig::compitableWith(const EglConfig& conf) const {

    if(m_buffer_size != conf.m_buffer_size) return false;
    if(m_red_size != conf.m_red_size) return false;
    if(m_green_size != conf.m_green_size) return false;
    if(m_blue_size != conf.m_blue_size) return false;
    if(m_depth_size != conf.m_depth_size) return false;
    if(m_stencil_size != conf.m_stencil_size) return false;

    return true;
}

//following the sorting EGLconfig as in spec
bool EglConfig::operator<(const EglConfig& conf) const {
    //0
    if(m_conformant != conf.m_conformant) {
       return m_conformant != 0; //We want the conformant ones first
    }
    //1
    if(m_caveat != conf.m_caveat) {
       return m_caveat < conf.m_caveat; // EGL_NONE < EGL_SLOW_CONFIG < EGL_NON_CONFORMANT_CONFIG
    }
    //2 TODO:

    //3
    if(m_buffer_size != conf.m_buffer_size) {
       return m_buffer_size < conf.m_buffer_size;
    }
    //4
    if(m_sample_buffers_num != conf.m_sample_buffers_num) {
       return m_sample_buffers_num < conf.m_sample_buffers_num;
    }
    //5
    if(m_samples_per_pixel != conf.m_samples_per_pixel) {
       return m_samples_per_pixel < conf.m_samples_per_pixel;
    }
    //6
    if(m_depth_size != conf.m_depth_size) {
       return m_depth_size < conf.m_depth_size;
    }
    //7
    if(m_stencil_size != conf.m_stencil_size) {
       return m_stencil_size < conf.m_stencil_size;
    }
    //8 implementation defined
    if(m_native_visual_type != conf.m_native_visual_type) {
       return m_native_visual_type < conf.m_native_visual_type;
    }
    //9
    return m_config_id < conf.m_config_id;
}

bool EglConfig::operator>=(const EglConfig& conf) const {
    return  !((*this) < conf);
}
#define CHECK_PROP(dummy,prop_name,op) \
                  if((dummy.prop_name != EGL_DONT_CARE) && (dummy.prop_name op prop_name)) return false;
#define CHECK_PROP_CAST(dummy,prop_name,op) \
                  if((((EGLint)dummy.prop_name) != EGL_DONT_CARE) && (dummy.prop_name op prop_name)) return false;
//checking if config stands for all the selection crateria of dummy as defined by EGL spec
bool EglConfig::choosen(const EglConfig& dummy) {

   //atleast
   CHECK_PROP(dummy,m_buffer_size,>);
   CHECK_PROP(dummy,m_red_size,>);
   CHECK_PROP(dummy,m_green_size,>);
   CHECK_PROP(dummy,m_blue_size,>);
   CHECK_PROP(dummy,m_alpha_size,>);
   CHECK_PROP(dummy,m_depth_size,>);
   CHECK_PROP(dummy,m_stencil_size,>);
   CHECK_PROP(dummy,m_sample_buffers_num,>);
   CHECK_PROP(dummy,m_samples_per_pixel,>);

   //exact
   CHECK_PROP(dummy,m_frame_buffer_level,!=);
   CHECK_PROP(dummy,m_config_id,!=);
   CHECK_PROP(dummy,m_native_visual_type,!=);
   CHECK_PROP(dummy,m_max_swap_interval ,!=);
   CHECK_PROP(dummy,m_min_swap_interval ,!=);
   CHECK_PROP(dummy,m_trans_red_val    ,!=);
   CHECK_PROP(dummy,m_trans_green_val ,!=);
   CHECK_PROP(dummy,m_trans_blue_val  ,!=);
   //exact - when cast to EGLint is needed when comparing to EGL_DONT_CARE
   CHECK_PROP_CAST(dummy,m_bind_to_tex_rgb ,!=);
   CHECK_PROP_CAST(dummy,m_bind_to_tex_rgba,!=);
   CHECK_PROP_CAST(dummy,m_caveat,!=);
   CHECK_PROP_CAST(dummy,m_native_renderable ,!=);
   CHECK_PROP_CAST(dummy,m_transparent_type   ,!=);

   //mask
   if(dummy.m_surface_type != EGL_DONT_CARE &&
    ((dummy.m_surface_type & m_surface_type) != dummy.m_surface_type)) return false;

   if(dummy.m_conformant != (EGLenum)EGL_DONT_CARE &&
    ((dummy.m_conformant & m_conformant) != dummy.m_conformant)) return false;

   if(dummy.m_renderable_type != EGL_DONT_CARE &&
    ((dummy.m_renderable_type & m_renderable_type) != dummy.m_renderable_type)) return false;

   //passed all checks
   return true;
}