Перевод документации драйвера NVIDIA для Linux, часть 4
Глава 11. Установка переменных среды OpenGL
11А. Полноэкранное сглаживание
Сглаживание углов (antialiasing) — это технология размытия краев объектов в сцене для уменьшения эффекта «лестницы», нередко проявляющегося в изображении. С помощью соответствующей переменной среды можно задействовать FSAA во всех OpenGL приложениях при использовании соответствующих графических процессоров.
Имеется несколько способов сглаживания, и вы можете выбирать между ними с помощью переменной среды __GL_FSAA_MODE. Обратите внимание, что увеличение числа выборки в полноэкранном сглаживании может снизить производительность.
Для просмотра доступных значений переменной __GL_FSAA_MODE и описаний режимов выполните команду:
nvidia-settings --query=fsaa --verbose
Переменная среды __GL_FSAA_MODE может принимать те же целочисленные значения, что используются для настройки полноэкранного сглаживания через утилиту «nvidia-settings» и расширение Х-интерфейса NV-CONTROL. Следующие команды имеют одинаковое действие:
export __GL_FSAA_MODE=5
nvidia-settings --assign FSAA=5
Обратите внимание, что имеется три параметра конфигурации, управляющие полноэкранным сглаживанием (FSAA, FSAAAppControlled и FSAAAppEnhanced), которые все вместе определяют работу OpenGL приложений. Если FSAAAppControlled задано как 1, указанные в утилите «nvidia-settings» настройки полноэкранного сглаживания будут игнорироваться в пользу настроек, указанных в вызовах приложений через атрибуты FBConfig. Если FSAAAppControlled задано как 0, но FSAAAppEnhanced как 1, тогда настройки полноэкранного сглаживания, заданные в nvidia-settings, будут применяться только если приложение в FBConfig запросит сглаживание по методу мультисэмплинга.
Полностью правильная команда для включения безусловного использования полноэкранного сглаживания для утилиты «nvidia-settings» должна выглядеть так:
nvidia-settings --assign FSAA=5 --assign FSAAAppControlled=0 --assign FSAAAppEnhanced=0
11В. Анизотропная фильтрация текстур
Автоматическая анизотропная фильтрация текстур может быть включена с помощью переменной среды __GL_LOG_MAX_ANISO. Возможные значения:
__GL_LOG_MAX_ANISO | Тип фильтрации |
0 | без анизотропной фильтрации |
1 | анизотропная фильтрация с выборкой 2x |
2 | анизотропная фильтрация с выборкой 4x |
3 | анизотропная фильтрация с выборкой 8x |
4 | анизотропная фильтрация с выборкой 16x |
Фильтрация с выборкой 4x и выше доступна только для графических процессоров GeForce3 и более новых; с выборкой 16x — только для GeForce 6800 и более новых.
11С. Вертикальная синхронизация
Присвоение переменной среды __GL_SYNC_TO_VBLANK ненулевого значения заставляет функцию glXSwapBuffers синхронизироваться с частотой вертикальной синхронизации монитора (осуществляя замену изображения только в период гашения).
При использовании переменной __GL_SYNC_TO_VBLANK вместе с TwinView, OpenGL может синхронизироваться только с одним из двух дисплеев; это может вызвать разрывы в изображении на том дисплее, с которым OpenGL не синхронизируется. С помощью переменной среды __GL_SYNC_DISPLAY_DEVICE вы можете указать дисплей, с которым OpenGL должен синхронизироваться. Для этого надо присвоить переменной значение — имя дисплея, например: "CRT-1". Посмотрите строку "Connected display device(s):" в файле журнала Х-интерфейса для просмотра списка подключенных дисплеев и их имен. Вы также можете найти полезную информацию в Главе 13 (Настройка Twinview) и в секции «Настройка временных параметров синхронизации» в Главе 19.
11D. Управление сортировкой атрибутов OpenGL FBCONFIGS
Реализация API GLX от NVIDIA сортирует атрибуты FBConfigs в списке, возвращаемом по вызову glXChooseFBConfig() в соответствии с требованиями спецификации GLX. Для изменения данного поведения, присвойте переменной среды __GL_SORT_FBCONFIGS значение 0, тогда в возвращаемом по вызову списке атрибуты FBConfigs будут перечислены в порядке очередности их получения от сервера X-интерфейса. Чтобы посмотреть возвращаемый сервером Х-интерфейса порядок атрибутов FBConfigs, выполните команду:
nvidia-settings --glxinfo
Эта опция может быть полезна при разрешении проблем с приложениями, получающими неожиданный атрибут FBConfig.
11E. Порядок осуществления возврата OpenGL драйвером
В ряде случаев драйверу OpenGL NVIDIA приходится ожидать внешних изменений перед продолжением работы. Чтобы избежать излишнего расхода времени центрального процессора в таких случаях, драйвер осуществляет операцию возврата, так что ядро операционной системы сможет обслуживать другие процессы, пока драйвер находится в режиме ожидания. Например, при ожидании освобождения места в очереди команд, если место не освободилось в течение определенного количества итераций, драйвер осуществляет возврат до возобновления цикла.
По умолчанию, драйвер делает системный вызов sched_yield(). Однако, такой подход может приводить к весьма продолжительному простою, если имеются другие процессы с тем же приоритетом, конкурирующие за время центрального процессора. Например, когда основанный на OpenGL диспетчер расширения «composite» перемещает окно и одновременно сервер Х-интерфейса пытается обновить его содержимое во время перемещения, для чего в равной степени требуется значительное количество работы центрального процессора.
Вы можете воспользоваться переменной среды __GL_YIELD для решения подобных проблем. С помощью этой переменной можно задать поведение драйвера при осуществлении операции возврата. Возможные значения:
__GL_YIELD | Поведение |
нет значения | по-умолчанию, драйвер OpenGL делает вызов sched_yield() |
NOTHING | драйвер OpenGL не осуществляет операции возврата |
USLEEP | драйвер OpenGL делает вызов usleep(0) |
11F. Доступность атрибутов OpenGL FBCONFIGS
Реализация API GLX от NVIDIA скрывает атрибуты FBConfigs, относящиеся к 32-битным ARGB областям вывода изображения, если определена переменная среды XLIB_SKIP_ARGB_VISUALS. Это соответствует поведению библиотеки «libX11», скрывающей эти области вывода изображения от вызовов XGetVisualInfo и XMatchVisualInfo. Данная переменная может быть полезна, если у приложений возникают проблемы из-за наличия этих атрибутов FBConfigs.
11G. Использование неофициальных протоколов GLX
По умолчанию, реализация GLX от NVIDIA не предлагает протокол GLX для команд OpenGL, если протокол определен как неполный. Протокол может быть определен как неполный по ряду причин, например потому, что его реализация находится еще в процессе разработки и содержит известные ошибки; или сама спецификация протокола еще только разрабатывается или находится в процессе пересмотра. Если кто-либо желает протестировать клиентскую часть подобного протокола в непрямом рендеринге, ему следует присвоить переменной __GL_ALLOW_UNOFFICIAL_PROTOCOL любое ненулевое значение перед запуском тестируемого приложения GLX. При использовании сервера GLX NVIDIA, опция конфигурации X-интерфейса "AllowUnofficialGLXProtocol" также должна быть задана для включения поддержки в сервере.
Глава 12. Настройка AGP
Имеется несколько вариантов настройки модуля уровня ядра драйвера NVIDIA для использования AGP в Linux. Вы можете выбирать между использованием встроенного драйвера AGP NVIDIA (nvAGP), или же драйвера AGP в составе ядра Linux (AGPGART). Это задается в опции "NvAGP" файла конфигурации Х-интерфейса:
Option "NvAGP" "0" | поддержка AGP отключена |
Option "NvAGP" "1" | использовать NVAGP, если возможно |
Option "NvAGP" "2" | использовать AGPGART, если возможно |
Option "NvAGP" "3" | сначала пытаться использовать AGPGART; если не удалось, то использовать NVAGP |
По-умолчанию значение опции 3 (до версии 1.0-1251 включительно было 1).
Следует использовать драйвер AGP, работающий лучше с вашим чипсетом материнской платы. В случае проблем со стабильностью можно попробовать загрузиться без поддержки AGP и посмотреть, решит ли это проблему. Затем вы можете попробовать использовать другой драйвер AGP.
Вы можете проверить использование AGP в любое время с помощью файловой системы /proc (см. Главу 21).
Для использования драйвера Linux 2.4 AGPGART, он должен быть скомпилирован вместе с ядром, статически связан с ядром, или же собран в модуль ядра и загружен. Для использования драйвера Linux 2.6 AGPGART, и общий модуль AGPGART apggart.ko, и модуль поддержки конкретного чипсета AGP (nvidia-agp.ko, intel-agp.ko, via-agp.ko) должны быть статически связаны с ядром или собраны в модули ядра и загружены.
Поддержка AGP NVIDIA не может быть использована, если AGPGART драйвер загружен в ядро. В системе Linux 2.4 рекомендуется скомпилировать AGPGART как модуль и убедиться, что он не загружен перед попыткой использовать драйвер AGP NVIDIA. В системе Linux 2.6, модуль agpgart.ko всегда должен быть загружен, так как модуль уровня ядра драйвера NVIDIA использует его для определения наличия модуля поддержки конкретного чипсета. Если планируется использовать драйвер AGP NVIDIA в Linux 2.6, рекомендуется, чтобы модули поддержки конкретного чипсета AGPGART были собраны как модули ядра и не загружались. Обратите внимание, что смена AGP драйвера требует перезагрузки перед началом действия сделанных изменений.
Если используется новое ядро Linux версии 2.6, в которое интегрирован драйвер Linux AGPGART (встречается в некоторых дистрибутивах), вы можете задать опцию ядра
agp=off
(через LILO или GRUB, например) для отключения поддержки AGPGART. Подобно Linux 2.6.11, большинство драйверов AGPGART должны поддерживать эту опцию.
Следующие чипсеты материнских плат поддерживаются AGP драйвером NVIDIA; для всех остальных рекомендуется использовать AGPGART.
- Intel 440LX
- Intel 440BX
- Intel 440GX
- Intel 815 (Solano)
- Intel 820 (Camino)
- Intel 830M
- Intel 840 (Carmel)
- Intel 845 (Brookdale)
- Intel 845G
- Intel 850 (Tehama)
- Intel 855 (Odem)
- Intel 860 (Colusa)
- Intel 865G (Springdale)
- Intel 875P (Canterwood)
- Intel E7205 (Granite Bay)
- Intel E7505 (Placer)
- AMD 751 (Irongate)
- AMD 761 (IGD4)
- AMD 762 (IGD4 MP)
- AMD 8151 (Lokar)
- VIA 8371
- VIA 82C694X
- VIA KT133
- VIA KT266
- VIA KT400
- VIA P4M266
- VIA P4M266A
- VIA P4X400
- VIA K8T800
- VIA K8N800
- VIA PT880
- VIA KT880
- RCC CNB20LE
- RCC 6585HE
- Micron SAMDDR (Samurai)
- Micron SCIDDR (Scimitar)
- NVIDIA nForce
- NVIDIA nForce2
- NVIDIA nForce3
- ALi 1621
- ALi 1631
- ALi 1647
- ALi 1651
- ALi 1671
- SiS 630
- SiS 633
- SiS 635
- SiS 645
- SiS 646
- SiS 648
- SiS 648FX
- SiS 650
- SiS 651
- SiS 655
- SiS 655FX
- SiS 661
- SiS 730
- SiS 733
- SiS 735
- SiS 745
- SiS 755
- ATI RS200M
Если вы столкнулись с трудностями, связанными со стабильностью AGP, обратите внимание на следующие особенности:
Дополнительная информация о AGP
Поддержка процессорами Athlon страниц расширенного размера
Некоторые версии ядра Linux имеют ошибку в работе с кешем, проявляющуюся при использовании функции расширенного спекулятивного кеширования процессоров семейства AMD Athlon (AMD Athlon XP, AMD Athlon 4, AMD Athlon MP, и Models 6, а также соответствующих AMD Duron). Эта ошибка обычно проявляется при тяжелой нагрузке 3D-графикой видеокарты с шиной AGP.
Дистрибутивы Linux, основанные на ядре версий 2.4.19 и более поздних, должны включать исправление этой ошибки, но более ранние версии требуют вмешательства пользователя для отключения небольшого использования расширенного спекулятивного кеширования (обычно выполняемой посредством патча ядра) и включением специальной опции загрузки системы для работы исправления.
Драйвер NVIDIA автоматически отключает использование расширенного спекулятивного кеширования для отмеченных проблемой процессоров AMD без необходимости патча ядра; он также может использоваться, если ядро уже содержит патч. Дополнительно, для старых версий ядра пользователь должен использовать опцию загрузки для отключения использования страниц размером 4 Мб. Это можно сделать из консоли загрузчика вводом:
mem=nopentium
или добавлением следующей строки в файл /etc/lilo.conf:
append = "mem=nopentium"
Скорость работы AGP порта
Вы можете попробовать снизить скорость работы AGP порта, если наблюдаются зависания при текущем значении. Для этого распакуйте файл .run:
# sh NVIDIA-Linux-x86-ХХX.XХ.run --extract-only
# cd NVIDIA-Linux-x86-ХХХ.XХ/kernel/
Затем отредактируйте nv-reg.h, внеся следующие изменения:
- NV_DEFINE_REG_ENTRY(__NV_REQ_AGP_RATE, 15);
+ NV_DEFINE_REG_ENTRY(__NV_REQ_AGP_RATE, 4); /* force AGP Rate to 4x
*/
или
+ NV_DEFINE_REG_ENTRY(__NV_REQ_AGP_RATE, 2); /* force AGP Rate to 2x
*/
или
+ NV_DEFINE_REG_ENTRY(__NV_REQ_AGP_RATE, 1); /* force AGP Rate to 1x
*/
После этого перекомпилируйте и загрузите новый модуль уровня ядра. Для этого запустите утилиту «nvidia-installer» с ключом запуска -n:
# cd ../../..
./nvidia-installer -n
Опция усиления сигнала AGP в BIOS материнских плат, основанных на Via
Многие материнские платы, основанные на чипсетах Via, позволяют управлять усилением сигнала по шине AGP в BIOS. Изменение этой опции имеет значительное влияние на стабильность работы системы, значения из диапазона от 0xEA до 0xEE лучше всего подходят для оборудования NVIDIA. Значения от полубайта до 0xF обычно приводят к проблемам.
Если вы решились экспериментировать с этой настройкой, вы должны осознавать, что делаете это на свой страх и риск, и что неправильное значение может ввести систему в незагружаемое состояние до изменения в рабочее значение (с использованием видеокарты для шины PCI или сбросом настроек BIOS в исходное состояние).
Версия BIOS материнской платы
Убедитесь, что используется последняя версия BIOS от производителя материнской платы.
На чипсетах ALi1541 и ALi1647, драйвер NVIDIA отключает поддержку AGP в качестве способа решения проблем с целостностью сигнала и параметрами временной синхронизации. Вы можете включить принудительное использование AGP в системах с этими чипсетами изменением опции NVreg_EnableALiAGP в 1. Учтите, что это может сделать работу компьютера нестабильной.
Ранние версии BIOS материнской платы ASUS A7V8X-X, основанной на чипсете KT400, неправильно конфигурируют чипсет при использовании видеокарты стандарта AGP 2.x; если Х-интерфейс аварийно завершается в системе, построенной на ASUS KT400 как с драйвером Linux AGPGART, так и с NvAGP, и установленная видеокарта не является AGP 8x устройством, убедитесь, что используется последняя версия BIOS материнской платы.