/* * Copyright © 2004 David Reveman * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of * David Reveman not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior permission. * David Reveman makes no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * * DAVID REVEMAN DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL DAVID REVEMAN BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: David Reveman */ #include #include #include #include #include #include #include #include #include "inputstr.h" #include "cursorstr.h" #include "mipointer.h" #include "xegl.h" #define XEGL_DEFAULT_SCREEN_WIDTH 800 #define XEGL_DEFAULT_SCREEN_HEIGHT 600 DevPrivateKey xeglScreenPrivateKey = &xeglScreenPrivateKey; #define XEGL_GET_SCREEN_PRIV(pScreen) ((xeglScreenPtr) \ dixLookupPrivate(&(pScreen)->devPrivates, xeglScreenPrivateKey)) #define XEGL_SET_SCREEN_PRIV(pScreen, v) \ dixSetPrivate(&(pScreen)->devPrivates, xeglScreenPrivateKey, v) #define XEGL_SCREEN_PRIV(pScreen) \ xeglScreenPtr pScreenPriv = XEGL_GET_SCREEN_PRIV (pScreen) static EGLDisplay eDisplay; static EGLScreenMESA eScreen; static ScreenPtr currentScreen = 0; static Bool softCursor = TRUE; extern miPointerScreenFuncRec kdPointerScreenFuncs; static Bool xeglAllocatePrivates (ScreenPtr pScreen) { xeglScreenPtr pScreenPriv; pScreenPriv = xalloc (sizeof (xeglScreenRec)); if (!pScreenPriv) return FALSE; XEGL_SET_SCREEN_PRIV (pScreen, pScreenPriv); return TRUE; } static Bool xeglCloseScreen (int index, ScreenPtr pScreen) { glitz_drawable_t *drawable; XEGL_SCREEN_PRIV (pScreen); drawable = XGL_GET_SCREEN_PRIV (pScreen)->drawable; if (drawable) glitz_drawable_destroy (drawable); xglClearVisualTypes (); XGL_SCREEN_UNWRAP (CloseScreen); xfree (pScreenPriv); return (*pScreen->CloseScreen) (index, pScreen); } static Bool xeglScreenInit (int index, ScreenPtr pScreen, int argc, char **argv) { EGLSurface eSurface; EGLModeMESA mode; int count; xeglScreenPtr pScreenPriv; glitz_drawable_format_t *format; glitz_drawable_t *drawable; EGLint screenAttribs[] = { EGL_WIDTH, 1024, EGL_HEIGHT, 768, EGL_NONE }; if (xglScreenInfo.width == 0 || xglScreenInfo.height == 0) { xglScreenInfo.width = XEGL_DEFAULT_SCREEN_WIDTH; xglScreenInfo.height = XEGL_DEFAULT_SCREEN_HEIGHT; } screenAttribs[1] = xglScreenInfo.width; screenAttribs[3] = xglScreenInfo.height; format = xglVisuals[0].format; if (!xeglAllocatePrivates (pScreen)) return FALSE; currentScreen = pScreen; pScreenPriv = XEGL_GET_SCREEN_PRIV (pScreen); if (xglScreenInfo.width == 0 || xglScreenInfo.height == 0) { xglScreenInfo.width = XEGL_DEFAULT_SCREEN_WIDTH; xglScreenInfo.height = XEGL_DEFAULT_SCREEN_HEIGHT; } eglGetModesMESA (eDisplay, eScreen, &mode, 1, &count); eSurface = eglCreateScreenSurfaceMESA (eDisplay, format->id, screenAttribs); if (eSurface == EGL_NO_SURFACE) { ErrorF ("failed to create screen surface\n"); return FALSE; } eglShowScreenSurfaceMESA (eDisplay, eScreen, eSurface, mode); drawable = glitz_egl_create_surface (eDisplay, eScreen, format, eSurface, xglScreenInfo.width, xglScreenInfo.height); if (!drawable) { ErrorF ("[%d] couldn't create glitz drawable for window\n", index); return FALSE; } xglScreenInfo.drawable = drawable; if (!xglScreenInit (pScreen)) return FALSE; #ifdef GLXEXT if (!xglInitVisualConfigs (pScreen)) return FALSE; #endif XGL_SCREEN_WRAP (CloseScreen, xeglCloseScreen); miDCInitialize (pScreen, &kdPointerScreenFuncs); miCreateDefColormap(pScreen); if (!xglFinishScreenInit (pScreen)) return FALSE; return TRUE; } void xeglInitOutput (ScreenInfo *pScreenInfo, int argc, char **argv) { glitz_drawable_format_t *format, templ; int i, maj, min, count; unsigned long mask; xglSetPixmapFormats (pScreenInfo); if (!eDisplay) { eDisplay = eglGetDisplay (":0"); if (!eglInitialize (eDisplay, &maj, &min)) FatalError ("can't open display"); eglGetScreensMESA (eDisplay, &eScreen, 1, &count); } templ.samples = 1; templ.doublebuffer = 1; templ.color.alpha_size = 8; mask = GLITZ_FORMAT_SAMPLES_MASK; format = glitz_egl_find_window_config (eDisplay, eScreen, mask, &templ, 0); if (!format) FatalError ("no visual format found"); xglSetVisualTypesAndMasks (pScreenInfo, format, (1 << TrueColor)); xglInitVisuals (pScreenInfo); AddScreen (xeglScreenInit, argc, argv); } static void xeglBlockHandler (pointer blockData, OSTimePtr pTimeout, pointer pReadMask) { XGL_SCREEN_PRIV (currentScreen); if (!xglSyncSurface (&pScreenPriv->pScreenPixmap->drawable)) FatalError (XGL_SW_FAILURE_STRING); glitz_surface_flush (pScreenPriv->surface); glitz_drawable_finish (pScreenPriv->drawable); } void xeglInitInput (int argc, char **argv) { eglInitInput (&LinuxEvdevMouseFuncs, &LinuxEvdevKeyboardFuncs); RegisterBlockAndWakeupHandlers (xeglBlockHandler, KdWakeupHandler, NULL); } Bool xeglLegalModifier (unsigned int key, DeviceIntPtr pDev) { return KdLegalModifier (key, pDev); } void xeglProcessInputEvents (void) { KdProcessInputEvents (); } void xeglUseMsg (void) { ErrorF ("-screen WIDTH[/WIDTHMM]xHEIGHT[/HEIGHTMM] " "specify screen characteristics\n"); ErrorF ("-softcursor force software cursor\n"); } int xeglProcessArgument (int argc, char **argv, int i) { if (!strcmp (argv[i], "-screen")) { if ((i + 1) < argc) { xglParseScreen (argv[i + 1]); } else return 1; return 2; } else if (!strcmp (argv[i], "-softcursor")) { softCursor = TRUE; return 1; } return 0; } void xeglAbort (void) { } void xeglGiveUp (void) { AbortDDX (); } void xeglOsVendorInit (void) { }