Как включить OpenGL 3.3 с помощью Mesa 10.1 в Ubuntu

Я пытаюсь получить механизм рендеринга на основе OpenGL, основанный на OpenGL 3.3 и GLSL 3.3, для работы в Ubuntu 13.10 с использованием AMD Radeon 6950. Я хочу использовать драйверы с открытым исходным кодом (radeon), которые полагаются на Mesa для их реализации OpenGL. . Ubuntu 13.10 предоставляет только Mesa 9.2 (реализующий OpenGL 3.1) «из коробки». Однако можно установить Mesa 10.1 (реализующую OpenGL 3.3) из этого PPA как описано в этой теме:

StackOverflow: OpenGL и GLSL 3.3 на HD Graphics 4000 под Ubuntu 12.04

Я использовал точно такие же шаги, как описано там:

1.) Add the PPA Repository
  $ sudo add-apt-repository ppa:oibaf/graphics-drivers
2.) Update sources
  $ sudo apt-get update
3.) Dist-upgrade (rebuilds many packages)
  $ sudo apt-get dist-upgrade
4.) Then I rebooted.

Mesa 10.1 успешно установлена. Однако glxinfo, хотя сейчас он сообщает, что Mesa 10.1 используется, по-прежнему сообщает только об OpenGL 3.0 (совместимый профиль) и OpenGL 3.1 (основной профиль):

$ glxinfo | grep OpenGL
OpenGL vendor string: X.Org
OpenGL renderer string: Gallium 0.4 on AMD CAYMAN
OpenGL core profile version string: 3.1 (Core Profile) Mesa 10.1.0-devel (git-7f57408 saucy-oibaf-ppa+curaga)
OpenGL core profile shading language version string: 1.40
OpenGL core profile context flags: (none)
OpenGL core profile extensions:
OpenGL version string: 3.0 Mesa 10.1.0-devel (git-7f57408 saucy-oibaf-ppa+curaga)
OpenGL shading language version string: 1.30
OpenGL context flags: (none)
OpenGL extensions:

Почему это? Как включить OpenGL 3.3? Как видно из сравнения в потока StackOverflow, о котором я упоминал, можно glxinfo сообщить об OpenGL 3.3. Мне известно, что glxinfo может сообщать неверные номера версий в соответствии с примечаниями к выпуску Mesa 10.1. , однако из-за этого механизм рендеринга, который я пытаюсь запустить, дает сбой.

Я использую следующий код для создания окна:

glfwOpenWindowHint(GLFW_OPENGL_VERSION_MAJOR, 3);
glfwOpenWindowHint(GLFW_OPENGL_VERSION_MINOR, 3);
glfwOpenWindowHint(GLFW_OPENGL_PROFILE, 0);

if(GL_TRUE != glfwOpenWindow(
    _windowDimensions.x, _windowDimensions.y,
    0, 0, 0, 0, 32, 0, GLFW_WINDOW))
{
    THROW("GLFW error: failed to create window.");
}

Когда я пытаюсь запустить механизм рендеринга с использованием этой настройки, возникает указанное выше исключение, поскольку OpenGL 3.3 не поддерживается. Я могу установить GLFW_OPENGL_VERSION_MINOR в 0, и тогда окно откроется нормально, но позже будет выдано исключение, так как требуются шейдеры GLSL 3.3.

Также обратите внимание, что механизм рендеринга работает нормально, когда я использую проприетарные драйверы fglrx (а затем glxinfo сообщает об OpenGL версии 4.2), поэтому проблема действительно не в самом приложении, а в поддерживаемом OpenGL.

Так что я делаю неправильно? Почему Mesa 10.1 не поддерживает OpenGL 3.3 для меня? Моя видеокарта, безусловно, поддерживает это.

Вот некоторая дополнительная информация, которая может оказаться полезной.

