X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?p=bootcensus;a=blobdiff_plain;f=src%2Fvideo.c;h=ba89bad92b0649571e2284b876f96535bd4d9bde;hp=58b764b41cdbc0a9c5a6bb84c94d9775c30993db;hb=81c11bdd80190ec319a82b0402173cfb65fcbf72;hpb=094e9170ca5f9b59443c171967cdc78f1c07044c diff --git a/src/video.c b/src/video.c index 58b764b..ba89bad 100644 --- a/src/video.c +++ b/src/video.c @@ -89,7 +89,7 @@ static int init_once(void) void *set_video_mode(int mode) { if(init_once() == -1) return 0; - if(mode < 0 || mode >= mode_count) return 0; + if(mode < 0) return 0; if(!(mode_info = vbe_get_mode_info(mode))) { return 0; @@ -103,10 +103,9 @@ void *set_video_mode(int mode) return (void*)mode_info->fb_addr; } -int find_video_mode(int xsz, int ysz, int bpp) +int find_video_mode_idx(int xsz, int ysz, int bpp) { - int i; - uint16_t best = 0; + int i, best = -1, best_bpp = 0; struct vbe_mode_info *inf; if(init_once() == -1) return -1; @@ -116,12 +115,13 @@ int find_video_mode(int xsz, int ysz, int bpp) if(!inf || inf->xres != xsz || inf->yres != ysz) { continue; } - if(SAME_BPP(inf->bpp, bpp)) { - best = modes[i]; + if((bpp <= 0 && inf->bpp > best_bpp) || SAME_BPP(inf->bpp, bpp)) { + best = i; + best_bpp = inf->bpp; } } - if(!best) { + if(best == -1) { printf("Requested video mode (%dx%d %dbpp) is unavailable\n", xsz, ysz, bpp); return -1; } @@ -150,6 +150,9 @@ int video_mode_info(int n, struct video_mode *vid) vid->rbits = inf->rmask_size; vid->gbits = inf->gmask_size; vid->bbits = inf->bmask_size; + vid->rshift = inf->rpos; + vid->gshift = inf->gpos; + vid->bshift = inf->bpos; vid->rmask = color_mask(inf->rmask_size, inf->rpos); vid->gmask = color_mask(inf->gmask_size, inf->gpos); vid->bmask = color_mask(inf->bmask_size, inf->bpos); @@ -194,3 +197,15 @@ unsigned int color_mask(int nbits, int pos) static unsigned int maskbits[] = {0, 1, 3, 7, 0xf, 0x1f, 0x3f, 0x7f, 0xff}; return maskbits[nbits] << pos; } + +const char *get_video_vendor(void) +{ + if(init_once() == -1) return 0; + return (char*)VBEPTR(vbe_info->oem_vendor_name_ptr); +} + +int get_video_mem_size(void) +{ + if(init_once() == -1) return 0; + return vbe_info->total_mem << 6; +}