aboutsummaryrefslogtreecommitdiff
path: root/xorg-server/hw/xgl/egl/xegl.c
diff options
context:
space:
mode:
Diffstat (limited to 'xorg-server/hw/xgl/egl/xegl.c')
-rw-r--r--xorg-server/hw/xgl/egl/xegl.c303
1 files changed, 303 insertions, 0 deletions
diff --git a/xorg-server/hw/xgl/egl/xegl.c b/xorg-server/hw/xgl/egl/xegl.c
new file mode 100644
index 000000000..1cf615bb6
--- /dev/null
+++ b/xorg-server/hw/xgl/egl/xegl.c
@@ -0,0 +1,303 @@
+/*
+ * 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 <davidr@novell.com>
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <signal.h>
+#include <sys/ioctl.h>
+#include <errno.h>
+#include <math.h>
+
+#include <glitz-egl.h>
+
+#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)
+{
+}