$ apt-cache policy libgl1-mesa-glx
libgl1-mesa-glx:
  Installed: 10.1~git1402041945.7f5740+curaga~gd~s
  Candidate: 10.1~git1402041945.7f5740+curaga~gd~s
  Version table:
 *** 10.1~git1402041945.7f5740+curaga~gd~s 0
        500 http://ppa.launchpad.net/oibaf/graphics-drivers/ubuntu/ saucy/main amd64 Packages
        100 /var/lib/dpkg/status
     9.2.1-1ubuntu3 0
        500 http://archive.ubuntu.com/ubuntu/ saucy/main amd64 Packages


$ lspci -vv
...snip...
01:00.0 VGA compatible controller: Advanced Micro Devices, Inc. [AMD/ATI] Cayman PRO [Radeon HD 6950] (prog-if 00 [VGA controller])
    Subsystem: Hightech Information System Ltd. Device 2307
    Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx+
    Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
    Latency: 0, Cache Line Size: 64 bytes
    Interrupt: pin A routed to IRQ 53
    Region 0: Memory at c0000000 (64-bit, prefetchable) [size=256M]
    Region 2: Memory at fe620000 (64-bit, non-prefetchable) [size=128K]
    Region 4: I/O ports at e000 [size=256]
    Expansion ROM at fe600000 [disabled] [size=128K]
    Capabilities: <access denied>
    Kernel driver in use: radeon
...snip...


$ lsmod | egrep 'radeon|fglrx'
radeon               1402995  3
i2c_algo_bit           13413  1 radeon
ttm                    84169  1 radeon
drm_kms_helper         52710  1 radeon
drm                   297056  5 ttm,drm_kms_helper,radeon


$ modinfo radeon
filename:       /lib/modules/3.11.0-15-generic/kernel/drivers/gpu/drm/radeon/radeon.ko
license:        GPL and additional rights
description:    ATI Radeon
author:         Gareth Hughes, Keith Whitwell, others.
...snip...
firmware:       radeon/CAYMAN_smc.bin
firmware:       radeon/CAYMAN_rlc.bin
firmware:       radeon/CAYMAN_mc.bin
firmware:       radeon/CAYMAN_me.bin
firmware:       radeon/CAYMAN_pfp.bin
...snip...
srcversion:     D174B1E4686391B33437915
alias:          pci:v00001002d000099A4sv*sd*bc*sc*i*
alias:          pci:v00001002d000099A2sv*sd*bc*sc*i*
...snip...
depends:        drm,drm_kms_helper,ttm,i2c-algo-bit
intree:         Y
vermagic:       3.11.0-15-generic SMP mod_unload modversions 
parm:           no_wb:Disable AGP writeback for scratch registers (int)
parm:           modeset:Disable/Enable modesetting (int)
parm:           dynclks:Disable/Enable dynamic clocks (int)
parm:           r4xx_atom:Enable ATOMBIOS modesetting for R4xx (int)
parm:           vramlimit:Restrict VRAM for testing (int)
parm:           agpmode:AGP Mode (-1 == PCI) (int)
parm:           gartsize:Size of PCIE/IGP gart to setup in megabytes (32, 64, etc) (int)
parm:           benchmark:Run benchmark (int)
parm:           test:Run tests (int)
parm:           connector_table:Force connector table (int)
parm:           tv:TV enable (0 = disable) (int)
parm:           audio:Audio enable (1 = enable) (int)
parm:           disp_priority:Display Priority (0 = auto, 1 = normal, 2 = high) (int)
parm:           hw_i2c:hw i2c engine enable (0 = disable) (int)
parm:           pcie_gen2:PCIE Gen2 mode (-1 = auto, 0 = disable, 1 = enable) (int)
parm:           msi:MSI support (1 = enable, 0 = disable, -1 = auto) (int)
parm:           lockup_timeout:GPU lockup timeout in ms (defaul 10000 = 10 seconds, 0 = disable) (int)
parm:           fastfb:Direct FB access for IGP chips (0 = disable, 1 = enable) (int)
parm:           dpm:DPM support (1 = enable, 0 = disable, -1 = auto) (int)
parm:           aspm:ASPM support (1 = enable, 0 = disable, -1 = auto) (int)


