The OpenNET Project / Index page

[ новости/++ | форум | wiki | теги ]

Повышение производительности в XWindow видеокарт Matrox (linux x xfree86 video tune)


<< Предыдущая ИНДЕКС Поиск в статьях src Установить закладку Перейти на закладку Следующая >>
Ключевые слова: linux, x, xfree86, video, tune,  (найти похожие документы)
From: Шлыков Василий (AKA VaSh) <vash@id.ru> Subject: Повышение производительности в XWindow видеокарт Matrox Предупреждение Данная статья распространяется КАК ЕСТЬ, в надежде оказаться кому-нибудь полезной. Так что автор не несёт ответственность за спаленные видеокарты, лапти, валенки или другой ущерб приченённый в результате попытки двинуть описанные ниже идеи в жизнь. В свою очередь я, собственно, не претендую на первенство, а хочу лишь поделиться найденным способом с народом. 'О чём у нас там самое был разговор шёл?' (c) Не мой. Данная статья посвящена повышению производительности видеокарточек Matrox в X'ах (http://www.xfree.org/ XFree86 имеются ввиду). К сожалению утилиты типа PowerStrip для *nix нет, и поэтому приходится расчитывать на собственные силы(у кого они есть :-) ). Если заглянуть в manы, посвященные в частности драйверам Matrox, то можно найти несколько любопытных ключей, отвечающих за производительность карточки. Это, во первых, параметр `AGPMode' с помощью которого можно настроить пропускную способнось AGP шины. Кроме этого у Matrox'овских карточек есть параметр `OverclockMem' про который, цитирую, сказано: Set clocks to values used by some commercial X-Servers (G100, G200 and G400 only). Default: off. И все :-( Но! Есть исходники драйверов Matrox'a :-). Если в них заглянуть, то окажется, что он отвечает за установку частоты работы GPU/памяти для видеокарт следующим образом: CAPTION: Соответствие карта/режим -> частота `OverclockMem' G100 G200 G400/G550 G400 MAX GPU Mem GPU Mem GPU Mem GPU Mem true - 143/220* - 143 125 166 150 200 false - 124/203* - 124 110 166 125 166 * При наличии памяти типа SDRAM Как видно, по умолчанию G400 работают(по идее) на частоте меньшей, чем положено :-/ Естественно возникает желание повысить частоту работы GPU/памяти, тем более что ни в какие спецификации лазить не приходится, всё уже готово. Итак, для этого нужно: 1. Исходники X'ов(Я правил в 4.3.0, но это не имеет значения, по крайней мере, для 4.x.x) 2. gcc + make + other stuff ... Собственно править нужно файл xc/programs/Xserver/hw/xfree86/drivers/mga/mga_dacG.c Привожу для удобства нужный нам кусок(с выброшенными ненужными кусками). static Bool MGAGInit(ScrnInfoPtr pScrn, DisplayModePtr mode) { /* * initial values of the DAC registers */ const static unsigned char initDAC[] = { /* 0x00: */ 0, 0, 0, 0, 0, 0, 0x00, 0, ... MGA_NOT_HAL( /* Allocate the DacRegs space if not done already */ if (pReg->DacRegs == NULL) { pReg->DacRegs = xnfcalloc(DACREGSIZE, 1); } for (i = 0; i < DACREGSIZE; i++) { pReg->DacRegs[i] = initDAC[i]; } ); /* MGA_NOT_HAL */ switch(pMga->Chipset) { case PCI_CHIP_MGAG100: case PCI_CHIP_MGAG100_PCI: pReg->DacRegs[ MGAGDAC_XVREFCTRL ] = 0x03; if(pMga->HasSDRAM) { if(pMga->OverclockMem) { /* 220 Mhz */ pReg->DacRegs[ MGA1064_SYS_PLL_M ] = 0x06; pReg->DacRegs[ MGA1064_SYS_PLL_N ] = 0x38; pReg->DacRegs[ MGA1064_SYS_PLL_P ] = 0x18; } else { /* 203 Mhz */ pReg->DacRegs[ MGA1064_SYS_PLL_M ] = 0x01; pReg->DacRegs[ MGA1064_SYS_PLL_N ] = 0x0E; pReg->DacRegs[ MGA1064_SYS_PLL_P ] = 0x18; } pReg->Option = 0x404991a9; } else { if(pMga->OverclockMem) { /* 143 Mhz */ pReg->DacRegs[ MGA1064_SYS_PLL_M ] = 0x06; pReg->DacRegs[ MGA1064_SYS_PLL_N ] = 0x24; pReg->DacRegs[ MGA1064_SYS_PLL_P ] = 0x10; } else { /* 124 Mhz */ pReg->DacRegs[ MGA1064_SYS_PLL_M ] = 0x04; pReg->DacRegs[ MGA1064_SYS_PLL_N ] = 0x16; pReg->DacRegs[ MGA1064_SYS_PLL_P ] = 0x08; } pReg->Option = 0x4049d121; } pReg->Option2 = 0x0000007; break; case PCI_CHIP_MGAG400: case PCI_CHIP_MGAG550: #ifdef USEMGAHAL MGA_HAL(break;); #endif if (MGAISGx50(pMga)) break; if(pMga->Dac.maxPixelClock == 360000) { /* G400 MAX */ if(pMga->OverclockMem) { /* 150/200 */ pReg->DacRegs[ MGA1064_SYS_PLL_M ] = 0x05; // СМОТРЕТЬ, НАПРИМЕР, СЮДА! pReg->DacRegs[ MGA1064_SYS_PLL_N ] = 0x42; // прим. автора pReg->DacRegs[ MGA1064_SYS_PLL_P ] = 0x18; // pReg->Option3 = 0x019B8419; // pReg->Option = 0x50574120; // } else { /* 125/166 */ pReg->DacRegs[ MGA1064_SYS_PLL_M ] = 0x02; pReg->DacRegs[ MGA1064_SYS_PLL_N ] = 0x1B; pReg->DacRegs[ MGA1064_SYS_PLL_P ] = 0x18; pReg->Option3 = 0x019B8419; pReg->Option = 0x5053C120; } } else { if(pMga->OverclockMem) { /* 125/166 */ pReg->DacRegs[ MGA1064_SYS_PLL_M ] = 0x02; pReg->DacRegs[ MGA1064_SYS_PLL_N ] = 0x1B; pReg->DacRegs[ MGA1064_SYS_PLL_P ] = 0x18; pReg->Option3 = 0x019B8419; pReg->Option = 0x5053C120; } else { /* 110/166 */ pReg->DacRegs[ MGA1064_SYS_PLL_M ] = 0x13; pReg->DacRegs[ MGA1064_SYS_PLL_N ] = 0x7A; pReg->DacRegs[ MGA1064_SYS_PLL_P ] = 0x08; pReg->Option3 = 0x0190a421; pReg->Option = 0x50044120; } } if(pMga->HasSDRAM) pReg->Option &= ~(1 << 14); pReg->Option2 = 0x01003000; break; case PCI_CHIP_MGAG200: case PCI_CHIP_MGAG200_PCI: default: } MGA_NOT_HAL( /* must always have the pci retries on but rely on polling to keep them from occuring */ pReg->Option &= ~0x20000000; ... return(TRUE); } Таким образом, можно задать частоты работы G400 в режиме `OverclockMem' равными, соответсвенно 150/200 MHz. Для этого копируем соответствующий блок установок регистров из блока для G400 MAX. И все! Кстати, обратите внимание на макрос MGA_HAL(...) (из mga_macros.h) он исполняет код, переданный ему в скобках. Так что, если вы хотите чтобы этот способ работал, либо вообще не грузите mga_hal_drv.o, либо уберите этот код ТАМ ГДЕ НУЖНО. См. также MGAISGx50(...). Для тех, кто не очень ориентируется во всём этом :-) * Добываете исходники X'ов(лучше из любимого дистрибутива). * Распаковываете в /usr/src (ну или куда там вам нужно). * Ползёте в /...там где нужно.../xc/programs/Xserver/hw/xfree86/drivers/mga * Правите mga_dacG.c * Переходите обратно в xc/ и запускаете 'make World' (править никакие конфиги не надо) * Для тех, у кого не 2.5+GHz/1Gb: Ждать окончания компиляции не нужно, можно оборвать процесс когда начнётся, собственно, компиляция. * Снова идете в /...там где нужно.../xc/programs/Xserver/hw/xfree86/drivers/mga, и если там ещё ничего не скомпилировано, запускаете 'make'. Можно также поправить Makefile на предмет '-fno-strength-reduce -fещё-туева-хуча-всего' на '-fstrength-reduce -fomit-frame-pointer'(ВЕЗДЕ!). * Когда образуется файл 'mga_drv.o', скопируйте его в '/usr/X11/lib/modules/drivers'. Теперь можно править конфиг X-ов. ... Section "Device" Identifier "Matrox G400" VendorName "Matrox" Driver "mga" Option "AGPMode" "4" # если вам это надо (и ПОДДЕРЖИВАЕТСЯ!) Option "OverclockMem" "true" # за что боролись! (или как у вас там) # + Ваши параметры EndSection ... Что касаемо benchmark'ов, то тут широкое поле для экспериментов... Я юзал 'glxgears': (G400, 125/166->150/200) fps подросли на ~15-20%. Да и QIII стал пошустрее Ж:-) ... Шлыков Василий (AKA VaSh) <vash@id.ru>

<< Предыдущая ИНДЕКС Поиск в статьях src Установить закладку Перейти на закладку Следующая >>

Ваш комментарий
Имя:         
E-Mail:      
Заголовок:
Текст:





  Закладки на сайте
  Проследить за страницей
Created 1996-2017 by Maxim Chirkov  
ДобавитьРекламаВебмастеруГИД  
Hosting by Ihor