S3VBEFIX - утилита для видеокарт S3

Описания, советы, ремонт, эксплуатация старых IBM PC-совместимых ПК
Аватара пользователя
Rio444
Почётный пользователь
Сообщения: 31187
Зарегистрирован: 14.09.2014,19:11
Откуда: Ростов-на-Дону
Благодарил (а): 44 раза
Поблагодарили: 120 раз

Вклад в сообщество

Savage 4, вопросы.

Сообщение Rio444 » 05.08.2019,18:37

Forza3dfx писал(а): 05.08.2019,18:22 https://ru.wikipedia.org/wiki/LFB
То, что это имеет отношение в видеокартам, я и так догадался. Но как это работает?
Электронка: Изображение копия Изображение

Аватара пользователя
Tronix
Advanced Member
Сообщения: 3634
Зарегистрирован: 15.01.2008,11:00
Откуда: Москва
Поблагодарили: 1 раз

Вклад в сообщество

Savage 4, вопросы.

Сообщение Tronix » 05.08.2019,18:54

Rio444 писал(а): 05.08.2019,18:37 Но как это работает?
Linear frame buffer - в защищенном режиме может адресовать видео-память как простой массив, грубо говоря от 0 до 2Mb или сколько на карте есть. В реальном режиме больше 64Кб адресовать у видео-карты нельзя, для 320x200x8bit это как раз - 320x200x8=65535 байт аккурат, поэтому любую точку можно нарисовать в любом месте, просто посчитав 320*y+x по сегменту 0xA000. А вот например в режиме 640x480x8bit так уже нельзя, потому что для него нужно 640x480x8=2457600 байт (256 Кб). А в реальном режиме проца у нас есть только "окно" в 64Кб в 0xA000 сегменте. Поэтому что бы нарисовать точку в любом месте экрана нужно еще переключить через VESA или регистры нужный банк (окно). А в защищенном режиме то просто все, так же как и для 320x200, то есть [480*y+x], ведь масиив у нас линейный. Не надо с банками мудохаться.

Аватара пользователя
mcloud4477
Advanced Member
Сообщения: 1478
Зарегистрирован: 03.04.2010,01:28
Откуда: Москва
Благодарил (а): 1 раз
Поблагодарили: 5 раз

Savage 4, вопросы.

Сообщение mcloud4477 » 05.08.2019,20:19

LFB можно прекрасно включить через UNIvbe, только костыль он костыль и есть. На правах ИМХО, я толк от этого замечал только когда система нагружена на грани. Например если запустить эту демку на 486, http://www.pouet.net/prod.php?which=376 . Только зачем? Убедиться что тормозит меньше? Так ведь всё равно тормозит...
286x3 386x4 486x4 p1 без счёта, дальше- больше.

wbcbz7
Advanced Member
Сообщения: 437
Зарегистрирован: 17.02.2014,12:24
Откуда: omsk || nsk
Поблагодарили: 3 раза

Savage 4, вопросы.

Сообщение wbcbz7 » 05.08.2019,20:31

Rio444 писал(а): 05.08.2019,18:37 То, что это имеет отношение в видеокартам, я и так догадался. Но как это работает?
Итак, изначально, поскольку PC не умел адресовать более 1 мегабайта памяти, под внешние устройства, в том числе и видеоадаптеры, была отведена область памяти по адресу 0xA000:0000-0xB000:FFFF в реальном режиме или 0xA0000-0xBFFFF в защищенном (всего 128 килобайт). В стандартных VGA-режимах используется один из сегментов, обычно 0xA000 для графических режимов (64 килобайта), 0xB000 для монохромного текстового режима (32кб) и 0xB800 для цветного текстового режима и CGA-графики (32кб). В VESA-режимах в сегмент 0xB000 обычно не лезут, поэтому остановимся на 0xA000.

В 16-цветных режимах в этот сегмент проецируются 4 битовые плоскости по 64 килобайта (отсюда и максимально доступный в VGA объем в 256 кб). Каждый байт плоскости содержит 8 однобитных (монохромных) пикселей, значение которого соответствует одному из битов кода цвета; в стандартной палитре плоскости именуют последовательно Blue, Green, Red и Intensity. Для простоты можно представить каждую из плоскостей как листы прозрачной бумаги, каждый из которых раскрашивается в один конкретный цвет. Если наложить их друг на друга и просветить, то получим комбинацию из наложенных цветов. Подобная организация видеопамяти характерна не только для EGA\VGA, но и для многих 16-битных домашних компьютеров, например, Amiga, Atari ST, а также в советском Вектор-06Ц. При этом мы можем настроить контроллер так, что запись по одному адресу запишет данные во все или выбранные битовые плоскости; объема видеопамяти хватает на несколько видеостраниц (отдельных виртуальных экранов, на которых можно рисовать, пока отображается текущий, и переключать их одной операцией - проще говоря, двойная\тройная буферизация :))
Изображение

Используя всю мощь дополнительной логики видеочипа - регистров-защелок и АЛУ VGA, можно накладывать спрайты с маской, быстро копировать данные из одной области памяти в другую, рисовать полупрозрачные объекты и т.д., при этом в сочетании с VGA-шным богатством цветов можно делать классно выглядящие и совершенно не тормозящие игры, например, Prehistorik 2.
Изображение

В 256-цветных режимах, чтобы не усложнять логику чипа и не терять аппаратную совместимость с 16-цветными режимами, число плоскостей оставлено прежним, но теперь байт плоскости хранит сразу значение цвета конкретного пиксела. Для дальнейшего упрощения работы с экраном, чтобы исключить переключение плоскостей, был введен режим Chain-4, в котором младшие два бита адреса выбирают конкретную плоскость, с которой будет вестись работа. Главное достоинство данного подхода - упрощается работа с экраном - он выглядит как линейный массив пикселов, объединенных в строки изображения, минус же данного подхода очевиден - 3/4 видеопамяти тратится впустую, из-за чего нельзя установить разрешение выше 320x200. Пример - всем известный режим 0x13 (320x200 256 цветов)
Так организована видеопамять в стандартном режиме 320x200 256 цветов:
M13ORG.GIF
M13ORG.GIF (8.65 КБ) 2269 просмотров
К счастью, этот режим легко отключается, и появляется возможность ценой усложнения адресации (теперь нужно работать со всеми плоскостями через узкое 64кб-окно, к тому же пикселы расположены не линейно, а по одному адресу отвечают сразу 4 пиксела в четырех плоскостях друг за другом) использовать всю доступную видеопамять. При этом функции АЛУ и регистров-защелок тоже никуда не исчезли, и их также можно было использовать на полную мощность, как и двойную буферизацию - доступный объем памяти-то увеличился, и в тех же 320x200 стало возможным использовать до 4 видеостраниц! Именно так и работает Mode-X.
MXORG.GIF
MXORG.GIF (9.94 КБ) 2269 просмотров
Когда встала необходимость работы с SuperVGA-режимами (640x480, 800x600), требовавшими уже большего объема видеопамяти, встал вопрос стандартизации программного интерфейса и адресации. Первый вопрос решился, с одной стороны, концепцией драйверов для каждого графического адаптера в ОС, с другой стороны, принятием VESA BIOS Extensions (VBE) - единого API реального (а начиная с версии 2.0 - и защищенного) режима для работы с расширенными возможностями видеоадаптеров.
Перейдем ко второму вопросу - адресации видеопамяти. Для непосредственно кадрового буфера была принята линейная адресация, как в режиме 0x13, а для совместимости с реальным режимом процессора и старыми DOS-программами было решено всю расширенную память (например, 512 килобайт) разбить на участки по 64 килобайта, которые подставляются в окно по адресу 0xA000:0000. Соответственно, для того, чтобы заполнить весь экран в режиме 640x480 256 цветов требуется записать 640*480 = 307200 байт, расположенные в 307200/65536 = 4,6875 = 5 последовательно расположенных банках памяти. Переключая эти банки через регистры или функции VESA BIOS Extensions, возможно получить доступ ко всей видеопамяти.
Изображение
Недостаток такого метода очевиден - для того, чтобы просто поставить точку, нужно обращаться к довольно медленным функциям BIOS (а в защищенном режиме это еще и добавляет накладные расходы на возврат в реальный или хотя бы V86 режим, чтобы выполнить функцию переключения). К тому же, одна строка экрана может оказаться разрезанной прямо по границе банков,из-за чего код переброски блоков картинки в видеопамять (например, для вывода спрайтов) серьезно усложняется. Тем не менее, некоторые игры оценили возможности VESA-режимов - например, SimCity 2000
Изображение

