如何让SDL2指定使用AMD独立GPU或Intel集成GPU?
问题描述
我的系统同时配备AMD独立GPU和Intel集成GPU,通过drm_info可查看对应驱动信息:
$ drm_info | grep Driver: ├───Driver: amdgpu (AMD GPU) version 3.49.0 (20150101) ├───Driver: i915 (Intel Graphics) version 1.6.0 (20201103)
SDL2的视频驱动列表如下:
SDL2 video driver #0: x11 SDL2 video driver #1: wayland SDL2 video driver #2: KMSDRM SDL2 video driver #3: offscreen SDL2 video driver #4: dummy SDL2 video driver #5: evdev
我能通过代码或SDL_VIDEODRIVER环境变量切换Wayland和X11驱动,但无法控制SDL2选择AMD或Intel GPU。目前即使主4K显示器连接AMD设备,SDL2仍默认使用Intel GPU,无论在X11还是Wayland环境下。
视频设备初始化代码:
const int initerr2 = SDL_InitSubSystem( SDL_INIT_VIDEO ); if ( initerr2 ) LOGE( "Failed to initialize video subsystem of SDL2: %s", SDL_GetError() );
OpenGL上下文属性设置代码:
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 4); SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 5); SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE); if ( opt_msaa>0 ) { SDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS, 1); SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES, opt_msaa); } SDL_GL_SetAttribute(SDL_GL_FRAMEBUFFER_SRGB_CAPABLE, 1);
系统显卡信息(inxi -G输出):
$ inxi -G Graphics: Device-1: Intel AlderLake-S GT1 driver: i915 v: kernel Device-2: AMD Ellesmere [Radeon RX 470/480/570/570X/580/580X/590] driver: amdgpu v: kernel Device-3: Logitech BRIO Ultra HD Webcam type: USB driver: hid-generic,snd-usb-audio,usbhid,uvcvideo Display: wayland server: X.Org v: 1.22.1.8 with: Xwayland v: 22.1.8 compositor: gnome-shell v: 44.0 driver: X: loaded: amdgpu,modesetting unloaded: fbdev,radeon,vesa dri: iris gpu: amdgpu,i915 resolution: 1: 1280x768~60Hz 2: 3840x2160~60Hz API: OpenGL v: 4.6 Mesa 23.0.2 renderer: Mesa Intel UHD Graphics 770 (ADL-S GT1)
疑问:如何让SDL2在/dev/dri/card0和/dev/dri/card1设备中指定使用某一个?
解决方案
1. 环境变量指定(通用快速方法)
Mesa驱动通用变量
通过Mesa提供的环境变量强制指定GPU:
- 若AMD对应
card1,临时运行程序时指定:
或者提前设置环境变量:DRI_PRIME=1 ./your_sdl_appexport DRI_PRIME=1 ./your_sdl_app - 更精准的设备路径指定:
export MESA_VK_DEVICE_SELECT=amdgpu:/dev/dri/card1 ./your_sdl_app
KMSDRM驱动专属变量
如果使用KMSDRM驱动,直接指定DRM设备路径:
SDL_VIDEODRIVER=kmsdrm SDL_KMSDRM_DEVICE=/dev/dri/card1 ./your_sdl_app
2. 代码层面指定(KMSDRM驱动适用)
在初始化SDL视频子系统前,通过SDL_SetHint设置目标设备:
// 在SDL_InitSubSystem调用前执行 SDL_SetHint(SDL_HINT_KMSDRM_DEVICE, "/dev/dri/card1"); const int initerr2 = SDL_InitSubSystem( SDL_INIT_VIDEO ); // 后续初始化代码...
3. X11/Wayland环境补充方法
X11环境
先通过xrandr --listproviders确认AMD GPU对应的X显示编号(比如:1),再指定运行:
SDL_VIDEODRIVER=x11 SDL_VIDEO_X11_DISPLAY=:1 ./your_sdl_app
Wayland环境
Wayland下优先用DRI_PRIME或MESA_VK_DEVICE_SELECT强制指定GPU,部分场景可通过WAYLAND_DISPLAY对应GPU的套接字,但通用性较差。
4. 验证切换是否生效
在程序中添加代码输出OpenGL渲染器信息,确认是否使用目标GPU:
#include <GL/gl.h> // ... const char* renderer = glGetString(GL_RENDERER); printf("OpenGL Renderer: %s\n", renderer);
若输出包含AMD Radeon RX ...,则说明已成功切换到AMD GPU。
内容的提问来源于stack exchange,提问作者Bram
相关产品推荐
相关产品推荐

