Шукати в цьому блозі

понеділок, 16 листопада 2009 р.

I/O Scheduler. Выбираем оптимальный.

Что нам понадобится для достижения цели?
Во-первых, установленный hdparm:
# aptitude install hdparm

Во-вторых, маленький скрипт:
# DISC="sda"; \
cat /sys/block/$DISC/queue/scheduler; \
for T in noop anticipatory deadline cfq; do \
echo $T > /sys/block/$DISC/queue/scheduler; \
cat /sys/block/$DISC/queue/scheduler; \
sync && /sbin/hdparm -tT /dev/$DISC && echo "----"; \
sleep 15; \
done
Если диск не sda, то соответствующим образом правим кусок кода с объявлением:
DISC="sda";
Запускаем и получаем подобный результат:
noop anticipatory deadline [cfq]
[noop] anticipatory deadline cfq

/dev/sda:
Timing cached reads:   1690 MB in  2.00 seconds = 844.83 MB/sec
Timing buffered disk reads:  216 MB in  3.00 seconds =  71.91 MB/sec
----
noop [anticipatory] deadline cfq

/dev/sda:
Timing cached reads:   1612 MB in  2.00 seconds = 805.98 MB/sec
Timing buffered disk reads:  208 MB in  3.03 seconds =  68.67 MB/sec
----
noop anticipatory [deadline] cfq

/dev/sda:
Timing cached reads:   1644 MB in  2.00 seconds = 822.10 MB/sec
Timing buffered disk reads:  206 MB in  3.02 seconds =  68.20 MB/sec
----
noop anticipatory deadline [cfq]

/dev/sda:
Timing cached reads:   1728 MB in  2.00 seconds = 864.06 MB/sec
Timing buffered disk reads:  214 MB in  3.01 seconds =  71.05 MB/sec
----
Первая строка чисто информационная, в ней мы просто видем тот scheduler который используется на текущий момент времени и всегда можем вернуться к нему. Затем следуют секции тестирования. Наиболее оптимальные результат выбираем вручную, он соответствует наибольшей скорости чтения мегабайт в секунду. Короче занимаемся округлениями :)
Новое значение, можно установить прямо в grub'е, изменив значение elevator=...
Далее:
# update-grub
# reboot

ps: Спасибо Сергею (snkua[at]jabber.ru) за подсказанные идеи :)
Ссылки по теме:
http://www.redhat.com/magazine/008jun05/features/schedulers/
http://www.redhat.com/promo/summit/2008/downloads/pdf/Thursday/Sanjay_Rao.pdf
http://sfdoccentral.symantec.com/sf/5.0/linux/html/sf_rac_install/sfrac_prep_install27.html

понеділок, 9 листопада 2009 р.

Мои изыскания по конвертированию avi в mp4 для проигрывания фильма на HTC Android G1 (гуглофоне) - 3 серия (заключительная)