$ dpkg -S /lib/modules/3.11.0-15-generic/kernel/drivers/gpu/drm/radeon/radeon.ko
linux-image-extra-3.11.0-15-generic: /lib/modules/3.11.0-15-generic/kernel/drivers/gpu/drm/radeon/radeon.ko


$ apt-cache policy linux-image-extra-3.11.0-15-generic
linux-image-extra-3.11.0-15-generic:
  Installed: 3.11.0-15.25
  Candidate: 3.11.0-15.25
  Version table:
 *** 3.11.0-15.25 0
        500 http://archive.ubuntu.com/ubuntu/ saucy-updates/main amd64 Packages
        500 http://archive.ubuntu.com/ubuntu/ saucy-security/main amd64 Packages
        100 /var/lib/dpkg/status

person Malte Skoruppa    schedule 04.02.2014    source источник
comment
Могу я спросить, какая часть GLSL 3.30 вам действительно нужна? Версия 3.30 не привнесла ничего существенного и ничего не удалила из GLSL 1.50 (что вы можете получить, если создадите профиль ядра 3.2 в Mesa). Вероятно, вам может сойти с рук #version 150, если вам не нужны явные квалификаторы макета расположения данных атрибута вершины/фрагмента. Это, а также изменение соглашения о версиях (с +.10 в каждом выпуске до GL Major.Minor0) были единственными серьезными изменениями.   -  person Andon M. Coleman    schedule 05.02.2014
comment
На самом деле это движок рендеринга друга, который написал его для Windows, и я пытаюсь заставить его работать с драйверами с открытым исходным кодом под Linux, поэтому я не могу точно рассказать вам о функциях. Я заменил требуемую версию GLSL в коде шейдера на #version 140 (я не могу получить 150, как я объяснил в своем комментарии к вашему ответу). Затем я получаю эту ошибку: Log: 0:3(44): error: shader input explicit location requires GL_ARB_explicit_attrib_location extension or GLSL 330. Ошибочная строка в коде шейдера — layout(location = 0) in vec3 vertexPosition;. Я думаю, это то, что вы имели в виду.   -  person Malte Skoruppa    schedule 06.02.2014
comment
Пробовали ли вы добавить #extension GL_ARB_explicit_attrib_location : require в начало шейдера после директивы вашей версии? Я думаю, что Mesa сможет реализовать это расширение, даже если аппаратное обеспечение не поддерживает остальную часть GLSL 1.50/3.30.   -  person Andon M. Coleman    schedule 06.02.2014
comment
Я только что попробовал ваше последнее предложение. Кажется, Меса действительно способна на это. Однако чуть позже выдается ошибка: Log: 0:58(1): error: interface blocks with an instance name are not allowed in GLSL 1.40 (GLSL 1.50 or GLSL ES 3.00 required). Оскорбительная строка — uniform Material {, и я думаю, что это еще одна функция, не поддерживаемая GLSL 1.40. Любое быстрое обходное решение здесь? ;) Спасибо еще раз.   -  person Malte Skoruppa    schedule 06.02.2014
comment
Это не может быть оскорбительной линией. Имя экземпляра блока на самом деле следует за закрывающей фигурной скобкой. В зависимости от шейдера вам может не понадобиться имя экземпляра. Если вы его не включаете, то к данным в юниформ-блоке можно обращаться без уточнения их с помощью InstanceName.Member, просто уменьшите его до Member. Возможно, вам придется использовать более описательные имена членов, чтобы предотвратить коллизии. Однако это то, что, к сожалению, нельзя решить с помощью простого расширения. Расширение Uniform Buffer Objects никогда не обращалось к предоставлению имен экземпляров юниформ-блоков.   -  person Andon M. Coleman    schedule 06.02.2014
comment
Я сделал, как вы предложили. Теперь шейдеры компилируются нормально. Однако вернемся к коду C++, и мне выдается новое исключение, вызванное if(glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) THROW_GL("Couldn't initialize framebuffer");. Я думаю, OpenGL 3.1 в конце концов недостаточно. Но попробовать было весело :) И уже здорово, что с fglrx работает. Я могу немного подождать, пока Меса наверстает упущенное.   -  person Malte Skoruppa    schedule 06.02.2014


Ответы (2)


О чем они вам не говорят, но косвенно подразумевают ("Некоторые драйверы не поддерживают все функции, требуемые в OpenGL 3.3."), так это то, что в последнем официальном выпуске Mesa (10.0), GL 3.3 работает только на оборудовании Intel. Это одна из радостей тесного участия Intel в проекте Mesa. Если вам нужна надежная поддержка GL 3.3 в любой форме на оборудовании AMD, вам следует пока использовать fglrx (проприетарный драйвер AMD).


Разрабатываемый выпуск Mesa 10.1 может реализовать GL 3.3 на драйверах Radeon, но вам необходимо запросить профиль ядра 3.3. Вы не делаете этого в настоящее время.

Этот:

glfwOpenWindowHint(GLFW_OPENGL_PROFILE, 0);

На самом деле должно быть так:

glfwOpenWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);

Кроме того, не существует профиля совместимости с GL 3.0 или профиля ядра 3.1. Профили не были представлены в OpenGL до версии 3.2. В GL 3.1 есть концепция GL_ARB_compatibility, но это не то же самое, что профиль; glxinfo дает вводящую в заблуждение информацию.

person Andon M. Coleman    schedule 05.02.2014
comment
Понятно, спасибо. Я попытался установить GLFW_OPENGL_PROFILE в GLFW_OPENGL_CORE_PROFILE, но почему-то в этом случае я вообще не могу открыть окно, ни когда я запрашиваю OpenGL 3.3, ни 3.2, ни 3.1, ни даже 3.0. Когда я устанавливаю GLFW_OPENGL_PROFILE в 0, с Mesa 10.1 из PPA я могу, по крайней мере, открыть окно OpenGL 3.1. Но это также дает мне только GLSL 1.40 (вместо 1.30), чего все еще недостаточно. Думаю, мне остается только ждать :) - person Malte Skoruppa; 06.02.2014

Я ответил на упоминание OP ветки о «OpenGL и GLSL 3.3 на HD Graphics 4000 под Ubuntu 12.04», но я подумал, что дам тот же ответ и здесь, учитывая, что информация кажется такой скудной. Это работает для тех, кто использует freeglut и glew:

поэтому я видел много тем, связанных с этим, и я подумал, что здесь будет хорошее место, чтобы ответить. Я использую Ubuntu 15.04 с Intel Ivybridge. После использования приложения «Intel Graphics installer for linux» glxinfo предоставляет следующую информацию об openGl:

OpenGL core profile version string: 3.3 (Core Profile) Mesa 10.6.0
OpenGL core profile shading language version string: 3.30
OpenGL version string: 3.0 Mesa 10.6.0
OpenGL shading language version string: 1.30

Теперь из этого вы можете видеть, что основной профиль и версия glsl — 3.3, но совместимый openGl — только 3.0, поэтому, если вы хотите, чтобы ваш код работал с 3.3, вам необходимо указать как профиль ядра opengl, так и профиль ядра glsl< /сильный>. Следующие шаги должны работать, если вы используете freeglut и glew:

-glsl #version должен указывать, что вам нужен основной профиль:

#version 330 core

-укажите, что вы хотите opengl 3.3:

glutInitContextVersion (3, 3);

- и, наконец, установите для glewExperimental значение true перед glewInit():

glewExperimental = GL_TRUE;

надеюсь, это поможет некоторым людям начать :)

person lecker909    schedule 02.10.2015