eglmode.c revision ad6f8eba00359fcb7abff8105dcb7a9dd2f32fec
1ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul#include <stdio.h>
2c22990c29a5cdff89e6e3914aa565acc88a6a407Brian Paul#include <assert.h>
3c22990c29a5cdff89e6e3914aa565acc88a6a407Brian Paul#include <stdlib.h>
47012d01d888d482f2c6ad1180231a482026d213aJon Smirl#include <string.h>
57012d01d888d482f2c6ad1180231a482026d213aJon Smirl
6adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul#include "egldisplay.h"
7adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul#include "egldriver.h"
8adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul#include "eglmode.h"
9adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul#include "eglglobals.h"
10adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul#include "eglscreen.h"
11adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
12adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
13adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul#define MIN2(A, B)  (((A) < (B)) ? (A) : (B))
14adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
15adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
167012d01d888d482f2c6ad1180231a482026d213aJon Smirlstatic char *
177012d01d888d482f2c6ad1180231a482026d213aJon Smirlmy_strdup(const char *s)
187012d01d888d482f2c6ad1180231a482026d213aJon Smirl{
19ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul   if (s) {
20ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul      int l = strlen(s);
21ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul      char *s2 = malloc(l + 1);
22ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul      if (s2)
23ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul         strcpy(s2, s);
24ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul      return s2;
25ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul   }
26ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul   else {
27ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul      return NULL;
28ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul   }
297012d01d888d482f2c6ad1180231a482026d213aJon Smirl}
307012d01d888d482f2c6ad1180231a482026d213aJon Smirl
317012d01d888d482f2c6ad1180231a482026d213aJon Smirl
32c22990c29a5cdff89e6e3914aa565acc88a6a407Brian Paul/**
33c22990c29a5cdff89e6e3914aa565acc88a6a407Brian Paul * Given an EGLModeMESA handle, return the corresponding _EGLMode object
34c22990c29a5cdff89e6e3914aa565acc88a6a407Brian Paul * or null if non-existant.
35c22990c29a5cdff89e6e3914aa565acc88a6a407Brian Paul */
36adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul_EGLMode *
37adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul_eglLookupMode(EGLDisplay dpy, EGLModeMESA mode)
38adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
39adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul   const _EGLDisplay *disp = _eglLookupDisplay(dpy);
40adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul   EGLint scrnum;
41adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
42c22990c29a5cdff89e6e3914aa565acc88a6a407Brian Paul   /* loop over all screens on the display */
43adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul   for (scrnum = 0; scrnum < disp->NumScreens; scrnum++) {
44c22990c29a5cdff89e6e3914aa565acc88a6a407Brian Paul      const _EGLScreen *scrn = disp->Screens[scrnum];
45adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul      EGLint i;
46c22990c29a5cdff89e6e3914aa565acc88a6a407Brian Paul      /* search list of modes for handle */
47adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul      for (i = 0; i < scrn->NumModes; i++) {
48adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul         if (scrn->Modes[i].Handle == mode) {
49adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul            return scrn->Modes + i;
50adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul         }
51adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul      }
52adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul   }
53c22990c29a5cdff89e6e3914aa565acc88a6a407Brian Paul
54adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul   return NULL;
55adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
56adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
57adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
58adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul/**
59c22990c29a5cdff89e6e3914aa565acc88a6a407Brian Paul * Add a new mode with the given attributes (width, height, depth, refreshRate)
60c22990c29a5cdff89e6e3914aa565acc88a6a407Brian Paul * to the given screen.
61c22990c29a5cdff89e6e3914aa565acc88a6a407Brian Paul * Assign a new mode ID/handle to the mode as well.
62c22990c29a5cdff89e6e3914aa565acc88a6a407Brian Paul * \return pointer to the new _EGLMode
63c22990c29a5cdff89e6e3914aa565acc88a6a407Brian Paul */
64c22990c29a5cdff89e6e3914aa565acc88a6a407Brian Paul_EGLMode *
65ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul_eglAddNewMode(_EGLScreen *screen, EGLint width, EGLint height,
66ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul               EGLint refreshRate, const char *name)
67c22990c29a5cdff89e6e3914aa565acc88a6a407Brian Paul{
68c22990c29a5cdff89e6e3914aa565acc88a6a407Brian Paul   EGLint n;
69c22990c29a5cdff89e6e3914aa565acc88a6a407Brian Paul   _EGLMode *newModes;
70c22990c29a5cdff89e6e3914aa565acc88a6a407Brian Paul
71c22990c29a5cdff89e6e3914aa565acc88a6a407Brian Paul   assert(screen);
72c22990c29a5cdff89e6e3914aa565acc88a6a407Brian Paul   assert(width > 0);
73c22990c29a5cdff89e6e3914aa565acc88a6a407Brian Paul   assert(height > 0);
74c22990c29a5cdff89e6e3914aa565acc88a6a407Brian Paul   assert(refreshRate > 0);
75c22990c29a5cdff89e6e3914aa565acc88a6a407Brian Paul
76c22990c29a5cdff89e6e3914aa565acc88a6a407Brian Paul   n = screen->NumModes;
77c22990c29a5cdff89e6e3914aa565acc88a6a407Brian Paul   newModes = (_EGLMode *) realloc(screen->Modes, (n+1) * sizeof(_EGLMode));
78c22990c29a5cdff89e6e3914aa565acc88a6a407Brian Paul   if (newModes) {
79c22990c29a5cdff89e6e3914aa565acc88a6a407Brian Paul      screen->Modes = newModes;
80c22990c29a5cdff89e6e3914aa565acc88a6a407Brian Paul      screen->Modes[n].Handle = n + 1;
81c22990c29a5cdff89e6e3914aa565acc88a6a407Brian Paul      screen->Modes[n].Width = width;
82c22990c29a5cdff89e6e3914aa565acc88a6a407Brian Paul      screen->Modes[n].Height = height;
83c22990c29a5cdff89e6e3914aa565acc88a6a407Brian Paul      screen->Modes[n].RefreshRate = refreshRate;
84ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul      screen->Modes[n].Optimal = EGL_FALSE;
85ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul      screen->Modes[n].Interlaced = EGL_FALSE;
867012d01d888d482f2c6ad1180231a482026d213aJon Smirl      screen->Modes[n].Name = my_strdup(name);
87c22990c29a5cdff89e6e3914aa565acc88a6a407Brian Paul      screen->NumModes++;
88c22990c29a5cdff89e6e3914aa565acc88a6a407Brian Paul      return screen->Modes + n;
89c22990c29a5cdff89e6e3914aa565acc88a6a407Brian Paul   }
90c22990c29a5cdff89e6e3914aa565acc88a6a407Brian Paul   else {
91c22990c29a5cdff89e6e3914aa565acc88a6a407Brian Paul      return NULL;
92c22990c29a5cdff89e6e3914aa565acc88a6a407Brian Paul   }
93c22990c29a5cdff89e6e3914aa565acc88a6a407Brian Paul}
94c22990c29a5cdff89e6e3914aa565acc88a6a407Brian Paul
95c22990c29a5cdff89e6e3914aa565acc88a6a407Brian Paul
96c22990c29a5cdff89e6e3914aa565acc88a6a407Brian Paul
97c22990c29a5cdff89e6e3914aa565acc88a6a407Brian Paul/**
98ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul * Parse the attrib_list to fill in the fields of the given _eglMode
99ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul * Return EGL_FALSE if any errors, EGL_TRUE otherwise.
100adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul */
101ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paulstatic EGLBoolean
102ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul_eglParseModeAttribs(_EGLMode *mode, const EGLint *attrib_list)
103adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
104adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul   EGLint i;
105adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
106ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul   /* init all attribs to EGL_DONT_CARE */
107ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul   mode->Handle = EGL_DONT_CARE;
108ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul   mode->Width = EGL_DONT_CARE;
109ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul   mode->Height = EGL_DONT_CARE;
110ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul   mode->RefreshRate = EGL_DONT_CARE;
111ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul   mode->Optimal = EGL_DONT_CARE;
112ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul   mode->Interlaced = EGL_DONT_CARE;
113ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul   mode->Name = NULL;
114adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
115ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul   for (i = 0; attrib_list && attrib_list[i] != EGL_NONE; i++) {
116adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul      switch (attrib_list[i]) {
117ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul      case EGL_MODE_ID_MESA:
118ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul         mode->Handle = attrib_list[++i];
119ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul         if (mode->Handle <= 0) {
120ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul            _eglError(EGL_BAD_PARAMETER, "eglChooseModeMESA(handle)");
121ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul            return EGL_FALSE;
122ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul         }
123ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul         break;
124adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul      case EGL_WIDTH:
125ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul         mode->Width = attrib_list[++i];
126ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul         if (mode->Width <= 0) {
127ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul            _eglError(EGL_BAD_PARAMETER, "eglChooseModeMESA(width)");
128ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul            return EGL_FALSE;
129ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul         }
130adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul         break;
131adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul      case EGL_HEIGHT:
132ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul         mode->Height = attrib_list[++i];
133ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul         if (mode->Height <= 0) {
134ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul            _eglError(EGL_BAD_PARAMETER, "eglChooseModeMESA(height)");
135ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul            return EGL_FALSE;
136ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul         }
137adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul         break;
138adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul      case EGL_REFRESH_RATE_MESA:
139ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul         mode->RefreshRate = attrib_list[++i];
140ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul         if (mode->RefreshRate <= 0) {
141ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul            _eglError(EGL_BAD_PARAMETER, "eglChooseModeMESA(refresh rate)");
142ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul            return EGL_FALSE;
143ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul         }
144adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul         break;
145ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul      case EGL_INTERLACED_MESA:
146ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul         mode->Interlaced = attrib_list[++i];
147ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul         if (mode->Interlaced != EGL_TRUE && mode->Interlaced != EGL_FALSE) {
148ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul            _eglError(EGL_BAD_PARAMETER, "eglChooseModeMESA(interlaced)");
149ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul            return EGL_FALSE;
150ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul         }
151ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul         break;
152ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul      case EGL_OPTIMAL_MESA:
153ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul         mode->Optimal = attrib_list[++i];
154ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul         if (mode->Optimal != EGL_TRUE && mode->Optimal != EGL_FALSE) {
155ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul            _eglError(EGL_BAD_PARAMETER, "eglChooseModeMESA(optimal)");
156ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul            return EGL_FALSE;
157ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul         }
158adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul         break;
159adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul      default:
160ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul         _eglError(EGL_BAD_ATTRIBUTE, "eglChooseModeMESA");
161adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul         return EGL_FALSE;
162adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul      }
163adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul   }
164ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul   return EGL_TRUE;
165ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul}
166ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul
167ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul
168ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul/**
169ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul * Determine if the candidate mode's attributes are at least as good
170ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul * as the minimal mode's.
171ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul * \return EGL_TRUE if qualifies, EGL_FALSE otherwise
172ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul */
173ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paulstatic EGLBoolean
174ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul_eglModeQualifies(const _EGLMode *c, const _EGLMode *min)
175ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul{
176ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul   if (min->Handle != EGL_DONT_CARE && c->Handle != min->Handle)
177ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul      return EGL_FALSE;
178ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul   if (min->Width != EGL_DONT_CARE && c->Width < min->Width)
179ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul      return EGL_FALSE;
180ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul   if (min->Height != EGL_DONT_CARE && c->Height < min->Height)
181ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul      return EGL_FALSE;
182ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul   if (min->RefreshRate != EGL_DONT_CARE && c->RefreshRate < min->RefreshRate)
183ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul      return EGL_FALSE;
184ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul   if (min->Optimal != EGL_DONT_CARE && c->Optimal != min->Optimal)
185ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul      return EGL_FALSE;
186ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul   if (min->Interlaced != EGL_DONT_CARE && c->Interlaced != min->Interlaced)
187ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul      return EGL_FALSE;
188ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul
189ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul   return EGL_TRUE;
190ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul}
191ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul
192ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul
193ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul/**
194ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul * Return value of given mode attribute, or -1 if bad attrib.
195ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul */
196ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paulstatic EGLint
197ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian PaulgetModeAttrib(const _EGLMode *m, EGLint attrib)
198ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul{
199ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul   switch (attrib) {
200ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul   case EGL_MODE_ID_MESA:
201ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul      return m->Handle;
202ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul   case EGL_WIDTH:
203ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul      return m->Width;
204ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul   case EGL_HEIGHT:
205ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul      return m->Height;
206ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul   case EGL_REFRESH_RATE_MESA:
207ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul      return m->RefreshRate;
208ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul   case EGL_OPTIMAL_MESA:
209ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul      return m->Optimal;
210ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul   case EGL_INTERLACED_MESA:
211ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul      return m->Interlaced;
212ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul   default:
213ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul      return -1;
214ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul   }
215ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul}
216ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul
217ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul
218ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul#define SMALLER 1
219ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul#define LARGER  2
220ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul
221ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paulstruct sort_info {
222ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul   EGLint Attrib;
223ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul   EGLint Order; /* SMALLER or LARGER */
224ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul};
225ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul
226ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul/* the order of these entries is the priority */
227ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paulstatic struct sort_info SortInfo[] = {
228ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul   { EGL_OPTIMAL_MESA, LARGER },
229ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul   { EGL_INTERLACED_MESA, SMALLER },
230ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul   { EGL_WIDTH, LARGER },
231ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul   { EGL_HEIGHT, LARGER },
232ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul   { EGL_REFRESH_RATE_MESA, LARGER },
233ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul   { EGL_MODE_ID_MESA, SMALLER },
234ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul   { 0, 0 }
235ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul};
236ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul
237ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul
238ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul/**
239ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul * Compare modes 'a' and 'b' and return -1 if a belongs before b, or 1 if a
240ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul * belongs after b, or 0 if they're equal.
241ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul * Used by qsort().
242ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul */
243ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paulstatic int
244ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul_eglCompareModes(const void *a, const void *b)
245ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul{
246ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul   const _EGLMode *aMode = *((const _EGLMode **) a);
247ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul   const _EGLMode *bMode = *((const _EGLMode **) b);
248ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul   EGLint i;
249ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul
250ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul   for (i = 0; SortInfo[i].Attrib; i++) {
251ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul      const EGLint aVal = getModeAttrib(aMode, SortInfo[i].Attrib);
252ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul      const EGLint bVal = getModeAttrib(bMode, SortInfo[i].Attrib);
253ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul      if (aVal == bVal) {
254ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul         /* a tie */
255ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul         continue;
256ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul      }
257ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul      else if (SortInfo[i].Order == SMALLER) {
258ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul         return (aVal < bVal) ? -1 : 1;
259ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul      }
260ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul      else if (SortInfo[i].Order == LARGER) {
261ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul         return (aVal > bVal) ? -1 : 1;
262ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul      }
263ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul   }
264ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul
265ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul   /* all attributes identical */
266ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul   return 0;
267ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul}
268ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul
269ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul
270ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul/**
271ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul * Search for EGLModes which match the given attribute list.
272ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul * Called via eglChooseModeMESA API function.
273ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul */
274ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian PaulEGLBoolean
275ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul_eglChooseModeMESA(_EGLDriver *drv, EGLDisplay dpy, EGLScreenMESA screen,
276ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul                   const EGLint *attrib_list, EGLModeMESA *modes,
277ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul                   EGLint modes_size, EGLint *num_modes)
278ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul{
279ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul   const _EGLScreen *scrn = _eglLookupScreen(dpy, screen);
280ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul   _EGLMode **modeList, min;
281ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul   EGLint i, count;
282ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul
283ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul   if (!scrn) {
284ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul      _eglError(EGL_BAD_SCREEN_MESA, "eglChooseModeMESA");
285ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul      return EGL_FALSE;
286ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul   }
287ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul
288ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul   if (!_eglParseModeAttribs(&min, attrib_list)) {
289ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul      /* error code will have been recorded */
290ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul      return EGL_FALSE;
291ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul   }
292ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul
293ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul   /* allocate array of mode pointers */
294ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul   modeList = (_EGLMode **) malloc(modes_size * sizeof(_EGLMode *));
295ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul   if (!modeList) {
296ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul      _eglError(EGL_BAD_MODE_MESA, "eglChooseModeMESA(out of memory)");
297ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul      return EGL_FALSE;
298ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul   }
299ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul
300ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul   /* make array of pointers to qualifying modes */
301ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul   for (i = count = 0; i < scrn->NumModes && count < modes_size; i++) {
302ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul      if (_eglModeQualifies(scrn->Modes + i, &min)) {
303ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul         modeList[count++] = scrn->Modes + i;
304ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul      }
305ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul   }
306ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul
307ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul   /* sort array of pointers */
308ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul   qsort(modeList, count, sizeof(_EGLMode *), _eglCompareModes);
309ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul
310ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul   /* copy mode handles to output array */
311ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul   for (i = 0; i < count; i++) {
312ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul      modes[i] = modeList[i]->Handle;
313ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul   }
314ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul
315ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul   free(modeList);
316ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul
317ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul   *num_modes = count;
318adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
319adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul   return EGL_TRUE;
320adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
321adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
322adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
323adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
324adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul/**
325ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul * Return all possible modes for the given screen.  No sorting of results.
326ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul * Called via eglGetModesMESA() API function.
327adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul */
328adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PaulEGLBoolean
329c22990c29a5cdff89e6e3914aa565acc88a6a407Brian Paul_eglGetModesMESA(_EGLDriver *drv, EGLDisplay dpy, EGLScreenMESA screen,
330adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul                 EGLModeMESA *modes, EGLint modes_size, EGLint *num_modes)
331adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
332c22990c29a5cdff89e6e3914aa565acc88a6a407Brian Paul   _EGLScreen *scrn = _eglLookupScreen(dpy, screen);
333adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
334adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul   if (!scrn) {
335ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul      _eglError(EGL_BAD_SCREEN_MESA, "eglGetModesMESA");
336adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul      return EGL_FALSE;
337adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul   }
338adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
339ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul   if (modes) {
340ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul      EGLint i;
341ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul      *num_modes = MIN2(scrn->NumModes, modes_size);
342ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul      for (i = 0; i < *num_modes; i++) {
343ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul         modes[i] = scrn->Modes[i].Handle;
344ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul      }
345ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul   }
346ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul   else {
347ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul      /* just return total number of supported modes */
348ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul      *num_modes = scrn->NumModes;
349adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul   }
350adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
351adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul   return EGL_TRUE;
352adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
353adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
354adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
355adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul/**
356adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul * Query an attribute of a mode.
357adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul */
358adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PaulEGLBoolean
359adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul_eglGetModeAttribMESA(_EGLDriver *drv, EGLDisplay dpy,
360adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul                      EGLModeMESA mode, EGLint attribute, EGLint *value)
361adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
362adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul   _EGLMode *m = _eglLookupMode(dpy, mode);
363ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul   EGLint v;
364adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
365ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul   if (!m) {
366ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul      _eglError(EGL_BAD_MODE_MESA, "eglGetModeAttribMESA");
367ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul      return EGL_FALSE;
368ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul   }
369ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul
370ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul   v = getModeAttrib(m, attribute);
371ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul   if (v < 0) {
372ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul      _eglError(EGL_BAD_ATTRIBUTE, "eglGetModeAttribMESA");
373adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul      return EGL_FALSE;
374adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul   }
375ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul   *value = v;
376adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul   return EGL_TRUE;
377adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
3787012d01d888d482f2c6ad1180231a482026d213aJon Smirl
3797012d01d888d482f2c6ad1180231a482026d213aJon Smirl
380ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul/**
381ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul * Return human-readable string for given mode.
382ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul * This is the default function called by eglQueryModeStringMESA().
383ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul */
3847012d01d888d482f2c6ad1180231a482026d213aJon Smirlconst char *
3857012d01d888d482f2c6ad1180231a482026d213aJon Smirl_eglQueryModeStringMESA(_EGLDriver *drv, EGLDisplay dpy, EGLModeMESA mode)
3867012d01d888d482f2c6ad1180231a482026d213aJon Smirl{
3877012d01d888d482f2c6ad1180231a482026d213aJon Smirl   _EGLMode *m = _eglLookupMode(dpy, mode);
388ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul   if (!m) {
389ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul      _eglError(EGL_BAD_MODE_MESA, "eglQueryModeStringMESA");
390ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul      return NULL;
391ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul   }
3927012d01d888d482f2c6ad1180231a482026d213aJon Smirl   return m->Name;
3937012d01d888d482f2c6ad1180231a482026d213aJon Smirl}
3947012d01d888d482f2c6ad1180231a482026d213aJon Smirl
3957012d01d888d482f2c6ad1180231a482026d213aJon Smirl
396ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul#if 0
397ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paulstatic int
398ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul_eglRand(int max)
399ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul{
400ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul   return rand() % max;
401ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul}
402ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul
403ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paulvoid
404ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul_eglTestModeModule(void)
405ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul{
406ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul   EGLint count = 30;
407ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul   _EGLMode *modes = (_EGLMode *) malloc(count * sizeof(_EGLMode));
408ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul   _EGLMode **modeList = (_EGLMode **) malloc(count * sizeof(_EGLMode*));
409ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul   EGLint i;
410ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul
411ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul   for (i = 0; i < count; i++) {
412ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul      modes[i].Handle = _eglRand(20);
413ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul      modes[i].Width = 512 + 256 * _eglRand(2);
414ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul      modes[i].Height = 512 + 256 * _eglRand(2);
415ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul      modes[i].RefreshRate = 50 + 5 * _eglRand(3);
416ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul      modes[i].Interlaced = _eglRand(2);
417ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul      modes[i].Optimal = _eglRand(4) == 0;
418ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul      modeList[i] = modes + i;
419ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul   }
420ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul
421ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul   /* sort array of pointers */
422ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul   qsort(modeList, count, sizeof(_EGLMode *), compareModes);
423ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul
424ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul   for (i = 0; i < count; i++) {
425ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul      _EGLMode *m = modeList[i];
426ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul      printf("%2d: %3d  %4d x %4d  @ %3d  opt %d  int %d\n", i,
427ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul             m->Handle, m->Width, m->Height, m->RefreshRate,
428ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul             m->Optimal, m->Interlaced);
429ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul   }
430ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul}
431ad6f8eba00359fcb7abff8105dcb7a9dd2f32fecBrian Paul#endif
432