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