static void vbe_probe(void) { unsigned flags = vbeMdAvailable | vbeMdGraphMode | vbeMdLinear; adv_bool has8bit = 0; adv_bool has15bit = 0; adv_bool has16bit = 0; adv_bool has24bit = 0; adv_bool has32bit = 0; vbe_mode_iterator i; vbe_mode_iterator_begin(&i); while (!vbe_mode_iterator_end(&i)) { unsigned mode; vbe_ModeInfoBlock info; mode = vbe_mode_iterator_get(&i) | vbeLinearBuffer; if (vbe_mode_info_get(&info, mode) == 0 && (info.ModeAttributes & flags) == flags && info.NumberOfPlanes == 1 && (info.MemoryModel == vbeMemRGB || info.MemoryModel == vbeMemPK)) { switch (info.BitsPerPixel) { case 8: has8bit = 1; break; case 15: has15bit = 1; break; case 16: has16bit = 1; break; case 24: has24bit = 1; break; case 32: has32bit = 1; break; } } vbe_mode_iterator_next(&i); } /* remove unsupported bit depth */ if (!has8bit) vbe_state2.flags &= ~VIDEO_DRIVER_FLAGS_MODE_PALETTE8; if (!has15bit) vbe_state2.flags &= ~VIDEO_DRIVER_FLAGS_MODE_BGR15; if (!has16bit) vbe_state2.flags &= ~VIDEO_DRIVER_FLAGS_MODE_BGR16; if (!has24bit) vbe_state2.flags &= ~VIDEO_DRIVER_FLAGS_MODE_BGR24; if (!has32bit) vbe_state2.flags &= ~VIDEO_DRIVER_FLAGS_MODE_BGR32; }
static int test_vbeline(int x, int y, vbeline_video_mode* mode) { char buffer[256]; vbe_ModeInfoBlock info; draw_test_default(); snprintf(buffer, sizeof(buffer), "vbeline %s %dx%dx%d [%dx%d]", index_name(video_index()), video_size_x(), video_size_y(), video_bits_per_pixel(), video_virtual_x(), video_virtual_y()); draw_string(x, y, buffer, DRAW_COLOR_WHITE); ++y; vbe_mode_info_get(&info, mode->mode); snprintf(buffer, sizeof(buffer), "based on vbe mode 0x%x %dx%dx%d", mode->mode, info.XResolution, info.YResolution, info.BitsPerPixel); draw_string(x, y, buffer, DRAW_COLOR_WHITE); ++y; ++y; y = test_crtc(x, y, &mode->crtc, 1, 1, 1); y = test_default_command(x, y); return y; }
/** * Import information for one video mode. * \param mode Mode to write. * \param vbe_mode Mode to import. * \return 0 if successful */ adv_error vbe_mode_import(adv_mode* mode, const vbe_video_mode* vbe_mode) { vbe_ModeInfoBlock info; snprintf(mode->name, MODE_NAME_MAX, "vbe_bios_%x", vbe_mode->mode); *DRIVER(mode) = *vbe_mode; if (vbe_mode_info_get(&info, DRIVER(mode)->mode) != 0) { error_set("VBE report that mode %d is unsupported", DRIVER(mode)->mode); return -1; } if ((info.ModeAttributes & vbeMdAvailable) == 0) { error_set("VBE report that mode %d is not avaliable", DRIVER(mode)->mode); return -1; } if ((info.ModeAttributes & vbeMdGraphMode) == 0) { error_nolog_set("Text modes are unsupported"); return -1; } else { if ((DRIVER(mode)->mode & vbeLinearBuffer) != 0) { if (vbe_state.info.VESAVersion < 0x200) { error_nolog_set("Linear frame buffer not available on VBE version prior 2.0"); return -1; } if ((info.ModeAttributes & vbeMdLinear) == 0) { error_nolog_set("Linear frame buffer not available in this mode"); return -1; } } else { if ((info.ModeAttributes & vbeMdNonBanked) != 0) { error_nolog_set("Banked frame buffer not available in this mode"); return -1; } else { error_nolog_set("Banked frame buffer isn't supported"); return -1; } } /* Packed or RGB memory model */ if (info.MemoryModel != vbeMemPK && info.MemoryModel != vbeMemRGB) { error_nolog_set("Unsupported memory model"); return -1; } /* Non planar mode */ if (info.NumberOfPlanes != 1) { error_nolog_set("Unsupported number of planes"); return -1; } } mode->driver = &video_vbe_driver; mode->flags = MODE_FLAGS_RETRACE_WAIT_SYNC | MODE_FLAGS_RETRACE_SCROLL_SYNC | (mode->flags & MODE_FLAGS_USER_MASK); if ((info.ModeAttributes & vbeMdTripleBuffer) != 0) mode->flags |= MODE_FLAGS_RETRACE_SCROLL_ASYNC; switch (info.MemoryModel) { case vbeMemTXT: mode->flags |= MODE_FLAGS_INDEX_TEXT; break; case vbeMemPK: mode->flags |= MODE_FLAGS_INDEX_PALETTE8; break; case vbeMemRGB: switch (info.BitsPerPixel) { case 15: mode->flags |= MODE_FLAGS_INDEX_BGR15; break; case 16: mode->flags |= MODE_FLAGS_INDEX_BGR16; break; case 24: mode->flags |= MODE_FLAGS_INDEX_BGR24; break; case 32: mode->flags |= MODE_FLAGS_INDEX_BGR32; break; default: return -1; } break; default: return -1; } mode->size_x = info.XResolution; mode->size_y = info.YResolution; if (info.MemoryModel == vbeMemTXT) { mode->size_x *= info.XCharSize; mode->size_y *= info.YCharSize; } mode->vclock = 0; mode->hclock = 0; if (info.YResolution <= 300) mode->scan = 1; /* assume doublescan */ else mode->scan = 0; /* assume singlescan */ return 0; }