示例#1
0
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;
}
示例#2
0
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;
}
示例#3
0
/**
 * 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;
}