26ea6bd6054a12cddbc07a5bb9b93b735206d703
[mesa.git] / src / egl / main / eglmode.c
1 #include <assert.h>
2 #include <stdlib.h>
3 #include <string.h>
4
5 #include "egldisplay.h"
6 #include "egldriver.h"
7 #include "eglmode.h"
8 #include "eglglobals.h"
9 #include "eglscreen.h"
10
11
12 #define MIN2(A, B) (((A) < (B)) ? (A) : (B))
13
14
15 static char *
16 my_strdup(const char *s)
17 {
18 int l = strlen(s);
19 char *s2 = malloc(l + 1);
20 strcpy(s2, s);
21 return s2;
22 }
23
24
25 /**
26 * Given an EGLModeMESA handle, return the corresponding _EGLMode object
27 * or null if non-existant.
28 */
29 _EGLMode *
30 _eglLookupMode(EGLDisplay dpy, EGLModeMESA mode)
31 {
32 const _EGLDisplay *disp = _eglLookupDisplay(dpy);
33 EGLint scrnum;
34
35 /* loop over all screens on the display */
36 for (scrnum = 0; scrnum < disp->NumScreens; scrnum++) {
37 const _EGLScreen *scrn = disp->Screens[scrnum];
38 EGLint i;
39 /* search list of modes for handle */
40 for (i = 0; i < scrn->NumModes; i++) {
41 if (scrn->Modes[i].Handle == mode) {
42 return scrn->Modes + i;
43 }
44 }
45 }
46
47 return NULL;
48 }
49
50
51 /**
52 * Add a new mode with the given attributes (width, height, depth, refreshRate)
53 * to the given screen.
54 * Assign a new mode ID/handle to the mode as well.
55 * \return pointer to the new _EGLMode
56 */
57 _EGLMode *
58 _eglAddMode(_EGLScreen *screen, EGLint width, EGLint height,
59 EGLint refreshRate, char *name)
60 {
61 EGLint n;
62 _EGLMode *newModes;
63
64 assert(screen);
65 assert(width > 0);
66 assert(height > 0);
67 assert(refreshRate > 0);
68
69 n = screen->NumModes;
70 newModes = (_EGLMode *) realloc(screen->Modes, (n+1) * sizeof(_EGLMode));
71 if (newModes) {
72 screen->Modes = newModes;
73 screen->Modes[n].Handle = n + 1;
74 screen->Modes[n].Width = width;
75 screen->Modes[n].Height = height;
76 screen->Modes[n].RefreshRate = refreshRate;
77 screen->Modes[n].Stereo = EGL_FALSE;
78 screen->Modes[n].Name = my_strdup(name);
79 screen->NumModes++;
80 return screen->Modes + n;
81 }
82 else {
83 return NULL;
84 }
85 }
86
87
88
89 /**
90 * Search for the EGLMode that best matches the given attribute list.
91 */
92 EGLBoolean
93 _eglChooseModeMESA(_EGLDriver *drv, EGLDisplay dpy, EGLScreenMESA screen,
94 const EGLint *attrib_list, EGLModeMESA *modes,
95 EGLint modes_size, EGLint *num_modes)
96 {
97 EGLint i;
98
99 /* XXX incomplete */
100
101 for (i = 0; attrib_list[i] != EGL_NONE; i++) {
102 switch (attrib_list[i]) {
103 case EGL_WIDTH:
104 i++;
105 break;
106 case EGL_HEIGHT:
107 i++;
108 break;
109 case EGL_REFRESH_RATE_MESA:
110 i++;
111 break;
112 #if 0
113 case EGL_STEREO_MESA:
114 i++;
115 break;
116 #endif
117 default:
118 _eglError(EGL_BAD_ATTRIBUTE, "eglChooseMode");
119 return EGL_FALSE;
120 }
121 }
122
123 return EGL_TRUE;
124 }
125
126
127
128 /**
129 * Return all possible modes for the given screen
130 */
131 EGLBoolean
132 _eglGetModesMESA(_EGLDriver *drv, EGLDisplay dpy, EGLScreenMESA screen,
133 EGLModeMESA *modes, EGLint modes_size, EGLint *num_modes)
134 {
135 _EGLScreen *scrn = _eglLookupScreen(dpy, screen);
136 EGLint i;
137
138 if (!scrn) {
139 _eglError(EGL_BAD_SCREEN_MESA, "eglGetModes");
140 return EGL_FALSE;
141 }
142
143 *num_modes = MIN2(modes_size, scrn->NumModes);
144 for (i = 0; i < *num_modes; i++) {
145 modes[i] = scrn->Modes[i].Handle;
146 }
147
148 return EGL_TRUE;
149 }
150
151
152 /**
153 * Query an attribute of a mode.
154 */
155 EGLBoolean
156 _eglGetModeAttribMESA(_EGLDriver *drv, EGLDisplay dpy,
157 EGLModeMESA mode, EGLint attribute, EGLint *value)
158 {
159 _EGLMode *m = _eglLookupMode(dpy, mode);
160
161 switch (attribute) {
162 case EGL_MODE_ID_MESA:
163 *value = m->Handle;
164 break;
165 case EGL_WIDTH:
166 *value = m->Width;
167 break;
168 case EGL_HEIGHT:
169 *value = m->Height;
170 break;
171 #if 0
172 case EGL_DEPTH_MESA:
173 *value = m->Depth;
174 break;
175 #endif
176 case EGL_REFRESH_RATE_MESA:
177 *value = m->RefreshRate;
178 break;
179 #if 0
180 case EGL_STEREO_MESA:
181 *value = m->Stereo;
182 break;
183 #endif
184 default:
185 _eglError(EGL_BAD_ATTRIBUTE, "eglGetModeAttrib");
186 return EGL_FALSE;
187 }
188 return EGL_TRUE;
189 }
190
191
192 const char *
193 _eglQueryModeStringMESA(_EGLDriver *drv, EGLDisplay dpy, EGLModeMESA mode)
194 {
195 _EGLMode *m = _eglLookupMode(dpy, mode);
196 return m->Name;
197 }
198
199