Тем временем, все большее число программ стало использовать все возможности защищенного режима, одной из главных является возможность работать с памятью дальше первого мегабайта без использования всяких ухищрений типа XMS/EMS. При этом адресное пространство для 386 (и более поздних процессоров) в 32-битном защищенном режиме простиралось вплоть до 4 ГБ, что по тем временам казалось немыслимым объемом :) Часть этого пространства было отдано на откуп дополнительным адаптерам расширения - к которым относятся и видеокарты, которые теперь смогли разместить все свои мегабайты видеопамяти линейной областью памяти, без всяких банков и медленных переключений контекста - благо как раз в то время видеокарты уходили от устаревшей шины ISA на намного более скоростные VLB и PCI, поддерживающие 32-битную адресацию памяти против 24-битной у ISA.
(опустим такие трюки, как Flat Real Mode, позволявшие использовать те же 4 гигабайта в обычном реальном режиме, хоть они и применимы в данном случае)

Достаточно быстро, в 1994 году, появляется вторая версия спецификации VBE, в которой основное внимание уделено новой возможности - линейному кадровому буферу (LFB). Получив один-единственный адрес буфера (например 0xE0000000), зная объем доступной памяти и остальные параметры режима (разрешение, глубина цвета, шаг одной строки буфера в байтах), возможно, не обращаясь ни к каким дополнительным функциям видеобиоса, работать со всей доступной видеопамятью карты на максимальной скорости, без глупых ограничений в 64 килобайта. Разумеется, LFB сразу стал использоваться практически во всех программах, использовавших SVGA-режимы, в том числе и под Windows (через DirectX), Linux и другими системами.
Изображение

При этом на пути ко всеобщему принятию LFB стояло достаточно преград - например, нежелание вендоров добавлять поддержку в видеобиосы (игнорируя ее или добавляя во внешние резиденты), либо наоборот, неполная поддержка необходимых функций, из-за чего возникали проблемы с некоторыми программами. Я думаю, вы догадались :), что речь пойдет про SciTech Display Doctor - набор утилит для тонкой настройки видеокарт под DOS, включавший UniVBE - универсальный драйвер VBE 2.0 (а позднее - и 3.0, добавивший поддержку регулировки и смены частот обновления экрана), работающий со множеством чипов. Так или иначе, но к 1996-1997 году уже трудно было найти новую игру или карту, не знавшую или неспособную использовать все прелести линейного буфера (хотя с играми шел другой процесс - переход на Windows, где те же возможности достигались средствами уже упомянутого DirectX).

Теперь про Quake. Игра поддерживает три возможных варианта - 320x200 256 цветов (режим 0x13), набор Mode-X режимов (от 320x240 до 360x480) и VBE 2.0-режимы, обязательно с поддержкой LFB. Соответственно, она никоем образом не умеет работать со старым методом адресации через банки по 64 кб, и на VBE 1.2 - видеокарте будут доступны лишь первые две группы режимов. Если же такой карточке загрузить UniVBE (или например S3VBE20), при этом карта аппаратно должна поддерживать линейный кадровый буфер, то игра сможет использовать и SVGA-режимы.
А вот, например, Duke Nukem 3D поддерживает и банковую адресацию, поэтому его возможно запустить в 640x480 и на стареньком Трайденте, поддерживающем только VBE 1.2 и banked режимы (про скорость мы конечно же умолчим :), и на S3 ViRGE/DX, который аппаратно умеет LFB.

Надеюсь, сейчас станет более понятно :)
Вложения
Снимок.gif
Последний раз редактировалось wbcbz7 05.08.2019,22:48, всего редактировалось 6 раз.

wbcbz7
Advanced Member
Сообщения: 437
Зарегистрирован: 17.02.2014,12:24
Откуда: omsk || nsk
Поблагодарили: 3 раза

Savage 4, вопросы.

Сообщение wbcbz7 » 05.08.2019,20:33

mcloud4477 писал(а): 05.08.2019,20:19 LFB можно прекрасно включить через UNIvbe, только костыль он костыль и есть
Как раз все наоборот - работать с видеопамятью через уууууууузенькое окошко и есть костыль, а LFB дает возможность работать с видеопамятью как с обычной без дробления на куски

Forza3dfx
Advanced Member
Сообщения: 1084
Зарегистрирован: 01.03.2015,08:51
Поблагодарили: 2 раза

