Я пытаюсь получить механизм рендеринга на основе 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
#version 150
, если вам не нужны явные квалификаторы макета расположения данных атрибута вершины/фрагмента. Это, а также изменение соглашения о версиях (с +.10 в каждом выпуске до GL Major.Minor0) были единственными серьезными изменениями. - person Andon M. Coleman   schedule 05.02.2014#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#extension GL_ARB_explicit_attrib_location : require
в начало шейдера после директивы вашей версии? Я думаю, что Mesa сможет реализовать это расширение, даже если аппаратное обеспечение не поддерживает остальную часть GLSL 1.50/3.30. - person Andon M. Coleman   schedule 06.02.2014Log: 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.2014InstanceName.Member
, просто уменьшите его доMember
. Возможно, вам придется использовать более описательные имена членов, чтобы предотвратить коллизии. Однако это то, что, к сожалению, нельзя решить с помощью простого расширения. Расширение Uniform Buffer Objects никогда не обращалось к предоставлению имен экземпляров юниформ-блоков. - person Andon M. Coleman   schedule 06.02.2014if(glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) THROW_GL("Couldn't initialize framebuffer");
. Я думаю, OpenGL 3.1 в конце концов недостаточно. Но попробовать было весело :) И уже здорово, что сfglrx
работает. Я могу немного подождать, пока Меса наверстает упущенное. - person Malte Skoruppa   schedule 06.02.2014