linux - Offload dri to a render node in xorg
2014-07
There is new feature in mesa DRI_PRIME
emerged to keep up with modern hybrid graphics on laptops. I'd like to use it for desktop too. Powersaving is always good.
So I make xorg to use only intel driver disabling AutoAddGPU
option. Then, when I need to run gpu consuming application I may wake up my radeon cards. DRI render nodes emerges after modprobing radeon module:
# ls /dev/dri/
card0 card1 card2
controlD64 controlD65 controlD66
renderD128 renderD129 renderD130
How can I make xorg use this nodes for offloading rendering?
I tried xrandr --listproviders
but got only single provider corresponded to embedded intel card. May render nodes be used as providers?
I'be got two Nvidia cards, but Xorg activates only one of them. The following config is based on the nvidia configurator output:
Section "ServerLayout"
Identifier "Layout0"
Screen 0 "Screen0" 0 0
Screen 1 "Screen1" LeftOf "Screen0"
InputDevice "Keyboard0" "CoreKeyboard"
InputDevice "Mouse0" "CorePointer"
Option "Xinerama" "0"
EndSection
Section "Module"
Load "dbe"
Load "extmod"
Load "type1"
Load "freetype"
Load "glx"
EndSection
Section "InputDevice"
Identifier "Mouse0"
Driver "mouse"
Option "Protocol" "auto"
Option "Device" "/dev/psaux"
Option "Emulate3Buttons" "no"
Option "ZAxisMapping" "4 5"
EndSection
Section "InputDevice"
Identifier "Keyboard0"
Driver "keyboard"
EndSection
Section "Monitor"
Identifier "Monitor0"
VendorName "Unknown"
ModelName "HP LE2201w"
HorizSync 24.0 - 83.0
VertRefresh 50.0 - 76.0
Option "DPMS"
EndSection
Section "Monitor"
Identifier "Monitor1"
VendorName "Unknown"
ModelName "Acer AL2017"
HorizSync 30.0 - 82.0
VertRefresh 56.0 - 76.0
Option "DPMS"
EndSection
Section "Device"
Identifier "Card0"
Driver "nvidia"
VendorName "nVidia Corporation"
BoardName "GeForce 6100 nForce 405"
BusID "PCI:0:13:0"
EndSection
Section "Device"
Identifier "Card1"
Driver "nvidia"
VendorName "nVidia Corporation"
BoardName "GeForce 8400 GS"
BusID "PCI:2:0:0"
EndSection
Section "Screen"
Identifier "Screen0"
Device "Device0"
Monitor "Monitor0"
DefaultDepth 24
Option "TwinView" "0"
Option "metamodes" "nvidia-auto-select +0+0"
SubSection "Display"
Depth 24
EndSubSection
EndSection
Section "Screen"
Identifier "Screen1"
Device "Device1"
Monitor "Monitor1"
DefaultDepth 24
Option "TwinView" "0"
Option "metamodes" "nvidia-auto-select +0+0"
SubSection "Display"
Depth 24
EndSubSection
EndSection
What I see in the log file is:
(==) Log file: "/var/log/Xorg.0.log", Time: Fri Mar 19 11:08:08 2010
(==) Using config file: "/etc/X11/xorg.conf"
(==) ServerLayout "Layout0"
(**) |-->Screen "Screen0" (0)
(**) | |-->Monitor "Monitor0"
(==) No device specified for screen "Screen0".
Using the first device section listed.
(**) | |-->Device "Card0"
(**) |-->Screen "Screen1" (1)
(**) | |-->Monitor "Monitor1"
(==) No device specified for screen "Screen1".
Using the first device section listed.
(**) | |-->Device "Card0"
(**) |-->Input Device "Keyboard0"
(**) |-->Input Device "Mouse0"
(**) Option "Xinerama" "0"
(==) Automatically adding devices
(==) Automatically enabling devices
even though later on both cards are detected:
(--) PCI:*(0:0:13:0) 10de:03d1:1019:2601 nVidia Corporation C61 [GeForce 6100 nForce 405] rev 162, Mem @ 0xfb000000/16777216, 0xd0000000/268435456, 0xfc000000/16777216, BIOS @ 0x????????/131072
(--) PCI: (0:2:0:0) 10de:0422:0000:0000 nVidia Corporation G86 [GeForce 8400 GS] rev 161, Mem @ 0xf8000000/16777216, 0xe0000000/268435456, 0xf6000000/33554432, I/O @ 0x0000bc00/128, BIOS @ 0x????????/131072
[ --- some more logs --- ]
(II) Mar 19 11:08:10 NVIDIA(0): NVIDIA GPU GeForce 6100 nForce 405 (C61) at PCI:0:13:0
(II) Mar 19 11:08:10 NVIDIA(0): (GPU-0)
[ --- some more logs --- ]
(II) Mar 19 11:08:12 NVIDIA(GPU-1): NVIDIA GPU GeForce 8400 GS (G86) at PCI:2:0:0 (GPU-1)
Unfortunately later on only one card is initialised and one screen is active. Xrandr shows only one screen too.
Any ideas on how to fix it?
Your Screen sections are not matching the Device sections you've defined. In the first Screen section (Screen0), the Device option points to "Device0" -- when in the first Device section, you set the Identifier option to "Card0". The Screen sections need to use the correct identifier.
What you want to have here is:
Section "Device"
Identifier "Card0"
^^^^^^^^^^^^^^^^^^^ this line names this device "Card0"
[...]
EndSection
Section "Screen"
Identifier "Screen0"
Device "Card0"
^^^^^^^^^^^^^^^^^^^^^^ this line needs to match a device's Identifier
[...]
EndSection