/** * Return human-readable string for given mode. * This is the default function called by eglQueryModeStringMESA(). */ const char * _eglQueryModeStringMESA(_EGLDriver *drv, EGLDisplay dpy, EGLModeMESA mode) { _EGLMode *m = _eglLookupMode(dpy, mode); if (!m) { _eglError(EGL_BAD_MODE_MESA, "eglQueryModeStringMESA"); return NULL; } return m->Name; }
const char * EGLAPIENTRY eglQueryModeStringMESA(EGLDisplay dpy, EGLModeMESA mode) { _EGLDisplay *disp = _eglLockDisplay(dpy); _EGLMode *m = _eglLookupMode(mode, disp); _EGLDriver *drv; const char *ret; _EGL_CHECK_MODE(disp, m, NULL, drv); ret = drv->API.QueryModeStringMESA(drv, disp, m); RETURN_EGL_EVAL(disp, ret); }
EGLBoolean EGLAPIENTRY eglGetModeAttribMESA(EGLDisplay dpy, EGLModeMESA mode, EGLint attribute, EGLint *value) { _EGLDisplay *disp = _eglLockDisplay(dpy); _EGLMode *m = _eglLookupMode(mode, disp); _EGLDriver *drv; EGLBoolean ret; _EGL_CHECK_MODE(disp, m, EGL_FALSE, drv); ret = drv->API.GetModeAttribMESA(drv, disp, m, attribute, value); RETURN_EGL_EVAL(disp, ret); }
/** * Set a screen's current display mode. * Note: mode = EGL_NO_MODE is valid (turns off the screen) * * This is just a placeholder function; drivers will always override * this with code that _really_ sets the mode. */ EGLBoolean _eglScreenModeMESA(_EGLDriver *drv, EGLDisplay dpy, EGLScreenMESA screen, EGLModeMESA mode) { _EGLScreen *scrn = _eglLookupScreen(dpy, screen); if (!scrn) { _eglError(EGL_BAD_SCREEN_MESA, "eglScreenModeMESA"); return EGL_FALSE; } scrn->CurrentMode = _eglLookupMode(dpy, mode); return EGL_TRUE; }
/** * Query an attribute of a mode. */ EGLBoolean _eglGetModeAttribMESA(_EGLDriver *drv, EGLDisplay dpy, EGLModeMESA mode, EGLint attribute, EGLint *value) { _EGLMode *m = _eglLookupMode(dpy, mode); EGLint v; if (!m) { _eglError(EGL_BAD_MODE_MESA, "eglGetModeAttribMESA"); return EGL_FALSE; } v = getModeAttrib(m, attribute); if (v < 0) { _eglError(EGL_BAD_ATTRIBUTE, "eglGetModeAttribMESA"); return EGL_FALSE; } *value = v; return EGL_TRUE; }
EGLBoolean EGLAPIENTRY eglShowScreenSurfaceMESA(EGLDisplay dpy, EGLint screen, EGLSurface surface, EGLModeMESA mode) { _EGLDisplay *disp = _eglLockDisplay(dpy); _EGLScreen *scrn = _eglLookupScreen((EGLScreenMESA) screen, disp); _EGLSurface *surf = _eglLookupSurface(surface, disp); _EGLMode *m = _eglLookupMode(mode, disp); _EGLDriver *drv; EGLBoolean ret; _EGL_CHECK_SCREEN(disp, scrn, EGL_FALSE, drv); if (!surf && surface != EGL_NO_SURFACE) RETURN_EGL_ERROR(disp, EGL_BAD_SURFACE, EGL_FALSE); if (!m && mode != EGL_NO_MODE_MESA) RETURN_EGL_ERROR(disp, EGL_BAD_MODE_MESA, EGL_FALSE); ret = drv->API.ShowScreenSurfaceMESA(drv, disp, scrn, surf, m); RETURN_EGL_EVAL(disp, ret); }
/** * Show the given surface on the named screen. * If surface is EGL_NO_SURFACE, disable the screen's output. * * This is just a placeholder function; drivers will always override * this with code that _really_ shows the surface. */ EGLBoolean _eglShowScreenSurfaceMESA(_EGLDriver *drv, EGLDisplay dpy, EGLScreenMESA screen, EGLSurface surface, EGLModeMESA m) { _EGLScreen *scrn = _eglLookupScreen(dpy, screen); _EGLMode *mode = _eglLookupMode(dpy, m); if (!scrn) { _eglError(EGL_BAD_SCREEN_MESA, "eglShowSurfaceMESA"); return EGL_FALSE; } if (!mode && (m != EGL_NO_MODE_MESA )) { _eglError(EGL_BAD_MODE_MESA, "eglShowSurfaceMESA"); return EGL_FALSE; } if (surface == EGL_NO_SURFACE) { scrn->CurrentSurface = NULL; } else { _EGLSurface *surf = _eglLookupSurface(surface); if (!surf || surf->Type != EGL_SCREEN_BIT_MESA) { _eglError(EGL_BAD_SURFACE, "eglShowSurfaceMESA"); return EGL_FALSE; } if (surf->Width < mode->Width || surf->Height < mode->Height) { _eglError(EGL_BAD_SURFACE, "eglShowSurfaceMESA(surface smaller than screen size)"); return EGL_FALSE; } scrn->CurrentSurface = surf; scrn->CurrentMode = mode; } return EGL_TRUE; }
/** * Show the given surface on the named screen. * If surface is EGL_NO_SURFACE, disable the screen's output. */ static EGLBoolean fbShowSurfaceMESA(_EGLDriver *drv, EGLDisplay dpy, EGLScreenMESA screen, EGLSurface surface, EGLModeMESA m) { fbDisplay *display = Lookup_fbDisplay(dpy); fbScreen *scrn = Lookup_fbScreen(dpy, screen); fbSurface *surf = Lookup_fbSurface(surface); FILE *file; char buffer[NAME_MAX]; _EGLMode *mode = _eglLookupMode(dpy, m); int bits; if (!_eglShowSurfaceMESA(drv, dpy, screen, surface, m)) return EGL_FALSE; snprintf(buffer, sizeof(buffer), "%s/%s/blank", sysfs, scrn->fb); file = fopen(buffer, "r+"); if (!file) { err: printf("chown all fb sysfs attrib to allow write - %s\n", buffer); return EGL_FALSE; } snprintf(buffer, sizeof(buffer), "%d", (m == EGL_NO_MODE_MESA ? VESA_POWERDOWN : VESA_VSYNC_SUSPEND)); fputs(buffer, file); fclose(file); if (m == EGL_NO_MODE_MESA) return EGL_TRUE; snprintf(buffer, sizeof(buffer), "%s/%s/mode", sysfs, scrn->fb); file = fopen(buffer, "r+"); if (!file) goto err; fputs(mode->Name, file); fclose(file); snprintf(buffer, sizeof(buffer), "%s/%s/bits_per_pixel", sysfs, scrn->fb); file = fopen(buffer, "r+"); if (!file) goto err; bits = GET_CONFIG_ATTRIB(surf->Base.Config, EGL_BUFFER_SIZE); snprintf(buffer, sizeof(buffer), "%d", bits); fputs(buffer, file); fclose(file); fbSetupFramebuffer(display, scrn->fb); snprintf(buffer, sizeof(buffer), "%s/%s/blank", sysfs, scrn->fb); file = fopen(buffer, "r+"); if (!file) goto err; snprintf(buffer, sizeof(buffer), "%d", VESA_NO_BLANKING); fputs(buffer, file); fclose(file); return EGL_TRUE; }