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
#include "common/scummsys.h"
@ -53,8 +53,8 @@ struct dispvarsStruct {
void *pixmem;
int numpages;
struct dispmanxPage *pages;
struct dispmanxPage *currentPage;
dispmanxPage *pages;
dispmanxPage *currentPage;
int pageflipPending;
pthread_cond_t vsyncCondition;
@ -79,15 +79,15 @@ struct dispmanxPage {
DispmanXSdlGraphicsManager::DispmanXSdlGraphicsManager(SdlEventSource *sdlEventSource)
: SurfaceSdlGraphicsManager(sdlEventSource) {
_dispvars = new(dispvarsStruct);
DispmanXInit();
dispmanXInit();
}
DispmanXSdlGraphicsManager::~DispmanXSdlGraphicsManager() {
DispmanXVideoQuit();
dispmanXVideoQuit();
delete(_dispvars);
}
void DispmanXSdlGraphicsManager::DispmanXInit() {
void DispmanXSdlGraphicsManager::dispmanXInit() {
_dispvars->screen = 0;
_dispvars->vcImagePtr = 0;
_dispvars->numpages = 3;
@ -125,12 +125,12 @@ void DispmanXSdlGraphicsManager::DispmanXInit() {
_dispvars->fscreen = NULL;
}
void DispmanXSdlGraphicsManager::DispmanXSetup(int srcWidth, int srcHeight) {
void DispmanXSdlGraphicsManager::dispmanXSetup(int srcWidth, int srcHeight) {
unsigned int dstWidth, dstHeight, dstXpos, dstYpos;
// If we have an element, we have to free it along with it's resources.
if (_dispvars->element) {
DispmanXFreeResources();
dispmanXFreeResources();
}
// 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);
}
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 dispvarsStruct *dispvars = page->dispvars;
@ -205,7 +205,7 @@ void DispmanXVSyncCallback (DISPMANX_UPDATE_HANDLE_T u, void *arg) {
pthread_mutex_unlock(&dispvars->pendingMutex);
}
void DispmanXSdlGraphicsManager::DispmanXUpdate() {
void DispmanXSdlGraphicsManager::dispmanXUpdate() {
// Wait until last issued flip completes to get a free page. Also,
// dispmanx doesn't support issuing more than one pageflip.
pthread_mutex_lock(&_dispvars->pendingMutex);
@ -216,7 +216,7 @@ void DispmanXSdlGraphicsManager::DispmanXUpdate() {
pthread_mutex_unlock(&_dispvars->pendingMutex);
struct dispmanxPage *page = DispmanXGetFreePage();
struct dispmanxPage *page = dispmanXGetFreePage();
// Frame blitting
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,
page->resource);
vc_dispmanx_update_submit(_dispvars->update, &DispmanXVSyncCallback, page);
vc_dispmanx_update_submit(_dispvars->update, &dispmanXVSyncCallback, page);
pthread_mutex_lock(&_dispvars->pendingMutex);
_dispvars->pageflipPending++;
pthread_mutex_unlock(&_dispvars->pendingMutex);
}
struct dispmanxPage *DispmanXSdlGraphicsManager::DispmanXGetFreePage(void) {
struct dispmanxPage *DispmanXSdlGraphicsManager::dispmanXGetFreePage(void) {
struct dispmanxPage *page = NULL;
while (!page)
@ -265,7 +265,7 @@ struct dispmanxPage *DispmanXSdlGraphicsManager::DispmanXGetFreePage(void) {
return page;
}
void DispmanXSdlGraphicsManager::DispmanXFreeResources(void) {
void DispmanXSdlGraphicsManager::dispmanXFreeResources(void) {
// What if we run into the vsync cb code after freeing the resources?
pthread_mutex_lock(&_dispvars->pendingMutex);
if (_dispvars->pageflipPending > 0)
@ -287,10 +287,10 @@ void DispmanXSdlGraphicsManager::DispmanXFreeResources(void) {
_dispvars->element = 0;
}
void DispmanXSdlGraphicsManager::DispmanXVideoQuit() {
void DispmanXSdlGraphicsManager::dispmanXVideoQuit() {
// This also waits for pending flips to complete, that's needed before
// we destroy the mutexes and condition.
DispmanXFreeResources();
dispmanXFreeResources();
// Destroy the mutexes and conditions
for (int i = 0; i < _dispvars->numpages; i++) {
@ -310,7 +310,7 @@ void DispmanXSdlGraphicsManager::DispmanXVideoQuit() {
bool DispmanXSdlGraphicsManager::loadGFXMode() {
_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.overlayWidth = _videoMode.screenWidth;
@ -340,7 +340,7 @@ bool DispmanXSdlGraphicsManager::loadGFXMode() {
// 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,
0, 0, 0, 0);
@ -350,7 +350,7 @@ bool DispmanXSdlGraphicsManager::loadGFXMode() {
_dispvars->fscreen = SDL_SetVideoMode(_videoMode.hardwareWidth, _videoMode.hardwareHeight, 16, SDL_FULLSCREEN);
if (_hwscreen == NULL) {
// 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();
}
@ -436,7 +436,7 @@ void DispmanXSdlGraphicsManager::internUpdateScreen() {
(_mouseNeedsRedraw && _mouseBackup.y <= _currentShakePos)) {
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;
SDL_FillRect(_hwscreen, &blackrect, 0);
@ -535,7 +535,7 @@ void DispmanXSdlGraphicsManager::internUpdateScreen() {
// Finally, blit all our changes to the screen
if (!_displayDisabled) {
SDL_UpdateRects(_hwscreen, _numDirtyRects, _dirtyRectList);
DispmanXUpdate();
dispmanXUpdate();
}
}
@ -548,9 +548,7 @@ bool DispmanXSdlGraphicsManager::handleScalerHotkeys(Common::KeyCode key) {
// Ctrl-Alt-a toggles aspect ratio correction
if (key == 'a') {
beginGFXTransaction();
setFeatureState(OSystem::kFeatureAspectRatioCorrection, !_dispvars->aspectRatioCorrection);
endGFXTransaction();
#ifdef USE_OSD
char buffer[128];
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.
_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.
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();
protected:
// Raspberry Pi Dispmanx API
void DispmanXSetup(int width, int height);
void DispmanXInit();
void DispmanXUpdate();
struct dispmanxPage *DispmanXGetFreePage();
void DispmanXFreeResources();
void DispmanXVideoQuit();
struct dispvarsStruct *_dispvars;
void dispmanXSetup(int width, int height);
void dispmanXInit();
void dispmanXUpdate();
dispmanxPage *dispmanXGetFreePage();
void dispmanXFreeResources();
void dispmanXVideoQuit();
dispvarsStruct *_dispvars;
};
#endif /* BACKENDS_GRAPHICS_SDL_DISPMANX_H */

View file

@ -127,6 +127,11 @@ MODULE_OBJS += \
mixer/sdl13/sdl13-mixer.o
endif
ifdef RASPBERRYPI
MODULE_OBJS += \
graphics/dispmanxsdl/dispmanxsdl-graphics.o
endif
ifeq ($(BACKEND),tizen)
MODULE_OBJS += \
timer/tizen/timer.o
@ -193,11 +198,6 @@ MODULE_OBJS += \
timer/psp/timer.o
endif
ifeq ($(BACKEND),raspberrypi)
MODULE_OBJS += \
graphics/dispmanxsdl/dispmanxsdl-graphics.o
endif
ifeq ($(BACKEND),samsungtv)
MODULE_OBJS += \
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
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
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.
Requirements
@ -77,7 +77,7 @@ Local compilation would simply consist of the "standard" GNU/Linux building proc
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
--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
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:
http://wiki.scummvm.org/index.php/Compiling_ScummVM/RPI

38
configure vendored
View file

@ -1304,7 +1304,6 @@ raspberrypi)
_host_os=linux
_host_cpu=arm
_host_alias=arm-linux-gnueabihf
_backend=raspberrypi
;;
caanoo)
_host_os=gph-linux
@ -2549,6 +2548,17 @@ if test -n "$_host"; then
_seq_midi=no
_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)
DEFINES="$DEFINES -DDISABLE_DEFAULT_SAVEFILEMANAGER"
DEFINES="$DEFINES -DDISABLE_TEXT_CONSOLE"
@ -2993,6 +3003,8 @@ case $_backend in
LIBS="$LIBS -Wl,-Map,mapfile.txt"
;;
raspberrypi)
LIBS="$LIBS -L$RPI_ROOT/usr/lib"
LIBS="$LIBS -L$RPI_ROOT/usr/lib/arm-linux-gnueabihf"
;;
samsungtv)
DEFINES="$DEFINES -DSAMSUNGTV"
@ -3129,23 +3141,6 @@ case $_backend in
;;
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
# 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
echocheck "DispmanX graphics"
_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_LIBS="--sysroot=$RPI_ROOTDIR -L$RPI_ROOTDIR/usr/lib -L$RPI_ROOTDIR/opt/vc/lib -lbcm_host -lvcos -lvchiq_arm"
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_ROOT -L$RPI_ROOT/usr/lib -L$RPI_ROOT/opt/vc/lib -lbcm_host -lvcos -lvchiq_arm"
cat > $TMPC << EOF
#include <bcm_host.h>
@ -4096,11 +4091,8 @@ EOF
if test "$_use_dispmanx" = "yes"; then
CXXFLAGS="$CXXFLAGS $DISPMANX_CXXFLAGS"
LIBS="$LIBS $DISPMANX_LIBS"
MODULES="$MODULES backends/platform/sdl"
DEFINES="$DEFINES -DRASPBERRYPI"
add_line_to_config_mk 'RASPBERRYPI = 1'
_opengl=no
_opengles=no
echo $_use_dispmanx
fi
fi