3 #include "egldisplay.h"
6 #include "eglglobals.h"
10 #define MIN2(A, B) (((A) < (B)) ? (A) : (B))
14 * Given an EGLModeMESA handle, return the corresponding _EGLMode object
15 * or null if non-existant.
18 _eglLookupMode(EGLDisplay dpy
, EGLModeMESA mode
)
20 const _EGLDisplay
*disp
= _eglLookupDisplay(dpy
);
23 /* loop over all screens on the display */
24 for (scrnum
= 0; scrnum
< disp
->NumScreens
; scrnum
++) {
25 const _EGLScreen
*scrn
= disp
->Screens
[scrnum
];
27 /* search list of modes for handle */
28 for (i
= 0; i
< scrn
->NumModes
; i
++) {
29 if (scrn
->Modes
[i
].Handle
== mode
) {
30 return scrn
->Modes
+ i
;
40 * Add a new mode with the given attributes (width, height, depth, refreshRate)
41 * to the given screen.
42 * Assign a new mode ID/handle to the mode as well.
43 * \return pointer to the new _EGLMode
46 _eglAddMode(_EGLScreen
*screen
, EGLint width
, EGLint height
,
47 EGLint depth
, EGLint refreshRate
)
56 assert(refreshRate
> 0);
59 newModes
= (_EGLMode
*) realloc(screen
->Modes
, (n
+1) * sizeof(_EGLMode
));
61 screen
->Modes
= newModes
;
62 screen
->Modes
[n
].Handle
= n
+ 1;
63 screen
->Modes
[n
].Width
= width
;
64 screen
->Modes
[n
].Height
= height
;
65 screen
->Modes
[n
].Depth
= depth
;
66 screen
->Modes
[n
].RefreshRate
= refreshRate
;
67 screen
->Modes
[n
].Stereo
= EGL_FALSE
;
69 return screen
->Modes
+ n
;
79 * Search for the EGLMode that best matches the given attribute list.
82 _eglChooseModeMESA(_EGLDriver
*drv
, EGLDisplay dpy
, EGLScreenMESA screen
,
83 const EGLint
*attrib_list
, EGLModeMESA
*modes
,
84 EGLint modes_size
, EGLint
*num_modes
)
90 for (i
= 0; attrib_list
[i
] != EGL_NONE
; i
++) {
91 switch (attrib_list
[i
]) {
98 case EGL_REFRESH_RATE_MESA
:
102 case EGL_STEREO_MESA
:
107 _eglError(EGL_BAD_ATTRIBUTE
, "eglChooseMode");
118 * Return all possible modes for the given screen
121 _eglGetModesMESA(_EGLDriver
*drv
, EGLDisplay dpy
, EGLScreenMESA screen
,
122 EGLModeMESA
*modes
, EGLint modes_size
, EGLint
*num_modes
)
124 _EGLScreen
*scrn
= _eglLookupScreen(dpy
, screen
);
128 _eglError(EGL_BAD_SCREEN_MESA
, "eglGetModes");
132 *num_modes
= MIN2(modes_size
, scrn
->NumModes
);
133 for (i
= 0; i
< *num_modes
; i
++) {
134 modes
[i
] = scrn
->Modes
[i
].Handle
;
142 * Query an attribute of a mode.
145 _eglGetModeAttribMESA(_EGLDriver
*drv
, EGLDisplay dpy
,
146 EGLModeMESA mode
, EGLint attribute
, EGLint
*value
)
148 _EGLMode
*m
= _eglLookupMode(dpy
, mode
);
151 case EGL_MODE_ID_MESA
:
165 case EGL_REFRESH_RATE_MESA
:
166 *value
= m
->RefreshRate
;
169 case EGL_STEREO_MESA
:
174 _eglError(EGL_BAD_ATTRIBUTE
, "eglGetModeAttrib");