From 4802823b945411055a07a209b5097e92a3dc1a39 Mon Sep 17 00:00:00 2001 From: Jools Wills Date: Thu, 19 Jan 2017 19:36:40 +0000 Subject: [PATCH 1/8] silence log output for unknown input --- src/core/linux/SDL_evdev.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/core/linux/SDL_evdev.c b/src/core/linux/SDL_evdev.c index 8f3c8bc4c..1c0006235 100644 --- a/src/core/linux/SDL_evdev.c +++ b/src/core/linux/SDL_evdev.c @@ -396,11 +396,13 @@ SDL_EVDEV_translate_keycode(int keycode) if (keycode < SDL_arraysize(linux_scancode_table)) scancode = linux_scancode_table[keycode]; + /* if (scancode == SDL_SCANCODE_UNKNOWN) { SDL_Log("The key you just pressed is not recognized by SDL. To help " "get this fixed, please report this to the SDL forums/mailing list " " EVDEV KeyCode %d", keycode); } + */ return scancode; } From c3cf83676efbe117d3d82c60a1f3c345c7c2f968 Mon Sep 17 00:00:00 2001 From: Stefan Date: Wed, 6 Jul 2016 21:53:43 +0200 Subject: [PATCH 2/8] rpi video - Use dispmanx scaling (#1) * Use dispmanx scaling * There is the new SDL hint SDL_VIDEO_RPI_SCALE_MODE. There are three values. * The variable can be set to the following values: * "0" - Window resolution is desktop resolution. * This is the behaviour of SDL <= 2.0.4. (default) * "1" - Requested video resolution will be scaled to desktop resolution. * Aspect ratio of requested video resolution will be respected. * "2" - Requested video resolution will be scaled to desktop resolution * "3" - Integer scaling. dst_rect is an integral multiple of src_rect. Should prevent scaling artifacts. * Add aspect ratio hint --- include/SDL_hints.h | 27 +++++++++ src/video/raspberry/SDL_rpivideo.c | 89 ++++++++++++++++++++++++++---- 2 files changed, 106 insertions(+), 10 deletions(-) diff --git a/include/SDL_hints.h b/include/SDL_hints.h index 007a4bee0..5b4dd42ab 100644 --- a/include/SDL_hints.h +++ b/include/SDL_hints.h @@ -745,6 +745,33 @@ extern "C" { */ #define SDL_HINT_NO_SIGNAL_HANDLERS "SDL_NO_SIGNAL_HANDLERS" +/** + * \brief Tell dispmanx to stretch the SDL window to fill the display. + * + * This hint only applies to the rpi video driver. + * + * The variable can be set to the following values: + * "0" - Window resolution is desktop resolution. + * This is the behaviour of SDL <= 2.0.4. (default) + * "1" - Requested video resolution will be scaled to desktop resolution. + * Aspect ratio of requested video resolution will be respected. + * "2" - Requested video resolution will be scaled to desktop resolution. + * "3" - Requested video resolution will be scaled to desktop resolution. + * Aspect ratio of requested video resolution will be respected. + * If possible output resolution will be integral multiple of video + * resolution. + */ +#define SDL_HINT_VIDEO_RPI_SCALE_MODE "SDL_VIDEO_RPI_SCALE_MODE" + +/** + * \brief Tell dispmanx to set a specific aspect ratio. + * + * This hint only applies to the rpi video driver. + * + * Must be set together with SDL_HINT_VIDEO_RPI_SCALE_MODE=1. + */ +#define SDL_HINT_VIDEO_RPI_RATIO "SDL_VIDEO_RPI_RATIO" + /** * \brief Tell SDL not to generate window-close events for Alt+F4 on Windows. * diff --git a/src/video/raspberry/SDL_rpivideo.c b/src/video/raspberry/SDL_rpivideo.c index 1e1f569f4..6bd8b055d 100644 --- a/src/video/raspberry/SDL_rpivideo.c +++ b/src/video/raspberry/SDL_rpivideo.c @@ -31,6 +31,7 @@ */ /* SDL internals */ +#include "SDL_hints.h" #include "../SDL_sysvideo.h" #include "SDL_version.h" #include "SDL_syswm.h" @@ -217,6 +218,9 @@ RPI_SetDisplayMode(_THIS, SDL_VideoDisplay * display, SDL_DisplayMode * mode) int RPI_CreateWindow(_THIS, SDL_Window * window) { + const char *hintScale = SDL_GetHint(SDL_HINT_VIDEO_RPI_SCALE_MODE); + const char *hintRatio = SDL_GetHint(SDL_HINT_VIDEO_RPI_RATIO); + char scalemode = '0'; SDL_WindowData *wdata; SDL_VideoDisplay *display; SDL_DisplayData *displaydata; @@ -226,6 +230,10 @@ RPI_CreateWindow(_THIS, SDL_Window * window) DISPMANX_UPDATE_HANDLE_T dispman_update; uint32_t layer = SDL_RPI_VIDEOLAYER; const char *env; + float srcAspect = 1; + float dstAspect = 1; + int factor_x = 0; + int factor_y = 0; /* Disable alpha, otherwise the app looks composed with whatever dispman is showing (X11, console,etc) */ dispman_alpha.flags = DISPMANX_FLAGS_ALPHA_FIXED_ALL_PIXELS; @@ -240,24 +248,85 @@ RPI_CreateWindow(_THIS, SDL_Window * window) display = SDL_GetDisplayForWindow(window); displaydata = (SDL_DisplayData *) display->driverdata; - /* Windows have one size for now */ - window->w = display->desktop_mode.w; - window->h = display->desktop_mode.h; - - /* OpenGL ES is the law here, buddy */ - window->flags |= SDL_WINDOW_OPENGL; + if (hintScale != NULL) + scalemode = *hintScale; /* Create a dispman element and associate a window to it */ - dst_rect.x = 0; - dst_rect.y = 0; - dst_rect.width = window->w; - dst_rect.height = window->h; + switch(scalemode) { + case '3': + /* Pixel perfect scaling mode. */ + factor_x = (display->desktop_mode.w / window->w); + factor_y = (display->desktop_mode.h / window->h); + if ((factor_x != 0) && (factor_y != 0)) { + if (factor_x >= factor_y) { + dst_rect.width = window->w * factor_y; + dst_rect.height = window->h * factor_y; + } + else { + dst_rect.width = window->w * factor_x; + dst_rect.height = window->h * factor_x; + } + /* Center window. */ + dst_rect.x = (display->desktop_mode.w - dst_rect.width) / 2; + dst_rect.y = (display->desktop_mode.h - dst_rect.height) / 2; + break; + } + /* If integer scale is not possible fallback to mode 1. */ + case '1': + /* Fullscreen mode. */ + /* Calculate source and destination aspect ratios. */ + if (hintRatio != NULL) + srcAspect = strtof(hintRatio, NULL); + else + srcAspect = (float)window->w / (float)window->h; + /* only allow sensible aspect ratios */ + if (srcAspect < 0.2f || srcAspect > 6.0f) + srcAspect = (float)window->w / (float)window->h; + dstAspect = (float)display->desktop_mode.w / (float)display->desktop_mode.h; + /* If source and destination aspect ratios are not equal correct destination width. */ + if (srcAspect < dstAspect) { + dst_rect.width = (unsigned)(display->desktop_mode.h * srcAspect); + dst_rect.height = display->desktop_mode.h; + } + else if (srcAspect > dstAspect) { + dst_rect.width = display->desktop_mode.w; + dst_rect.height = (unsigned)((float)display->desktop_mode.w / srcAspect); + } + else { + dst_rect.width = display->desktop_mode.w; + dst_rect.height = display->desktop_mode.h; + } + /* Center window. */ + dst_rect.x = (display->desktop_mode.w - dst_rect.width) / 2; + dst_rect.y = (display->desktop_mode.h - dst_rect.height) / 2; + break; + case '2': + /* Fullscreen streched mode. */ + dst_rect.x = 0; + dst_rect.y = 0; + dst_rect.width = display->desktop_mode.w; + dst_rect.height = display->desktop_mode.h; + break; + default: + /* Default mode. */ + window->w = display->desktop_mode.w; + window->h = display->desktop_mode.h; + + dst_rect.x = 0; + dst_rect.y = 0; + dst_rect.width = window->w; + dst_rect.height = window->h; + break; + } src_rect.x = 0; src_rect.y = 0; src_rect.width = window->w << 16; src_rect.height = window->h << 16; + /* OpenGL ES is the law here, buddy */ + window->flags |= SDL_WINDOW_OPENGL; + env = SDL_GetHint(SDL_HINT_RPI_VIDEO_LAYER); if (env) { layer = SDL_atoi(env); From bc967afcca96fd03c64a744969cd607137fc52c9 Mon Sep 17 00:00:00 2001 From: Jools Wills Date: Sat, 9 Apr 2016 22:07:12 +0100 Subject: [PATCH 3/8] Revert "Linux joystick: Look at entire axis namespace for controls (thanks, "spaz16"!)." This reverts commit 4cb7923f251543c1175c1702f8cf8b4201ce9054. see https://github.com/RetroPie/RetroPie-Setup/issues/1297 --- src/joystick/linux/SDL_sysjoystick.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/joystick/linux/SDL_sysjoystick.c b/src/joystick/linux/SDL_sysjoystick.c index 1f19d1d39..a652cf859 100644 --- a/src/joystick/linux/SDL_sysjoystick.c +++ b/src/joystick/linux/SDL_sysjoystick.c @@ -568,7 +568,7 @@ ConfigJoystick(SDL_Joystick * joystick, int fd) ++joystick->nbuttons; } } - for (i = 0; i < ABS_MAX; ++i) { + for (i = 0; i < ABS_MISC; ++i) { /* Skip hats */ if (i == ABS_HAT0X) { i = ABS_HAT3Y; @@ -826,6 +826,10 @@ HandleInputEvents(SDL_Joystick * joystick) events[i].value); break; case EV_ABS: + if (code >= ABS_MISC) { + break; + } + switch (code) { case ABS_HAT0X: case ABS_HAT0Y: From b3cc167b0fe4faf20478f60f5da561d5d2caac6d Mon Sep 17 00:00:00 2001 From: Jools Wills Date: Sat, 12 Sep 2015 19:44:33 +0100 Subject: [PATCH 4/8] debian package changes - * update debian control/rules for retropie * split configure options onto multiple lines * disable tslib as it doesn't exist in Debian Jessie but does exist in Raspbian Jessie and we want to use the same binaries on both * correct configure option to enable opengles * added libx11-dev dependency for libsdl2-dev --- debian/control | 17 ++++++++--------- .../{libsdl2.install => libsdl2-2.0-0.install} | 0 debian/rules | 5 ++++- 3 files changed, 12 insertions(+), 10 deletions(-) rename debian/{libsdl2.install => libsdl2-2.0-0.install} (100%) diff --git a/debian/control b/debian/control index a3411335a..450aa2925 100644 --- a/debian/control +++ b/debian/control @@ -13,8 +13,6 @@ Build-Depends: debhelper (>= 9), dpkg-dev (>= 1.16.1~), fcitx-libs-dev [linux-any], libasound2-dev [linux-any], - libgl1-mesa-dev, - libpulse-dev, libudev-dev [linux-any], libdbus-1-dev [linux-any], libibus-1.0-dev[linux-any], @@ -30,16 +28,16 @@ Build-Depends: debhelper (>= 9), libxxf86vm-dev Homepage: http://www.libsdl.org/ -Package: libsdl2 +Package: libsdl2-2.0-0 Architecture: any Multi-Arch: same Pre-Depends: ${misc:Pre-Depends} Depends: ${misc:Depends}, ${shlibs:Depends}, - libudev0 [linux-any], + libudev0 | libudev1 [linux-any], libdbus-1-3 [linux-any] -Conflicts: libsdl-1.3-0 -Replaces: libsdl-1.3-0 +Conflicts: libsdl-1.3-0, libsdl2 +Replaces: libsdl-1.3-0, libsdl2 Description: Simple DirectMedia Layer SDL is a library that allows programs portable low level access to a video framebuffer, audio output, mouse, and keyboard. @@ -51,9 +49,10 @@ Section: libdevel Architecture: any Multi-Arch: same Depends: ${misc:Depends}, - libsdl2 (= ${binary:Version}), + libsdl2-2.0-0 (= ${binary:Version}), libc6-dev, - libgl1-mesa-dev + libgl1-mesa-dev, + libx11-dev Conflicts: libsdl-1.3-dev Replaces: libsdl-1.3-dev Description: Simple DirectMedia Layer development files @@ -68,7 +67,7 @@ Section: debug Architecture: any Multi-Arch: same Depends: ${misc:Depends}, - libsdl2 (= ${binary:Version}), + libsdl2-2.0-0 (= ${binary:Version}), Description: Simple DirectMedia Layer debug files SDL is a library that allows programs portable low level access to a video framebuffer, audio output, mouse, and keyboard. diff --git a/debian/libsdl2.install b/debian/libsdl2-2.0-0.install similarity index 100% rename from debian/libsdl2.install rename to debian/libsdl2-2.0-0.install diff --git a/debian/rules b/debian/rules index 4bde8f325..e3a2e88bb 100755 --- a/debian/rules +++ b/debian/rules @@ -6,7 +6,10 @@ DEB_HOST_MULTIARCH ?= $(shell dpkg-architecture -qDEB_HOST_MULTIARCH) confflags = --disable-rpath --disable-video-directfb \ --disable-nas --disable-esd --disable-arts \ --disable-alsa-shared --disable-pulseaudio-shared \ - --disable-x11-shared + --disable-x11-shared --disable-video-opengl --enable-video-opengles \ + --disable-esd --disable-pulseaudio \ + --disable-input-tslib \ + --host=armv6l-raspberry-linux-gnueabihf %: dh $@ --parallel From 96d9d62b1fb22355075b6f39d1043cba935f474d Mon Sep 17 00:00:00 2001 From: Stefan Date: Sun, 1 Oct 2017 20:03:34 +0200 Subject: [PATCH 5/8] Use new --enable-video-rpi option --host=arm-raspberry-linux-gnueabihf is deprecated. https://github.com/spurious/SDL-mirror/commit/56af866ead35a74c7626c8599422dab460bf8cda --- debian/rules | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/debian/rules b/debian/rules index e3a2e88bb..f134b0543 100755 --- a/debian/rules +++ b/debian/rules @@ -9,7 +9,7 @@ confflags = --disable-rpath --disable-video-directfb \ --disable-x11-shared --disable-video-opengl --enable-video-opengles \ --disable-esd --disable-pulseaudio \ --disable-input-tslib \ - --host=armv6l-raspberry-linux-gnueabihf + --enable-video-rpi %: dh $@ --parallel From c2399ba262748f14654404d34cf4eadb8d3df5c0 Mon Sep 17 00:00:00 2001 From: Conn O'Griofa Date: Thu, 5 Oct 2017 20:19:55 +0100 Subject: [PATCH 6/8] Raspberry Pi: fix ES 1/PVR support & autodetect Mesa driver * The brcmGLESv2 vendor library also supports ES PVR/1 profiles * Fallback to standard Mesa libraries if the VC4 driver is loaded --- src/video/SDL_egl.c | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/video/SDL_egl.c b/src/video/SDL_egl.c index 9ccc2c3e1..9e10c2bc5 100644 --- a/src/video/SDL_egl.c +++ b/src/video/SDL_egl.c @@ -44,12 +44,12 @@ #if SDL_VIDEO_DRIVER_RPI /* Raspbian places the OpenGL ES/EGL binaries in a non standard path */ -#define DEFAULT_EGL "/opt/vc/lib/libbrcmEGL.so" -#define DEFAULT_OGL_ES2 "/opt/vc/lib/libbrcmGLESv2.so" -#define ALT_EGL "/opt/vc/lib/libEGL.so" -#define ALT_OGL_ES2 "/opt/vc/lib/libGLESv2.so" -#define DEFAULT_OGL_ES_PVR "/opt/vc/lib/libGLES_CM.so" -#define DEFAULT_OGL_ES "/opt/vc/lib/libGLESv1_CM.so" +#define DEFAULT_EGL ( vc4 ? "libEGL.so" : "/opt/vc/lib/libbrcmEGL.so" ) +#define DEFAULT_OGL_ES2 ( vc4 ? "libGLESv2.so.2" : "/opt/vc/lib/libbrcmGLESv2.so" ) +#define ALT_EGL ( vc4 ? "libEGL.so" : "/opt/vc/lib/libEGL.so" ) +#define ALT_OGL_ES2 ( vc4 ? "libGLESv2.so.2" : "/opt/vc/lib/libGLESv2.so" ) +#define DEFAULT_OGL_ES_PVR ( vc4 ? "libGLES_CM.so.1" : "/opt/vc/lib/libbrcmGLESv2.so" ) +#define DEFAULT_OGL_ES ( vc4 ? "libGLESv1_CM.so.1" : "/opt/vc/lib/libbrcmGLESv2.so" ) #elif SDL_VIDEO_DRIVER_ANDROID || SDL_VIDEO_DRIVER_VIVANTE /* Android */ @@ -256,6 +256,9 @@ SDL_EGL_LoadLibrary(_THIS, const char *egl_path, NativeDisplayType native_displa #if SDL_VIDEO_DRIVER_WINDOWS || SDL_VIDEO_DRIVER_WINRT const char *d3dcompiler; #endif +#if SDL_VIDEO_DRIVER_RPI + SDL_bool vc4 = (0 == access("/sys/module/vc4/", F_OK)); +#endif if (_this->egl_data) { return SDL_SetError("OpenGL ES context already created"); From e3cd9b2aa827a40ff237e9a27c6a585170219184 Mon Sep 17 00:00:00 2001 From: Conn O'Griofa Date: Thu, 5 Oct 2017 20:22:24 +0100 Subject: [PATCH 7/8] debian/rules: enable KMS DRM driver by default The vendor/Mesa driver can now be autodetected during runtime. --- debian/rules | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/debian/rules b/debian/rules index f134b0543..389740d30 100755 --- a/debian/rules +++ b/debian/rules @@ -9,7 +9,7 @@ confflags = --disable-rpath --disable-video-directfb \ --disable-x11-shared --disable-video-opengl --enable-video-opengles \ --disable-esd --disable-pulseaudio \ --disable-input-tslib \ - --enable-video-rpi + --enable-video-rpi --enable-video-kmsdrm %: dh $@ --parallel From be1d2aeccd52d4be9ed137868103bb06d4813397 Mon Sep 17 00:00:00 2001 From: Conn O'Griofa Date: Thu, 5 Oct 2017 23:29:47 +0000 Subject: [PATCH 8/8] SDL_video: try to bootstrap KMSDRM before RPI video driver Allow better coexistence between RPI's vendor libraries and VC4 mesa driver. --- src/video/SDL_video.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/video/SDL_video.c b/src/video/SDL_video.c index 60b214718..37401f52e 100644 --- a/src/video/SDL_video.c +++ b/src/video/SDL_video.c @@ -97,12 +97,12 @@ static VideoBootStrap *bootstrap[] = { #if SDL_VIDEO_DRIVER_PSP &PSP_bootstrap, #endif -#if SDL_VIDEO_DRIVER_RPI - &RPI_bootstrap, -#endif #if SDL_VIDEO_DRIVER_KMSDRM &KMSDRM_bootstrap, #endif +#if SDL_VIDEO_DRIVER_RPI + &RPI_bootstrap, +#endif #if SDL_VIDEO_DRIVER_NACL &NACL_bootstrap, #endif