Косячат дрова S3 и Voodoo; как пересобрать?


Автор темы
Вредятел
Сообщения: 94
Зарегистрирован: 23 янв 2012, 13:30

Re: Косячат дрова S3 и Voodoo; как пересобрать?

Сообщение Вредятел » 27 апр 2015, 19:41

Поскольку на s3 давно внимания никто не обращает, а я недавно опять пробегал мимо той весёлой машинки, отчитываюсь о положении дел.
Дрова s3 по-прежнему с тем же идиотским косяком. Они сначала составляют список доступных режимов, перебирая все разрешения с цветовой глубиной 24, очевидно, на самые высокие разрешения видеопамяти не хватает и они вычёркиваются. Затем они смотрят, какое разрешение захотел юзер, и, если его нет в списке, оно принудительно уменьшается. И вот только после этого проверяется, какую цветовую глубину юзер в xorgconf'е задал, не 16 ли? В результате этого гениального решения все видеорежимы, доступные только в 16 битах (это всё-таки s3, видеопамяти у неё далеко не вагон!), отпадают ко всем индусам и остаётся в лучшем случае 800х600.

Поскольку по пальцам линейкой автору уже не надаёшь, старый быстрый костыль остаётся в силе:

sudo apt-get install pkg-config
sudo apt-get install dpkg-dev
sudo apt-get build-dep xserver-xorg-video-s3
sudo apt-get --compile source xserver-xorg-video-s3
cd xserver-xorg-video-s3-0.6.5
(ну или какой уж там будет)
sudo leafpad debian/patches/remove-mibstore.diff
(это он просто под горячую руку попался мне первым, костыли такие костыли)
sudo dpkg-buildpackage

В дифф добавляем строки

Код: Выделить всё

@@ -329,1 +329,1 @@ static Bool S3PreInit(ScrnInfoPtr pScrn, int flags)
-        if (!xf86SetDepthBpp(pScrn, 0, 0, 0, Support24bppFb | Support32bppFb))
+       if (!xf86SetDepthBpp(pScrn, 16, 16, 16, NoDepth24Support))

и в итоге дифф, в его нынешнем виде, с инородным телом выглядит так:

Код: Выделить всё

@@ -52,7 +52,6 @@
 #include "compiler.h"
 #include "mipointer.h"
 #include "micmap.h"
-#include "mibstore.h"
 #include "fb.h"
 #include "inputstr.h"
 #include "shadowfb.h"
@@ -329,1 +329,1 @@ static Bool S3PreInit(ScrnInfoPtr pScrn, int flags)
-        if (!xf86SetDepthBpp(pScrn, 0, 0, 0, Support24bppFb | Support32bppFb))
+       if (!xf86SetDepthBpp(pScrn, 16, 16, 16, NoDepth24Support))
@@ -822,7 +821,6 @@ static Bool S3ScreenInit(SCREEN_INIT_ARGS_DECL)
    fbPictureInit (pScreen, 0, 0);
    S3DGAInit(pScreen);
 
-        miInitializeBackingStore(pScreen);
         xf86SetBackingStore(pScreen);
 
    /* framebuffer manager setup */


Число пробелов в начале строки (8) и номер строки (329) могут не читаться на страничке или плавать от версии к версии, см. свой файл src/s3_driver.c для точного попадания. Привёл из свежачка на момент поста.

And a translation, of course. For ones who just googled the "Lubuntu can't set 1024x768 on old S3 card, only 800x600":
Years go, problem persists. S3 driver has the same idiotic bug. First, it fills the list of available modes, checking them with 24BPP. Top resolution modes fail and don't appear in the list. Second, it checks for user's resolution and decrease 1024x to 800x, because 1024x didn't work during that idiotic test. And only then the driver checks if user requested to set 16BPP color depth, for which 1024x could be OK, but the driver does not allow this. Bigger VRAM cause 1280 to 1024 etc. I can't reward the autor with my boot (to the head), so I remind my quick and dirty hack still works.

sudo apt-get install pkg-config
sudo apt-get install dpkg-dev
sudo apt-get build-dep xserver-xorg-video-s3
sudo apt-get --compile source xserver-xorg-video-s3
cd xserver-xorg-video-s3-0.6.5
(or whatever version you got)
sudo leafpad debian/patches/remove-mibstore.diff
(it was the first .diff file I've got my hands on, dirty hack is so dirty)
sudo dpkg-buildpackage

But what exactly we do with the .diff? We add:

Код: Выделить всё

@@ -329,1 +329,1 @@ static Bool S3PreInit(ScrnInfoPtr pScrn, int flags)
-        if (!xf86SetDepthBpp(pScrn, 0, 0, 0, Support24bppFb | Support32bppFb))
+       if (!xf86SetDepthBpp(pScrn, 16, 16, 16, NoDepth24Support))

So it'll look somewhat like this:

Код: Выделить всё

@@ -52,7 +52,6 @@
 #include "compiler.h"
 #include "mipointer.h"
 #include "micmap.h"
-#include "mibstore.h"
 #include "fb.h"
 #include "inputstr.h"
 #include "shadowfb.h"
@@ -329,1 +329,1 @@ static Bool S3PreInit(ScrnInfoPtr pScrn, int flags)
-        if (!xf86SetDepthBpp(pScrn, 0, 0, 0, Support24bppFb | Support32bppFb))
+       if (!xf86SetDepthBpp(pScrn, 16, 16, 16, NoDepth24Support))
@@ -822,7 +821,6 @@ static Bool S3ScreenInit(SCREEN_INIT_ARGS_DECL)
    fbPictureInit (pScreen, 0, 0);
    S3DGAInit(pScreen);
 
-        miInitializeBackingStore(pScreen);
         xf86SetBackingStore(pScreen);
 
    /* framebuffer manager setup */


Check actual space indents and line number in src/s3_driver.c, this example is up-to-date for the day I post this message.
sudo leafpad /etc/default/keyboard... Боже, дай мне сил :(


Вернуться в «Разработка и тестирование»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость