Как включить 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) из этот ППА как объяснено в этом нить:

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 (профиль compat) и 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 to 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

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_ARB_compatibility в GL 3.1, но это не то же самое, что профиль; glxinfo дает вводящую в заблуждение информацию.


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

Итак, я видел много нитей, окружающих это, и я подумал, что здесь будет хорошее место для ответа. Im работает 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 you необходимо указать как профиль ядра opengl, так и профиль ядра glsl. Следующие шаги должны работать, если вы используете freeglut и glew:

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

#version 330 core

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

glutInitContextVersion (3, 3);

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

glewExperimental = GL_TRUE;

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