Ура! Ура! Ура! Я его таки сделал! Вот что значит - хорошенько отдохнуть и уже на свежую голову перечитать весь материал заново.
Собственно я не знаю, будет ли работать это решение если не проделать все предыдущие "махинации" (1, 2), но факт остаётся фактом - я конвертанул видео в нужные андроиду формат и теперь есть и видео, и звук.
Для этого потребовалось всего лишь внимательней прочитать статью "Converting Videos For The Android T-Mobile G1 Phone With Linux", а если быть более точным то комментарии к ней. Там есть ссылка на уже готовый и вполне работоспособный код. У себя я его обозвал android_ffmpeg_converter, сказал ему chmod +x и вуаля! Вот, собственно, содержимое скрипта:
#!/bin/bash
# AUTHOR: M@sprackle.org
# PURPOSE: To convert one file or many files to Android format and size.
# LIMITATIONS: Get the Cancel button working in Zenity pop-up
# INSTALL: Place this script in "~/.gnome2/nautilus-scripts/Android"
# and set to execute `chmod +x ~/.gnome2/nautilus-scripts/Android`
# USE: Just right click on a file or folder that contains files you
# would like to convert to an Android format.  This was converted from
# my already used iPhone script.
#
# Where do you want all of these files to be saved?
# You should NOT have to edit below this line
SAVESPOT="~username/tmp/movie"
#
# Same as above I just wanted a single place to find my files
if [ ! -d $SAVESPOT ]; then
mkdir $SAVESPOT
fi
# Lets see if this was a single file or a Directory
if [ -f "$1" ]; then
#
# Let's cut up the name so it's not example.avi.mp4
NEWNAME=`echo "$1" | awk -F. '{print $1}'`
#
# Run the command - I found all these flags on some website.
# So far they're good.
ffmpeg -i "$1" -s 480x256 -vcodec mpeg4 -acodec libfaac -ac 1 -ar 16000 -r 13 -ab 32000 -aspect 3:2 -padtop 32 -padbottom 32 $SAVESPOT/"$NEWNAME".mp4 </dev/null
#
# Ta-Da
else
#
# I placed the files in a new Directory to make them easy to find
cd "$1"
#
# Lets find the files we want to work with.
find . -type f -print0 | while read -d $'\0' file; do
#
# Lets check to see that this is a video file first
file "$file" | egrep "video:"
#
# If the egrep returns a "0" it found the phrase "video:" then continue
if [ $? != "0" ]; then
exit 1
fi
# Let's cut up the name so it's not example.avi.mp4
NEWNAME=`echo "$file" | cut -c 3- | awk -F. '{print $1}'`
#
zenity --text "Processing $NEWNAME" --info &
# Run the command - I found all these flags on some website.
#  So far they're good.
ffmpeg -i "$file" -s 480x256 -vcodec mpeg4 -acodec libfaac -ac 1 -ar 16000 -r 13 -ab 32000 -aspect 3:2 -padtop 32 -padbottom 32 $SAVESPOT/"$NEWNAME".mp4 </dev/null
#
zenity --text "$NEWNAME Complete" --info &
#
# Ta Da
done
#
fi
и всё! Как говориться, приятного просмотра :)
Возможно, и даже наверняка, потребуется внести изменения в переменную SAVESPOT и указать в ней директорию куда надо сохранять итоговое сконвертированное видео. Параметры-же у этого скрипта более чем простые. Параметр один - имя конвертируемого файла.
Счастливого просмотра :)

четвер, 5 листопада 2009 р.

Мои изыскания по конвертированию avi в mp4 для проигрывания фильма на HTC Android G1 (гуглофоне) - 2 серия

Как я уже написал в предыдущем посте, конвертирование через mencoder потерпело фиаско. Я услышал звук, но совершенно не увидел видео.
Слегка подумав я всё-таки решил вершуться к идее сборки ffmpeg. В прошлом посте я упомянул о заморачивании сборки ffmpeg, но не упомянул, что я ею таки занимался. Другой вопрос, что я собирал сборку из Debian'овский исходников, полученных через apt-get:
apt-get source ffmpeg
Так как собирал я его ещё до менкодера и до сборки h264 то, наверное, вполне естественно, что полученная утилита ни в какую не хотела конвертировать видео в нужный мне формат. Так как мысль эта меня посетила только что, а я уже успел собрать ffmpeg из исходников svn, то чем бы закончился такой эксперимент сказать, к сожалению, сейчас не могу. Однако опишу мою недолгую борьбу со сборкой ffmpeg из svn. Хотя по большому-то счёту и описывать нечего, так как весь процесс описан в статье "How-To Build FFmpeg on Debian Squeeze". Пошагово:
$ svn checkout svn://svn.ffmpeg.org/ffmpeg/trunk ffmpeg
$ cd ffmpeg
$ ./configure \
--enable-gpl \
--enable-postproc \
--enable-pthreads \
--enable-libfaac \
--enable-libfaad \
--enable-libmp3lame \
--enable-libtheora \
--enable-libx264 \
--enable-shared \
--enable-nonfree \
--enable-libvorbis \
--enable-libgsm \
--enable-libspeex \
--enable-libschroedinger \
--enable-libdirac \
--enable-avfilter \
--enable-avfilter-lavf \
--enable-libdc1394 \
--enable-libopenjpeg \
--enable-libopencore-amrnb \
--enable-libopencore-amrwb \
--enable-version3 | \
tee ../ffmpeg-configure.txt && \
make && \
sudo make install && \
make tools/qt-faststart && \
sudo ldconfig
Как видим, ничего сложного. Единственное, что надо отметить, так это то, что в /etc/ld.so.conf или его include должен быть описан каталог /usr/local/lib.

