SDL/DISPMANX: Updated class member names, configure script and asociated files and docs to conform to fingolfin's corrections.
This commit is contained in:
parent
6320a008ec
commit
b706ca36f1
5 changed files with 106 additions and 116 deletions
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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 \
|
||||
|
|
|
@ -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
38
configure
vendored
|
@ -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
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue