kdrive: memory/fd leaks fixed in fbdev/vesa/trident drivers
This commit is contained in:
parent
367cab99ec
commit
6171187e92
|
@ -136,13 +136,14 @@ fbdevScreenInitialize (KdScreenInfo *screen, FbdevScrPriv *scrpriv)
|
||||||
priv->var.bits_per_pixel == 16)
|
priv->var.bits_per_pixel == 16)
|
||||||
{
|
{
|
||||||
fake24 = TRUE;
|
fake24 = TRUE;
|
||||||
|
scrpriv->shadow = TRUE;
|
||||||
|
scrpriv->rotate = FALSE;
|
||||||
screen->fb[0].redMask = 0xff0000;
|
screen->fb[0].redMask = 0xff0000;
|
||||||
screen->fb[0].greenMask = 0x00ff00;
|
screen->fb[0].greenMask = 0x00ff00;
|
||||||
screen->fb[0].blueMask = 0x0000ff;
|
screen->fb[0].blueMask = 0x0000ff;
|
||||||
screen->width = priv->var.xres;
|
screen->width = priv->var.xres;
|
||||||
screen->height = priv->var.yres;
|
screen->height = priv->var.yres;
|
||||||
screen->softCursor = TRUE;
|
screen->softCursor = TRUE;
|
||||||
return KdShadowScreenInit (screen);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
#endif
|
#endif
|
||||||
|
@ -164,9 +165,13 @@ fbdevScreenInitialize (KdScreenInfo *screen, FbdevScrPriv *scrpriv)
|
||||||
screen->width = priv->var.yres;
|
screen->width = priv->var.yres;
|
||||||
screen->height = priv->var.xres;
|
screen->height = priv->var.xres;
|
||||||
screen->softCursor = TRUE;
|
screen->softCursor = TRUE;
|
||||||
return KdShadowScreenInit (screen);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (scrpriv->rotate)
|
||||||
|
scrpriv->shadow = TRUE;
|
||||||
|
if (scrpriv->shadow)
|
||||||
|
return KdShadowScreenInit (screen);
|
||||||
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
Bool
|
Bool
|
||||||
|
@ -293,23 +298,30 @@ fbdevInitScreen (ScreenPtr pScreen)
|
||||||
ShadowUpdateProc update;
|
ShadowUpdateProc update;
|
||||||
ShadowWindowProc window;
|
ShadowWindowProc window;
|
||||||
|
|
||||||
|
if (scrpriv->shadow)
|
||||||
|
{
|
||||||
|
window = fbdevWindowLinear;
|
||||||
#ifdef FAKE24_ON_16
|
#ifdef FAKE24_ON_16
|
||||||
if (pScreenPriv->screen->fb[0].bitsPerPixel == 24 && priv->var.bits_per_pixel == 16)
|
if (pScreenPriv->screen->fb[0].bitsPerPixel == 24 && priv->var.bits_per_pixel == 16)
|
||||||
{
|
{
|
||||||
return KdShadowInitScreen (pScreen, fbdevUpdateFake24, fbdevWindowLinear);
|
update = fbdevUpdateFake24;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
#endif /* FAKE24_ON_16 */
|
#endif /* FAKE24_ON_16 */
|
||||||
if (scrpriv->rotate)
|
{
|
||||||
{
|
update = shadowUpdatePacked;
|
||||||
window = fbdevWindowLinear;
|
if (scrpriv->rotate)
|
||||||
switch (pScreenPriv->screen->fb[0].bitsPerPixel) {
|
{
|
||||||
case 8:
|
window = fbdevWindowLinear;
|
||||||
update = shadowUpdateRotate8; break;
|
switch (pScreenPriv->screen->fb[0].bitsPerPixel) {
|
||||||
case 16:
|
case 8:
|
||||||
update = shadowUpdateRotate16; break;
|
update = shadowUpdateRotate8; break;
|
||||||
case 32:
|
case 16:
|
||||||
update = shadowUpdateRotate32; break;
|
update = shadowUpdateRotate16; break;
|
||||||
|
case 32:
|
||||||
|
update = shadowUpdateRotate32; break;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return KdShadowInitScreen (pScreen, update, window);
|
return KdShadowInitScreen (pScreen, update, window);
|
||||||
}
|
}
|
||||||
|
@ -405,6 +417,10 @@ fbdevRestore (KdCardInfo *card)
|
||||||
void
|
void
|
||||||
fbdevScreenFini (KdScreenInfo *screen)
|
fbdevScreenFini (KdScreenInfo *screen)
|
||||||
{
|
{
|
||||||
|
FbdevScrPriv *scrpriv = screen->driver;
|
||||||
|
|
||||||
|
if (scrpriv->shadow)
|
||||||
|
KdShadowScreenFini (screen);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
|
@ -40,11 +40,11 @@ typedef struct _fbdevPriv {
|
||||||
int fd;
|
int fd;
|
||||||
char *fb;
|
char *fb;
|
||||||
char *fb_base;
|
char *fb_base;
|
||||||
Bool rotate;
|
|
||||||
} FbdevPriv;
|
} FbdevPriv;
|
||||||
|
|
||||||
typedef struct _fbdevScrPriv {
|
typedef struct _fbdevScrPriv {
|
||||||
Bool rotate;
|
Bool rotate;
|
||||||
|
Bool shadow;
|
||||||
} FbdevScrPriv;
|
} FbdevScrPriv;
|
||||||
|
|
||||||
Bool
|
Bool
|
||||||
|
|
|
@ -633,11 +633,6 @@ KdScreenInit(int index, ScreenPtr pScreen, int argc, char **argv)
|
||||||
pScreen->SaveScreen = KdSaveScreen;
|
pScreen->SaveScreen = KdSaveScreen;
|
||||||
pScreen->CreateWindow = KdCreateWindow;
|
pScreen->CreateWindow = KdCreateWindow;
|
||||||
|
|
||||||
#ifdef RENDER
|
|
||||||
if (!fbPictureInit (pScreen, 0, 0))
|
|
||||||
return FALSE;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef FB_OLD_SCREEN
|
#ifdef FB_OLD_SCREEN
|
||||||
pScreenPriv->BackingStoreFuncs.SaveAreas = fbSaveAreas;
|
pScreenPriv->BackingStoreFuncs.SaveAreas = fbSaveAreas;
|
||||||
pScreenPriv->BackingStoreFuncs.RestoreAreas = fbSaveAreas;
|
pScreenPriv->BackingStoreFuncs.RestoreAreas = fbSaveAreas;
|
||||||
|
@ -685,6 +680,11 @@ KdScreenInit(int index, ScreenPtr pScreen, int argc, char **argv)
|
||||||
pScreen->BlockHandler = KdBlockHandler;
|
pScreen->BlockHandler = KdBlockHandler;
|
||||||
pScreen->WakeupHandler = KdWakeupHandler;
|
pScreen->WakeupHandler = KdWakeupHandler;
|
||||||
|
|
||||||
|
#ifdef RENDER
|
||||||
|
if (!fbPictureInit (pScreen, 0, 0))
|
||||||
|
return FALSE;
|
||||||
|
#endif
|
||||||
|
|
||||||
if (card->cfuncs->initScreen)
|
if (card->cfuncs->initScreen)
|
||||||
if (!(*card->cfuncs->initScreen) (pScreen))
|
if (!(*card->cfuncs->initScreen) (pScreen))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
|
@ -591,6 +591,9 @@ KdShadowScreenInit (KdScreenInfo *screen);
|
||||||
Bool
|
Bool
|
||||||
KdShadowInitScreen (ScreenPtr pScreen, ShadowUpdateProc update, ShadowWindowProc window);
|
KdShadowInitScreen (ScreenPtr pScreen, ShadowUpdateProc update, ShadowWindowProc window);
|
||||||
|
|
||||||
|
void
|
||||||
|
KdShadowScreenFini (KdScreenInfo *screen);
|
||||||
|
|
||||||
/* ktest.c */
|
/* ktest.c */
|
||||||
Bool
|
Bool
|
||||||
KdFrameBufferValid (CARD8 *base, int size);
|
KdFrameBufferValid (CARD8 *base, int size);
|
||||||
|
|
|
@ -30,6 +30,8 @@ KdShadowScreenInit (KdScreenInfo *screen)
|
||||||
void *buf;
|
void *buf;
|
||||||
|
|
||||||
buf = shadowAlloc (screen->width, screen->height, screen->fb[0].bitsPerPixel);
|
buf = shadowAlloc (screen->width, screen->height, screen->fb[0].bitsPerPixel);
|
||||||
|
if (!buf)
|
||||||
|
return FALSE;
|
||||||
screen->fb[0].frameBuffer = buf;
|
screen->fb[0].frameBuffer = buf;
|
||||||
screen->fb[0].byteStride = BitmapBytePad (screen->width * screen->fb[0].bitsPerPixel);
|
screen->fb[0].byteStride = BitmapBytePad (screen->width * screen->fb[0].bitsPerPixel);
|
||||||
screen->fb[0].pixelStride = screen->fb[0].byteStride * 8 / screen->fb[0].bitsPerPixel;
|
screen->fb[0].pixelStride = screen->fb[0].byteStride * 8 / screen->fb[0].bitsPerPixel;
|
||||||
|
@ -44,3 +46,10 @@ KdShadowInitScreen (ScreenPtr pScreen, ShadowUpdateProc update, ShadowWindowProc
|
||||||
|
|
||||||
return shadowInit (pScreen, update, window);
|
return shadowInit (pScreen, update, window);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
KdShadowScreenFini (KdScreenInfo *screen)
|
||||||
|
{
|
||||||
|
if (screen->fb[0].frameBuffer)
|
||||||
|
xfree (screen->fb[0].frameBuffer);
|
||||||
|
}
|
||||||
|
|
|
@ -286,6 +286,9 @@ tridentScreenFini (KdScreenInfo *screen)
|
||||||
{
|
{
|
||||||
TridentScreenInfo *tridents = (TridentScreenInfo *) screen->driver;
|
TridentScreenInfo *tridents = (TridentScreenInfo *) screen->driver;
|
||||||
|
|
||||||
|
#ifdef VESA
|
||||||
|
vesaScreenFini (screen);
|
||||||
|
#endif
|
||||||
xfree (tridents);
|
xfree (tridents);
|
||||||
screen->driver = 0;
|
screen->driver = 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -188,6 +188,8 @@ VbeCleanup(VbeInfoPtr vi)
|
||||||
munmap(vi->magicMem, MAGICMEM_SIZE);
|
munmap(vi->magicMem, MAGICMEM_SIZE);
|
||||||
munmap(vi->loMem, LOMEM_SIZE);
|
munmap(vi->loMem, LOMEM_SIZE);
|
||||||
munmap(vi->hiMem, HIMEM_SIZE);
|
munmap(vi->hiMem, HIMEM_SIZE);
|
||||||
|
close (vi->devmem);
|
||||||
|
close (vi->devzero);
|
||||||
xfree(vi);
|
xfree(vi);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -19,7 +19,7 @@ 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
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
THE SOFTWARE.
|
THE SOFTWARE.
|
||||||
*/
|
*/
|
||||||
/* $XFree86: xc/programs/Xserver/hw/kdrive/vesa/vesa.c,v 1.5 2000/09/15 07:25:13 keithp Exp $ */
|
/* $XFree86: xc/programs/Xserver/hw/kdrive/vesa/vesa.c,v 1.6 2000/09/19 23:50:47 keithp Exp $ */
|
||||||
|
|
||||||
#include "vesa.h"
|
#include "vesa.h"
|
||||||
|
|
||||||
|
@ -795,6 +795,8 @@ vesaScreenFini(KdScreenInfo *screen)
|
||||||
if (pscr->fb)
|
if (pscr->fb)
|
||||||
VbeUnmapFramebuffer(priv->vi, &pscr->mode->vmib, pscr->fb);
|
VbeUnmapFramebuffer(priv->vi, &pscr->mode->vmib, pscr->fb);
|
||||||
|
|
||||||
|
if (pscr->shadow)
|
||||||
|
KdShadowScreenFini (screen);
|
||||||
screen->fb[0].depth = pscr->origDepth;
|
screen->fb[0].depth = pscr->origDepth;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue