С чего начать программирование графики на ассемблере?

Тема в разделе "WASM.BEGINNERS", создана пользователем assemblerist, 12 авг 2010.

  1. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    assemblerist
    Все с вами ясно. Вы никогда не занимались низкоуровневыми вещами. Поэтому не понимаете зачем нужны высокоуравниваемыми абстракции. Мы уже с ними знакомы а вы еще нет. Мы с вами говорим на разных языках.

    Код (Text):
    1. +---------------------+
    2. |Общая память         |
    3. +---------------------+
    4.    |              
    5. +----------+       +---------+
    6. |процессор |------>| монитор |
    7. +----------+       +---------+
    Рис1.

    Управлять ножкой программно это бред. Так как иначе процессор съест все ресурсы только на дерганье. Для этого и создают отдельный аппаратный блок.
    получается система такая.
    Код (Text):
    1. +---------------------+
    2. |Общая память         |
    3. +---------------------+
    4.    |              |
    5. +----------+ +--------+       +---------+
    6. |процессор | |RAMDAC  |------>| монитор |
    7. +----------+ +--------+       +---------+
    Рис2.
    В данном случае не суть важно какой процессор графический или центральный.
    RAMDAC это устройство преобразование данных из памяти в аналогвый сигнал
    Процессор формирует данные в памяти а RAMDAC читает их и выводит.
    Процессор сообщает RAMDAC параметры развертки монитора (разрешение). А тот уже с нужной частотой отправляет данные на монитор.

    На процесс формирования картинки в памяти вещь не простая и тоже потребляет много ресурсов.
    Если на рис 1. показано система в которой процессор занимался выдачей сигнала и эта задача съедала все время процессора.
    То рис 2. у процессора появилось время. За счет того что между кадрами он мог не перерисовывать картинку.
    Но читать одновременно и писать в одну ячейку нельзя нужна синхронизация. Это времена 8086. Что долать?
    Разработчики нашли решение они создали первую видео карту. Да вещь дорогая но зато теперь центральный процессор может заниматься своими прямыми делами по расчетам, а выводом будет заниматься графический контроллер.

    Код (Text):
    1. +---------------------+ +---------------------+
    2. |основная память      | | видео память        |
    3. +---------------------+ +---------------------+
    4.    |  Общая шина          |          |
    5.    +----------------------+          |
    6.    |                                 |
    7. +------+                         +----------+       +---------+
    8. | ЦП   |                         |видео конт|------>| RAMDAC  |--->
    9. +------+                         +----------+       +---------+
    рис 3.


    Теперь процессор не должен простаивать и ждать пока RAMDAC считает из памяти свои данные. Фактически мы получили ускорение в 2 раза. Сделав кэш память. В котором кэшировалось видео.

    Но для анимации такое дело не годилось. Как только нужно было анимировать процессор вынужден был заниматься копированием байт. Если на рис 1. Он оперировал битами то на рис2. он оперирует байтами. SetPixel занимал очень много времени только по то му что процессор был медленным. 60 мегагерц а картинку надо было выводить с частотой порядка 20МГц*3 компоненты цвета RGB. Фактически на вывод тратилось все время. А на расчет перемещения его не оставалось во все.

    Разработчики задумались и придумали аппаратный bitblt. Это первые 2D ускорители. Чаще всего анимация делалась на спрайтах. Надо за анимировать мышку копируй спрайт мышки в нужное место. Появился варкрафт. Бегающие человечки были на спрайтах. Где каждое движение человечка это отдельный кадр. А если человечков несколько это были копии.

    Идея была проста. Переложить нагрузку с ЦП на вспомогательный блок назовем его BLT.

    Код (Text):
    1. +---------------------+ +---------------------+
    2. |основная память      | | видео память        |
    3. +---------------------+ +---------------------+
    4.    |  Общая шина          |          |
    5.    +----------------------+          +---------------+
    6.    |                      |          |               |
    7. +------+                  |       +---+   +----+ +---------+       +---------+
    8. | ЦП   |                  +-------|DMA|<->|BLT | |RAM DAC  |------>| монитор |
    9. +------+                          +---+   +----+ +---------+       +---------+
    Рис 4.


    DMA - контроллер прямого доступа к памяти. На самом деле название не отражает сути.
    Просто так исторически сложилось. Занимается он тем что копирует память из основной памяти компьютера в видео память прямыми блоками. Но для blitинга этого не достаточно Для этого есть контролелр BLT(bliter) который умеет копировать строчки из одного рисунка в другой. С рессунка на первичную поверхность или работать со вторичными. Он выполняет все функции bitblt. Как то перевод изображения из одного формата 8бит палитра в 24бит или 32. Или 16бит в 32 так и др функции. К примеру не копировать прозрачный цвет.

    Аппаратный блиттинг оказался намного эффективнее чет setpixel. А во вторых особенность шин такова что им выгоднее передовать данные блоками чем отдельными байтами, в нашем случае пикселями. Если интересно почему напишу.
    До появления PCI-E шина соединяющая видео карту и материнскую карту была очень медленной в нашем случае на рисунке это общая шина.

    Поэтому гораздо эффективнее было вначале нарисовать в основной памяти компьютера а потом скопировать в видео память. Создавали временный буфер в основной памяти дели setpixel, а после выводили копированием. Вы и сейчас можете выделить память нарисовать в ней а после от блитить т.е скопировать на экран вернее в видео память.

    А если вы будете делать setpixel на прямую в видео память то процессор будет вынужден простаивать ожидая медленной шины. Частота процессора 2ГГц а частота шины AGP 66МГЦ у PCI_E 500МГц (числа примерные кому надо уточнит) Когда как эффективнеее нарисовать в памяти компьютера у который частота 1ГГЦ. Еще числа надо помножить на ширину шины чтобы получить пропускную способность.

    Немного отсутпим от основного изложения. Поговорит про setpixel. Bitblt в виндоусе аппаратно оптимизированный. Так что он работает быстро. А вернее почти параллельно. Но Виндоус работает в защищенном режиме. Поэтому чтобы вызвать какой либы сервис ему надо перейти с 3 уровня на 0 кольцо защиты что отъедает уму времени.
    Поэтому setpixel в виндоусе не эффективен из-за таких вот прыжков. Но даже если изображение созданно в основной памяти компьютера да на 3 уровне. Т.е когда setpixel не тратит так много времени на переход между режимами. Но он выполняет кучу проверок выходы за границе изображения и прочее что снижает эффективность. Поэтому переписывают свои аналоги различных.

    Производители подумали и сочли что это тоже не эффективно появилась 2D и 3D акселераторы - по нашему языку ускорители.

    Теперь в видео карте появилось куча специализированных блоков которые решали свои частные задачи. Одни строили линии другие сплайны треть строили треугольники.

    Появляется OpenGL. Одна из проблем это переключение между 3 кольцом защиты и 0 кольцом. Это очень тормозило. Если нужно было бы нарисвовать 1000 то приходилось бы прыгать туда сюда. Поэтому придумали следующую хитрость. Команды OpenGL буфферезируются на 3 кольце. Как следствие OpneGL стали называть машиной состояний. Собственно DirecX это тоже касается. Передача происходит на каждом кадре примерно так. При завершении главного цикла. Или при переключении буферов тогда все даннные описывающие состояние на этом кадре передаются с 3 кольца на 0. Там драйвера разбирают этот код и передают в видео карту.

    Но делают они это тоже хитро. В каждой видео карте есть своя память и в ней тоже есть цикл отрисовке. В которой записываются все эти состояния определенным образом. Фактически просто идет копирование. Даже ходят слухи что в видео карте есть специальные аппоратные блоки для парсенга вот таких команд из одного представления в другое.

    Но тут появились проблемы прогррамисты потеряли гибкость они не могли апперировать каждым пикселям. Тогда разработчики решили создать еще один специализированный блок и назвали его Шейдером. Появились первые шейдоры для пиксельной обработке. При растаризации каждый треугольник разбивался на линии, а тот на пиксели. А вот пиксели передовались в шейдер.


    Фактически в видео карте на это время для каждой операцие видео канала существовал специализированный блок. А ускорения достигалось за счет того что все эти блоки работали параллельно. Специализированные блоки стали заменять программируемыми. Потом стало понятно что их можно сделать универсальными.
     
  2. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    DirectX и OpenGL не существует. Это всего лишь стандарты маскорадные-маски. Под которые производители видео карт написали свой код. Просто он замаскирован названиями функций из этих стандартов. А так фактически весь код это именно код из драйверов производителей. А они уже оптимизировали как могли. Либо вызывают специальный блок либо считают что-то на процессоре. Либо используют универсальные блоки в GPU.
    Все это достигалась тем что майкрософт нвида ати амд интел. Просто взяли и договорились о стандартах. И там затачивались и сами видео карты под ДиректХ и ДирекХ под видео карты. DirectX 11 появился по тому что появились много ядерные процессоры. А редеринг шел на одном ядре. И надо было как-то расстреливать. Просто на просто пришлось переписывать стандарт. Драйвера надо переписать. Это не трудно. Но майкрософт по просила всех стандартизировать вывод. Вернее она ужесточила стандарт. Раньше треугольники все рисовали как хотели. Это только на первый взгляд кажется что треугольник по другому не на рисуешь. Еще как на рисуешь. Все использовали разные алгоритмы антилясинга вычисления координат могло вестись у кого до половины у кого до четверти пикселя. и тд. И тут нвидиа встала. Толи просто за упрямилась (не хотят отдавать свои наработки) толи слишком много переделывать.
     
  3. alexey_k

    alexey_k New Member

    Публикаций:
    0
    Регистрация:
    28 сен 2006
    Сообщения:
    24
    вот нашел у себя:
    Владимир Кулаков. Программирование на аппаратном уровне. Специальный справочник
    здесь описано много интересного. Не только по работе с видеоадаптером, но и с PCI, мышкой, клавиатурой и пр.
    естественно всё на чистом асме и независимо от ОС ;)

    Interrupt List Ralf Brown
    это - вобще вещь! справочник по прерываниям Ральфа Брауна. Там информация по прерыванию INT10! Работа с VGA и VESA! =))
     
  4. SII

    SII Воин против дзена

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    С Кулаковым осторожнее: полезной инфы полно, но есть и ошибки, и недосказанности... Помнится, с клавой там что-то не совсем то было.
     
  5. alexey_k

    alexey_k New Member

    Публикаций:
    0
    Регистрация:
    28 сен 2006
    Сообщения:
    24
    SII, не проверял, честно сказать :dntknw:
     
  6. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.792
    По шнуру от видеокарты к монитору идут 3 cигнала цветности (на красную, синюю и зеленые пушки), 2 сигнала синхронизации (горизонтальная и вертикальная синхронизация) и 1 сигнал "корпус". Вопрос: как вы собрались программировать даже точку?
    alexey_k
    По наводящим вопросам к TC выяснено, что он собрался программировать под Windows
    >>Mikl___: под какую ОС вы собрались программировать графику?
    >>assemblerist: Под Windows. Это приоритет.

    так что ни Кулакова, ни Ralf Brown'а ТС предлагать не стоит
     
  7. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    > По шнуру от видеокарты к монитору идут 3 cигнала цветности (на красную, синюю и зеленые пушки), 2 сигнала синхронизации (горизонтальная и вертикальная синхронизация) и 1 сигнал "корпус".
    ЭЛТ уже не модно :)
     
  8. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.792
    Сами напросились :) на монитор подается:
    1) с аналогового выхода (VGA) передается два сигнала синхронизации, на смену строки и смену кадра, и три аналоговых сигнала сигнала (на красную, синюю и зеленую пушку) определяющие цвет и яркость текущего пиксела
    2) если есть цифровой выход (DVI), то те же сигналы синхронизации + аналоговый сигнал разложенный на цифровые составляющие (т.е. N градаций красного, N градаций синего, N зеленого) + дополнительные управляющие сигналы прогоняются через кодер и востанавливаются на стороне монитора декодером
    Для понимания VGA прощее, IMHO ТС одержим идеей "25-ого кадра" Сказал бы прямо (хотя достаточно набрать в поиске "25 кадр"), тогда с ним бы поделились информацией, а так -- вокруг да около :)
     
  9. alexey_k

    alexey_k New Member

    Публикаций:
    0
    Регистрация:
    28 сен 2006
    Сообщения:
    24
    Mikl___, тогда вам вопрос. Если в виндах (хр) вылезти в нулевое кольцо, можно ли напрямую использовать прерывание INT10?
    насколько я знаю, система пишет данные напрямую в память видеокарты (для бОльшего быстродействия), а что если мы из своего драйвера ещё начнем дёргать INT10? =))
     
  10. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.792
  11. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    По-моему ТС просто одержим.
     
  12. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.792
    может быть стоит вызвать skomarov? ;) [​IMG]
     
  13. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    alexey_k
    ЦПУ не имеет доступа к АП видеокарты.
     
  14. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    Booster
    Имеет. Правда в некоторых современных видео картах не к всему.
     
  15. Subrealist

    Subrealist Member

    Публикаций:
    0
    Регистрация:
    17 июл 2006
    Сообщения:
    134
    Вот написал как-то пример, выдающий фрактальную анимацию. Немного его сейчас доделал. Используются функции везы и линейный видеобуфер в нереальном режиме. Запускается как начальный загрузчик. Работоспособность везде не гарантируется. У меня под бошем, на вмваре и на реальном железе работает. Может кому для самого начального ознакомления пригодится
     
  16. alexey_k

    alexey_k New Member

    Публикаций:
    0
    Регистрация:
    28 сен 2006
    Сообщения:
    24
    Booster, просто я читал как-то давненько, что софтайс не работает на новых видюхах только потому, что там какие-то проблемы с записью в память видюхи, какие точно - я не помню, но суть - одна.
     
  17. KIV

    KIV Member

    Публикаций:
    0
    Регистрация:
    16 июл 2009
    Сообщения:
    231
    BIOS в современных ОС после старта системы уже не при делах. Так что int 0x10 приведёт вас куда-куда, а не к BIOS. Кстати, приведёт он вас к одному из обработчиков исключений.
     
  18. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Pavia
    Вот это новость. Подробнее можно? Всегда данные гонялись по шине.
     
  19. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.622
    Адрес:
    Russia
    Booster
    Pavia

    я вообще читал статью руссиновича про проблемы перехода через 4 гб
    там много интересного - в частности как я понял в общее адресное пространство входит не только видеопамять но и порты ввода вывода

    поглядите- легко гуглится в блоге руссиновича
     
  20. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Booster, Pavia
    Если немного подождать, глядишь, Вам Rockphorr ещё и Абеля посоветует почитать. :)