<?xml version='1.0' encoding="utf-8"?>
      <rss version='2.0'>
      <channel>
      <title>Форум на Исходниках.RU</title>
      <link>https://forum.sources.ru</link>
      <description>Форум на Исходниках.RU</description>
      <generator>Форум на Исходниках.RU</generator>
  	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=327648&amp;view=findpost&amp;p=3061372</guid>
        <pubDate>Tue, 17 Jan 2012 15:06:13 +0000</pubDate>
        <title>Низкоуровневое программирование видеоадаптеров ATI (часть первая)</title>
        <link>https://forum.sources.ru/index.php?showtopic=327648&amp;view=findpost&amp;p=3061372</link>
        <description><![CDATA[StasNewOs: Хорошо попробую]]></description>
        <author>StasNewOs</author>
        <category>Assembler FAQ</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=327648&amp;view=findpost&amp;p=3061362</guid>
        <pubDate>Tue, 17 Jan 2012 14:34:04 +0000</pubDate>
        <title>Низкоуровневое программирование видеоадаптеров ATI (часть первая)</title>
        <link>https://forum.sources.ru/index.php?showtopic=327648&amp;view=findpost&amp;p=3061362</link>
        <description><![CDATA[shm: Различных видеоадаптеров ATI огромное количество, у некоторых есть особенности, естественно я не имею возможности протестировать на всех. Попробуй сам под него допилить мой пример, у него доступ управление курсором вроде через группу регистров AVIVO осуществляется - они описаны в соответствующем даташите. Если получится, то выложи код, я поправлю.]]></description>
        <author>shm</author>
        <category>Assembler FAQ</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=327648&amp;view=findpost&amp;p=3061359</guid>
        <pubDate>Tue, 17 Jan 2012 14:28:22 +0000</pubDate>
        <title>Низкоуровневое программирование видеоадаптеров ATI (часть первая)</title>
        <link>https://forum.sources.ru/index.php?showtopic=327648&amp;view=findpost&amp;p=3061359</link>
        <description><![CDATA[StasNewOs: Да я ставлю весу перед переходом в защищенку, но мой родной режим 1366 на 768. А что курсор не поставиш уже скажем на радеон нд4570?]]></description>
        <author>StasNewOs</author>
        <category>Assembler FAQ</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=327648&amp;view=findpost&amp;p=3061343</guid>
        <pubDate>Tue, 17 Jan 2012 13:56:34 +0000</pubDate>
        <title>Низкоуровневое программирование видеоадаптеров ATI (часть первая)</title>
        <link>https://forum.sources.ru/index.php?showtopic=327648&amp;view=findpost&amp;p=3061343</link>
        <description><![CDATA[shm: Видеорежими через порты менять можно, схема примерно такая: вырубаешь монитор, загружаешь оптом в регистры управления значения из таблички для нужного видеорежима, включаешь монитор. А вот конкретно сказать не могу так как набор регистров и значения, которые в них нужно загружать в разных моделях различны. В настоящее время я занят, может к февралю поосвобожусь, надо статью поправить под новые версии Radeon&#39;ов (мой пример работать на них не будет), ну может и тебе помогу. Хотя я не вижу объективных причин зачем переключать видеорежим через порты: VESA нормально это делает,  если есть нужно переключать видеорежимы прямо из PM32, то можно использовать V86.]]></description>
        <author>shm</author>
        <category>Assembler FAQ</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=327648&amp;view=findpost&amp;p=3060435</guid>
        <pubDate>Mon, 16 Jan 2012 03:35:21 +0000</pubDate>
        <title>Низкоуровневое программирование видеоадаптеров ATI (часть первая)</title>
        <link>https://forum.sources.ru/index.php?showtopic=327648&amp;view=findpost&amp;p=3060435</link>
        <description><![CDATA[StasNewOs: Красава.<br>Не вкурсе, как видеорежимы через порты менять.<br>Есть чтонибудь для защищенного режима?]]></description>
        <author>StasNewOs</author>
        <category>Assembler FAQ</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=327648&amp;view=findpost&amp;p=2850180</guid>
        <pubDate>Thu, 10 Mar 2011 14:22:05 +0000</pubDate>
        <title>Низкоуровневое программирование видеоадаптеров ATI (часть первая)</title>
        <link>https://forum.sources.ru/index.php?showtopic=327648&amp;view=findpost&amp;p=2850180</link>
        <description><![CDATA[shm: <div class='tag-align-center'><span class="tag-color tag-color-named" data-value="blue" style="color: blue"><span class='tag-size' data-value='13' style='font-size:13pt;'><strong class='tag-b'>Низкоуровневое программирование видеоадаптеров ATI (часть первая)</strong></span></span></div><br>
С некоторой периодичностью на различных форумах по программированию возникают новые темы примерно такого содержания: &quot;Как программировать видеоадаптер (графический акселератор) на уровне регистров устройства (под DOS)?&quot;. А ответом на подобный вопрос служит либо предложение &quot;забыть&quot; об этой идее или ограничится использованием VESA. Собственно оно и очевидно: современные видеоадаптеры на уровне регистров, пожалуй самые нестандартизированные устройства (конечно для совместимости они эмулируют блок стандартных VGA регистров, но возможности которые можно через них реализовать вряд-ли кого-то удовлетворят). Практически на все современные видеоадаптеры отсутствуют необходимые даташиты и к этому стоит добавить, что низкоуровневое программирование видеоадаптера и встроенного ускорителя, на мой взгляд, представляется наиболее сложным по сравнению с оборудованием другого типа. В этой статье я собираюсь приоткрыть завесу этой &quot;тайны&quot; на примере видеоадаптеров семейства radeon (у кого nvidia, intel или нечто другое можете почитать лишь для общего ознакомления, совместимости между ними, увы, нет никакой). Далее я предполагаю, что в качестве ОС будет использоваться DOS по причине простоты работы с устройствами из под нее и отсутствия конфликтов с системными драйверами.<br>
	Итак, прежде чем приступить к непосредственной работе с регистрами контроллера я рекомендую изучить (для тех, кто не знаком): <br>
1. архитектуру х86, желательно еще и ассемблер;<br>
2. защищенный режим процессора и  &quot;нереальный режим&quot; (если не устраивает защищенный);<br>
3. шину PCI и сервисы PCI BIOS (в защищенном режиме можно работать и через регистры, но знать не лишнее);<br>
4. основные принципы низкоуровневой работы с устройствами;<br>
5. VESA BIOS (я предполагаю, что мы будем работать в видеорежиме уже установленном через VESA BIOS, установить его через регистры конечно можно, но лично меня возможности VESA в этом плане полностью удовлетворяют).<br>
<br>
<div class='tag-align-center'><span class="tag-color tag-color-named" data-value="green" style="color: green"><span class='tag-size' data-value='11' style='font-size:11pt;'><strong class='tag-b'>Некоторые предварительные сведения</strong></span></span></div>	<br>
	Для начала устройство необходимо найти на шине PCI по коду класса видеоадаптеров 0x030000. Все radeon&#39;ы имеют идентификатор изготовителя 0x1002 (AMD). Сам контроллер должен сконфигурировать BIOS и VGA BIOS, поэтому из всего конфигурационного пространства нас интересует только	 идентификатор устройства (слово по смещению 0x02) и физический адрес блока MMIO регистров (двойное слово по смещению 0x18), физический адрес видеопамяти лучше узнать через VESA BIOS. Вообще говоря GP видеоадаптеров управляется отдельно от блока регистров контролера управления видеорежимом и как ни странно блок регистров 2D ускорения radeon&#39;ов не претерпел существенных изменений начиная с первых моделей (<strong class='tag-b'>upd: начиная с r600 выпилен начисто</strong>). А вот с блоком регистров контроллера ситуация сложнее: начиная с серии RV515 введен новый блок  регистров AVIVO описанный в открытом даташите &quot;RV630 Register Reference Guide&quot;. А вот с регистрами GP и регистрами контроллера чипов старее RV515 ситуация хуже: открытого даташита с их полным описанием (описаны лишь некоторые отдельные регистры) в открытом доступе нет. Единственным источником являются исходники линуксового драйвера &quot;xf86-video-ati&quot;, наибольший интерес там представляют определения регистров в файле radeon_reg.h, некоторые функции 2Д ускорения в radeon_accelfuncs.c и поддержка мыши в radeon_cursor.c. Из регистров контроллера, на мой взгляд, представляет интерес только регистры управления аппаратным курсором, также некоторую пользу для лучевых мониторов можно получить увеличив частоту обновления экрана, но в следствии устаревания лучевых мониторов я не рассматриваю эту возможность подробнее, при необходимости вы без труда сможете это сделать проанализировав как это делает линуксовый драйвер. Сам доступ к регистрам GP и контроллера осуществляется посредством записи или чтения из физической области памяти блока MMIO регистров. В примере к статье запись осуществляется так: mov GS:[EBX + REG], EAX, где GS - сегментрый регистр с базой = 0, пределом = 4Гб, EBX содержит адрес блока регистров MMIO, EAX - значение которое требуется записать, чтение mov EAX, GS:[EBX + REG]. Естественно, что возможно бесконечное множество других вариантов, в защищенном режиме доступ может осуществляться еще проще, кстати с MMIO регистрами очень удобно работать на многих ЯВУ (в отличии от записи в порты ввода-вывода). Перед непосредственной работой с GP нужно установить графический режим (лучше полноцветный, хотя GP поддерживает и 256 цветной с палитрой). В примере к статье используется видеорежим группы TrueColor32 , т.к. рабоать намного удобнее. Взаимодействии с GP может  осуществляться через AGP GART (или DMA для PCI-E карт), но работа с AGP GART (с PCI-E ситуация не намного лучше) затрагивает низкоуровневое конфигурирование Северного Моста и специальную инициализацию командного процессора GP. Желающие могут этим заняться, но можно работать с GP и в режиме PIO, хотя это и накладывает ряд ограничений, в частности передача изображения через регистры не будет быстрее прямой записи в видеопамять. Но если изображение все же загрузить в видеопамять (не обязательно отображаемую), то операцию копирования в &quot;своей&quot; памяти GP осуществляет очень быстро. Все регистры которые я рассматриваю в этой статье 32х разрядные.<br>
<br>
<div class='tag-align-center'><span class="tag-color tag-color-named" data-value="green" style="color: green"><span class='tag-size' data-value='11' style='font-size:11pt;'><strong class='tag-b'>Определение режима работы контроллера</strong></span></span></div><br>
	Определить работает ли контроллер с регистрами AVIVO можно по крайней мере двумя способами: <br>
1. Найти в линуксовом драйвере таблицу соответствия идентификатора устройства и кодового номера GP, все RV &gt;= 515 модели работают через AVIVO.<br>
2. Считать из  AVIVO регистра информацию, которая уже заведомо известна и проверить - если совпадает, значит наш RV AVIVO поддерживает, иначе нет. Вообще говоря если он AVIVO не поддерживает, то должен считаться &quot;0&quot;. В качестве такого регистра я использую регистр с номером 0x6000. <br>
<br>
<div class='tag-align-center'><span class="tag-color tag-color-named" data-value="green" style="color: green"><span class='tag-size' data-value='11' style='font-size:11pt;'><strong class='tag-b'>Работа с аппаратным курсором</strong></span></span></div><br>
	Аппаратный курсор - очень полезная вещь, позволяющая значительно повысить скорость вывода графики т.к. не требуется контролировать пересечение его границ, в добавок контроллер берет на себя его отрисовку, достаточно лишь указать его координаты. Курсор невозможно затереть через отображаемую видеопямять, если само изображение курсора разместить где-нибудь за ее пределами (но в видеопамяти). Он рисуется как бы дополнительным слоем поверх отображаемой части видеопамяти. Стандартный размер аппаратного курсора 64х64 пиксела, в изображении можно использовать альфа-канал. Взаимодействие через AVIVO регистры и через стандартные немного отличается, но все же схоже.<br>
Если не  AVIVO:<br>
 - регистр 0x0260 содержит смещение изображения курсора в видеопамяти<br>
 - регистр 0x0264 содержит в старшей части координату X курсора и Y в младшей<br>
 - регистр 0x0268 содержит смещение начала отображения курсора относительно начала его изображения в видеопамяти, в старшей части содержится смещение по Х, в младшей - по Y. К примеру Если в этот регистр записан 0, то контроллер будет отображать весь курсор целиком в виде квадрата 64х64 (при использовании альфа-канала курсор можно сделать любой формы), если 0x00100010, то контроллер будет отображать только правый нижний квадрат размером 48х48. <br>
Чтобы разблокировать курсор (т.е. чтобы контроллер его начал отображать) нужно установить определенные биты в регистре управления CRTC (0x0050) (помимо управления курсором я там ничего трогать не советую), его нужно считать и установить биты 20...22 на нужную цветовую модель курсора и бит 16 в 1. Для того, чтобы отключить курсор достаточно сбросить бит 16 в этом регистре. Возможные цветовые модели можно посмотреть в Линуксовом драйвере, я всегда используй модель с номером 2 - ARGB32, то есть курсор будет представлять обычное RGB32 изображение, где старший байт - альфа-канал. <br>
Для AVIVO:  <br>
 - регистр 0x6408 содержит смещение изображения курсора в видеопамяти<br>
 - регистр 0x6414 содержит в старшей части координату X курсора и Y в младшей <br>
 - регистр 0x6410 содержит в старшей части координату ширину курсора и высоту в младшей <br>
 - регистр 0x6400 содержит в битах 8...9 цветовую модель, с помощью бита 0 можно разрещить(1) или запретить(0) отрисовку курсора.<br>
Инициализация аппаратного курсора весьма тривиальна и представляет собой последовательную установку всех регистров в определенные значения, а также загрузку изображения курсора в видеопамять.<br>
<br>
<div class='tag-align-center'><span class="tag-color tag-color-named" data-value="green" style="color: green"><span class='tag-size' data-value='11' style='font-size:11pt;'><strong class='tag-b'>Непосредственная работа с графическим процессором</strong></span></span></div><br>
	После инициализации видеоадаптера VGA BIOS, GP должен работать в режиме PIO, поэтому для того чтобы было возможно использовать функции 2D ускорения необходимо привести некоторые регистры в определенные значения. Доступ к любому регистру GP интерпретируется как команда, GP имеет буфер FIFO переполнение которого нужно контролировать с помощью специального регистра состояния 0x0E40, в нем в битах 0..7 содержится количество свободных слотов команд. Перед любой записью в регистры нужно убедиться, что необходимое количество слотов свободно, иначе ждать их освобождения, допустим мы собираемся записать значения в 5 регистров GP, тогда мы должны дождаться того момента когда как минимум 5 слотов будет свободно. Хотя на практике GP имеет очень высокое быстродействие и получить переполнение буфера команд сложно (запись в регистры, хоть они и MMIO, но все же занимает определенное время), но проверки никогда не бывают лишними. Я не собираюсь описывать тут все регистры блока 2D ускорения (3D тем более), к тому же я постарался максимально подробно все описать в примере к статье, но все же остановлюсь на некоторых моментах. В примере к статье процедура radeon_init_2d_engine производит инициализацию блока 2D регистров. Прежде всего устанавливается глобальное &quot;окно&quot; вывода на максимальные оазмеры, т.е. фактически отключается глобальное обрезание вывода графики. Это произвобится путем записи в регистр 0x16E8 значения 0x1FFF1FFF, в принципе можно его и использовать, но лучше не стоит, т.к. это может ограничить в использовании некоторых фитч. Намного лучше использовать локальные регистры обрезания вывода графики с номерарами 0x16EC и 0x16F0. В старшей части первого регистра указывается координата Y, в младшей части X начала региона отображения графики (все, что в него входить не будет, то будет обрезаться), соответственно в регистре 0x16F0 в таком же порядке указываются координаты конца региона. Кстати именно благодаря использованию такой возможности осуществляется вывод графики в видимую часть окна любого уровня в моей ОС. Присмотревшись к названиям регистров можно выделить несколько групп, я раскажу про 4 самые важные начинающиеся на: SC_ от слова scissors - ножницы (управление регионом обрезания), DST_ - destination (получатель), SRC_ - source (источник) и DP_ - это регистры управления и конфигурации. Регистры помеченные как &quot;получатель&quot; содержат характеристики объекта куда GP передает данные, а как &quot;источник&quot; соответственно откуда берет. При инициализации имеет смысл задать определенные значения регистров выбора цвета. Регистр с загадочным названием DP_WRITE_MASK представляет собой некий интерфейс управления альфа-смешивания старший байт отвечает за общий коэффициент, а все остальные за соответствующую цветовую компоненту. При инициализации имеет смысл записать в него значение 0FFFFFFFFh, т.е. фактически отключить альфа-смешивание, при настройке выводимого объекта можно им воспользоваться. Также при инициализации необходимо установить логической ширины строки источника и приемника в байтах, это значение нужно поделить на 64 и сдвинуть на 22 разряда влево, и записать в регистры 0x142C, 0x1428 соответственно. Для некоторых операций связанных с копированием блоков видеопамяти иногда имеет смысл использовать длину логической строки источника отличную, от той, которая используется в текущем видеорежиме. После того как блок 2D ускорения установлен в нужное состояние можно приступать непосредственно к выводу графики посредством GP. Регистр DP_GUI_MASTER_CNTL с номером 0x146C задает фактически операцию, которую будет делать GP. Формат его подробно описан в спецификации &quot;Radeon R5xx Acceleration&quot; на странице 30, поэтому я дублировать не буду. Далее в зависимости от операции устанавливается цвет, координаты, загружаются паттерны и пр. Единственное чего я замечу, это то, что GP начнет выполнять операцию сразу после записи в регистр DST_WIDTH_HEIGHT (ширина и высота оъекта) для объектов прямоугольной формы и DST_LINE_END (координаты конца линии) для линий. Тут также отмечу, что подавляющего большинства операций применимы только к объектам прямоугольной формы.<br>
<br>
	В примере к статье приведен исходной код простой демонстрационной программы для видеоадаптеров radeon (я планирую сделать поддержку и ATI128). Программа периодически рисует случайные линии и прямоугольники, также по экрану перемещается аппаратный курсор в виде полупрозрачного оранжевого квадрата. Желающие могут придумать нечто по оригинальнее. В ближайшем будущем я собираюсь добавить демонстрацию вывода текста с использованием GP, и функции BitBlt. У кого есть какие идеи по поводу статьи или примера - пишите, постараюсь добавить.<br>
<span class="b-attach" data-size="8194" data-hits="518" data-attach-id="34341" data-attach-post-id="2850180">
			<span class="b-attach__title"></span><a class='b-attach-link' href='https://forum.sources.ru/index.php?act=Attach&amp;type=post&amp;id=2850180&amp;attach_id=34341' title='Скачать файл' target='_blank'>atidemo.7z</a> (, : 518)
		</span><br>
<br>
<strong class='tag-b'><span class="tag-color tag-color-named" data-value="red" style="color: red">upd: поправил пример. В руки мне попали более современные карточки. Как выяснилось начиная с  r600 блок регистров  2D-ускорения выпилен начисто. Владельцы rv6xx-rv7xx и м.б. некоторых более новых карточек смогут увидеть только аппаратный курсор в виде оранжевого двигающегося квадратика. Теперь чтобы банально нарисовать прямоугольник аппаратно нужно инить 3D-рендеринг, а для этого потребуется: инициализация GART, загрузка микрокода, низкоуровневая инициализация GP, инициализация кольцевого буфера команд... Выйдет такой пример на несколько тысяч строк в лучшем случае. Пока я не готов за это браться.</span></strong><br>
<br>
<a class='tag-url' href='http://forum.sources.ru/index.php?act=ST&f=163&t=385717' target='_blank'>вторая часть (установка видеорежима)</a>]]></description>
        <author>shm</author>
        <category>Assembler FAQ</category>
      </item>
	
      </channel>
      </rss>
	