На текущий момент времени запущена переконвертация их xvid в mpeg4 следующей строкой:
$ /usr/local/bin/ffmpeg -y -i исходный_файл.avi -pass 1 -vcodec libx264 -acodec aac -vpre fastfirstpass -r 23.976 -aspect 3:2 -s 480x320 -b 480k -bt 480k -ab 96k -sameq файл_назначения.mp4

ps: Как и в предыдущем посте: ничего определённого о положительном или отрицательном результате пока сказать не могу, но о результатах обязательно сообщу дополнительно :)

ps2: Печально... Очень печально... Теперь было 10 секунд видео, но без звука... А затем ошибка - невозможно воспроизвести... Brain on! Думаем дальше! ;)

Мои изыскания по конвертированию avi в mp4 для проигрывания фильма на HTC Android G1 (гуглофоне)

Сразуже скажу, что в своей "борьбе" я руководствовался прочтением следующих материалов. Правда не все сразу они были найдены, а следовательно, будь по другому, я возможно намного раньше получил бы необходимые мне результаты.
Сначала я хотел конвертировать через ffmpeg и заморачиваться с его сборкой, но менкодер показался как-то ближе и привычней, как, собственно, и м-плеер в состав которого он входит. Но!...

И вот тут начинается самое интересное.
Можно добавить:
deb http://www.debian-multimedia.org squeeze main
и установить пакеты mplayer и mencoder, а можно собрать всё самому и попробовать установить. Чем я руководствовался когда начал сборку пакета mplayer с поддержкой кодеков h264 и xvid? Ну... Во-первых я как-то не сразу сообразил, что mencoder, в дебиановском "стандартном" и мультимедийном репозитории, не входит в состав mplayer'а. Во-вторых, ffmpeg, даже будучи установленным из мультимедийного репозитория, поддержку h264 не осуществлял. Конечно-же можно попробовать установить mencoder и попытаться осуществить конвертацию им, но... как-то лениво, ибо уже был собрат собственный mplayer_1.0svn_i386.deb, с поддержкой h264 и xvid, процессом создания которого я и собираюсь тут поделиться.
Тут я буду рассказывать всё "гладко" и, по мере возможности, последовательно хотя, поверьте, все эти ступени и шаги по ним, разбирательства с ними, заняло куда больше времени чем я тут об этом собираюсь рассказать.
Чтобы упростить себе жизнь, всё-таки внесём, для начала, вышеуказанный источник в репозиторий. Обновим свою систему as is и двинемся дальше.
Для нормальной сборки поддерджки в менкодере кодека h264 необходимо наличие в системе пакетов libfaac0 и libfaad0, плюс dev'ы libfaac-dev и libfaad-dev. Ставим их.
Затем собираем библиотеки и пакеты для поддержки h264 и xvid.
$ wget http://downloads.xvid.org/downloads/xvidcore-1.2.1.tar.gz
$ tar xzpf xvidcore-1.2.1.tar.gz
$ cd xvidcore
$ dpkg-buildpackage
$ cd ..
$ sudo dpkg -i ./libxvidcore4_1.2.1-1_i386.deb  ./libxvidcore4-dev_1.2.1-1_i386.deb
Собственно пакет поддержки xvid у нас уже есть и установлен. В дальнейшем можно будет просто устанавливать собранный deb.
Поехали дальше.
$ git clone git://git.videolan.org/x264.git
$ cd x264
$ ./configure && make && sudo make install sudo make install
$ cd ..
Ну вот, у нас есть поддержка h264. Для тех кто в бронепоезде и всё ещё не знает что такое git - просто установите пакет git-core.
Теперь перейдём к сборке. Сайт проекта www.mplayerhq.hu. На мой взгляд он нисколько не изменился с 90-х. А вот сам новый mplayer удивил. Последний раз, когда я его собирал руками, в нём не было поддержки сборки через dpkg-buildpackage - теперь есть. И это приятно. Далее всё очень просто:
$ svn checkout svn://svn.mplayerhq.hu/mplayer/trunk mplayer
$ cd mplayer
$ DEB_BUILD_OPTIONS="--enable-gui --win32codecsdir=/usr/local/lib/codecs --enable-menu --enable-linux-devfs --enable-dynamic-plugins --codecsdir=/usr/local/lib/codecs" dpkg-buildpackage
Опции для configure передаются через переменную DEB_BUILD_OPTIONS. "Форточные" кодеки у меня лежат в /usr/local/lib/codecs, качаются так-же с сайта проекта. Внимательно следим чтобы была поддержка faac ибо... После успешной сборки у нас появляется mplayer_1.0svn_i386.deb который мы и устанавливаем через dpkg.
Естественно если нам нужно чтобы mplayer поддерживал что-то ещё, то ставим соответствующие lib'ы и dev'ы к ним, чтобы на этапе конфигурации они смогли быть найдены.
На этом этап сборки можно считать законченным.