Вклад в сообщество

Savage 4, вопросы.

Сообщение Forza3dfx » 05.08.2019,21:00

wbcbz7 писал(а): 05.08.2019,20:31 Надеюсь, сейчас станет более понятно
В сжатом виде и по-существу, очень хорошо.

Особо никогда не интересовался программированием графики, но так как знаю, что такое
wbcbz7 писал(а): 05.08.2019,20:31 (такие трюки, как Flat Real Mode, позволявшие использовать те же 4 гигабайта в обычном реальном режиме,
хоть они и применимы в данном случае)
то проблем с пониманием изложенного не возникло.

Аватара пользователя
Rio444
Почётный пользователь
Сообщения: 31187
Зарегистрирован: 14.09.2014,19:11
Откуда: Ростов-на-Дону
Благодарил (а): 44 раза
Поблагодарили: 120 раз

Вклад в сообщество

Savage 4, вопросы.

Сообщение Rio444 » 05.08.2019,21:36

Вот это понятно:
[quote=wbcbz7 post_id=474794 time=1565026280 user_id=3752]
В 16-цветных режимах в этот сегмент проецируются 4 битовые плоскости по 64 килобайта (отсюда и максимально доступный в VGA объем в 256 кб), каждая из которых, будучи монохромной, соответствует одному из битов кода цвета....
[/quote]
Но уже на этом месте затык:
[quote=wbcbz7 post_id=474794 time=1565026280 user_id=3752]
В 256-цветных режимах, чтобы не терять совместимость с 16-цветными режимами, был введен режим Chain-4, в котором младшие два бита адреса выбирают конкретную плоскость, с которой будет вестись работа, и которая в одном байте хранит непосредственно код цвета для пиксела.
[/quote]
Как может быть совместимость, если в первом случае пикселю соответствует бит, а во втором байт?
Можете не отвечать. Мы и так слишком далеко в оффтоп ушли.

P.S. Что с форматированием? Только я вместо цитат вижу коды в квадратных скобках?
Электронка: Изображение копия Изображение

wbcbz7
Advanced Member
Сообщения: 437
Зарегистрирован: 17.02.2014,12:24
Откуда: omsk || nsk
Поблагодарили: 3 раза

Savage 4, вопросы.

Сообщение wbcbz7 » 05.08.2019,22:23

Rio444 писал(а): 05.08.2019,21:36 Как может быть совместимость, если в первом случае пикселю соответствует бит, а во втором байт?
здесь под совместимостью имеется в виду тот факт, что для 16-цветных и 256-цветных режимов в VGA используется одна и та же логика, просто работающая в разных режимах, чтобы не усложнять сам чип и работу с ним.

Аватара пользователя
Rio444
Почётный пользователь
Сообщения: 31187
Зарегистрирован: 14.09.2014,19:11
Откуда: Ростов-на-Дону
Благодарил (а): 44 раза
Поблагодарили: 120 раз

Вклад в сообщество

Savage 4, вопросы.

Сообщение Rio444 » 05.08.2019,22:33

wbcbz7, Начало понятно, середина - не очень, описание LFB и заключение - тоже понятно. И на том спасибо! :thumbup: :)
Электронка: Изображение копия Изображение

Jager
Advanced Member
Сообщения: 1492
Зарегистрирован: 10.11.2018,21:27
Поблагодарили: 1 раз

S3VBEFIX - утилита для видеокарт S3

Сообщение Jager » 06.08.2019,06:26

Кстати, про VBE. Пока особо не вникал в детали, но почему Quake может не давать поставить больше, чем 360x480 на Virge DX? Там же вроде априори VBE2, нет?
Карточка примерно такая (с половиной памяти):
Изображение

Аватара пользователя
Rio444
Почётный пользователь
Сообщения: 31187
Зарегистрирован: 14.09.2014,19:11
Откуда: Ростов-на-Дону
Благодарил (а): 44 раза
Поблагодарили: 120 раз

Вклад в сообщество

S3VBEFIX - утилита для видеокарт S3

Сообщение Rio444 » 06.08.2019,11:02

Jager, не знаю, может он не активирован. Но приходится запускать UniVBE. Тогда появляются все режимы
А вот в более поздних картах, как Ati Rage 128, Riva TNT2 всё работает из коробки. Насчет Savage4 не помню, кажется тоже.
Электронка: Изображение копия Изображение

Ответить