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;
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;
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;
}
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);
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;
+}