Теперь о конвертировании. Как и было указано в ссылках выше, вызываем менкодер следующим образом:
$ mencoder исходное_имя_файл.avi -o имя_файла_назначения.mp4 \
-vf dsize=480:352:2,scale=-8:-8,harddup \
-oac faac \
-faacopts mpeg=4:object=2:raw:br=128 \
-of lavf \
-lavfopts format=mp4 \
-ovc x264 \
-sws 9 \
-x264encopts nocabac:level_idc=30:bframes=0:bitrate=512:threads=auto:turbo=1:global_header:threads=auto:subq=5:frameref=6:partitions=all:trellis=1:chroma_me:me=umh

Запускаем и ждём результата. Закачиваем на наш любимый гуглофон. Пытаемся смотреть видео :)

ps: Собственно на данном этапе видео у меня как раз таки конвертируется, так что о 100% положительном результате сказать не могу. Могу лишь сказать, что оно таки начало конвертироваться, в отличии от вчерашнего дня ;) Об окончательных результатах "борьбы" сообщу дополнительно, убрав этот ps. ;)

ps2: Печально... Очень печально... Хоть и конвертанулось видео... Хоть я его нормально посмотрел на компе плеером... А вот гуглофон выдал только тихий-тихий звук, но совершенно без видео. Что-ж, буду копать дальше. Ожидайте продолжение серии статей по изысканиям ;)

пʼятниця, 23 жовтня 2009 р.

Настройка проприетарных драйверов ATI под Debian, Linux 2.6.27.4, ATI driver installer 8.10, Debian/Lenny

Это просто копия моей-же статьи с linuxforum.ru.


Хочу поделиться с сообществом своим опытом в настройке проприетарных драйверов от ATI. Все дело в том, что на момент начала моей "борьбы" с этими драйверами более-менее современного описания найдено не было, а те рецепты которые были найдены, в частности, на этом форуме не дали полного и вразумительного ответа. Поэтому и родилась мысль поделиться опытом. Как оказалось - все более чем просто! Надо лишь знать в какую сторону копать.
Итак, поехали...

Карточка у меня оказалась достаточно древняя (это рабочий десктоп, как ни как):
$ lspci | grep ATI
01:00.0 VGA compatible controller: ATI Technologies Inc RV370 [Sapphire X550 Silent]
01:00.1 Display controller: ATI Technologies Inc RV370 secondary [Sapphire X550 Silent]
А сайта AMD ATI были взяты последние драйвера для моей карточки ati-driver-installer-8-10-x86.x86_64.run.

Предчувствие меня не обмануло и, как и ожидалось, простой запуск на исполнение послал меня, выдав ошибку при компиляции. С этого момента начались мытарства в поисках нужного ответа, часть которого была найдена тут mczim-debian.blogspot.com и, да простит меня русскоязычная часть форумчан, тут www.debian-administration.org.ua. Скажу сразу, что хоть и в первом, и во втором случае эти рецепты ранее были признаны рабочими, но в моём случае они к успеху не привели. Но тем не менее - это очень правильные рецепты.

