OSDev http://osdev.su/ |
|
driver VGA http://osdev.su/viewtopic.php?f=7&t=834 |
Страница 5 из 6 |
Автор: | sabir [ 26 июн 2017, 14:29 ] |
Заголовок сообщения: | Re: driver VGA |
SII, Yoda Спасибо парни за инфу, вы избавили меня от кучи потраченного времени, я ведь и в самом деле собирался "поплисить", хорошо когда есть у кого спросить. Yoda писал(а): Попробуйте попрограммировать на CUDA, вы быстро убедитесь в этом. На CUDA я не кодил, т.к. карт энвидии у меня нет и не будет, а вот OpenCL потрогал, там определенно нет ничего сложного, конкретно в "userspace", в плане отрисовать пиксели в нужном месте в нужное время, OpenСL даже в разы проще OpenGL, которую я тоже потрогал, обе они, и OpenСL и OpenGL, в конечном итоге заканчиваются составлением исполняемого batch буффера, который отправляется в ядро, а вот что с ним происходит в ядре, я могу только предположить. Тут как раз все дело в ядре (Linux) где уже реализованы драйвера, именно поэтому в "userspace" все так просто. Yoda писал(а): Другое дело, что все эти ядра будут работать на частотах максимум в несколько десятков мегагерц, что дискредитирует всю затею по ускорению и переводит всё в область хобби. Вот именно это я и хотел услышать, четко и просто. Еще раз большое спасибо за НЕ потраченное время моей жизни Ну что делать, значит буду пилить software renderer. |
Автор: | pavia [ 28 июн 2017, 07:38 ] |
Заголовок сообщения: | Re: driver VGA |
На мою 50$ ПЛИС даже одно стандартное ядро не влазит. 100$ сразу забываем так как ядро PCI съест больше половины. 1-3 примитивных ядер влезит. 150-200$ Тут вы нормально можете сделать видео карту уровня VGA win95. Возможно тайванцы вам и драйвер подгонят(за доп. денюшку). И да про скорость тут уже писали 1-10 МГц. Если за плечами есть несколько лет практике ускоришь ещё в 10 раз. Я не осилил. Видео-драйвера это ОС в ОС. Интел это не абстракции на абстракции. Это шифр какой-то. Абстракция на абстракции это AMD. |
Автор: | sabir [ 28 июн 2017, 17:51 ] |
Заголовок сообщения: | Re: driver VGA |
Еще вопрос по теме. Как заюзать двойную буфферизацию, ведь рисовать в 'foreground buffer' просто не прилично. Положим отжать кусок видео памяти под 'background buffer', а затем перещелкнуться на него, нет проблем, здесь написано (http://forum.osdev.org/viewtopic.php?f= ... 28&start=0), а вот как отловить само событие, условно назовем его 'PAGE_FLIP_EVENT', когда контроллер дисплея или видяха (я точно еще не понял) закончил сканирование 'foreground buffer' и готов начать сначала, именно в этот момент ему и надо подсунуть другой буффер. Правильно ли я понимаю, что видяха (любая VESA совместимая) посылает камню прерывание, что вот прямо сейчас я готова флипнуться, желаешь сменить буффер или оставим как есть? Как отловить прерывание, вопросов нет, вопрос в его номере, он стандартен или нет, и как отличить, что прерывание вызвано событием 'PAGE_FLIP_EVENT', а не каким-либо другим, понятно что по номеру, а где эти номера прописаны? |
Автор: | Himik [ 28 июн 2017, 18:03 ] |
Заголовок сообщения: | Re: driver VGA |
Всё прописано в ACPI. Генерировать прерывания ещё надо заставить, они не идут сами по себе. Возможно в APCI есть сервисная функция активации прерывания, точно не знаю. Может даже в VESA это есть. |
Автор: | SII [ 28 июн 2017, 20:13 ] |
Заголовок сообщения: | Re: driver VGA |
pavia писал(а): На мою 50$ ПЛИС даже одно стандартное ядро не влазит. 100$ сразу забываем так как ядро PCI съест больше половины. 1-3 примитивных ядер влезит Не совсем так: зависит от конкретной плисины. Дело в том, что есть вполне дешёвые микрухи (у Хилинха, во всяком случае), где есть аппаратные блоки для подключения к PCI Express, а также аппаратные контроллеры памяти. Соответственно, на эти вещи не приходится тратить ресурсы собственно ПЛИС, и можно сосредоточиться на решении конкретной задачи. Пы.Сы. Если у кого-то есть желание обсуждать плисины, это лучше делать в отдельной теме: всё ж эта посвящена другой теме. |
Автор: | pavia [ 29 июн 2017, 11:48 ] |
Заголовок сообщения: | Re: driver VGA |
sabir писал(а): Еще вопрос по теме. Как заюзать двойную буфферизацию, ведь рисовать в 'foreground buffer' просто не прилично. Положим отжать кусок видео памяти под 'background buffer', а затем перещелкнуться на него, нет проблем, здесь написано (http://forum.osdev.org/viewtopic.php?f= ... 28&start=0), а вот как отловить само событие, условно назовем его 'PAGE_FLIP_EVENT', когда контроллер дисплея или видяха (я точно еще не понял) закончил сканирование 'foreground buffer' и готов начать сначала, именно в этот момент ему и надо подсунуть другой буффер. Правильно ли я понимаю, что видяха (любая VESA совместимая) посылает камню прерывание, что вот прямо сейчас я готова флипнуться, желаешь сменить буффер или оставим как есть? Как отловить прерывание, вопросов нет, вопрос в его номере, он стандартен или нет, и как отличить, что прерывание вызвано событием 'PAGE_FLIP_EVENT', а не каким-либо другим, понятно что по номеру, а где эти номера прописаны? Замечание, сейчас мода что-бы монитор подстраивался под видюшку. А не наоборот. IBM-PC (XT?) было стандартное IRQ2, но это конфликтует с современной архитектурой AT и PS/2 и прочее. У которых на нём сидит второй PIC. Единственный универсальный вариант это периодически читать из VGA регистра 3BAh/3DAh. http://semestr.com.ua/book_381_glava_16 ... y_VGA.html Что касается прерывания. То сейчас его номер можно получить через PCI-CFG. Его ещё надо настроить, ни VESA ни какой либо другой стандарт это не предусматривает. Для примера для Intel 965 PIPEASTAT—Pipe A Display Status Memory Offset Address: 70024h PIPEBSTAT—Pipe B Display Status Memory Offset Address: 71024h 25 бит Vertical Sync Interrupt Enable: This will enable the consideration of the vertical sync interrupt status bit in the first line interrupt logic. 0 = Vertical Sync Interrupt/Status Disabled 1 = Vertical Sync Interrupt/Status Enabled и 9 бит для сброса прерывания. |
Автор: | dixie [ 29 июн 2017, 16:23 ] |
Заголовок сообщения: | Re: driver VGA |
sabir писал(а): Как заюзать двойную буфферизацию, ведь рисовать в 'foreground buffer' просто не прилично. Положим отжать кусок видео памяти под 'background buffer', а затем перещелкнуться на него, нет проблем Слушьте - зачем при изобретении велосипеда обязательно делать шестиколёсный с GPS и встроенной кофемашиной?Нафиг вообще это железо не нужно при нынешних скоростях. Даже функции работы с хардварным курсором не нужны - с некоторым трахом, но любой вывод можно сделать так, что курсор мерцать не будет. Делается shadow в обычной памяти, с WB разумеется... Туда всё рисуется, оттуда читается, если надо сделать копию экрана или скроллирование. И оттуда же выводится в видеопамять (у которой WC). Для человеческого глаза и обычного GUI - этого хватает более чем. |
Автор: | sabir [ 29 июн 2017, 18:32 ] |
Заголовок сообщения: | Re: driver VGA |
pavia По ходу таки придется ковыряться в Intel HD, но я все равно собирался, сомнения у меня только были, что проще плиска или Intel, плиска отпала сама собой со всеми вытекающими. |
Автор: | sabir [ 05 июл 2017, 00:50 ] |
Заголовок сообщения: | Re: driver VGA |
В продолжение темы, нарыл я тут интересную и старую как мир мульку относительно двойной буферизации (далее описаны исключительно мои личные фантазии, которые могут не совпадать с реальностью). А именно, вовсе не обязательно отлавливать прерывание видюхи, тем более что его можно и вовсе не дождаться, а как же тогда быть? Да очень просто, в ядре по любому есть обработчик таймера на IRQ0, пусть, для примера, это будет 1000 раз в секунду, все одно видюха больше 60 раз в секунду не сможет обновить экран, так что с запасом. Так вот при срабатывании таймера можно проверить состояние видюхи (т.н. Input Status Register One) на предмет обратного хода луча по кадру фреймбуфера и как только луч пойдет обратно подсунуть ему второй буфер. А сделать это не составляет никакого труда, например (тиснуто у Кулакова, так что это уже не мои фантазии): Код: ;======================================================================= ; Ожидание обратного хода луча по кадру ;======================================================================= WaitVSync: push rax push rdx mov edx, 0x03DA ; читаем регистр статуса VGA @WaitNotVSyncLoop: in al, dx and al, 0x08 ; выделяем бит вертикальной синхронизации jnz @WaitNotVSyncLoop @WaitVSyncLoop: ; не пойму только, зачем здесь два раза in al, dx and al, 0x08 ; выделяем бит вертикальной синхронизации jz @WaitVSyncLoop pop rdx pop rax ret ;======================================================================= А вот мой вариант, в отличии от оригинала нет никаких бесконечных циклов ожидания выстрела, срабатывает только по таймеру и исполняется только один раз за сеанс: Код: WaitVSync: push rax push rdx mov edx, 0x03DA ; читаем регистр статуса VGA in al, dx bt eax, 3 ; проверяем бит вертикальной синхронизации jc @VSYNC_EVENT ... ; нет? ну так может в другой раз, я подожду @VSYNC_EVENT: ... ; здесь перещелкиваемся на backgroung буфер pop rdx pop rax ret Если кто в теме покритикуйте мой вариант, в сравнении с оригиналом, камень не нагружаем, а событие ловим. На практике пока не проверял, кто-нибудь уже пользовал такой метод, поделитесь |
Автор: | pavia [ 05 июл 2017, 06:45 ] |
Заголовок сообщения: | Re: driver VGA |
Обратный ход луча длиться меньше чем 0.5 мс. Это значит что половину из 60 фпс вы потеряете. Лечится повышением частоты таймера. А вывод картинке внутри прерывания приведёт к потере прерываний. Что-бы это немешало нужен колбек и нужен мьютекс. А вообще лучше ввести штамп времени для засечки обратного-хода и тройную буфферезацию. |
Страница 5 из 6 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/ |