SDL/DISPMANX: Updated class member names, configure script and asociated files and docs to conform to fingolfin's corrections.

This commit is contained in:
vanfanel 2015-07-22 13:00:45 +02:00
parent 6320a008ec
commit b706ca36f1
5 changed files with 106 additions and 116 deletions

View file

@ -20,7 +20,7 @@
* *
*/ */
//Needed for Raspberry Pi header incussion // Needed for Raspberry Pi header inclusion
#define FORBIDDEN_SYMBOL_ALLOW_ALL #define FORBIDDEN_SYMBOL_ALLOW_ALL
#include "common/scummsys.h" #include "common/scummsys.h"
@ -53,8 +53,8 @@ struct dispvarsStruct {
void *pixmem; void *pixmem;
int numpages; int numpages;
struct dispmanxPage *pages; dispmanxPage *pages;
struct dispmanxPage *currentPage; dispmanxPage *currentPage;
int pageflipPending; int pageflipPending;
pthread_cond_t vsyncCondition; pthread_cond_t vsyncCondition;
@ -79,15 +79,15 @@ struct dispmanxPage {
DispmanXSdlGraphicsManager::DispmanXSdlGraphicsManager(SdlEventSource *sdlEventSource) DispmanXSdlGraphicsManager::DispmanXSdlGraphicsManager(SdlEventSource *sdlEventSource)
: SurfaceSdlGraphicsManager(sdlEventSource) { : SurfaceSdlGraphicsManager(sdlEventSource) {
_dispvars = new(dispvarsStruct); _dispvars = new(dispvarsStruct);
DispmanXInit(); dispmanXInit();
} }
DispmanXSdlGraphicsManager::~DispmanXSdlGraphicsManager() { DispmanXSdlGraphicsManager::~DispmanXSdlGraphicsManager() {
DispmanXVideoQuit(); dispmanXVideoQuit();
delete(_dispvars); delete(_dispvars);
} }
void DispmanXSdlGraphicsManager::DispmanXInit() { void DispmanXSdlGraphicsManager::dispmanXInit() {
_dispvars->screen = 0; _dispvars->screen = 0;
_dispvars->vcImagePtr = 0; _dispvars->vcImagePtr = 0;
_dispvars->numpages = 3; _dispvars->numpages = 3;
@ -125,12 +125,12 @@ void DispmanXSdlGraphicsManager::DispmanXInit() {
_dispvars->fscreen = NULL; _dispvars->fscreen = NULL;
} }
void DispmanXSdlGraphicsManager::DispmanXSetup(int srcWidth, int srcHeight) { void DispmanXSdlGraphicsManager::dispmanXSetup(int srcWidth, int srcHeight) {
unsigned int dstWidth, dstHeight, dstXpos, dstYpos; unsigned int dstWidth, dstHeight, dstXpos, dstYpos;
// If we have an element, we have to free it along with it's resources. // If we have an element, we have to free it along with it's resources.
if (_dispvars->element) { if (_dispvars->element) {
DispmanXFreeResources(); dispmanXFreeResources();
} }
// We do this for 2 bytes per pixel which is default on the Rpi. // We do this for 2 bytes per pixel which is default on the Rpi.
@ -175,7 +175,7 @@ void DispmanXSdlGraphicsManager::DispmanXSetup(int srcWidth, int srcHeight) {
vc_dispmanx_update_submit_sync(_dispvars->update); vc_dispmanx_update_submit_sync(_dispvars->update);
} }
void DispmanXVSyncCallback (DISPMANX_UPDATE_HANDLE_T u, void *arg) { void dispmanXVSyncCallback (DISPMANX_UPDATE_HANDLE_T u, void *arg) {
struct dispmanxPage *page = (struct dispmanxPage*)arg; struct dispmanxPage *page = (struct dispmanxPage*)arg;
struct dispvarsStruct *dispvars = page->dispvars; struct dispvarsStruct *dispvars = page->dispvars;
@ -205,7 +205,7 @@ void DispmanXVSyncCallback (DISPMANX_UPDATE_HANDLE_T u, void *arg) {
pthread_mutex_unlock(&dispvars->pendingMutex); pthread_mutex_unlock(&dispvars->pendingMutex);
} }
void DispmanXSdlGraphicsManager::DispmanXUpdate() { void DispmanXSdlGraphicsManager::dispmanXUpdate() {
// Wait until last issued flip completes to get a free page. Also, // Wait until last issued flip completes to get a free page. Also,
// dispmanx doesn't support issuing more than one pageflip. // dispmanx doesn't support issuing more than one pageflip.
pthread_mutex_lock(&_dispvars->pendingMutex); pthread_mutex_lock(&_dispvars->pendingMutex);
@ -216,7 +216,7 @@ void DispmanXSdlGraphicsManager::DispmanXUpdate() {
pthread_mutex_unlock(&_dispvars->pendingMutex); pthread_mutex_unlock(&_dispvars->pendingMutex);
struct dispmanxPage *page = DispmanXGetFreePage(); struct dispmanxPage *page = dispmanXGetFreePage();
// Frame blitting // Frame blitting
vc_dispmanx_resource_write_data(page->resource, _dispvars->pixFormat, vc_dispmanx_resource_write_data(page->resource, _dispvars->pixFormat,
@ -227,14 +227,14 @@ void DispmanXSdlGraphicsManager::DispmanXUpdate() {
vc_dispmanx_element_change_source(_dispvars->update, _dispvars->element, vc_dispmanx_element_change_source(_dispvars->update, _dispvars->element,
page->resource); page->resource);
vc_dispmanx_update_submit(_dispvars->update, &DispmanXVSyncCallback, page); vc_dispmanx_update_submit(_dispvars->update, &dispmanXVSyncCallback, page);
pthread_mutex_lock(&_dispvars->pendingMutex); pthread_mutex_lock(&_dispvars->pendingMutex);
_dispvars->pageflipPending++; _dispvars->pageflipPending++;
pthread_mutex_unlock(&_dispvars->pendingMutex); pthread_mutex_unlock(&_dispvars->pendingMutex);
} }
struct dispmanxPage *DispmanXSdlGraphicsManager::DispmanXGetFreePage(void) { struct dispmanxPage *DispmanXSdlGraphicsManager::dispmanXGetFreePage(void) {
struct dispmanxPage *page = NULL; struct dispmanxPage *page = NULL;
while (!page) while (!page)
@ -265,7 +265,7 @@ struct dispmanxPage *DispmanXSdlGraphicsManager::DispmanXGetFreePage(void) {
return page; return page;
} }
void DispmanXSdlGraphicsManager::DispmanXFreeResources(void) { void DispmanXSdlGraphicsManager::dispmanXFreeResources(void) {
// What if we run into the vsync cb code after freeing the resources? // What if we run into the vsync cb code after freeing the resources?
pthread_mutex_lock(&_dispvars->pendingMutex); pthread_mutex_lock(&_dispvars->pendingMutex);
if (_dispvars->pageflipPending > 0) if (_dispvars->pageflipPending > 0)
@ -287,10 +287,10 @@ void DispmanXSdlGraphicsManager::DispmanXFreeResources(void) {
_dispvars->element = 0; _dispvars->element = 0;
} }
void DispmanXSdlGraphicsManager::DispmanXVideoQuit() { void DispmanXSdlGraphicsManager::dispmanXVideoQuit() {
// This also waits for pending flips to complete, that's needed before // This also waits for pending flips to complete, that's needed before
// we destroy the mutexes and condition. // we destroy the mutexes and condition.
DispmanXFreeResources(); dispmanXFreeResources();
// Destroy the mutexes and conditions // Destroy the mutexes and conditions
for (int i = 0; i < _dispvars->numpages; i++) { for (int i = 0; i < _dispvars->numpages; i++) {
@ -310,7 +310,7 @@ void DispmanXSdlGraphicsManager::DispmanXVideoQuit() {
bool DispmanXSdlGraphicsManager::loadGFXMode() { bool DispmanXSdlGraphicsManager::loadGFXMode() {
_forceFull = true; _forceFull = true;
// In DispmanX, we manage aspect ratio correction, so for scummvm it's always disabled. // In dispmanX, we manage aspect ratio correction, so for scummvm it's always disabled.
_videoMode.aspectRatioCorrection = false; _videoMode.aspectRatioCorrection = false;
_videoMode.overlayWidth = _videoMode.screenWidth; _videoMode.overlayWidth = _videoMode.screenWidth;
@ -340,7 +340,7 @@ bool DispmanXSdlGraphicsManager::loadGFXMode() {
// Create the surface that contains the scaled graphics in 16 bit mode // Create the surface that contains the scaled graphics in 16 bit mode
// //
DispmanXSetup(_videoMode.screenWidth, _videoMode.screenHeight); dispmanXSetup(_videoMode.screenWidth, _videoMode.screenHeight);
_hwscreen = SDL_CreateRGBSurface(SDL_SWSURFACE, _videoMode.hardwareWidth, _videoMode.hardwareHeight, 16, _hwscreen = SDL_CreateRGBSurface(SDL_SWSURFACE, _videoMode.hardwareWidth, _videoMode.hardwareHeight, 16,
0, 0, 0, 0); 0, 0, 0, 0);
@ -350,7 +350,7 @@ bool DispmanXSdlGraphicsManager::loadGFXMode() {
_dispvars->fscreen = SDL_SetVideoMode(_videoMode.hardwareWidth, _videoMode.hardwareHeight, 16, SDL_FULLSCREEN); _dispvars->fscreen = SDL_SetVideoMode(_videoMode.hardwareWidth, _videoMode.hardwareHeight, 16, SDL_FULLSCREEN);
if (_hwscreen == NULL) { if (_hwscreen == NULL) {
// Don't use error here because we don't have access to the debug console // Don't use error here because we don't have access to the debug console
warning("Allocating surface for DispmanX rendering _hwscreen failed"); warning("Allocating surface for dispmanX rendering _hwscreen failed");
g_system->quit(); g_system->quit();
} }
@ -436,7 +436,7 @@ void DispmanXSdlGraphicsManager::internUpdateScreen() {
(_mouseNeedsRedraw && _mouseBackup.y <= _currentShakePos)) { (_mouseNeedsRedraw && _mouseBackup.y <= _currentShakePos)) {
SDL_Rect blackrect = {0, 0, (Uint16)(_videoMode.screenWidth * _videoMode.scaleFactor), (Uint16)(_newShakePos * _videoMode.scaleFactor)}; SDL_Rect blackrect = {0, 0, (Uint16)(_videoMode.screenWidth * _videoMode.scaleFactor), (Uint16)(_newShakePos * _videoMode.scaleFactor)};
if (_videoMode.aspectRatioCorrection && !_overlayVisible) if (_dispvars->aspectRatioCorrection && !_overlayVisible)
blackrect.h = real2Aspect(blackrect.h - 1) + 1; blackrect.h = real2Aspect(blackrect.h - 1) + 1;
SDL_FillRect(_hwscreen, &blackrect, 0); SDL_FillRect(_hwscreen, &blackrect, 0);
@ -535,7 +535,7 @@ void DispmanXSdlGraphicsManager::internUpdateScreen() {
// Finally, blit all our changes to the screen // Finally, blit all our changes to the screen
if (!_displayDisabled) { if (!_displayDisabled) {
SDL_UpdateRects(_hwscreen, _numDirtyRects, _dirtyRectList); SDL_UpdateRects(_hwscreen, _numDirtyRects, _dirtyRectList);
DispmanXUpdate(); dispmanXUpdate();
} }
} }
@ -548,9 +548,7 @@ bool DispmanXSdlGraphicsManager::handleScalerHotkeys(Common::KeyCode key) {
// Ctrl-Alt-a toggles aspect ratio correction // Ctrl-Alt-a toggles aspect ratio correction
if (key == 'a') { if (key == 'a') {
beginGFXTransaction();
setFeatureState(OSystem::kFeatureAspectRatioCorrection, !_dispvars->aspectRatioCorrection); setFeatureState(OSystem::kFeatureAspectRatioCorrection, !_dispvars->aspectRatioCorrection);
endGFXTransaction();
#ifdef USE_OSD #ifdef USE_OSD
char buffer[128]; char buffer[128];
if (_dispvars->aspectRatioCorrection) if (_dispvars->aspectRatioCorrection)
@ -575,10 +573,10 @@ void DispmanXSdlGraphicsManager::setAspectRatioCorrection(bool enable) {
// We simply take note on what's the aspect ratio correction activation state. // We simply take note on what's the aspect ratio correction activation state.
_dispvars->aspectRatioCorrection = enable; _dispvars->aspectRatioCorrection = enable;
// If we have a videomode setup already, call DispmanXSetup() again so aspect ratio // If we have a videomode setup already, call dispmanXSetup() again so aspect ratio
// correction activation/deactivation works from the menu. // correction activation/deactivation works from the menu.
if (_oldVideoMode.setup && _dispvars->aspectRatioCorrection == enable) { if (_oldVideoMode.setup && _dispvars->aspectRatioCorrection == enable) {
DispmanXSetup(_videoMode.screenWidth, _videoMode.screenHeight); dispmanXSetup(_videoMode.screenWidth, _videoMode.screenHeight);
} }
} }

View file

@ -40,13 +40,13 @@ public:
void clearOverlay(); void clearOverlay();
protected: protected:
// Raspberry Pi Dispmanx API // Raspberry Pi Dispmanx API
void DispmanXSetup(int width, int height); void dispmanXSetup(int width, int height);
void DispmanXInit(); void dispmanXInit();
void DispmanXUpdate(); void dispmanXUpdate();
struct dispmanxPage *DispmanXGetFreePage(); dispmanxPage *dispmanXGetFreePage();
void DispmanXFreeResources(); void dispmanXFreeResources();
void DispmanXVideoQuit(); void dispmanXVideoQuit();
struct dispvarsStruct *_dispvars; dispvarsStruct *_dispvars;
}; };
#endif /* BACKENDS_GRAPHICS_SDL_DISPMANX_H */ #endif /* BACKENDS_GRAPHICS_SDL_DISPMANX_H */

View file

@ -127,6 +127,11 @@ MODULE_OBJS += \
mixer/sdl13/sdl13-mixer.o mixer/sdl13/sdl13-mixer.o
endif endif
ifdef RASPBERRYPI
MODULE_OBJS += \
graphics/dispmanxsdl/dispmanxsdl-graphics.o
endif
ifeq ($(BACKEND),tizen) ifeq ($(BACKEND),tizen)
MODULE_OBJS += \ MODULE_OBJS += \
timer/tizen/timer.o timer/tizen/timer.o
@ -193,11 +198,6 @@ MODULE_OBJS += \
timer/psp/timer.o timer/psp/timer.o
endif endif
ifeq ($(BACKEND),raspberrypi)
MODULE_OBJS += \
graphics/dispmanxsdl/dispmanxsdl-graphics.o
endif
ifeq ($(BACKEND),samsungtv) ifeq ($(BACKEND),samsungtv)
MODULE_OBJS += \ MODULE_OBJS += \
events/samsungtvsdl/samsungtvsdl-events.o \ events/samsungtvsdl/samsungtvsdl-events.o \

View file

@ -8,7 +8,7 @@ This version of ScummVM is specially tailored to use DispmanX, the native 2D
API on the Raspberry Pi. The idea is that scaling and drawing on a double API on the Raspberry Pi. The idea is that scaling and drawing on a double
buffer with a non-blocking vsync wait is all done using the on-board VideoCore buffer with a non-blocking vsync wait is all done using the on-board VideoCore
hardware, thus using only a small fraction of the CPU ScummVM uses when ran hardware, thus using only a small fraction of the CPU ScummVM uses when ran
on a clunky, software-scaled and desynced X11 enviroment using the X11 API. on a clunky, software-scaled and desynced X11 environment using the X11 API.
Thus, running this version under an X11 session is not supported. Thus, running this version under an X11 session is not supported.
Requirements Requirements
@ -77,7 +77,7 @@ Local compilation would simply consist of the "standard" GNU/Linux building proc
cd <sources_dir> cd <sources_dir>
./configure ./configure --backend=raspberrypi -disable-debug --enable-release ./configure --backend=raspberrypi -disable-debug --enable-release
--enable-optimizations --disable-mt32emu --disable-flac --disable-mad --disable-vorbis --enable-optimizations --disable-mt32emu --disable-flac --disable-mad --disable-vorbis
--disable-tremor --disable-fluidsynth --disable-taskbar --disable-timidity --disable-alsa --disable-tremor --disable-fluidsynth --disable-taskbar --disable-timidity --disable-alsa
@ -86,7 +86,7 @@ make
¡¡It will be an SLOW process, taking several hours to complete, unless you ¡¡It will be an SLOW process, taking several hours to complete, unless you
are running distcc against a fast compilation server!! are running distcc against a fast compilation server!!
2) If we wandt to build by cross-compiling on a GNU/Linux X86-based computer, 2) If we want to build by cross-compiling on a GNU/Linux X86-based computer,
we can find concise instructions for this can be found on the ScummVM wiki: we can find concise instructions for this can be found on the ScummVM wiki:
http://wiki.scummvm.org/index.php/Compiling_ScummVM/RPI http://wiki.scummvm.org/index.php/Compiling_ScummVM/RPI

38
configure vendored
View file

@ -1304,7 +1304,6 @@ raspberrypi)
_host_os=linux _host_os=linux
_host_cpu=arm _host_cpu=arm
_host_alias=arm-linux-gnueabihf _host_alias=arm-linux-gnueabihf
_backend=raspberrypi
;; ;;
caanoo) caanoo)
_host_os=gph-linux _host_os=gph-linux
@ -2549,6 +2548,17 @@ if test -n "$_host"; then
_seq_midi=no _seq_midi=no
_port_mk="backends/platform/dingux/dingux.mk" _port_mk="backends/platform/dingux/dingux.mk"
;; ;;
raspberrypi)
# We should have setup raspberrypi-sdl-config with modified prefix as part of
# the cross-building enviroment.
_savegame_timestamp=no
_eventrec=no
_build_scalers=no
_build_hq_scalers=no
# It makes no sense to have both GL and dispmanx rendering support.
_opengl=no
_opengles=no
;;
dreamcast) dreamcast)
DEFINES="$DEFINES -DDISABLE_DEFAULT_SAVEFILEMANAGER" DEFINES="$DEFINES -DDISABLE_DEFAULT_SAVEFILEMANAGER"
DEFINES="$DEFINES -DDISABLE_TEXT_CONSOLE" DEFINES="$DEFINES -DDISABLE_TEXT_CONSOLE"
@ -2993,6 +3003,8 @@ case $_backend in
LIBS="$LIBS -Wl,-Map,mapfile.txt" LIBS="$LIBS -Wl,-Map,mapfile.txt"
;; ;;
raspberrypi) raspberrypi)
LIBS="$LIBS -L$RPI_ROOT/usr/lib"
LIBS="$LIBS -L$RPI_ROOT/usr/lib/arm-linux-gnueabihf"
;; ;;
samsungtv) samsungtv)
DEFINES="$DEFINES -DSAMSUNGTV" DEFINES="$DEFINES -DSAMSUNGTV"
@ -3129,23 +3141,6 @@ case $_backend in
;; ;;
esac esac
#
# In raspberry Pi, we don't use find_sdlconfig since we could be crosscompiling, but still we use SDL
#
case $_backend in
raspberrypi)
INCLUDES="$INCLUDES -I$RPI_ROOTDIR/usr/include/SDL -D_GNU_SOURCE=1 -D_REENTRANT"
LIBS="$LIBS -L$RPI_ROOTDIR/usr/lib -L$RPI_ROOTDIR/usr/lib/arm-linux-gnueabihf -lSDL"
DEFINES="$DEFINES -DSDL_BACKEND"
add_line_to_config_mk "SDL_BACKEND = 1"
_16bit=yes
_savegame_timestamp=no
_eventrec=no
_build_scalers=no
_build_hq_scalers=no
;;
esac
# #
# Determine whether host is POSIX compliant, or at least POSIX # Determine whether host is POSIX compliant, or at least POSIX
# compatible enough to support our POSIX code (including dlsym(), # compatible enough to support our POSIX code (including dlsym(),
@ -4083,8 +4078,8 @@ define_in_config_if_yes "$_opengles" "USE_GLES"
if test "$_dispmanx" = "yes" ; then if test "$_dispmanx" = "yes" ; then
echocheck "DispmanX graphics" echocheck "DispmanX graphics"
_use_dispmanx=no _use_dispmanx=no
DISPMANX_CXXFLAGS="-I$RPI_ROOTDIR/opt/vc/include -I$RPI_ROOTDIR/opt/vc/include/interface/vmcs_host/linux/ -I$RPI_ROOTDIR/opt/vc/include/interface/vcos/pthreads -mfpu=vfp -mfloat-abi=hard -I$RPI_ROOTDIR/opt/rpi_root/usr/include/SDL" DISPMANX_CXXFLAGS="-I$RPI_ROOT/opt/vc/include -I$RPI_ROOT/opt/vc/include/interface/vmcs_host/linux/ -I$RPI_ROOT/opt/vc/include/interface/vcos/pthreads -I$RPI_ROOT/opt/rpi_root/usr/include/SDL"
DISPMANX_LIBS="--sysroot=$RPI_ROOTDIR -L$RPI_ROOTDIR/usr/lib -L$RPI_ROOTDIR/opt/vc/lib -lbcm_host -lvcos -lvchiq_arm" DISPMANX_LIBS="--sysroot=$RPI_ROOT -L$RPI_ROOT/usr/lib -L$RPI_ROOT/opt/vc/lib -lbcm_host -lvcos -lvchiq_arm"
cat > $TMPC << EOF cat > $TMPC << EOF
#include <bcm_host.h> #include <bcm_host.h>
@ -4096,11 +4091,8 @@ EOF
if test "$_use_dispmanx" = "yes"; then if test "$_use_dispmanx" = "yes"; then
CXXFLAGS="$CXXFLAGS $DISPMANX_CXXFLAGS" CXXFLAGS="$CXXFLAGS $DISPMANX_CXXFLAGS"
LIBS="$LIBS $DISPMANX_LIBS" LIBS="$LIBS $DISPMANX_LIBS"
MODULES="$MODULES backends/platform/sdl"
DEFINES="$DEFINES -DRASPBERRYPI" DEFINES="$DEFINES -DRASPBERRYPI"
add_line_to_config_mk 'RASPBERRYPI = 1' add_line_to_config_mk 'RASPBERRYPI = 1'
_opengl=no
_opengles=no
echo $_use_dispmanx echo $_use_dispmanx
fi fi
fi fi