Теперь по-порядку, к чему свелись мои действия из этих двух рецептов:
$ chmod +x ati-driver-installer-8-10-x86.x86_64.run

Получим список поддерживаемых платформ для сборки драйверов:
$ ./ati-driver-installer-8-10-x86.x86_64.run --listpkg

Мне повезло, так как Debian/lenny в этом списке присутствовал. Ура. Следующий шаг тоже особых усилий не требует:
$ sudo ./ati-driver-installer-8-10-x86.x86_64.run --buildpkg Debian/lenny

Ждем. После завершения у нас появляются пакеты:
fglrx-amdcccle_8.542-1_i386.deb
fglrx-driver_8.542-1_i386.deb
fglrx-driver-dev_8.542-1_i386.deb
fglrx-kernel-src_8.542-1_i386.deb

Отлично! Устанавливаем их при помощи dpkg -i один за другим, начиная с fglrx-driver_8.542-1_i386.deb. Внимание! Если в процессе установки fglrx-driver произошла ошибка - ничего страшного, все фиксится очень просто:
$ sudo aptitude reinstall libgl1-mesa-glx

и повторяем попытку установки.

А вот теперь самое интересное. При попытке собрать пакет с драйвером fglrx под свою платформу мы получаем "отбой", так как во время компиляции возникает ошибка. Усиленные поиски в Сети привели к находке патча для файла firegl_public.c, правда для его наложения на текущую версию драйверов пришлось поработать напильником, так как по смещениям нужные строки не совпадали... ну как обычно... По-порядку. Diff'ничек с правильными смещениями для вышеуказанных дров:
--- firegl_public.c.orig 2008-10-31 14:36:11.000000000 +0200
+++ firegl_public.c 2008-10-31 15:18:02.000000000 +0200
@@ -200,6 +200,12 @@
#define preempt_enable()
#endif

+/* Since 2.6.27 smp_call_function doesn't have a nonatomic/retry argument */
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27)
+#define SMP_CALL_FUNCTION(func, info, retry, wait) smp_call_function(func, info, wait)
+#else
+#define SMP_CALL_FUNCTION(func, info, retry, wait) smp_call_function(func, info, retry, wait)
+#endif
// ============================================================
/* globals */

@@ -251,7 +257,7 @@
const char BUILD_KERNEL_HAS_MODVERSIONS_CLEARED;
#endif

-#ifdef __SMP__
+#ifdef CONFIG_SMP
const unsigned long __ke_SMP_State = 1;
const char BUILD_KERNEL_HAS_SMP_SET;
#else
@@ -2348,8 +2354,8 @@
{
/*Some kernel developer removed the export of symbol "flush_tlb_page" on 2.6.25 x86_64 SMP kernel.
Define a simple version here.*/
-#if defined(__x86_64__) && defined(__SMP__) && (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,25))
- on_each_cpu(KCL_flush_tlb_one, &va, 1, 1);
+#if defined(__x86_64__) && (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,25))
+ on_each_cpu(KCL_flush_tlb_one, &va, 1);
#else
flush_tlb_page(vma, va);
#endif
@@ -2766,7 +2772,7 @@

/*****************************************************************************/

-#ifdef __SMP__
+#ifdef CONFIG_SMP
static atomic_t cpus_waiting;

static void deferred_flush(void* contextp)
@@ -2782,13 +2788,13 @@
while (atomic_read(&cpus_waiting) > 0)
barrier();
}
-#endif /* __SMP__ */
+#endif /* CONFIG_SMP */

