Browse Source

Move dri initialization into XCreateWindow

tags/embedded-1-20030120
Keith Whitwell 23 years ago
parent
commit
3e06eed70a
3 changed files with 46 additions and 25 deletions
  1. 9
    8
      src/mesa/drivers/dri/radeon/server/radeon_dri.c
  2. 35
    13
      src/miniglx/miniglx.c
  3. 2
    4
      src/miniglx/miniglxP.h

+ 9
- 8
src/mesa/drivers/dri/radeon/server/radeon_dri.c View File

@@ -215,7 +215,7 @@ static int RADEONDRIAgpInit( struct MiniGLXDisplayRec *dpy, RADEONInfoPtr info)
static int RADEONDRIKernelInit(struct MiniGLXDisplayRec *dpy,
RADEONInfoPtr info)
{
int cpp = dpy->bpp / 8;
int cpp = dpy->VarInfo.bits_per_pixel / 8;
drmRadeonInit drmInfo;
int ret;

@@ -235,8 +235,8 @@ static int RADEONDRIKernelInit(struct MiniGLXDisplayRec *dpy,
drmInfo.agp_size = info->agpSize*1024*1024;
drmInfo.ring_size = info->ringSize*1024*1024;
drmInfo.usec_timeout = 1000;
drmInfo.fb_bpp = dpy->bpp;
drmInfo.depth_bpp = dpy->bpp;
drmInfo.fb_bpp = dpy->VarInfo.bits_per_pixel;
drmInfo.depth_bpp = dpy->VarInfo.bits_per_pixel;
drmInfo.front_offset = info->frontOffset;
drmInfo.front_pitch = info->frontPitch * cpp;
drmInfo.back_offset = info->backOffset;
@@ -373,7 +373,7 @@ static int RADEONSetPitch (struct MiniGLXDisplayRec *dpy)
int dummy = dpy->VarInfo.xres_virtual;

/* FIXME: May need to validate line pitch here */
switch (dpy->bpp / 8) {
switch (dpy->VarInfo.bits_per_pixel / 8) {
case 1: dummy = (dpy->VarInfo.xres_virtual + 127) & ~127; break;
case 2: dummy = (dpy->VarInfo.xres_virtual + 31) & ~31; break;
case 3:
@@ -431,9 +431,10 @@ static int RADEONScreenInit( struct MiniGLXDisplayRec *dpy, RADEONInfoPtr info )
if (maxy <= dpy->VarInfo.yres_virtual * 3) {
fprintf(stderr,
"Static buffer allocation failed -- "
"need at least %d kB video memory\n",
"need at least %d kB video memory (have %d kB)\n",
(dpy->VarInfo.xres_virtual * dpy->VarInfo.yres_virtual *
dpy->cpp * 3 + 1023) / 1024);
dpy->cpp * 3 + 1023) / 1024,
dpy->FrameBufferSize / 1024);
return 0;
}
}
@@ -678,8 +679,8 @@ static int RADEONScreenInit( struct MiniGLXDisplayRec *dpy, RADEONInfoPtr info )
pRADEONDRI->deviceID = info->Chipset;
pRADEONDRI->width = dpy->VarInfo.xres_virtual;
pRADEONDRI->height = dpy->VarInfo.yres_virtual;
pRADEONDRI->depth = dpy->bpp; /* XXX: was depth */
pRADEONDRI->bpp = dpy->bpp;
pRADEONDRI->depth = dpy->VarInfo.bits_per_pixel; /* XXX: was depth */
pRADEONDRI->bpp = dpy->VarInfo.bits_per_pixel;
pRADEONDRI->IsPCI = 0;
pRADEONDRI->AGPMode = info->agpMode;
pRADEONDRI->frontOffset = info->frontOffset;

+ 35
- 13
src/miniglx/miniglx.c View File

@@ -1,4 +1,4 @@
/* $Id: miniglx.c,v 1.1.4.16 2002/12/19 10:16:19 keithw Exp $ */
/* $Id: miniglx.c,v 1.1.4.17 2002/12/19 13:48:27 keithw Exp $ */

/*
* Mesa 3-D graphics library
@@ -341,6 +341,8 @@ SetupFBDev( Display *dpy, Window win )
return GL_FALSE;
}

dpy->cpp = dpy->VarInfo.bits_per_pixel / 8;

if (0)
{
int x, y;
@@ -505,7 +507,7 @@ int __read_config_file( Display *dpy )
{
dpy->fbdevDevice = "/dev/fb0";
dpy->clientDriverName = "radeon_dri.so";
dpy->drmModuleName = "radeon.o";
dpy->drmModuleName = "radeon";
dpy->pciBus = 1;
dpy->pciDevice = 0;
dpy->pciFunc = 0;
@@ -567,7 +569,6 @@ XOpenDisplay( const char *display_name )
return NULL;
}


dpy->createScreen = (CreateScreenFunc) dlsym(dpy->dlHandle,
"__driCreateScreen");
if (!dpy->createScreen) {
@@ -578,15 +579,6 @@ XOpenDisplay( const char *display_name )
return NULL;
}

/* this effectively initializes the DRI driver - just an idea */
dpy->driScreen.private = (*dpy->createScreen)(dpy, 0, &(dpy->driScreen),
dpy->numConfigs,
dpy->configs);
if (!dpy->driScreen.private) {
FREE(dpy);
return NULL;
}

return dpy;
}

@@ -637,7 +629,9 @@ XCreateWindow( Display *dpy, Window parent, int x, int y,
win->h = height;
win->visual = visual; /* ptr assignment */

/* do fbdev setup */
/* do fbdev setup
* TODO: Let the driver influence the choice of window pitch.
*/
if (!SetupFBDev(dpy, win)) {
FREE(win);
return NULL;
@@ -664,6 +658,34 @@ XCreateWindow( Display *dpy, Window parent, int x, int y,
win->curBottom = win->frontBottom;
}


/* Perform the initialization normally done in the X server */
if (!dpy->driverInitFBDev( dpy )) {
RestoreFBDev(dpy);
FREE(win);
return NULL;
}

/* Perform the client-side initialization. Have to do this here as
* it depends on the display resolution chosen, which in this
* window system depends on the size of the "window" created.
*
* Clearly there is a limit of one on the number of windows in
* existence at any time.
*
* Need to shut down drm and free dri data in XDestroyWindow, too.
*/
dpy->driScreen.private = (*dpy->createScreen)(dpy, 0, &(dpy->driScreen),
dpy->numConfigs,
dpy->configs);
if (!dpy->driScreen.private) {
RestoreFBDev(dpy);
FREE(win);
return NULL;
}



win->driDrawable.private = dpy->driScreen.createDrawable(dpy, 0, win,
visual->visInfo->visualid, &(win->driDrawable));
if (!win->driDrawable.private) {

+ 2
- 4
src/miniglx/miniglxP.h View File

@@ -251,10 +251,8 @@ struct MiniGLXDisplayRec {
int NumWindows;
Window TheWindow; /* only allow one window for now */

int width;
int height;
int bpp;
int cpp;
/* int bpp; */
int cpp;

int numConfigs;
__GLXvisualConfig *configs;

Loading…
Cancel
Save