LINUX.ORG.RU

История изменений

Исправление Deleted, (текущая версия) :

Касательно возможности исправления этого со стороны SDL...

Фикс из первого поста некорректен. Вот этот код -

		if ( !shadow_fb &&
				ioctl(console_fd, FBIOPUT_VSCREENINFO, &vinfo) < 0 ) {
			vinfo.yres_virtual = height;
			if ( ioctl(console_fd, FBIOPUT_VSCREENINFO, &vinfo) < 0 ) {
				SDL_SetError("Couldn't set console screen info");
				return(NULL);
			}
		}
- имеет следующий смысл: сначала пробуем FBIOPUT_VSCREENINFO с обычным vinfo, а если не срабатывает, то меняем vinfo.yres_virtual, пробуем ещё раз и ещё раз проверяем на ошибки. Соответственно, если просто закомментить второй вызов ioctl(), то ошибка первого ioctl() будет просто проигнорирована. Вряд ли это именно та логика, которая должна тут быть.

Вообще, в SDL какой-то жуткий говнокод вот в этой части, которая выбирает правильные параметры для передачи в FBIOPUT_VSCREENINFO. Иногда он берёт захардкоженные значения, иногда читает /etc/fb.modes и как-то хитро перерабатывает(???). Если SDL считает, что текущий режим уже правильный, то FBIOPUT_VSCREENINFO похоже просто не вызывается.

Я, честно говоря, не понял до конца как это работает. И не могу посоветовать как это исправить со стороны SDL 1.2 так, чтобы гарантированно не сломалось что-то другое.

Касательно сегфолов: если код, вызывающий функции SDL не проверяет возвращаемые значения и из-за этого сегфолтится, то чинить надо и его тоже.

Исходная версия Deleted, :

Касательно возможности исправления этого со стороны SDL...

Фикс из первого поста некорректен. Вот этот код -

		if ( !shadow_fb &&
				ioctl(console_fd, FBIOPUT_VSCREENINFO, &vinfo) < 0 ) {
			vinfo.yres_virtual = height;
			if ( ioctl(console_fd, FBIOPUT_VSCREENINFO, &vinfo) < 0 ) {
				SDL_SetError("Couldn't set console screen info");
				return(NULL);
			}
		}
- имеет следующий смысл: сначала пробуем FBIOPUT_VSCREENINFO с обычным vinfo, а если не срабатывает, то меняем vinfo.yres_virtual, пробуем ещё раз и ещё раз проверяем на ошибки. Соответственно, если просто закомментить второй вызов ioctl(), то ошибка первого ioctl() будет просто проигнорирована. Вряд ли это именно та логика, которая должна тут быть.

Вообще, в SDL какой-то жуткий говнокод вот в этой части, которая выбирает правильные параметры для передачи в FBIOPUT_VSCREENINFO. Иногда он берёт захардкоженные значения, иногда читает /etc/fb.modes и как-то хитро перерабатывает(???). Если SDL считает, что текущий режим уже правильный, то FBIOPUT_VSCREENINFO похоже просто не вызывается.

Я, честно говоря, не понял до конца как это работает. И не могу посоветовать как это исправить со стороны SDL 1.2 так, чтобы гарантированно не сломалось что-то другое.