This commit is contained in:
Brian Paul 2004-09-10 22:12:36 +00:00
parent 0479ce06d4
commit 89ac4fc6bf
4 changed files with 206 additions and 186 deletions

View file

@ -75,15 +75,16 @@ static int do_setmode(ggi_visual *vis)
_ggiZapMode(vis, ~GGI_DL_OPDISPLAY);
priv->have_accel = 0;
for (id = 1; GGIMesa_fbdev_getapi(vis, id, libname, libargs) == 0; id++)
{
for (id = 1; GGIMesa_fbdev_getapi(vis, id, libname, libargs) == 0; id++) {
if (_ggiOpenDL(vis, libname, libargs, NULL) == 0) {
fprintf(stderr, "display-fbdev-mesa: Error opening the "
GGIMESADPRINT_LIBS(stderr, "display-fbdev-mesa: Error opening the "
"%s (%s) library.\n", libname, libargs);
return GGI_EFATAL;
}
GGIMESADPRINT_CORE("Success in loading %s (%s)\n", libname, libargs);
GGIMESADPRINT_CORE("Success in loading %s (%s)\n",
libname, libargs);
}
if (priv->oldpriv->accel &&
@ -93,7 +94,7 @@ static int do_setmode(ggi_visual *vis)
priv->have_accel = 0;
}
vis->accelactive = 0;
ggiIndicateChange(vis, GGI_CHG_APILIST);
GGIMESADPRINT_CORE("display-fbdev-mesa: do_setmode SUCCESS\n");

View file

@ -38,7 +38,6 @@
#include <fcntl.h>
#include <sys/stat.h>
#define GGI_SYMNAME_PREFIX "MesaGGIdl_"
#ifdef HAVE_SYS_VT_H
#include <sys/vt.h>
@ -68,65 +67,28 @@ static accel_info accel_strings[] = {
#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)
{
switch (whatchanged) {
case GGI_CHG_APILIST: {
char api[GGI_API_MAXLEN], args[GGI_API_MAXLEN];
int i;
const char *fname;
ggi_dlhandle *lib;
for (i = 0; ggiGetAPI(vis, i, api, args) == 0; i++) {
strcat(api, "-mesa");
fname = ggMatchConfig(_configHandle, api, NULL);
if (fname == NULL) {
/* No special implementation for this sublib */
continue;
}
lib = ggiExtensionLoadDL(vis, fname, args, NULL, GGI_SYMNAME_PREFIX);
}
}
break;
}
return 0;
}
static int GGIopen(ggi_visual *vis, struct ggi_dlhandle *dlh,
const char *args, void *argptr, uint32 *dlret)
{
struct fbdev_priv_mesa *priv;
int err;
struct fbdev_priv_mesa *priv;
ggifunc_getapi *oldgetapi;
priv->oldpriv = LIBGGI_PRIVATE(vis); /* Hook back */
GGIMESA_PRIV(vis) = priv = malloc(sizeof(struct fbdev_priv_mesa));
if (priv == NULL) {
fprintf(stderr, "Failed to allocate fbdev private data\n");
fprintf(stderr, "GGIMesa: Failed to allocate fbdev private data\n");
return GGI_ENOMEM;
}
priv->oldpriv = LIBGGI_PRIVATE(vis); /* Hook back */
err = ggLoadConfig(conffile, &_configHandle);
if (err != GGI_OK) {
GGIMESADPRINT_CORE("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) ||
@ -142,6 +104,13 @@ static int GGIopen(ggi_visual *vis, struct ggi_dlhandle *dlh,
static int GGIclose(ggi_visual *vis, struct ggi_dlhandle *dlh)
{
struct fbdev_priv_mesa *priv = GGIMESA_PRIV(vis);
if (priv) {
LIBGGI_PRIVATE(vis) = priv->oldpriv;
free(priv);
}
return 0;
}

View file

@ -43,19 +43,56 @@
#include "texformat.h"
#include "texstore.h"
ggi_extid ggiMesaID = -1;
/* We use LibGG to manage config files */
#include <ggi/gg.h>
/* XXX: Those #defines should be provided via
* config.h
*/
#define GGIMESAPATHTAG "pAtHTAg"
#define GGIMESACONFDIR "pAtHTAg/usr/local/etc/ggi"
#define GGIMESATAGLEN 7
#define GGIMESACONFFILE "ggimesa.conf"
/* Static variables
*/
static int _ggimesaLibIsUp = 0;
static void *_ggimesaConfigHandle;
static char ggimesaconffile[] = GGIMESACONFFILE;
static char _ggimesaconfstub[512] = GGIMESACONFDIR;
static char *_ggimesaconfdir = _ggimesaconfstub+GGIMESATAGLEN;
int _ggimesaDebugSync = 0;
uint32 _ggimesaDebugState = 0;
static void gl_ggiUpdateState(GLcontext *ctx, GLuint new_state);
static int changed(ggi_visual_t vis, int whatchanged);
/* Extension ID. Defaulting to -1 should make segfault on abuse more likely...
*/
ggi_extid _ggiMesaID = -1;
#define SUBLIB_PREFIX "MesaGGIdl_"
/*
* Returns the directory where global config files are kept
*/
const char *ggiMesaGetConfDir(void)
{
#ifdef __WIN32__
/* On Win32 we allow overriding of the compiled in path. */
const char *envdir = getenv("GGI_CONFDIR");
if (envdir) return envdir;
#endif
return _ggimesaconfdir;
}
/* Dummy function which returns -1
We use this to reset the function pointers */
static int _ggi_error(void)
{
GGIMESADPRINT_CORE("_ggi_error() called\n");
@ -63,6 +100,147 @@ static int _ggi_error(void)
return -1;
}
static int changed(ggi_visual_t vis, int whatchanged)
{
GLcontext *ctx;
ctx = _mesa_get_current_context();
GGIMESADPRINT_CORE("changed() called\n");
switch (whatchanged) {
case GGI_CHG_APILIST:
{
char api[GGI_MAX_APILEN];
char args[GGI_MAX_APILEN];
int i;
const char *fname;
ggi_dlhandle *lib;
GLvisual *gl_vis = &(LIBGGI_MESAEXT(vis)->mesa_visual.gl_visual);
GLframebuffer *gl_fb = &(LIBGGI_MESAEXT(vis)->mesa_buffer);
/* Initialize the framebuffer to provide all necessary
buffers in software. The target libraries that are loaded
next are free to modify this according to their
capabilities.
*/
/* FIXME: if the target changes capabilities we'll leak
swrast's memory !!! Need to deallocate first */
_mesa_initialize_framebuffer(gl_fb, gl_vis,
gl_vis->depthBits > 0,
gl_vis->stencilBits > 0,
gl_vis->accumRedBits > 0,
gl_vis->alphaBits > 0);
for (i = 0; ggiGetAPI(vis, i, api, args) == 0; i++) {
strcat(api, "-mesa");
GGIMESADPRINT_CORE("GGIMesa: looking for"
"a sublib named %s\n", api);
fname = ggMatchConfig(_ggimesaConfigHandle, api, NULL);
if (fname == NULL) {
/* No special implementation for this sublib */
continue;
}
lib = ggiExtensionLoadDL(vis, fname, args, NULL,
SUBLIB_PREFIX);
}
/* The targets have cleared everything they can do from
the framebuffer structure so we provide the rest in sw
*/
_swrast_alloc_buffers(gl_fb);
break;
}
}
return 0;
}
int ggiMesaInit()
{
int err;
char *str;
char *conffile;
GGIMESADPRINT_CORE("ggiMesaInit() called\n");
_ggimesaLibIsUp++;
if (_ggimesaLibIsUp > 1) return 0; /* Initialize only at first call */
str = getenv("GGIMESA_DEBUGSYNC");
if (str != NULL) {
_ggimesaDebugSync = 1;
}
str = getenv("GGIMESA_DEBUG");
if (str != NULL) {
_ggimesaDebugState = atoi(str);
GGIMESADPRINT_CORE("%s Debugging=%d\n",
_ggimesaDebugSync ? "sync" : "async",
_ggimesaDebugState);
}
conffile = malloc(strlen(ggiMesaGetConfDir()) + 1
+ strlen(GGIMESACONFFILE) +1);
if (conffile == NULL) {
fprintf(stderr, "GGIMesa: unable to allocate memory for config filename.\n");
return GGI_ENOMEM;
}
sprintf(conffile, "%s%c%s",
ggiMesaGetConfDir(), '/', GGIMESACONFFILE);
err = ggLoadConfig(conffile, &_ggimesaConfigHandle);
if (err != GGI_OK) {
fprintf(stderr, "GGIMesa: Couldn't open %s\n",
conffile);
free(conffile);
_ggimesaLibIsUp--;
return err;
}
free(conffile);
_ggiMesaID = ggiExtensionRegister("GGIMesa",
sizeof(struct ggi_mesa_ext), changed);
if (_ggiMesaID < 0) {
fprintf(stderr, "GGIMesa: failed to register as extension\n");
_ggimesaLibIsUp--;
ggFreeConfig(_ggimesaConfigHandle);
return _ggiMesaID;
}
return 0;
}
int ggiMesaExit(void)
{
int rc;
GGIMESADPRINT_CORE("ggiMesaExit() called\n");
if (!_ggimesaLibIsUp) return -1;
if (_ggimesaLibIsUp > 1) {
/* Exit only at last call */
_ggimesaLibIsUp--;
return 0;
}
rc = ggiExtensionUnregister(_ggiMesaID);
ggFreeConfig(_ggimesaConfigHandle);
_ggimesaLibIsUp = 0;
return rc;
}
static void gl_ggiUpdateState(GLcontext *ctx, GLuint new_state);
static void gl_ggiGetSize(GLframebuffer *fb, GLuint *width, GLuint *height)
{
/* FIXME: this is a hack to work around the new interface */
@ -307,78 +485,6 @@ static void get_mode_info(ggi_visual_t vis, int *r, int *g, int *b,
printf("rgb (%d, %d, %d) db %d, rgb %d ci %d\n",*r,*g,*b,*db,*rgb,*ci);
}
int ggiMesaInit()
{
int err;
char *str;
GGIMESADPRINT_CORE("ggiMesaInit() called\n");
str = getenv("GGIMESA_DEBUGSYNC");
if (str != NULL) {
_ggimesaDebugSync = 1;
}
str = getenv("GGIMESA_DEBUG");
if (str != NULL) {
_ggimesaDebugState = atoi(str);
GGIMESADPRINT_CORE("%s Debugging=%d\n",
_ggimesaDebugSync ? "sync" : "async",
_ggimesaDebugState);
}
GGIMESADPRINT_CORE("ggiMesaInit()\n");
_ggimesaLibIsUp++;
if (_ggimesaLibIsUp > 1)
return 0; /* Initialize only at first call */
err = ggLoadConfig(ggimesaconffile, &_ggimesaConfigHandle);
if (err != GGI_OK)
{
GGIMESADPRINT_CORE("GGIMesa: Couldn't open %s\n",
ggimesaconffile);
_ggimesaLibIsUp--;
return err;
}
ggiMesaID = ggiExtensionRegister("GGIMesa",
sizeof(struct ggi_mesa_ext), changed);
if (ggiMesaID < 0)
{
GGIMESADPRINT_CORE("GGIMesa: failed to register as extension\n");
_ggimesaLibIsUp--;
ggFreeConfig(_ggimesaConfigHandle);
return ggiMesaID;
}
return 0;
}
int ggiMesaExit(void)
{
int rc;
GGIMESADPRINT_CORE("ggiMesaExit() called\n");
if (!_ggimesaLibIsUp)
return -1;
if (_ggimesaLibIsUp > 1)
{
/* Exit only at last call */
_ggimesaLibIsUp--;
return 0;
}
rc = ggiExtensionUnregister(ggiMesaID);
ggFreeConfig(_ggimesaConfigHandle);
_ggimesaLibIsUp = 0;
return rc;
}
int ggiMesaAttach(ggi_visual_t vis)
{
@ -386,7 +492,7 @@ int ggiMesaAttach(ggi_visual_t vis)
GGIMESADPRINT_CORE("ggiMesaAttach() called\n");
rc = ggiExtensionAttach(vis, ggiMesaID);
rc = ggiExtensionAttach(vis, _ggiMesaID);
if (rc == 0)
{
int r, g, b, ci;
@ -418,7 +524,7 @@ int ggiMesaDetach(ggi_visual_t vis)
{
GGIMESADPRINT_CORE("ggiMesaDetach() called\n");
return ggiExtensionDetach(vis, ggiMesaID);
return ggiExtensionDetach(vis, _ggiMesaID);
}
int ggiMesaExtendVisual(ggi_visual_t vis, GLboolean alpha_flag,
@ -588,58 +694,3 @@ static void gl_ggiUpdateState(GLcontext *ctx, GLuint new_state)
LIBGGI_MESAEXT(ggi_ctx->ggi_visual)->update_state(ggi_ctx);
}
static int changed(ggi_visual_t vis, int whatchanged)
{
GLcontext *ctx;
ctx = _mesa_get_current_context();
GGIMESADPRINT_CORE("changed() called\n");
switch (whatchanged) {
case GGI_CHG_APILIST:
{
char api[GGI_API_MAXLEN];
char args[GGI_API_MAXLEN];
int i;
const char *fname;
ggi_dlhandle *lib;
GLvisual *gl_vis=&(LIBGGI_MESAEXT(vis)->mesa_visual.gl_visual);
GLframebuffer *gl_fb = &(LIBGGI_MESAEXT(vis)->mesa_buffer);
/* Initialize the framebuffer to provide all necessary
buffers in software. The target libraries that are loaded
next are free to modify this according to their
capabilities.
*/
/* FIXME: if the target changes capabilities we'll leak
swrast's memory !!! Need to deallocate first */
_mesa_initialize_framebuffer(gl_fb, gl_vis,
gl_vis->depthBits > 0,
gl_vis->stencilBits > 0,
gl_vis->accumRedBits > 0,
gl_vis->alphaBits > 0);
for (i = 0; ggiGetAPI(vis, i, api, args) == 0; i++)
{
strcat(api, "-mesa");
fname = ggMatchConfig(_ggimesaConfigHandle, api, NULL);
if (fname == NULL)
{
/* No special implementation for this sublib */
continue;
}
lib = ggiExtensionLoadDL(vis, fname, args, NULL,
GGI_SYMNAME_PREFIX);
}
/* The targets have cleared everything they can do from
the framebuffer structure so we provide the rest in sw
*/
_swrast_alloc_buffers(gl_fb);
break;
}
}
return 0;
}

View file

@ -4,9 +4,8 @@
#include <ggi/internal/internal.h>
#include "ggimesa.h"
#define GGI_SYMNAME_PREFIX "MesaGGIdl_"
extern ggi_extid ggiMesaID;
extern ggi_extid _ggiMesaID;
ggifunc_setmode GGIMesa_setmode;
ggifunc_getapi GGIMesa_getapi;
@ -39,7 +38,7 @@ typedef struct ggi_mesa_ext
void *private;
} ggi_mesa_ext_t;
#define LIBGGI_MESAEXT(vis) ((ggi_mesa_ext_t *)LIBGGI_EXT(vis,ggiMesaID))
#define LIBGGI_MESAEXT(vis) ((ggi_mesa_ext_t *)LIBGGI_EXT(vis,_ggiMesaID))
#define GGIMESA_PRIV(vis) ((LIBGGI_MESAEXT(vis)->priv))
#endif /* _GGI_MISC_INT_H */