--- xc/programs/Xserver/hw/xfree86/fbdevhw/fbdevhw.c.ori Mon Jun 12 08:43:08 2000 +++ xc/programs/Xserver/hw/xfree86/fbdevhw/fbdevhw.c Thu Jun 8 06:51:08 2000 @@ -398,7 +398,19 @@ fbdevHWGetDepth(ScrnInfoPtr pScrn) { fbdevHWPtr fPtr = FBDEVHWPTR(pScrn); - return fPtr->var.bits_per_pixel; +/* ML return fPtr->var.bits_per_pixel; */ + switch(fPtr->var.bits_per_pixel) { + case 16: + if(fPtr->var.green.length > 5) + return(fPtr->var.bits_per_pixel); + else + return(15); + case 32: + return(24); + default: + return(fPtr->var.bits_per_pixel); + } + } int @@ -442,7 +454,39 @@ xfree2fbdev_timing(mode,&var); var.xres_virtual = virtX; var.yres_virtual = virtY; - var.bits_per_pixel = pScrn->depth; +/* ML var.bits_per_pixel = pScrn->depth; */ + var.bits_per_pixel = pScrn->bitsPerPixel; + switch(pScrn->depth) { + case 15: + var.red.offset = 10; + var.red.length = 5; + var.green.offset = 5; + var.green.length = 5; + var.blue.offset = 0; + var.blue.length = 5; + break; + case 16: + var.red.offset = 11; + var.red.length = 5; + var.green.offset = 5; + var.green.length = 6; + var.blue.offset = 0; + var.blue.length = 5; + break; + case 24: + if(pScrn->bitsPerPixel > 24) { + var.red.offset = 16; + var.red.length = 8; + var.green.offset = 8; + var.green.length = 8; + var.blue.offset = 0; + var.blue.length = 8; + var.transp.offset = 24; + var.transp.length = 8; + } + break; + } + var.activate = FB_ACTIVATE_TEST; if (var.xres_virtual < var.xres) var.xres_virtual = var.xres; if (var.yres_virtual < var.yres) var.yres_virtual = var.yres; @@ -506,7 +550,8 @@ TRACE_ENTER("MapVidmem"); if (NULL == fPtr->fbmem) { - fPtr->fboff = fPtr->fix.smem_len & (PAGE_SIZE-1); +/* ML fPtr->fboff = fPtr->fix.smem_len & (PAGE_SIZE-1); */ + fPtr->fboff = (unsigned long)fPtr->fix.smem_start & (unsigned long)(PAGE_SIZE-1); fPtr->fbmem = mmap(NULL, fPtr->fix.smem_len, PROT_READ | PROT_WRITE, MAP_SHARED, fPtr->fd, 0); if (-1 == (int)fPtr->fbmem) { @@ -609,6 +654,9 @@ perror("FBIOGET_VSCREENINFO"); return FALSE; } +/* ML */ + pScrn->displayWidth = fPtr->fix.line_length / + (fPtr->var.bits_per_pixel >> 3); return TRUE; }