LINUX.ORG.RU

Эксперименты с NVIDIA и ATi. Сменить OpenGL в не-Gentoo

 


0

1

Решил установить в одну систему и драйвер NVIDIA, и драйвер ATi. Причин две: в openSUSE не знаю когда именно, но разрешили проблему с дублирующимся /usr/lib64/libGL.so.1. Теперь он всегда принадлежит Mesa, а для проприетарных OpenGL есть каталог /usr/X11R6/. А значит, все три OpenGL установлены в одной системе и не конфликтуют. Также проприетарные драйверы создают правило blacklist nouveau и blacklist radeon, что также мне нужно.

Неужели теперь не важно, какая видеокарта в моём компьютере - система сама подставит нужный OpenGL? Установил. Чтобы не возникло конфликтов, удалил пакет nvidia-computeG02, который содержал /usr/lib64/libOpenCL.so.1, который дублировался бы с RPM драйвера ATi. И конфликтов не возникло:

# lspci -v

01:05.0 VGA compatible controller: ATI Technologies Inc Radeon HD 3200 Graphics (prog-if 00 [VGA controller])
        Subsystem: ASRock Incorporation Device 9610
        Flags: bus master, fast devsel, latency 0, IRQ 18
        Memory at ce000000 (32-bit, prefetchable) [size=32M]
        I/O ports at c000 [size=256]
        Memory at f9ff0000 (32-bit, non-prefetchable) [size=64K]
        Memory at f9e00000 (32-bit, non-prefetchable) [size=1M]
        Capabilities: [50] Power Management version 3
        Capabilities: [a0] MSI: Enable- Count=1/1 Maskable- 64bit+
        Kernel driver in use: fglrx_pci

02:00.0 VGA compatible controller: nVidia Corporation G92 [GeForce 9800 GT] (rev a2) (prog-if 00 [VGA controller])
        Subsystem: ASUSTeK Computer Inc. Device 8314
        Flags: bus master, fast devsel, latency 0, IRQ 18
        Memory at fd000000 (32-bit, non-prefetchable) [size=16M]
        Memory at d0000000 (64-bit, prefetchable) [size=256M]
        Memory at fa000000 (64-bit, non-prefetchable) [size=32M]
        I/O ports at d800 [size=128]
        [virtual] Expansion ROM at feae0000 [disabled] [size=128K]
        Capabilities: [60] Power Management version 3
        Capabilities: [68] MSI: Enable- Count=1/1 Maskable- 64bit+
        Capabilities: [78] Express Endpoint, MSI 00
        Capabilities: [100] Virtual Channel
        Capabilities: [128] Power Budgeting <?>
        Capabilities: [600] Vendor Specific Information: ID=0001 Rev=1 Len=024 <?>
        Kernel driver in use: nvidia

Затем я удалил /etc/X11/xorg.conf и решил по-очереди загрузиться с NVIDIA и ATi. ATi загрузился и запустил игру. Чтобы NVIDIA загрузился всё же пришлось создать xorg.conf, но нет OpenGL. Смотрю /usr/X11R6/lib64 - а там OpenGL ATi лежит в подкаталоге fglrx, а OpenGL NVIDIA - прямо в lib64! Символьная ссылка libGL.so.1 ведёт на OpenGL ATi.

Я могу конечно её поменять, и тогда и на NVIDIA будет OpenGL. Вопрос вам: как сделать так, чтобы когда я загружаю систему на компьютере с NVIDIA, он запускался без xorg.conf? Как создать два разных каталога с OpenGL для NVIDIA и ATi? Как Linux понимает, что OpenGL ему надо искать не в /usr/lib64, а в /usr/X11R6/lib64, и как затем это поведение изменить на /usr/X11R6/lib64/fglrx либо /usr/X11R6/lib64/nvidia? И нужно ли аналогично переключать библиотеку GLX?

Меня напрягло следующее. При установке RPM с драйвером ATi была строчка:

Switch to AMD