int ATI_API_CALL __ke_flush_cache(void)
{
-#ifdef __SMP__
+#ifdef CONFIG_SMP
/* write back invalidate all other CPUs (exported by kernel) */
- if (smp_call_function(deferred_flush, NULL, 1, 0) != 0)
+ if (SMP_CALL_FUNCTION(deferred_flush, NULL, 1, 0) != 0)
panic("timed out waiting for the other CPUs!\n");

/* invalidate this CPU */
@@ -2802,7 +2808,7 @@

while (atomic_read(&cpus_waiting) > 0)
barrier();
-#else /* !__SMP__ */
+#else /* !CONFIG_SMP */
#if defined(__i386__) || defined(__x86_64__)
asm volatile ("wbinvd":::"memory");
#elif defined(__alpha__) || defined(__sparc__)
@@ -2810,7 +2816,7 @@
#else
#error "Please define flush_cache for your architecture."
#endif
-#endif /* !__SMP__ */
+#endif /* !CONFIG_SMP */

//for kernel 2.6.25, tlb_flush has been included when calling set_pages_*.
#if LINUX_VERSION_CODE 

После установки пакета fglrx-kernel-src_8.542-1_i386.deb в /usr/src появляется файл fglrx.tar.bz2, вот его куда-нибудь в /tmp распаковываем, накладываем выше приведённый патч, пакуем назад с таким же именем и кладем назад в /usr/src.

Конечно-же подразумевается, что ранее ядро мы собирали вручную.
Очень кратко о сборке ядра:
# make menuconfig
# make-kpkg clean
# fakeroot make-kpkg --initrd --revision=custom.1.0 kernel_image
# fakeroot make-kpkg --initrd --revision=custom.1.0 kernel_headers
# fakeroot make-kpkg --initrd --revision=custom.1.0 kernel_source
# dpkg -i ../linux-image_версия-ядра_ревизия-ядра_i386.deb


Вот. Тут бы и сказочке конец, тут бы и собрать дровишки и установить их. Но... Конечно же драйвера соберутся и установка пройдёт гладко, вплоть до перезагрузки, так как на момент загрузки fglrx будет выдана ошибка, которую можно будет лицезреть по dmesg. Поэтому ещё немного терпения.

Это хорошо, что ядро у нас собрано установлено и работает. Придётся его... собирать опять, перед этим слегка пропатчив init_task.c в пути исходников ядра arch/x86/kernel.
--- arch/x86/kernel/init_task.c.orig 2008-11-02 09:11:46.000000000 +0200
+++ arch/x86/kernel/init_task.c 2008-11-01 11:16:34.000000000 +0200
@@ -14,7 +14,8 @@
static struct signal_struct init_signals = INIT_SIGNALS(init_signals);
static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand);
struct mm_struct init_mm = INIT_MM(init_mm);
-EXPORT_UNUSED_SYMBOL(init_mm); /* will be removed in 2.6.26 */
+//EXPORT_UNUSED_SYMBOL(init_mm); /* will be removed in 2.6.26 */
+EXPORT_SYMBOL(init_mm); /* will be removed in 2.6.26 */

/*
* Initial thread structure.

Вот, отлично, теперь пересобираем и устанавливаем ядро. Перезагружаемся.
Используя
$ sudo m-a
или
module-assistant prepare,update
module-assistant build,install fglrx
depmod -a
собираем пакет fglrx-kernel-версия-ядра_8.542-1+ревизия-ядра_i386.deb и устанавливаем его.

Ну и напоследок:
$ sudo aticonfig --initial
$ sudo aticonfig --overlay-type=Xv
$ sudo reboot

Собственно всё! Перезагружаемся и наслаждаемся!

Проверка:
$ fglrxinfo
display: :0.0 screen: 0
OpenGL vendor string: ATI Technologies Inc.
OpenGL renderer string: Radeon X300/X550/X1050 Series
OpenGL version string: 2.1.8087 Release
$ glxinfo | grep render
direct rendering: Yes
OpenGL renderer string: Radeon X300/X550/X1050 Series
$ glxgears -info
GL_RENDERER = Radeon X300/X550/X1050 Series
GL_VERSION = 2.1.8087 Release
GL_VENDOR = ATI Technologies Inc.
GL_EXTENSIONS = GL_AMD_performance_monitor GL_ARB_depth_texture
GL_ARB_draw_buffers GL_ARB_fragment_program
GL_ARB_fragment_shader GL_ARB_half_float_pixel
GL_ARB_half_float_vertex GL_ARB_multisample GL_ARB_multitexture
GL_ARB_occlusion_query GL_ARB_pixel_buffer_object
GL_ARB_point_parameters GL_ARB_point_sprite GL_ARB_shader_objects
GL_ARB_shading_language_100 GL_ARB_shadow GL_ARB_shadow_ambient
GL_ARB_texture_border_clamp GL_ARB_texture_compression
GL_ARB_texture_cube_map GL_ARB_texture_env_add
GL_ARB_texture_env_combine GL_ARB_texture_env_crossbar
GL_ARB_texture_env_dot3 GL_ARB_texture_float
GL_ARB_texture_mirrored_repeat GL_ARB_texture_non_power_of_two
GL_ARB_texture_rectangle GL_ARB_transpose_matrix GL_ARB_vertex_buffer_object
GL_ARB_vertex_program GL_ARB_vertex_shader
GL_ARB_window_pos GL_ATI_draw_buffers
GL_ATI_envmap_bumpmap GL_ATI_fragment_shader GL_ATI_meminfo
GL_ATI_separate_stencil GL_ATI_texture_env_combine3
GL_ATI_texture_float GL_EXT_abgr GL_EXT_bgra GL_EXT_blend_color
GL_EXT_blend_equation_separate GL_EXT_blend_func_separate
GL_EXT_blend_minmax GL_EXT_blend_subtract
GL_EXT_compiled_vertex_array GL_EXT_copy_texture
GL_EXT_draw_range_elements GL_EXT_fog_coord GL_EXT_framebuffer_blit
GL_EXT_framebuffer_multisample GL_EXT_framebuffer_object
GL_EXT_gpu_program_parameters GL_EXT_multi_draw_arrays
GL_EXT_packed_depth_stencil GL_EXT_packed_pixels
GL_EXT_point_parameters GL_EXT_rescale_normal GL_EXT_secondary_color
GL_EXT_separate_specular_color GL_EXT_shadow_funcs
GL_EXT_stencil_wrap GL_EXT_subtexture GL_EXT_texgen_reflection
GL_EXT_texture3D GL_EXT_texture_compression_s3tc
GL_EXT_texture_cube_map GL_EXT_texture_edge_clamp
GL_EXT_texture_env_add GL_EXT_texture_env_combine
GL_EXT_texture_env_dot3 GL_EXT_texture_filter_anisotropic
GL_EXT_texture_lod_bias GL_EXT_texture_mirror_clamp
GL_EXT_texture_object GL_EXT_texture_rectangle GL_EXT_texture_sRGB
GL_EXT_vertex_array GL_KTX_buffer_region GL_NV_blend_square
GL_NV_texgen_reflection GL_SGIS_generate_mipmap
GL_SGIS_texture_edge_clamp GL_SGIS_texture_lod GL_WIN_swap_hint WGL_EXT_swap_control
7295 frames in 5.0 seconds = 1458.984 FPS
7239 frames in 5.0 seconds = 1447.743 FPS
7328 frames in 5.0 seconds = 1465.518 FPS
7364 frames in 5.0 seconds = 1472.800 FPS
7346 frames in 5.0 seconds = 1469.199 FPS
$ fgl_glxgears
Using GLX_SGIX_pbuffer
1597 frames in 5.0 seconds = 319.400 FPS
2008 frames in 5.0 seconds = 401.600 FPS
1997 frames in 5.0 seconds = 399.400 FPS
2008 frames in 5.0 seconds = 401.600 FPS
2267 frames in 5.0 seconds = 453.400 FPS
2589 frames in 5.0 seconds = 517.800 FPS

Ps:
Отдельное спасибо хочется сказать Вадику Пилипенко aka Pil$on, который
"заставил" меня совершить подвиг по установке ATI'шных дров вместо
покупки nVidia и который поделился идеей патча ядра, на предмет замены
EXPORT_UNUSED_SYMBOL на EXPORT_SYMBOL (уж не знаю, где он нашёл это
решение и чем это чревато, но... - работает)

Как получить modeline

Немного о настройке X'ов. В секции Monitor каждый может заметить загадочные строки ModeLine, но не каждый может ответить на вопрос откуда берутся эти параметры.
Приоткроем завесу над этой тайной. Вот два метода позволяющий получить значения ModeLine.
$ aptitude install read-edid
$ aptitude install videogen
В первом пакете нас интересуют утилиты get-edid и parse-edid - первая из них получает, а вторая интерпретирует значение спецификации монитора используя VESA VBE DDC протокол.
videogen - это программа генерации Modelines для XFree86 сервера.
Теперь как пользоваться первой и второй из них.

Для начала рассмотрим пакет read-edid.
$ sudo get-edid | parse-edid
parse-edid: parse-edid version 2.0.0
get-edid: get-edid version 2.0.0

Performing real mode VBE call
Interrupt 0x10 ax=0x4f00 bx=0x0 cx=0x0
Function supported
Call successful

VBE version 200
VBE string at 0x2110 "ATI RV370"

VBE/DDC service about to be called
Report DDC capabilities

Performing real mode VBE call
Interrupt 0x10 ax=0x4f15 bx=0x0 cx=0x0
Function supported
Call successful

Monitor and video card combination does not support DDC1 transfers
Monitor and video card combination supports DDC2 transfers
0 seconds per 128 byte EDID block transfer
Screen is not blanked during DDC transfer

Reading next EDID block

VBE/DDC service about to be called
Read EDID

Performing real mode VBE call
Interrupt 0x10 ax=0x4f15 bx=0x1 cx=0x0
Function supported
Call successful

parse-edid: EDID checksum passed.

# EDID version 1 revision 3
Section "Monitor"
# Block type: 2:0 3:fd
# Block type: 2:0 3:fc
Identifier "SyncMaster"
VendorName "SAM"
ModelName "SyncMaster"
# Block type: 2:0 3:fd
HorizSync 30-81
VertRefresh 56-75
# Max dot clock (video bandwidth) 140 MHz
# Block type: 2:0 3:fc
# Block type: 2:0 3:ff
# DPMS capabilities: Active off:yes  Suspend:no  Standby:no

Mode  "1280x1024" # vfreq 60.020Hz, hfreq 63.981kHz
DotClock 108.000000
HTimings 1280 1328 1440 1688
VTimings 1024 1025 1028 1066
Flags "+HSync" "+VSync"
EndMode
# Block type: 2:0 3:fd
# Block type: 2:0 3:fc
# Block type: 2:0 3:ff
EndSection
Тут наиболее интересная для решения поставленной нами задачи информация содержится практически в самом конце. Для составления ModeLine нас интересуют строки начинающиеся с Mode, DotClock, HTimings, VTimings и Flags:
Mode  "1280x1024" # vfreq 60.020Hz, hfreq 63.981kHz
DotClock 108.000000
HTimings 1280 1328 1440 1688
VTimings 1024 1025 1028 1066
Flags "+HSync" "+VSync"
Итоговая ModeLine:
  • ModeLine "1280x1024" 108.00 1280 1328 1440 1688 1024 1025 1028 1066 +HSync +VSync

Перейдём ко второму методу, пакету videogen.
Тут всё значительно проще. Просто вызываем videogen с параметрами режима, максимального значения dot clock rate, максимальной частотой горизонтальной развёртки и максимальной частотой вертикальной развёртки:
$ videogen -m=1280x1024 -mdc=108 -mhf=81 -mvf=75
и получаем результирующую строку ModeLine:
  • Modeline "1280x1024" 108.00 1280 1320 1368 1640 1024 1026 1030 1078  # 108 MHz, 65.9 kHz, 61.1 Hz

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

Собственно на этом всё ;)

вівторок, 20 жовтня 2009 р.

Установка скорости последовательного порта

Понадобилось тут последовательный порт на 2400 залочить.
Помню, что раньше через setserial всё успешно лочил, но было это давно, в далёких 90-х. Тем не менее решил попробовать, на что и получил нелицеприятное сообщение:
# setserial /dev/ttyS0 uart 16550A port 0x03f8 irq 4 baud_base 2400 spd_normal skip_test
Cannot set serial info: Invalid argument

При этом значения выше (9600 и т.д.) воспринимались вполне корректно:
# setserial /dev/ttyS0 uart 16550A port 0x03f8 irq 4 baud_base 9600 spd_normal skip_test
#
Выход был найден. Оказывается всё можно сделать и без использования дополнительного setserial:
# stty 2400 < /dev/ttyS0
Проверяем:
# stty -F /dev/ttyS0 | grep speed
speed 2400 baud; line = 0;
Чудеса да и только ;)