You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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_app
    
    或者提前设置环境变量:
    export 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 14:13:14