SDL Driver
SDL (Simple DirectMedia Layer) provides a cross-platform way to handle graphics, input, and multimedia, making it an excellent choice for running LVGL applications on a PC.
Overview
SDL (Simple DirectMedia Layer) provides a cross-platform way to handle graphics, input, and multimedia, making it an excellent choice for running LVGL applications on a PC.
The Eclipse, VSCode, and Generic Linux projects of LVGL use SDL to open a window and manage input devices.
As SDL is fully cross-platform, it is easy to integrate into any environment.
Prerequisites
Install SDL according to your platform:
- Linux:
sudo apt install libsdl2-dev - macOS:
brew install sdl2 - Windows: Recommended: vcpkg install sdl2
Alternatively, you can download prebuilt SDL2 binaries from theSDL website and follow their installation instructions.
Configuration
- Required linked libraries:
-lSDL2 - Enable SDL driver support in
lv_conf.h, via CMake compiler definitions, or by using KConfig.
#define LV_USE_SDL 1Feel free to adjust the other options as needed, but the default values are usually sufficient.
Usage
#define SDL_MAIN_HANDLED /* To fix SDL's "undefined reference to WinMain" issue */
#include "lvgl/lvgl.h"
static lv_display_t *display;
static lv_indev_t *mouse;
static lv_indev_t *mouse_wheel;
static lv_indev_t *keyboard;
int main()
{
/* Initialize LVGL */
lv_init();
display = lv_sdl_window_create(SDL_HOR_RES, SDL_VER_RES);
mouse = lv_sdl_mouse_create();
mouse_wheel = lv_sdl_mousewheel_create();
keyboard = lv_sdl_keyboard_create();
/* Create widgets on the screen */
lv_demo_widgets();
while (1) {
lv_timer_handler();
lv_delay_ms(5);
}
return 0;
}When building for 32-bit architecture, add the following workaround at the beginning of main:
// Workaround for SDL2 `-m32` crash
// https://bugs.launchpad.net/ubuntu/+source/libsdl2/+bug/1775067/comments/7
#ifndef WIN32
setenv("DBUS_FATAL_WARNINGS", "0", 1);
#endifRendering Backends
The SDL driver supports multiple rendering backends that determine how LVGL renders content to the screen. Each backend offers different performance characteristics and use cases.
Standard Software Rendering (Default)
By default, the SDL driver uses pure software rendering with no additional configuration required.
Configuration:
No additional configuration needed - this is the default when only LV_USE_SDL 1 is enabled.
SDL Draw Unit
The SDL Draw Unit uses software rendering to create SDL textures which are then cached and blended together by the GPU, providing a hybrid approach that combines software rendering flexibility with hardware-accelerated texture composition.
Configuration:
#define LV_USE_SDL 1
#define LV_USE_DRAW_SDL 1For complete details, see SDL Draw Unit.
OpenGL-Based Rendering
The SDL driver can leverage OpenGL for hardware-accelerated rendering. LVGL provides two OpenGL-based rendering options:
#define LV_USE_SDL 1
#define LV_USE_OPENGLES 1
/* For NanoVG Draw Unit*/
#define LV_USE_DRAW_NANOVG 1
#define LV_USE_NANOVG 1
/* For OpenGL Draw Unit */
#define LV_USE_DRAW_OPENGLES 1See the Complete OpenGL overview for more information.
Driver Support
OpenGL-based rendering is only supported on Linux when using x11 as the SDL video driver.
When the EGL/OpenGL path is enabled, LVGL currently forces SDL to use the x11
video driver, overriding SDL_VIDEODRIVER. As a result, selecting drivers such as
wayland or kmsdrm via SDL_VIDEODRIVER will not take effect in this mode.
To use those SDL backends, do not enable the OpenGL/EGL rendering path; use the regular SDL renderer instead.
See Also
- SDL Draw Unit - SDL texture-based rendering
- OpenGL Overview - Complete OpenGL integration overview
- NanoVG Draw Unit - NanoVG vector graphics rendering
- OpenGL ES Draw Unit - OpenGL ES for embedded systems
How is this guide?
Last updated on