Какая команда выполнялась? Мне кажется, это и есть то, что указывает Linux'у, где OpenGL. switchlibGL из состава драйвера ATi говорит:

# /usr/lib64/fglrx/switchlibGL --help
Usage: switchlibGL <amd|intel|query>
#

А switchlibglx:

# /usr/lib64/fglrx/switchlibglx --help
Usage: switchlibglx <amd|intel|query>
#
★★★★★

Последнее исправление: ZenitharChampion (всего исправлений: 1)

Этот тупак не читал, но раскрою тебе суть: нужно все пересекающиеся файлы драйверов разложить по отдельным для каждого производителя каталогам, и симлинкать по необходимости. Теперь осталось пронаблюдать, как долго займёт у тебя выполнение этой «нетривиальной» задачи.

anonymous
()
Ответ на: комментарий от GotF

Олсо, в приличных дистрибутивах есть система альтернатив, с учётом которой собирают пакеты.

GotF ★★★★★
()
Ответ на: комментарий от anonymous

Поменять симлинк я могу и сейчас. Мне надо чтобы это производилось автоматически. Система же определяет каким-то образом, libGL.so.1 мне из /usr/lib64 нужен (когда открытый драйвер) или из /usr/X11R6/lib64 (когда закрытый). Осталось только понять, как, чтобы внести изменения.

ZenitharChampion ★★★★★
() автор топика

Видимо, никто не знает. Разместил вопрос на англоязычном форуме, если получу ответ - напишу сюда.

ZenitharChampion ★★★★★
() автор топика
Ответ на: комментарий от ZenitharChampion

тут и знать нечего - запиливаешь скрипт, который проверит на какой карты ты сейчас
и правит ссылки/конфиги соответствующим образом
всё это ДО запуска иксов
вот и всё

megabaks ★★★★
()
Ответ на: комментарий от anonymous

Ладно, описываю как для тупых.

Раньше все видеодрайверы использовали разные имена файлов, кроме одного - /usr/lib64/libGL.so.1 у всех видеодрайверов свой, и название библиотеки обязательно именно такое. В Gentoo это решено командой eselect opengl list.

Теперь всё иначе: OpenGL хранятся в разных каталогах.

Если установлен открытый драйвер, то OpenGL лежит в /usr/lib64/libGL.so.1.

Если установлен драйвер NVIDIA, а ATi не установлен, то OpenGL лежит в каталоге /usr/X11R6/lib64.

Если установлен драйвер ATi, а NVIDIA не установлен, то OpenGL лежит в каталоге /usr/X11R6/lib64/fglrx.

Если установлены и драйвер NVIDIA, и драйвер ATi, то все три OpenGL установлены и не дублируются!

Смотри: когда я пользуюсь открытым драйвером, приложение пользуется OpenGL из /usr/lib64. И ldd файла выдаёт путь к libGL.so.1 в /usr/lib64. А если я пользуюсь закрытым драйвером, то без моего вмешательства этот путь меняется на /usr/X11R6/lib64! Сам! Без замены символьной ссылки /usr/lib64/libGL.so.1!

Идея замечательная, но реализация неудачная. Вместо того, чтобы создать /usr/X11R6/lib64/nvidia и /usr/X11R6/lib64/fglrx, nvidia кладёт свой OpenGL прямо в /usr/X11R6/lib64, а ATi создаёт отдельный каталог. И я конечно прямо сейчас могу вручную поменять символьную ссылку /usr/X11R6/lib64/libGL.so.1 или написать скрипт, но мне хочется, чтобы когда вставлена видеокарта NVIDIA использовался один путь до libGL.so.1, а когда ATi - другой. А если обе - то в разных иксах использовался свой путь до OpenGL. Поэтому я спрашиваю, что за механизм регулирует путь к используемому libGL.so.1 в зависимости от используемого драйвера, потому что я не могу его найти.

ZenitharChampion ★★★★★
() автор топика
Последнее исправление: ZenitharChampion (всего исправлений: 5)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.