diff options
Diffstat (limited to 'src/mesa/drivers/ggi/display')
-rw-r--r-- | src/mesa/drivers/ggi/display/fbdev.conf.in | 6 | ||||
-rw-r--r-- | src/mesa/drivers/ggi/display/fbdev_mode.c | 134 | ||||
-rw-r--r-- | src/mesa/drivers/ggi/display/fbdev_visual.c | 157 |
3 files changed, 297 insertions, 0 deletions
diff --git a/src/mesa/drivers/ggi/display/fbdev.conf.in b/src/mesa/drivers/ggi/display/fbdev.conf.in new file mode 100644 index 0000000000..902a8be2ea --- /dev/null +++ b/src/mesa/drivers/ggi/display/fbdev.conf.in @@ -0,0 +1,6 @@ +# GGIMesa fbdev target configuration +.root: @ggi_libdir@/ggi/mesa/default + +tgt-fbdev-kgicon-generic-mesa kgi/genkgi.so + +# .include /usr/local/etc/ggi/mesa/genkgi.conf diff --git a/src/mesa/drivers/ggi/display/fbdev_mode.c b/src/mesa/drivers/ggi/display/fbdev_mode.c new file mode 100644 index 0000000000..1c882f7f84 --- /dev/null +++ b/src/mesa/drivers/ggi/display/fbdev_mode.c @@ -0,0 +1,134 @@ +/* $Id: fbdev_mode.c,v 1.1 1999/08/21 05:57:59 jtaylor Exp $ +****************************************************************************** + + display-fbdev-mesa + + Copyright (C) 1999 Creative Labs + + Permission is hereby granted, free of charge, to any person obtaining a + copy of this software and associated documentation files (the "Software"), + to deal in the Software without restriction, including without limitation + the rights to use, copy, modify, merge, publish, distribute, sublicense, + and/or sell copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + THE AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +****************************************************************************** +*/ + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> +#include <fcntl.h> +#include <sys/ioctl.h> +#include <sys/mman.h> + +#include <linux/fb.h> + +#include <ggi/internal/ggi-dl.h> +#include <ggi/mesa/ggimesa_int.h> +#include <ggi/mesa/display/fbdev.h> + +#ifndef MAP_FAILED +#define MAP_FAILED ((void*)-1) +#endif + +#define FB_KLUDGE_FONTX 8 +#define FB_KLUDGE_FONTY 16 +#define FB_KLUDGE_TEXTMODE 13 +#define TIMINGFILE "/etc/fb.modes" + +int GGIMesa_fbdev_getapi(ggi_visual *vis, int num, char *apiname, char *arguments) +{ + fbdev_hook_mesa *priv = GGIMESA_PRIVATE(vis); + + strcpy(arguments, ""); + + switch(num) + { + case 0: + if (priv->oldpriv->have_accel) + { + strcpy(apiname, priv->oldpriv->accel); + return 0; + } + break; + } + + return -1; +} + +static int do_setmode(ggi_visual *vis) +{ + fbdev_hook_mesa *priv = GGIMESA_PRIVATE(vis); + int err, id; + char libname[256], libargs[256]; + ggi_graphtype gt; + + _ggiZapMode(vis, ~GGI_DL_OPDISPLAY); + priv->have_accel = 0; + for (id = 1; GGIMesa_fbdev_getapi(vis, id, libname, libargs) == 0; id++) + { + if (_ggiOpenDL(vis, libname, libargs, NULL) == NULL) + { + fprintf(stderr, "display-fbdev-mesa: Error opening the " + "%s (%s) library.\n", libname, libargs); + return GGI_EFATAL; + } + + gl_ggiDEBUG("Success in loading %s (%s)\n", libname, libargs); + } + + if (priv->oldpriv->accel && + _ggiOpenDL(vis, priv->accel, NULL, NULL) != NULL) { + priv->have_accel = 1; + } + else + { + priv->have_accel = 0; + } + vis->accelactive = 0; + + ggiIndicateChange(vis, GGI_CHG_APILIST); + + gl_ggiDEBUG("display-fbdev-mesa: do_setmode SUCCESS\n"); + + return 0; +} + + +int GGIMesa_fbdev_setmode(ggi_visual *vis, ggi_mode *mode) +{ + int err; + + if ((err = ggiCheckMode(vis, mode)) != 0) { + return err; + } + + gl_ggiDEBUG("display-fbdev-mesa: setmode %dx%d#%dx%dF%d[0x%02x]\n", + mode->visible.x, mode->visible.y, + mode->virt.x, mode->virt.y, + mode->frames, mode->graphtype); + + memcpy(LIBGGI_MODE(vis), mode, sizeof(ggi_mode)); + + /* Now actually set the mode */ + err = do_setmode(vis); + if (err != 0) { + return err; + } + + gl_ggiDEBUG("display-fbdev-mesa: setmode success.\n"); + + return 0; +} diff --git a/src/mesa/drivers/ggi/display/fbdev_visual.c b/src/mesa/drivers/ggi/display/fbdev_visual.c new file mode 100644 index 0000000000..30ad340226 --- /dev/null +++ b/src/mesa/drivers/ggi/display/fbdev_visual.c @@ -0,0 +1,157 @@ +/* $Id: fbdev_visual.c,v 1.1 1999/08/21 05:57:59 jtaylor Exp $ +****************************************************************************** + + display-fbdev-mesa: visual handling + + Copyright (C) 1998 Andrew Apted [andrew@ggi-project.org] + Copyright (C) 1999 Marcus Sundberg [marcus@ggi-project.org] + Copyright (C) 1999 Creative Labs + + Permission is hereby granted, free of charge, to any person obtaining a + copy of this software and associated documentation files (the "Software"), + to deal in the Software without restriction, including without limitation + the rights to use, copy, modify, merge, publish, distribute, sublicense, + and/or sell copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + THE AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +****************************************************************************** +*/ + +#include <ggi/internal/ggi-dl.h> +#include <ggi/mesa/ggimesa_int.h> +#include <ggi/mesa/display/fbdev.h> + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <ctype.h> +#include <errno.h> +#include <unistd.h> +#include <fcntl.h> +#include <sys/stat.h> + +#ifdef HAVE_SYS_VT_H +#include <sys/vt.h> +#else +#include <linux/vt.h> +#endif +#ifdef HAVE_LINUX_KDEV_T_H +#include <linux/kdev_t.h> +#endif +#include <linux/tty.h> + +#define MAX_DEV_LEN 63 +#define DEFAULT_FBNUM 0 + +static char accel_prefix[] = "tgt-fbdev-"; +#define PREFIX_LEN (sizeof(accel_prefix)) + +typedef struct { + int async; + char *str; +} accel_info; + +static accel_info accel_strings[] = { + { 0, "kgicon-generic",}, /* no accel - check for KGIcon */ + { 0, NULL }, /* Atari Blitter */ +}; + +#define NUM_ACCELS (sizeof(accel_strings)/sizeof(accel_info)) + +/* FIXME: These should really be defined in the make system */ +#define CONF_FILE "/usr/local/etc/ggi/mesa/targets/fbdev.conf" +void *_configHandle; +char confstub[512] = CONF_FILE; +char *conffile = confstub; + +static int changed(ggi_visual_t vis, int whatchanged) +{ + gl_ggiDEBUG("Entered ggimesa_fbdev_changed\n"); + switch (whatchanged) + { + case GGI_CHG_APILIST: + { + char api[256]; + char args[256]; + int i; + const char *fname; + ggi_dlhandle *lib; + + for (i = 0; ggiGetAPI(vis, i, api, args) == 0; i++) + { + strcat(api, "-mesa"); + gl_ggiDEBUG("ggimesa_fbdev_changed: api=%s, i=%d\n", api, i); + fname = ggMatchConfig(_configHandle, api, NULL); + if (fname == NULL) + { + /* No special implementation for this sublib */ + continue; + } + + lib = ggiExtensionLoadDL(vis, fname, args, NULL); + } + } + break; + } + gl_ggiDEBUG("Leaving ggimesa_fbdev_changed\n"); + return 0; +} + +int GGIdlinit(ggi_visual *vis, const char *args, void *argptr) +{ + fbdev_hook_mesa *priv; + char libname[256], libargs[256]; + int id, err; + ggifunc_getapi *oldgetapi; + + gl_ggiDEBUG("display-fbdev-mesa: GGIdlinit start\n"); + + GGIMESA_PRIVATE(vis) = priv = malloc(sizeof(fbdev_hook_mesa)); + if (priv == NULL) { + fprintf(stderr, "Failed to allocate fbdev_hook!\n"); + return GGI_DL_ERROR; + } + + priv->oldpriv = LIBGGI_PRIVATE(vis); // Hook back + + err = ggLoadConfig(conffile, &_configHandle); + if (err != GGI_OK) + { + gl_ggiPrint("display-fbdev: Couldn't open %s\n", conffile); + return err; + } + + LIBGGI_MESAEXT(vis)->update_state = NULL; + LIBGGI_MESAEXT(vis)->setup_driver = NULL; + + oldgetapi = vis->opdisplay->getapi; + vis->opdisplay->getapi = GGIMesa_fbdev_getapi; + changed(vis, GGI_CHG_APILIST); + /* If the accel sublibs didn't sucessfuly hook a driver, + * back up and keep looking */ + if ((LIBGGI_MESAEXT(vis)->update_state == NULL) || + (LIBGGI_MESAEXT(vis)->setup_driver == NULL)) + { + vis->opdisplay->getapi = oldgetapi; + } + + gl_ggiDEBUG("display-fbdev-mesa: GGIdlinit done\n"); + return 0; +} + +int GGIdlcleanup(ggi_visual *vis) +{ + return 0; +} + +#include <ggi/internal/ggidlinit.h> |