PSP2: Add Playstation Vita (PSP2) support
This commit is contained in:
parent
3a7c091122
commit
70988527c6
39 changed files with 2049 additions and 15 deletions
5
.gitignore
vendored
5
.gitignore
vendored
|
@ -208,5 +208,10 @@ dists/msvc*/**
|
||||||
out/
|
out/
|
||||||
scummvm.xcodeproj
|
scummvm.xcodeproj
|
||||||
|
|
||||||
|
#Ignore PSP2 files
|
||||||
|
psp2pkg/
|
||||||
|
*.velf
|
||||||
|
*.vpk
|
||||||
|
|
||||||
#Ignore gmon.out created by gprof
|
#Ignore gmon.out created by gprof
|
||||||
gmon.out
|
gmon.out
|
||||||
|
|
323
backends/events/psp2sdl/psp2sdl-events.cpp
Normal file
323
backends/events/psp2sdl/psp2sdl-events.cpp
Normal file
|
@ -0,0 +1,323 @@
|
||||||
|
/* ScummVM - Graphic Adventure Engine
|
||||||
|
*
|
||||||
|
* ScummVM is the legal property of its developers, whose names
|
||||||
|
* are too numerous to list here. Please refer to the COPYRIGHT
|
||||||
|
* file distributed with this source distribution.
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU General Public License
|
||||||
|
* as published by the Free Software Foundation; either version 2
|
||||||
|
* of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "common/scummsys.h"
|
||||||
|
|
||||||
|
#if defined(PSP2)
|
||||||
|
|
||||||
|
#include <psp2/kernel/processmgr.h>
|
||||||
|
#include "backends/platform/sdl/psp2/psp2.h"
|
||||||
|
#include "backends/events/psp2sdl/psp2sdl-events.h"
|
||||||
|
#include "backends/platform/sdl/sdl.h"
|
||||||
|
#include "engines/engine.h"
|
||||||
|
|
||||||
|
#include "common/util.h"
|
||||||
|
#include "common/events.h"
|
||||||
|
#include "common/config-manager.h"
|
||||||
|
|
||||||
|
#include "math.h"
|
||||||
|
|
||||||
|
#define JOY_DEADZONE 2000
|
||||||
|
#define JOY_ANALOG
|
||||||
|
#define JOY_XAXIS 0
|
||||||
|
#define JOY_YAXIS 1
|
||||||
|
#define JOY_XAXISR 2
|
||||||
|
#define JOY_YAXISR 3
|
||||||
|
|
||||||
|
enum {
|
||||||
|
BTN_LEFT = 7,
|
||||||
|
BTN_DOWN = 6,
|
||||||
|
BTN_RIGHT = 9,
|
||||||
|
BTN_UP = 8,
|
||||||
|
|
||||||
|
BTN_START = 11,
|
||||||
|
BTN_SELECT = 10,
|
||||||
|
|
||||||
|
BTN_SQUARE = 3,
|
||||||
|
BTN_CROSS = 2,
|
||||||
|
BTN_CIRCLE = 1,
|
||||||
|
BTN_TRIANGLE = 0,
|
||||||
|
|
||||||
|
BTN_R1 = 5,
|
||||||
|
BTN_L1 = 4
|
||||||
|
};
|
||||||
|
|
||||||
|
bool PSP2EventSource::handleJoyButtonDown(SDL_Event &ev, Common::Event &event) {
|
||||||
|
|
||||||
|
event.kbd.flags = 0;
|
||||||
|
|
||||||
|
switch (ev.jbutton.button) {
|
||||||
|
// Dpad
|
||||||
|
case BTN_LEFT: // Left (+R_trigger: Up+Left)
|
||||||
|
if (!_km.modifier) {
|
||||||
|
event.type = Common::EVENT_KEYDOWN;
|
||||||
|
event.kbd.keycode = Common::KEYCODE_KP4;
|
||||||
|
event.kbd.ascii = mapKey(SDLK_KP4, (SDLMod) ev.key.keysym.mod, 0);
|
||||||
|
} else {
|
||||||
|
event.type = Common::EVENT_KEYDOWN;
|
||||||
|
event.kbd.keycode = Common::KEYCODE_KP7;
|
||||||
|
event.kbd.ascii = mapKey(SDLK_KP7, (SDLMod) ev.key.keysym.mod, 0);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case BTN_RIGHT: // Right (+R_trigger: Down+Right)
|
||||||
|
if (!_km.modifier) {
|
||||||
|
event.type = Common::EVENT_KEYDOWN;
|
||||||
|
event.kbd.keycode = Common::KEYCODE_KP6;
|
||||||
|
event.kbd.ascii = mapKey(SDLK_KP6, (SDLMod) ev.key.keysym.mod, 0);
|
||||||
|
} else {
|
||||||
|
event.type = Common::EVENT_KEYDOWN;
|
||||||
|
event.kbd.keycode = Common::KEYCODE_KP3;
|
||||||
|
event.kbd.ascii = mapKey(SDLK_KP3, (SDLMod) ev.key.keysym.mod, 0);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case BTN_UP: // Up (+R_trigger: Up+Right)
|
||||||
|
if (!_km.modifier) {
|
||||||
|
event.type = Common::EVENT_KEYDOWN;
|
||||||
|
event.kbd.keycode = Common::KEYCODE_KP8;
|
||||||
|
event.kbd.ascii = mapKey(SDLK_KP8, (SDLMod) ev.key.keysym.mod, 0);
|
||||||
|
} else {
|
||||||
|
event.type = Common::EVENT_KEYDOWN;
|
||||||
|
event.kbd.keycode = Common::KEYCODE_KP9;
|
||||||
|
event.kbd.ascii = mapKey(SDLK_KP9, (SDLMod) ev.key.keysym.mod, 0);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case BTN_DOWN: // Down (+R_trigger: Down+Left)
|
||||||
|
if (!_km.modifier) {
|
||||||
|
event.type = Common::EVENT_KEYDOWN;
|
||||||
|
event.kbd.keycode = Common::KEYCODE_KP2;
|
||||||
|
event.kbd.ascii = mapKey(SDLK_KP2, (SDLMod) ev.key.keysym.mod, 0);
|
||||||
|
} else {
|
||||||
|
event.type = Common::EVENT_KEYDOWN;
|
||||||
|
event.kbd.keycode = Common::KEYCODE_KP1;
|
||||||
|
event.kbd.ascii = mapKey(SDLK_KP1, (SDLMod) ev.key.keysym.mod, 0);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
// Buttons
|
||||||
|
case BTN_CROSS: // Left mouse button
|
||||||
|
event.type = Common::EVENT_LBUTTONDOWN;
|
||||||
|
processMouseEvent(event, _km.x / MULTIPLIER, _km.y / MULTIPLIER);
|
||||||
|
break;
|
||||||
|
case BTN_CIRCLE: // Right mouse button
|
||||||
|
event.type = Common::EVENT_RBUTTONDOWN;
|
||||||
|
processMouseEvent(event, _km.x / MULTIPLIER, _km.y / MULTIPLIER);
|
||||||
|
break;
|
||||||
|
case BTN_TRIANGLE: // Escape (+R_trigger: Return)
|
||||||
|
if (!_km.modifier) {
|
||||||
|
event.type = Common::EVENT_KEYDOWN;
|
||||||
|
event.kbd.keycode = Common::KEYCODE_ESCAPE;
|
||||||
|
event.kbd.ascii = mapKey(SDLK_ESCAPE, (SDLMod) ev.key.keysym.mod, 0);
|
||||||
|
} else {
|
||||||
|
event.type = Common::EVENT_KEYDOWN;
|
||||||
|
event.kbd.keycode = Common::KEYCODE_RETURN;
|
||||||
|
event.kbd.ascii = mapKey(SDLK_RETURN, (SDLMod) ev.key.keysym.mod, 0);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case BTN_SQUARE: // Period (+R_trigger: Space)
|
||||||
|
if (!_km.modifier) {
|
||||||
|
event.type = Common::EVENT_KEYDOWN;
|
||||||
|
event.kbd.keycode = Common::KEYCODE_PERIOD;
|
||||||
|
event.kbd.ascii = mapKey(SDLK_PERIOD, (SDLMod) ev.key.keysym.mod, 0);
|
||||||
|
} else {
|
||||||
|
event.type = Common::EVENT_KEYDOWN;
|
||||||
|
event.kbd.keycode = Common::KEYCODE_SPACE;
|
||||||
|
event.kbd.ascii = mapKey(SDLK_SPACE, (SDLMod) ev.key.keysym.mod, 0);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case BTN_L1: // Game menu
|
||||||
|
event.type = Common::EVENT_KEYDOWN;
|
||||||
|
event.kbd.keycode = Common::KEYCODE_F5;
|
||||||
|
event.kbd.ascii = mapKey(SDLK_F5, (SDLMod) ev.key.keysym.mod, 0);
|
||||||
|
break;
|
||||||
|
case BTN_R1: // Modifier + Shift
|
||||||
|
_km.modifier=true; // slow mouse
|
||||||
|
event.type = Common::EVENT_KEYDOWN;
|
||||||
|
event.kbd.keycode = Common::KEYCODE_INVALID;
|
||||||
|
event.kbd.ascii = 0;
|
||||||
|
event.kbd.flags = Common::KBD_SHIFT;
|
||||||
|
break;
|
||||||
|
case BTN_START: // ScummVM in game menu
|
||||||
|
event.type = Common::EVENT_MAINMENU;
|
||||||
|
break;
|
||||||
|
case BTN_SELECT: // Virtual keyboard (+R_trigger: Predictive Input Dialog)
|
||||||
|
if (!_km.modifier) {
|
||||||
|
#ifdef ENABLE_VKEYBD
|
||||||
|
event.type = Common::EVENT_VIRTUAL_KEYBOARD;
|
||||||
|
#endif
|
||||||
|
} else {
|
||||||
|
event.type = Common::EVENT_PREDICTIVE_DIALOG;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool PSP2EventSource::handleJoyButtonUp(SDL_Event &ev, Common::Event &event) {
|
||||||
|
|
||||||
|
event.kbd.flags = 0;
|
||||||
|
|
||||||
|
switch (ev.jbutton.button) {
|
||||||
|
// Dpad
|
||||||
|
case BTN_LEFT: // Left (+R_trigger: Up+Left)
|
||||||
|
if (!_km.modifier) {
|
||||||
|
event.type = Common::EVENT_KEYUP;
|
||||||
|
event.kbd.keycode = Common::KEYCODE_KP4;
|
||||||
|
event.kbd.ascii = mapKey(SDLK_KP4, (SDLMod) ev.key.keysym.mod, 0);
|
||||||
|
} else {
|
||||||
|
event.type = Common::EVENT_KEYUP;
|
||||||
|
event.kbd.keycode = Common::KEYCODE_KP7;
|
||||||
|
event.kbd.ascii = mapKey(SDLK_KP7, (SDLMod) ev.key.keysym.mod, 0);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case BTN_RIGHT: // Right (+R_trigger: Down+Right)
|
||||||
|
if (!_km.modifier) {
|
||||||
|
event.type = Common::EVENT_KEYUP;
|
||||||
|
event.kbd.keycode = Common::KEYCODE_KP6;
|
||||||
|
event.kbd.ascii = mapKey(SDLK_KP6, (SDLMod) ev.key.keysym.mod, 0);
|
||||||
|
} else {
|
||||||
|
event.type = Common::EVENT_KEYUP;
|
||||||
|
event.kbd.keycode = Common::KEYCODE_KP3;
|
||||||
|
event.kbd.ascii = mapKey(SDLK_KP3, (SDLMod) ev.key.keysym.mod, 0);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case BTN_UP: // Up (+R_trigger: Up+Right)
|
||||||
|
if (!_km.modifier) {
|
||||||
|
event.type = Common::EVENT_KEYUP;
|
||||||
|
event.kbd.keycode = Common::KEYCODE_KP8;
|
||||||
|
event.kbd.ascii = mapKey(SDLK_KP8, (SDLMod) ev.key.keysym.mod, 0);
|
||||||
|
} else {
|
||||||
|
event.type = Common::EVENT_KEYUP;
|
||||||
|
event.kbd.keycode = Common::KEYCODE_KP9;
|
||||||
|
event.kbd.ascii = mapKey(SDLK_KP9, (SDLMod) ev.key.keysym.mod, 0);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case BTN_DOWN: // Down (+R_trigger: Down+Left)
|
||||||
|
if (!_km.modifier) {
|
||||||
|
event.type = Common::EVENT_KEYUP;
|
||||||
|
event.kbd.keycode = Common::KEYCODE_KP2;
|
||||||
|
event.kbd.ascii = mapKey(SDLK_KP2, (SDLMod) ev.key.keysym.mod, 0);
|
||||||
|
} else {
|
||||||
|
event.type = Common::EVENT_KEYUP;
|
||||||
|
event.kbd.keycode = Common::KEYCODE_KP1;
|
||||||
|
event.kbd.ascii = mapKey(SDLK_KP1, (SDLMod) ev.key.keysym.mod, 0);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
// Buttons
|
||||||
|
case BTN_CROSS: // Left mouse button
|
||||||
|
event.type = Common::EVENT_LBUTTONUP;
|
||||||
|
processMouseEvent(event, _km.x / MULTIPLIER, _km.y / MULTIPLIER);
|
||||||
|
break;
|
||||||
|
case BTN_CIRCLE: // Right mouse button
|
||||||
|
event.type = Common::EVENT_RBUTTONUP;
|
||||||
|
processMouseEvent(event, _km.x / MULTIPLIER, _km.y / MULTIPLIER);
|
||||||
|
break;
|
||||||
|
case BTN_TRIANGLE: // Escape (+R_trigger: Return)
|
||||||
|
if (!_km.modifier) {
|
||||||
|
event.type = Common::EVENT_KEYUP;
|
||||||
|
event.kbd.keycode = Common::KEYCODE_ESCAPE;
|
||||||
|
event.kbd.ascii = mapKey(SDLK_ESCAPE, (SDLMod) ev.key.keysym.mod, 0);
|
||||||
|
} else {
|
||||||
|
event.type = Common::EVENT_KEYUP;
|
||||||
|
event.kbd.keycode = Common::KEYCODE_RETURN;
|
||||||
|
event.kbd.ascii = mapKey(SDLK_RETURN, (SDLMod) ev.key.keysym.mod, 0);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case BTN_SQUARE: // Period (+R_trigger: Space)
|
||||||
|
if (!_km.modifier) {
|
||||||
|
event.type = Common::EVENT_KEYUP;
|
||||||
|
event.kbd.keycode = Common::KEYCODE_PERIOD;
|
||||||
|
event.kbd.ascii = mapKey(SDLK_PERIOD, (SDLMod) ev.key.keysym.mod, 0);
|
||||||
|
} else {
|
||||||
|
event.type = Common::EVENT_KEYUP;
|
||||||
|
event.kbd.keycode = Common::KEYCODE_SPACE;
|
||||||
|
event.kbd.ascii = mapKey(SDLK_SPACE, (SDLMod) ev.key.keysym.mod, 0);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case BTN_L1: // Game menu
|
||||||
|
event.type = Common::EVENT_KEYUP;
|
||||||
|
event.kbd.keycode = Common::KEYCODE_F5;
|
||||||
|
event.kbd.ascii = mapKey(SDLK_F5, (SDLMod) ev.key.keysym.mod, 0);
|
||||||
|
break;
|
||||||
|
case BTN_R1: // Modifier + SHIFT Key
|
||||||
|
_km.modifier = false; // slow mouse
|
||||||
|
event.type = Common::EVENT_KEYUP;
|
||||||
|
event.kbd.keycode = Common::KEYCODE_INVALID;
|
||||||
|
event.kbd.ascii = 0;
|
||||||
|
event.kbd.flags = 0;
|
||||||
|
break;
|
||||||
|
case BTN_START: // ScummVM in game menu
|
||||||
|
// Handled in key down
|
||||||
|
break;
|
||||||
|
case BTN_SELECT: // Virtual keyboard (+R_trigger: Predictive Input Dialog)
|
||||||
|
// Handled in key down
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool PSP2EventSource::handleJoyAxisMotion(SDL_Event &ev, Common::Event &event) {
|
||||||
|
|
||||||
|
int axis = ev.jaxis.value;
|
||||||
|
|
||||||
|
// conversion factor between keyboard mouse and joy axis value
|
||||||
|
int vel_to_axis = (1500 / MULTIPLIER);
|
||||||
|
|
||||||
|
if (ev.jaxis.axis == JOY_XAXIS) {
|
||||||
|
_km.joy_x = axis;
|
||||||
|
} else if (ev.jaxis.axis == JOY_YAXIS) {
|
||||||
|
axis = -axis;
|
||||||
|
_km.joy_y = -axis;
|
||||||
|
}
|
||||||
|
|
||||||
|
// radial and scaled deadzone
|
||||||
|
|
||||||
|
float analogX = (float)_km.joy_x;
|
||||||
|
float analogY = (float)_km.joy_y;
|
||||||
|
float deadZone = (float)JOY_DEADZONE;
|
||||||
|
if (g_system->hasFeature(OSystem::kFeatureJoystickDeadzone))
|
||||||
|
deadZone = (float)ConfMan.getInt("joystick_deadzone") * 1000.0f;
|
||||||
|
float scalingFactor = 1.0f;
|
||||||
|
float magnitude = 0.0f;
|
||||||
|
|
||||||
|
magnitude = sqrt(analogX * analogX + analogY * analogY);
|
||||||
|
|
||||||
|
if (magnitude >= deadZone) {
|
||||||
|
_km.x_down_count = 0;
|
||||||
|
_km.y_down_count = 0;
|
||||||
|
scalingFactor = 1.0f / magnitude * (magnitude - deadZone) / (32769.0f - deadZone);
|
||||||
|
_km.x_vel = (int16)(analogX * scalingFactor * 32768.0f / (float) vel_to_axis);
|
||||||
|
_km.y_vel = (int16)(analogY * scalingFactor * 32768.0f / (float) vel_to_axis);
|
||||||
|
} else {
|
||||||
|
_km.x_vel = 0;
|
||||||
|
_km.y_vel = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void PSP2EventSource::preprocessEvents(SDL_Event *event) {
|
||||||
|
|
||||||
|
// prevent suspend (scummvm games contains a lot of cutscenes..)
|
||||||
|
sceKernelPowerTick(SCE_KERNEL_POWER_TICK_DISABLE_AUTO_SUSPEND);
|
||||||
|
sceKernelPowerTick(SCE_KERNEL_POWER_TICK_DISABLE_OLED_OFF);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
39
backends/events/psp2sdl/psp2sdl-events.h
Normal file
39
backends/events/psp2sdl/psp2sdl-events.h
Normal file
|
@ -0,0 +1,39 @@
|
||||||
|
/* ScummVM - Graphic Adventure Engine
|
||||||
|
*
|
||||||
|
* ScummVM is the legal property of its developers, whose names
|
||||||
|
* are too numerous to list here. Please refer to the COPYRIGHT
|
||||||
|
* file distributed with this source distribution.
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU General Public License
|
||||||
|
* as published by the Free Software Foundation; either version 2
|
||||||
|
* of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if !defined(DISABLE_DEFAULT_EVENTMANAGER)
|
||||||
|
#define BACKEND_EVENTS_PSP2_H
|
||||||
|
|
||||||
|
#include "backends/events/sdl/sdl-events.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* SDL Events manager for the PSP2.
|
||||||
|
*/
|
||||||
|
class PSP2EventSource : public SdlEventSource {
|
||||||
|
protected:
|
||||||
|
bool handleJoyButtonDown(SDL_Event &ev, Common::Event &event);
|
||||||
|
bool handleJoyButtonUp(SDL_Event &ev, Common::Event &event);
|
||||||
|
bool handleJoyAxisMotion(SDL_Event &ev, Common::Event &event);
|
||||||
|
void preprocessEvents(SDL_Event *event);
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif /* BACKEND_EVENTS_PSP2_H */
|
|
@ -20,7 +20,7 @@
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#if defined(POSIX) || defined(PLAYSTATION3)
|
#if defined(POSIX) || defined(PLAYSTATION3) || defined(PSP2)
|
||||||
|
|
||||||
// Re-enable some forbidden symbols to avoid clashes with stat.h and unistd.h.
|
// Re-enable some forbidden symbols to avoid clashes with stat.h and unistd.h.
|
||||||
// Also with clock() in sys/time.h in some Mac OS X SDKs.
|
// Also with clock() in sys/time.h in some Mac OS X SDKs.
|
||||||
|
@ -36,7 +36,12 @@
|
||||||
|
|
||||||
#include <sys/param.h>
|
#include <sys/param.h>
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
|
#ifdef PSP2
|
||||||
|
#include "backends/fs/psp2/psp2-dirent.h"
|
||||||
|
#define mkdir sceIoMkdir
|
||||||
|
#else
|
||||||
#include <dirent.h>
|
#include <dirent.h>
|
||||||
|
#endif
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
|
|
241
backends/fs/psp2/psp2-dirent.cpp
Normal file
241
backends/fs/psp2/psp2-dirent.cpp
Normal file
|
@ -0,0 +1,241 @@
|
||||||
|
/* ScummVM - Graphic Adventure Engine
|
||||||
|
*
|
||||||
|
* ScummVM is the legal property of its developers, whose names
|
||||||
|
* are too numerous to list here. Please refer to the COPYRIGHT
|
||||||
|
* file distributed with this source distribution.
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU General Public License
|
||||||
|
* as published by the Free Software Foundation; either version 2
|
||||||
|
* of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
|
||||||
|
Copyright (C) 2016, David "Davee" Morgan
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a
|
||||||
|
copy of this software and associated documentation files (the "Software"),
|
||||||
|
to deal in the Software without restriction, including without limitation
|
||||||
|
the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||||
|
and/or sell copies of the Software, and to permit persons to whom the
|
||||||
|
Software is furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in
|
||||||
|
all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||||
|
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||||
|
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||||
|
DEALINGS IN THE SOFTWARE.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "psp2-dirent.h"
|
||||||
|
#include <errno.h>
|
||||||
|
#include <malloc.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include <psp2/types.h>
|
||||||
|
#include <psp2/io/dirent.h>
|
||||||
|
#include <psp2/kernel/threadmgr.h>
|
||||||
|
|
||||||
|
#define SCE_ERRNO_MASK 0xFF
|
||||||
|
|
||||||
|
|
||||||
|
struct DIR_ {
|
||||||
|
SceUID uid;
|
||||||
|
struct dirent dir;
|
||||||
|
int refcount;
|
||||||
|
char *dirname;
|
||||||
|
int index;
|
||||||
|
};
|
||||||
|
|
||||||
|
static inline void grab_dir(DIR *dirp) {
|
||||||
|
__sync_add_and_fetch(&dirp->refcount, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void drop_dir(DIR *dirp) {
|
||||||
|
if (__sync_add_and_fetch(&dirp->refcount, 1) == 0) {
|
||||||
|
free(dirp->dirname);
|
||||||
|
free(dirp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void release_drop_dir(DIR *dirp) {
|
||||||
|
if (__sync_add_and_fetch(&dirp->refcount, 2) == 0) {
|
||||||
|
free(dirp->dirname);
|
||||||
|
free(dirp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void atomic_exchange(int *obj, int desired) {
|
||||||
|
__sync_synchronize();
|
||||||
|
__sync_lock_test_and_set(obj, desired);
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef F_closedir
|
||||||
|
int closedir(DIR *dirp) {
|
||||||
|
if (!dirp) {
|
||||||
|
errno = EBADF;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
grab_dir(dirp);
|
||||||
|
|
||||||
|
int res = sceIoDclose(dirp->uid);
|
||||||
|
|
||||||
|
if (res < 0) {
|
||||||
|
errno = res & SCE_ERRNO_MASK;
|
||||||
|
drop_dir(dirp);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
release_drop_dir(dirp);
|
||||||
|
|
||||||
|
errno = 0;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if F_opendir
|
||||||
|
DIR *opendir(const char *dirname) {
|
||||||
|
SceUID uid = sceIoDopen(dirname);
|
||||||
|
|
||||||
|
if (uid < 0) {
|
||||||
|
errno = uid & SCE_ERRNO_MASK;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
DIR *dirp = (DIR *)calloc(1, sizeof(DIR));
|
||||||
|
|
||||||
|
if (!dirp) {
|
||||||
|
sceIoDclose(uid);
|
||||||
|
errno = ENOMEM;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
dirp->refcount = 1;
|
||||||
|
dirp->uid = uid;
|
||||||
|
dirp->dirname = strdup(dirname);
|
||||||
|
dirp->index = 0;
|
||||||
|
|
||||||
|
errno = 0;
|
||||||
|
return dirp;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef F_readdir
|
||||||
|
struct dirent *readdir(DIR *dirp) {
|
||||||
|
if (!dirp) {
|
||||||
|
errno = EBADF;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
grab_dir(dirp);
|
||||||
|
|
||||||
|
int res = sceIoDread(dirp->uid, (SceIoDirent *)&dirp->dir);
|
||||||
|
|
||||||
|
if (res < 0) {
|
||||||
|
errno = res & SCE_ERRNO_MASK;
|
||||||
|
drop_dir(dirp);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (res == 0) {
|
||||||
|
errno = 0;
|
||||||
|
drop_dir(dirp);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
__sync_add_and_fetch(&dirp->index, 1);
|
||||||
|
|
||||||
|
struct dirent *dir = &dirp->dir;
|
||||||
|
drop_dir(dirp);
|
||||||
|
return dir;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#ifdef F_readdir_r
|
||||||
|
int readdir_r(DIR *dirp, struct dirent *x, struct dirent **y) {
|
||||||
|
errno = ENOSYS;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef F_rewinddir
|
||||||
|
void rewinddir(DIR *dirp) {
|
||||||
|
if (!dirp) {
|
||||||
|
errno = EBADF;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
grab_dir(dirp);
|
||||||
|
|
||||||
|
SceUID dirfd = sceIoDopen(dirp->dirname);
|
||||||
|
|
||||||
|
if (dirfd < 0) {
|
||||||
|
errno = dirfd & SCE_ERRNO_MASK;
|
||||||
|
drop_dir(dirp);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
sceIoDclose(dirp->uid);
|
||||||
|
atomic_exchange(&dirp->uid, dirfd);
|
||||||
|
atomic_exchange(&dirp->index, 0);
|
||||||
|
|
||||||
|
drop_dir(dirp);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef F_seekdir
|
||||||
|
void seekdir(DIR *dirp, long int index) {
|
||||||
|
if (!dirp) {
|
||||||
|
errno = EBADF;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
grab_dir(dirp);
|
||||||
|
|
||||||
|
if (index < dirp->index)
|
||||||
|
rewinddir(dirp);
|
||||||
|
|
||||||
|
if (index < dirp->index) {
|
||||||
|
drop_dir(dirp);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (index != dirp->index) {
|
||||||
|
if (!readdir(dirp)) {
|
||||||
|
errno = ENOENT;
|
||||||
|
drop_dir(dirp);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
drop_dir(dirp);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef F_telldir
|
||||||
|
long int telldir(DIR *dirp) {
|
||||||
|
if (!dirp) {
|
||||||
|
errno = EBADF;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return dirp->index;
|
||||||
|
}
|
||||||
|
#endif
|
59
backends/fs/psp2/psp2-dirent.h
Normal file
59
backends/fs/psp2/psp2-dirent.h
Normal file
|
@ -0,0 +1,59 @@
|
||||||
|
/*
|
||||||
|
|
||||||
|
Copyright (C) 2016, David "Davee" Morgan
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a
|
||||||
|
copy of this software and associated documentation files (the "Software"),
|
||||||
|
to deal in the Software without restriction, including without limitation
|
||||||
|
the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||||
|
and/or sell copies of the Software, and to permit persons to whom the
|
||||||
|
Software is furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in
|
||||||
|
all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||||
|
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||||
|
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||||
|
DEALINGS IN THE SOFTWARE.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _PSP2_DIRENT_H_
|
||||||
|
#define _PSP2_DIRENT_H_
|
||||||
|
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/time.h>
|
||||||
|
|
||||||
|
#include <psp2/io/dirent.h>
|
||||||
|
|
||||||
|
#define F_opendir 1
|
||||||
|
#define F_readdir 1
|
||||||
|
#define F_closedir 1
|
||||||
|
|
||||||
|
struct dirent
|
||||||
|
{
|
||||||
|
/** File status. */
|
||||||
|
SceIoStat d_stat;
|
||||||
|
/** File name. */
|
||||||
|
char d_name[256];
|
||||||
|
/** Device-specific data. */
|
||||||
|
void *d_private;
|
||||||
|
int dummy;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct DIR_;
|
||||||
|
typedef struct DIR_ DIR;
|
||||||
|
|
||||||
|
int closedir(DIR *);
|
||||||
|
DIR *opendir(const char *);
|
||||||
|
struct dirent *readdir(DIR *);
|
||||||
|
int readdir_r(DIR *, struct dirent *, struct dirent **);
|
||||||
|
void rewinddir(DIR *);
|
||||||
|
void seekdir(DIR *, long int);
|
||||||
|
long int telldir(DIR *);
|
||||||
|
|
||||||
|
#endif /* _PSP2_DIRENT_H_ */
|
45
backends/fs/psp2/psp2-fs-factory.cpp
Normal file
45
backends/fs/psp2/psp2-fs-factory.cpp
Normal file
|
@ -0,0 +1,45 @@
|
||||||
|
/* ScummVM - Graphic Adventure Engine
|
||||||
|
*
|
||||||
|
* ScummVM is the legal property of its developers, whose names
|
||||||
|
* are too numerous to list here. Please refer to the COPYRIGHT
|
||||||
|
* file distributed with this source distribution.
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU General Public License
|
||||||
|
* as published by the Free Software Foundation; either version 2
|
||||||
|
* of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Re-enable some forbidden symbols to avoid clashes with stat.h and unistd.h.
|
||||||
|
// Also with clock() in sys/time.h in some Mac OS X SDKs.
|
||||||
|
#define FORBIDDEN_SYMBOL_EXCEPTION_time_h
|
||||||
|
#define FORBIDDEN_SYMBOL_EXCEPTION_unistd_h
|
||||||
|
#define FORBIDDEN_SYMBOL_EXCEPTION_mkdir
|
||||||
|
#define FORBIDDEN_SYMBOL_EXCEPTION_exit //Needed for IRIX's unistd.h
|
||||||
|
|
||||||
|
#include "backends/fs/posix/posix-fs-factory.h"
|
||||||
|
#include "backends/fs/posix/posix-fs.h"
|
||||||
|
#include "backends/fs/psp2/psp2-fs-factory.h"
|
||||||
|
|
||||||
|
AbstractFSNode *PSP2FilesystemFactory::makeRootFileNode() const {
|
||||||
|
return new POSIXFilesystemNode("ux0:");
|
||||||
|
}
|
||||||
|
|
||||||
|
AbstractFSNode *PSP2FilesystemFactory::makeCurrentDirectoryFileNode() const {
|
||||||
|
return makeRootFileNode();
|
||||||
|
}
|
||||||
|
|
||||||
|
AbstractFSNode *PSP2FilesystemFactory::makeFileNodePath(const Common::String &path) const {
|
||||||
|
assert(!path.empty());
|
||||||
|
return new POSIXFilesystemNode(path);
|
||||||
|
}
|
41
backends/fs/psp2/psp2-fs-factory.h
Normal file
41
backends/fs/psp2/psp2-fs-factory.h
Normal file
|
@ -0,0 +1,41 @@
|
||||||
|
/* ScummVM - Graphic Adventure Engine
|
||||||
|
*
|
||||||
|
* ScummVM is the legal property of its developers, whose names
|
||||||
|
* are too numerous to list here. Please refer to the COPYRIGHT
|
||||||
|
* file distributed with this source distribution.
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU General Public License
|
||||||
|
* as published by the Free Software Foundation; either version 2
|
||||||
|
* of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef PSP2_FILESYSTEM_FACTORY_H
|
||||||
|
#define PSP2_FILESYSTEM_FACTORY_H
|
||||||
|
|
||||||
|
#include "backends/fs/posix/posix-fs-factory.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates PSP2FilesystemFactory objects.
|
||||||
|
*
|
||||||
|
* Parts of this class are documented in the base interface class, FilesystemFactory.
|
||||||
|
*/
|
||||||
|
|
||||||
|
class PSP2FilesystemFactory : public FilesystemFactory {
|
||||||
|
protected:
|
||||||
|
virtual AbstractFSNode *makeRootFileNode() const;
|
||||||
|
virtual AbstractFSNode *makeCurrentDirectoryFileNode() const;
|
||||||
|
virtual AbstractFSNode *makeFileNodePath(const Common::String &path) const;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif /*PSP2_FILESYSTEM_FACTORY_H*/
|
|
@ -46,6 +46,13 @@ public:
|
||||||
virtual bool setGraphicsMode(int mode) = 0;
|
virtual bool setGraphicsMode(int mode) = 0;
|
||||||
virtual void resetGraphicsScale() = 0;
|
virtual void resetGraphicsScale() = 0;
|
||||||
virtual int getGraphicsMode() const = 0;
|
virtual int getGraphicsMode() const = 0;
|
||||||
|
virtual const OSystem::GraphicsMode *getSupportedShaders() const {
|
||||||
|
static const OSystem::GraphicsMode no_shader[2] = {{"NONE", "Normal (no shader)", 0}, {0, 0, 0}};
|
||||||
|
return no_shader;
|
||||||
|
};
|
||||||
|
virtual bool setShader(int id) { return false; }
|
||||||
|
virtual int getShader() { return 0; }
|
||||||
|
|
||||||
#ifdef USE_RGB_COLOR
|
#ifdef USE_RGB_COLOR
|
||||||
virtual Graphics::PixelFormat getScreenFormat() const = 0;
|
virtual Graphics::PixelFormat getScreenFormat() const = 0;
|
||||||
virtual Common::List<Graphics::PixelFormat> getSupportedFormats() const = 0;
|
virtual Common::List<Graphics::PixelFormat> getSupportedFormats() const = 0;
|
||||||
|
|
522
backends/graphics/psp2sdl/psp2sdl-graphics.cpp
Normal file
522
backends/graphics/psp2sdl/psp2sdl-graphics.cpp
Normal file
|
@ -0,0 +1,522 @@
|
||||||
|
/* ScummVM - Graphic Adventure Engine
|
||||||
|
*
|
||||||
|
* ScummVM is the legal property of its developers, whose names
|
||||||
|
* are too numerous to list here. Please refer to the COPYRIGHT
|
||||||
|
* file distributed with this source distribution.
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU General Public License
|
||||||
|
* as published by the Free Software Foundation; either version 2
|
||||||
|
* of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#include "common/scummsys.h"
|
||||||
|
|
||||||
|
#if defined(SDL_BACKEND)
|
||||||
|
|
||||||
|
#include "backends/graphics/psp2sdl/psp2sdl-graphics.h"
|
||||||
|
#include "backends/events/sdl/sdl-events.h"
|
||||||
|
#include "backends/platform/sdl/sdl.h"
|
||||||
|
#include "common/config-manager.h"
|
||||||
|
#include "common/mutex.h"
|
||||||
|
#include "common/textconsole.h"
|
||||||
|
#include "common/translation.h"
|
||||||
|
#include "common/util.h"
|
||||||
|
#include "common/frac.h"
|
||||||
|
#ifdef USE_RGB_COLOR
|
||||||
|
#include "common/list.h"
|
||||||
|
#endif
|
||||||
|
#include "graphics/font.h"
|
||||||
|
#include "graphics/fontman.h"
|
||||||
|
#include "graphics/scaler.h"
|
||||||
|
#include "graphics/scaler/aspect.h"
|
||||||
|
#include "graphics/surface.h"
|
||||||
|
#include "gui/EventRecorder.h"
|
||||||
|
|
||||||
|
#include <vita2d_fbo.h>
|
||||||
|
#include <lcd3x_v.h>
|
||||||
|
#include <lcd3x_f.h>
|
||||||
|
#include <texture_v.h>
|
||||||
|
#include <texture_f.h>
|
||||||
|
#include <advanced_aa_v.h>
|
||||||
|
#include <advanced_aa_f.h>
|
||||||
|
#include <scale2x_f.h>
|
||||||
|
#include <scale2x_v.h>
|
||||||
|
#include <sharp_bilinear_f.h>
|
||||||
|
#include <sharp_bilinear_v.h>
|
||||||
|
#include <sharp_bilinear_simple_f.h>
|
||||||
|
#include <sharp_bilinear_simple_v.h>
|
||||||
|
|
||||||
|
#define GFX_SHADER_NONE 0
|
||||||
|
#define GFX_SHADER_LCD3X 1
|
||||||
|
#define GFX_SHADER_SHARP 2
|
||||||
|
#define GFX_SHADER_SHARP_SCAN 3
|
||||||
|
#define GFX_SHADER_AAA 4
|
||||||
|
#define GFX_SHADER_SCALE2X 5
|
||||||
|
|
||||||
|
static const OSystem::GraphicsMode s_supportedShadersPSP2[] = {
|
||||||
|
{"NONE", "Normal (no shader)", GFX_SHADER_NONE},
|
||||||
|
{"LCD", "LCD", GFX_SHADER_LCD3X},
|
||||||
|
{"Sharp", "Sharp", GFX_SHADER_SHARP},
|
||||||
|
{"Scan", "Scan", GFX_SHADER_SHARP_SCAN},
|
||||||
|
{"AAA", "Super2xSAI", GFX_SHADER_AAA},
|
||||||
|
{"Scale", "Scale", GFX_SHADER_SCALE2X},
|
||||||
|
{0, 0, 0}
|
||||||
|
};
|
||||||
|
|
||||||
|
PSP2SdlGraphicsManager::PSP2SdlGraphicsManager(SdlEventSource *sdlEventSource, SdlWindow *window)
|
||||||
|
:
|
||||||
|
SurfaceSdlGraphicsManager(sdlEventSource, window),
|
||||||
|
_vitatex_hwscreen(nullptr),
|
||||||
|
_sdlpixels_hwscreen(nullptr) {
|
||||||
|
|
||||||
|
// do aspect ratio correction in hardware on the Vita
|
||||||
|
if (_videoMode.aspectRatioCorrection == true) {
|
||||||
|
_hardwareAspectRatioCorrection = true;
|
||||||
|
} else {
|
||||||
|
_hardwareAspectRatioCorrection = false;
|
||||||
|
}
|
||||||
|
_videoMode.aspectRatioCorrection = false;
|
||||||
|
|
||||||
|
if (g_system->hasFeature(OSystem::kFeatureShader)) {
|
||||||
|
// shader number 0 is the entry NONE (no shader)
|
||||||
|
const OSystem::GraphicsMode *p = s_supportedShadersPSP2;
|
||||||
|
_numShaders = 0;
|
||||||
|
while (p->name) {
|
||||||
|
_numShaders++;
|
||||||
|
p++;
|
||||||
|
}
|
||||||
|
_currentShader = ConfMan.getInt("shader");
|
||||||
|
if (_currentShader < 0 || _currentShader >= _numShaders) {
|
||||||
|
_currentShader = 0;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
_numShaders = 1;
|
||||||
|
_currentShader = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
_shaders[0] = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
PSP2SdlGraphicsManager::~PSP2SdlGraphicsManager() {
|
||||||
|
if (_vitatex_hwscreen) {
|
||||||
|
vita2d_free_texture(_vitatex_hwscreen);
|
||||||
|
for (int i = 0; i < 6; i++) {
|
||||||
|
vita2d_free_shader(_shaders[i]);
|
||||||
|
_shaders[i] = NULL;
|
||||||
|
}
|
||||||
|
_vitatex_hwscreen = NULL;
|
||||||
|
}
|
||||||
|
if (_hwscreen) {
|
||||||
|
_hwscreen->pixels = _sdlpixels_hwscreen;
|
||||||
|
}
|
||||||
|
_sdlpixels_hwscreen = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
OSystem::TransactionError PSP2SdlGraphicsManager::endGFXTransaction() {
|
||||||
|
OSystem::TransactionError returnValue = SurfaceSdlGraphicsManager::endGFXTransaction();
|
||||||
|
|
||||||
|
// force update of filtering on Vita
|
||||||
|
PSP2_UpdateFiltering();
|
||||||
|
|
||||||
|
return returnValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
void PSP2SdlGraphicsManager::setGraphicsModeIntern() {
|
||||||
|
SurfaceSdlGraphicsManager::setGraphicsModeIntern();
|
||||||
|
PSP2_UpdateFiltering();
|
||||||
|
}
|
||||||
|
|
||||||
|
void PSP2SdlGraphicsManager::PSP2_UpdateFiltering() {
|
||||||
|
if (_vitatex_hwscreen) {
|
||||||
|
if (_videoMode.filtering) {
|
||||||
|
vita2d_texture_set_filters(_vitatex_hwscreen, SCE_GXM_TEXTURE_FILTER_LINEAR, SCE_GXM_TEXTURE_FILTER_LINEAR);
|
||||||
|
} else {
|
||||||
|
vita2d_texture_set_filters(_vitatex_hwscreen, SCE_GXM_TEXTURE_FILTER_POINT, SCE_GXM_TEXTURE_FILTER_POINT);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const OSystem::GraphicsMode *PSP2SdlGraphicsManager::getSupportedShaders() const {
|
||||||
|
return s_supportedShadersPSP2;
|
||||||
|
}
|
||||||
|
|
||||||
|
void PSP2SdlGraphicsManager::unloadGFXMode() {
|
||||||
|
if (_screen) {
|
||||||
|
SDL_FreeSurface(_screen);
|
||||||
|
_screen = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
deinitializeRenderer();
|
||||||
|
|
||||||
|
if (_hwscreen) {
|
||||||
|
if (_vitatex_hwscreen) {
|
||||||
|
vita2d_free_texture(_vitatex_hwscreen);
|
||||||
|
for (int i = 0; i < 6; i++) {
|
||||||
|
vita2d_free_shader(_shaders[i]);
|
||||||
|
_shaders[i] = NULL;
|
||||||
|
}
|
||||||
|
_vitatex_hwscreen = NULL;
|
||||||
|
}
|
||||||
|
_hwscreen->pixels = _sdlpixels_hwscreen;
|
||||||
|
}
|
||||||
|
SurfaceSdlGraphicsManager::unloadGFXMode();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool PSP2SdlGraphicsManager::hotswapGFXMode() {
|
||||||
|
if (!_screen)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// Release the HW screen surface
|
||||||
|
if (_hwscreen) {
|
||||||
|
if (_vitatex_hwscreen) {
|
||||||
|
vita2d_free_texture(_vitatex_hwscreen);
|
||||||
|
for (int i = 0; i < 6; i++) {
|
||||||
|
vita2d_free_shader(_shaders[i]);
|
||||||
|
_shaders[i] = NULL;
|
||||||
|
}
|
||||||
|
_vitatex_hwscreen = NULL;
|
||||||
|
}
|
||||||
|
_hwscreen->pixels = _sdlpixels_hwscreen;
|
||||||
|
}
|
||||||
|
return SurfaceSdlGraphicsManager::hotswapGFXMode();
|
||||||
|
}
|
||||||
|
|
||||||
|
void PSP2SdlGraphicsManager::updateShader() {
|
||||||
|
// shader init code goes here
|
||||||
|
// currently only used on Vita port
|
||||||
|
// the user-selected shaderID should be obtained via ConfMan.getInt("shader")
|
||||||
|
// and the corresponding shader should then be activated here
|
||||||
|
// this way the user can combine any software scaling (scalers)
|
||||||
|
// with any hardware shading (shaders). The shaders could provide
|
||||||
|
// scanline masks, overlays, but could also serve for
|
||||||
|
// hardware-based up-scaling (sharp-bilinear-simple, etc.)
|
||||||
|
if (_vitatex_hwscreen) {
|
||||||
|
if (_shaders[0] == NULL) {
|
||||||
|
// load shaders
|
||||||
|
_shaders[GFX_SHADER_NONE] = vita2d_create_shader((const SceGxmProgram *)texture_v, (const SceGxmProgram *)texture_f);
|
||||||
|
_shaders[GFX_SHADER_LCD3X] = vita2d_create_shader((const SceGxmProgram *)lcd3x_v, (const SceGxmProgram *)lcd3x_f);
|
||||||
|
_shaders[GFX_SHADER_SHARP] = vita2d_create_shader((const SceGxmProgram *)sharp_bilinear_simple_v, (const SceGxmProgram *)sharp_bilinear_simple_f);
|
||||||
|
_shaders[GFX_SHADER_SHARP_SCAN] = vita2d_create_shader((const SceGxmProgram *)sharp_bilinear_v, (const SceGxmProgram *)sharp_bilinear_f);
|
||||||
|
_shaders[GFX_SHADER_AAA] = vita2d_create_shader((const SceGxmProgram *)advanced_aa_v, (const SceGxmProgram *)advanced_aa_f);
|
||||||
|
_shaders[GFX_SHADER_SCALE2X] = vita2d_create_shader((const SceGxmProgram *)scale2x_v, (const SceGxmProgram *)scale2x_f);
|
||||||
|
}
|
||||||
|
if (_currentShader >= 0 && _currentShader < _numShaders) {
|
||||||
|
vita2d_texture_set_program(_shaders[_currentShader]->vertexProgram, _shaders[_currentShader]->fragmentProgram);
|
||||||
|
vita2d_texture_set_wvp(_shaders[_currentShader]->wvpParam);
|
||||||
|
vita2d_texture_set_vertexInput(&_shaders[_currentShader]->vertexInput);
|
||||||
|
vita2d_texture_set_fragmentInput(&_shaders[_currentShader]->fragmentInput);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void PSP2SdlGraphicsManager::internUpdateScreen() {
|
||||||
|
SDL_Surface *srcSurf, *origSurf;
|
||||||
|
int height, width;
|
||||||
|
ScalerProc *scalerProc;
|
||||||
|
int scale1;
|
||||||
|
|
||||||
|
// definitions not available for non-DEBUG here. (needed this to compile in SYMBIAN32 & linux?)
|
||||||
|
#if defined(DEBUG)
|
||||||
|
assert(_hwscreen != NULL);
|
||||||
|
assert(_hwscreen->map->sw_data != NULL);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// If the shake position changed, fill the dirty area with blackness
|
||||||
|
if (_currentShakePos != _newShakePos ||
|
||||||
|
(_mouseNeedsRedraw && _mouseBackup.y <= _currentShakePos)) {
|
||||||
|
SDL_Rect blackrect = {0, 0, (Uint16)(_videoMode.screenWidth * _videoMode.scaleFactor), (Uint16)(_newShakePos * _videoMode.scaleFactor)};
|
||||||
|
|
||||||
|
if (_videoMode.aspectRatioCorrection && !_overlayVisible)
|
||||||
|
blackrect.h = real2Aspect(blackrect.h - 1) + 1;
|
||||||
|
|
||||||
|
SDL_FillRect(_hwscreen, &blackrect, 0);
|
||||||
|
|
||||||
|
_currentShakePos = _newShakePos;
|
||||||
|
|
||||||
|
_forceFull = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check whether the palette was changed in the meantime and update the
|
||||||
|
// screen surface accordingly.
|
||||||
|
if (_screen && _paletteDirtyEnd != 0) {
|
||||||
|
SDL_SetColors(_screen, _currentPalette + _paletteDirtyStart,
|
||||||
|
_paletteDirtyStart,
|
||||||
|
_paletteDirtyEnd - _paletteDirtyStart);
|
||||||
|
|
||||||
|
_paletteDirtyEnd = 0;
|
||||||
|
|
||||||
|
_forceFull = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!_overlayVisible) {
|
||||||
|
origSurf = _screen;
|
||||||
|
srcSurf = _tmpscreen;
|
||||||
|
width = _videoMode.screenWidth;
|
||||||
|
height = _videoMode.screenHeight;
|
||||||
|
scalerProc = _scalerProc;
|
||||||
|
scale1 = _videoMode.scaleFactor;
|
||||||
|
} else {
|
||||||
|
origSurf = _overlayscreen;
|
||||||
|
srcSurf = _tmpscreen2;
|
||||||
|
width = _videoMode.overlayWidth;
|
||||||
|
height = _videoMode.overlayHeight;
|
||||||
|
scalerProc = Normal1x;
|
||||||
|
|
||||||
|
scale1 = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add the area covered by the mouse cursor to the list of dirty rects if
|
||||||
|
// we have to redraw the mouse.
|
||||||
|
if (_mouseNeedsRedraw)
|
||||||
|
undrawMouse();
|
||||||
|
|
||||||
|
#ifdef USE_OSD
|
||||||
|
updateOSD();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Force a full redraw if requested
|
||||||
|
if (_forceFull) {
|
||||||
|
_numDirtyRects = 1;
|
||||||
|
_dirtyRectList[0].x = 0;
|
||||||
|
_dirtyRectList[0].y = 0;
|
||||||
|
_dirtyRectList[0].w = width;
|
||||||
|
_dirtyRectList[0].h = height;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Only draw anything if necessary
|
||||||
|
if (_numDirtyRects > 0 || _mouseNeedsRedraw) {
|
||||||
|
SDL_Rect *r;
|
||||||
|
SDL_Rect dst;
|
||||||
|
uint32 srcPitch, dstPitch;
|
||||||
|
SDL_Rect *lastRect = _dirtyRectList + _numDirtyRects;
|
||||||
|
|
||||||
|
for (r = _dirtyRectList; r != lastRect; ++r) {
|
||||||
|
dst = *r;
|
||||||
|
dst.x++; // Shift rect by one since 2xSai needs to access the data around
|
||||||
|
dst.y++; // any pixel to scale it, and we want to avoid mem access crashes.
|
||||||
|
|
||||||
|
if (SDL_BlitSurface(origSurf, r, srcSurf, &dst) != 0)
|
||||||
|
error("SDL_BlitSurface failed: %s", SDL_GetError());
|
||||||
|
}
|
||||||
|
|
||||||
|
SDL_LockSurface(srcSurf);
|
||||||
|
srcPitch = srcSurf->pitch;
|
||||||
|
dstPitch = _hwscreen->pitch;
|
||||||
|
|
||||||
|
for (r = _dirtyRectList; r != lastRect; ++r) {
|
||||||
|
register int dst_y = r->y + _currentShakePos;
|
||||||
|
register int dst_h = 0;
|
||||||
|
#ifdef USE_SCALERS
|
||||||
|
register int orig_dst_y = 0;
|
||||||
|
#endif
|
||||||
|
register int rx1 = r->x * scale1;
|
||||||
|
|
||||||
|
if (dst_y < height) {
|
||||||
|
dst_h = r->h;
|
||||||
|
if (dst_h > height - dst_y)
|
||||||
|
dst_h = height - dst_y;
|
||||||
|
|
||||||
|
#ifdef USE_SCALERS
|
||||||
|
orig_dst_y = dst_y;
|
||||||
|
#endif
|
||||||
|
dst_y = dst_y * scale1;
|
||||||
|
|
||||||
|
if (_videoMode.aspectRatioCorrection && !_overlayVisible)
|
||||||
|
dst_y = real2Aspect(dst_y);
|
||||||
|
|
||||||
|
assert(scalerProc != NULL);
|
||||||
|
scalerProc((byte *)srcSurf->pixels + (r->x * 2 + 2) + (r->y + 1) * srcPitch, srcPitch,
|
||||||
|
(byte *)_hwscreen->pixels + rx1 * 2 + dst_y * dstPitch, dstPitch, r->w, dst_h);
|
||||||
|
}
|
||||||
|
|
||||||
|
r->x = rx1;
|
||||||
|
r->y = dst_y;
|
||||||
|
r->w = r->w * scale1;
|
||||||
|
r->h = dst_h * scale1;
|
||||||
|
|
||||||
|
#ifdef USE_SCALERS
|
||||||
|
if (_videoMode.aspectRatioCorrection && orig_dst_y < height && !_overlayVisible)
|
||||||
|
r->h = stretch200To240((uint8 *) _hwscreen->pixels, dstPitch, r->w, r->h, r->x, r->y, orig_dst_y * scale1);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
SDL_UnlockSurface(srcSurf);
|
||||||
|
// Readjust the dirty rect list in case we are doing a full update.
|
||||||
|
// This is necessary if shaking is active.
|
||||||
|
if (_forceFull) {
|
||||||
|
_dirtyRectList[0].y = 0;
|
||||||
|
_dirtyRectList[0].h = effectiveScreenHeight();
|
||||||
|
}
|
||||||
|
|
||||||
|
drawMouse();
|
||||||
|
|
||||||
|
#ifdef USE_OSD
|
||||||
|
drawOSD();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef USE_SDL_DEBUG_FOCUSRECT
|
||||||
|
// We draw the focus rectangle on top of everything, to assure it's easily visible.
|
||||||
|
// Of course when the overlay is visible we do not show it, since it is only for game
|
||||||
|
// specific focus.
|
||||||
|
if (_enableFocusRect && !_overlayVisible) {
|
||||||
|
int y = _focusRect.top + _currentShakePos;
|
||||||
|
int h = 0;
|
||||||
|
int x = _focusRect.left * scale1;
|
||||||
|
int w = _focusRect.width() * scale1;
|
||||||
|
|
||||||
|
if (y < height) {
|
||||||
|
h = _focusRect.height();
|
||||||
|
if (h > height - y)
|
||||||
|
h = height - y;
|
||||||
|
|
||||||
|
y *= scale1;
|
||||||
|
|
||||||
|
if (_videoMode.aspectRatioCorrection && !_overlayVisible)
|
||||||
|
y = real2Aspect(y);
|
||||||
|
|
||||||
|
if (h > 0 && w > 0) {
|
||||||
|
// Use white as color for now.
|
||||||
|
Uint32 rectColor = SDL_MapRGB(_hwscreen->format, 0xFF, 0xFF, 0xFF);
|
||||||
|
|
||||||
|
// First draw the top and bottom lines
|
||||||
|
// then draw the left and right lines
|
||||||
|
if (_hwscreen->format->BytesPerPixel == 2) {
|
||||||
|
uint16 *top = (uint16 *)((byte *)_hwscreen->pixels + y * _hwscreen->pitch + x * 2);
|
||||||
|
uint16 *bottom = (uint16 *)((byte *)_hwscreen->pixels + (y + h) * _hwscreen->pitch + x * 2);
|
||||||
|
byte *left = ((byte *)_hwscreen->pixels + y * _hwscreen->pitch + x * 2);
|
||||||
|
byte *right = ((byte *)_hwscreen->pixels + y * _hwscreen->pitch + (x + w - 1) * 2);
|
||||||
|
|
||||||
|
while (w--) {
|
||||||
|
*top++ = rectColor;
|
||||||
|
*bottom++ = rectColor;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (h--) {
|
||||||
|
*(uint16 *)left = rectColor;
|
||||||
|
*(uint16 *)right = rectColor;
|
||||||
|
|
||||||
|
left += _hwscreen->pitch;
|
||||||
|
right += _hwscreen->pitch;
|
||||||
|
}
|
||||||
|
} else if (_hwscreen->format->BytesPerPixel == 4) {
|
||||||
|
uint32 *top = (uint32 *)((byte *)_hwscreen->pixels + y * _hwscreen->pitch + x * 4);
|
||||||
|
uint32 *bottom = (uint32 *)((byte *)_hwscreen->pixels + (y + h) * _hwscreen->pitch + x * 4);
|
||||||
|
byte *left = ((byte *)_hwscreen->pixels + y * _hwscreen->pitch + x * 4);
|
||||||
|
byte *right = ((byte *)_hwscreen->pixels + y * _hwscreen->pitch + (x + w - 1) * 4);
|
||||||
|
|
||||||
|
while (w--) {
|
||||||
|
*top++ = rectColor;
|
||||||
|
*bottom++ = rectColor;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (h--) {
|
||||||
|
*(uint32 *)left = rectColor;
|
||||||
|
*(uint32 *)right = rectColor;
|
||||||
|
|
||||||
|
left += _hwscreen->pitch;
|
||||||
|
right += _hwscreen->pitch;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Finally, blit all our changes to the screen
|
||||||
|
if (!_displayDisabled) {
|
||||||
|
PSP2_UpdateRects(_hwscreen, _numDirtyRects, _dirtyRectList);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
_numDirtyRects = 0;
|
||||||
|
_forceFull = false;
|
||||||
|
_mouseNeedsRedraw = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void PSP2SdlGraphicsManager::setAspectRatioCorrection(bool enable) {
|
||||||
|
Common::StackLock lock(_graphicsMutex);
|
||||||
|
|
||||||
|
if (_oldVideoMode.setup && _hardwareAspectRatioCorrection == enable)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (_transactionMode == kTransactionActive) {
|
||||||
|
_videoMode.aspectRatioCorrection = false;
|
||||||
|
_hardwareAspectRatioCorrection = enable;
|
||||||
|
// erase the screen for both buffers
|
||||||
|
if (_vitatex_hwscreen) {
|
||||||
|
for (int i = 0; i <= 10; i++) {
|
||||||
|
vita2d_start_drawing();
|
||||||
|
vita2d_clear_screen();
|
||||||
|
vita2d_end_drawing();
|
||||||
|
vita2d_swap_buffers();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
SDL_Surface *PSP2SdlGraphicsManager::SDL_SetVideoMode(int width, int height, int bpp, Uint32 flags) {
|
||||||
|
SDL_Surface *screen = SurfaceSdlGraphicsManager::SDL_SetVideoMode(width, height, bpp, flags);
|
||||||
|
|
||||||
|
if (screen != nullptr) {
|
||||||
|
vita2d_set_vblank_wait(true);
|
||||||
|
_vitatex_hwscreen = vita2d_create_empty_texture_format(width, height, SCE_GXM_TEXTURE_FORMAT_R5G6B5);
|
||||||
|
_sdlpixels_hwscreen = screen->pixels; // for SDL_FreeSurface...
|
||||||
|
screen->pixels = vita2d_texture_get_datap(_vitatex_hwscreen);
|
||||||
|
updateShader();
|
||||||
|
}
|
||||||
|
return screen;
|
||||||
|
}
|
||||||
|
|
||||||
|
void PSP2SdlGraphicsManager::PSP2_UpdateRects(SDL_Surface *screen, int numrects, SDL_Rect *rects) {
|
||||||
|
int x, y, w, h;
|
||||||
|
float sx, sy;
|
||||||
|
float ratio = (float)screen->w / (float)screen->h;
|
||||||
|
|
||||||
|
if ((_videoMode.screenHeight == 200 || _videoMode.screenHeight == 400) && _hardwareAspectRatioCorrection) {
|
||||||
|
ratio = ratio * (200.0f / 240.0f);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_videoMode.fullscreen || screen->h >= 544) {
|
||||||
|
h = 544;
|
||||||
|
w = h * ratio;
|
||||||
|
} else {
|
||||||
|
if (screen->h <= 277 && screen->w <= 480) {
|
||||||
|
// Use Vita hardware 2x scaling if the picture is really small
|
||||||
|
// this uses the current shader and filtering mode
|
||||||
|
h = screen->h * 2;
|
||||||
|
w = screen->w * 2;
|
||||||
|
} else {
|
||||||
|
h = screen->h;
|
||||||
|
w = screen->w;
|
||||||
|
}
|
||||||
|
if ((_videoMode.screenHeight == 200 || _videoMode.screenHeight == 400) && _hardwareAspectRatioCorrection) {
|
||||||
|
// stretch the height only if it fits, otherwise make the width smaller
|
||||||
|
if (((float)w * (1.0f / ratio)) <= 544.0f) {
|
||||||
|
h = w * (1.0f / ratio);
|
||||||
|
} else {
|
||||||
|
w = h * ratio;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
x = (960 - w) / 2; y = (544 - h) / 2;
|
||||||
|
sx = (float)w / (float)screen->w;
|
||||||
|
sy = (float)h / (float)screen->h;
|
||||||
|
if (_vitatex_hwscreen) {
|
||||||
|
vita2d_start_drawing();
|
||||||
|
vita2d_draw_texture_scale(_vitatex_hwscreen, x, y, sx, sy);
|
||||||
|
vita2d_end_drawing();
|
||||||
|
vita2d_swap_buffers();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
55
backends/graphics/psp2sdl/psp2sdl-graphics.h
Normal file
55
backends/graphics/psp2sdl/psp2sdl-graphics.h
Normal file
|
@ -0,0 +1,55 @@
|
||||||
|
/* ScummVM - Graphic Adventure Engine
|
||||||
|
*
|
||||||
|
* ScummVM is the legal property of its developers, whose names
|
||||||
|
* are too numerous to list here. Please refer to the COPYRIGHT
|
||||||
|
* file distributed with this source distribution.
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU General Public License
|
||||||
|
* as published by the Free Software Foundation; either version 2
|
||||||
|
* of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef BACKENDS_GRAPHICS_PSP2SDL_GRAPHICS_H
|
||||||
|
#define BACKENDS_GRAPHICS_PSP2SDL_GRAPHICS_H
|
||||||
|
|
||||||
|
#include "backends/graphics/surfacesdl/surfacesdl-graphics.h"
|
||||||
|
#include <vita2d_fbo.h>
|
||||||
|
|
||||||
|
class PSP2SdlGraphicsManager : public SurfaceSdlGraphicsManager {
|
||||||
|
public:
|
||||||
|
PSP2SdlGraphicsManager(SdlEventSource *sdlEventSource, SdlWindow *window);
|
||||||
|
virtual ~PSP2SdlGraphicsManager();
|
||||||
|
|
||||||
|
virtual OSystem::TransactionError endGFXTransaction();
|
||||||
|
virtual const OSystem::GraphicsMode *getSupportedShaders() const;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
virtual void setGraphicsModeIntern();
|
||||||
|
virtual void unloadGFXMode();
|
||||||
|
virtual bool hotswapGFXMode();
|
||||||
|
|
||||||
|
virtual void internUpdateScreen();
|
||||||
|
virtual void updateShader();
|
||||||
|
virtual void setAspectRatioCorrection(bool enable);
|
||||||
|
virtual SDL_Surface *SDL_SetVideoMode(int width, int height, int bpp, Uint32 flags);
|
||||||
|
void PSP2_UpdateRects(SDL_Surface *screen, int numrects, SDL_Rect *rects);
|
||||||
|
void PSP2_UpdateFiltering();
|
||||||
|
|
||||||
|
bool _hardwareAspectRatioCorrection;
|
||||||
|
vita2d_texture *_vitatex_hwscreen;
|
||||||
|
void *_sdlpixels_hwscreen;
|
||||||
|
vita2d_shader *_shaders[6];
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
|
@ -43,6 +43,11 @@
|
||||||
#include "graphics/surface.h"
|
#include "graphics/surface.h"
|
||||||
#include "gui/EventRecorder.h"
|
#include "gui/EventRecorder.h"
|
||||||
|
|
||||||
|
static const OSystem::GraphicsMode s_supportedShaders[] = {
|
||||||
|
{"NONE", "Normal (no shader)", 0},
|
||||||
|
{0, 0, 0}
|
||||||
|
};
|
||||||
|
|
||||||
static const OSystem::GraphicsMode s_supportedGraphicsModes[] = {
|
static const OSystem::GraphicsMode s_supportedGraphicsModes[] = {
|
||||||
{"1x", _s("Normal (no scaling)"), GFX_NORMAL},
|
{"1x", _s("Normal (no scaling)"), GFX_NORMAL},
|
||||||
#ifdef USE_SCALERS
|
#ifdef USE_SCALERS
|
||||||
|
@ -194,6 +199,23 @@ SurfaceSdlGraphicsManager::SurfaceSdlGraphicsManager(SdlEventSource *sdlEventSou
|
||||||
#if SDL_VERSION_ATLEAST(2, 0, 0)
|
#if SDL_VERSION_ATLEAST(2, 0, 0)
|
||||||
_videoMode.filtering = ConfMan.getBool("filtering");
|
_videoMode.filtering = ConfMan.getBool("filtering");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
if (g_system->hasFeature(OSystem::kFeatureShader)) {
|
||||||
|
// shader number 0 is the entry NONE (no shader)
|
||||||
|
const OSystem::GraphicsMode *p = s_supportedShaders;
|
||||||
|
_numShaders = 0;
|
||||||
|
while (p->name) {
|
||||||
|
_numShaders++;
|
||||||
|
p++;
|
||||||
|
}
|
||||||
|
_currentShader = ConfMan.getInt("shader");
|
||||||
|
if (_currentShader < 0 || _currentShader >= _numShaders) {
|
||||||
|
_currentShader = 0;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
_numShaders = 1;
|
||||||
|
_currentShader = 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
SurfaceSdlGraphicsManager::~SurfaceSdlGraphicsManager() {
|
SurfaceSdlGraphicsManager::~SurfaceSdlGraphicsManager() {
|
||||||
|
@ -602,6 +624,8 @@ void SurfaceSdlGraphicsManager::setGraphicsModeIntern() {
|
||||||
Common::StackLock lock(_graphicsMutex);
|
Common::StackLock lock(_graphicsMutex);
|
||||||
ScalerProc *newScalerProc = 0;
|
ScalerProc *newScalerProc = 0;
|
||||||
|
|
||||||
|
updateShader();
|
||||||
|
|
||||||
switch (_videoMode.mode) {
|
switch (_videoMode.mode) {
|
||||||
case GFX_NORMAL:
|
case GFX_NORMAL:
|
||||||
newScalerProc = Normal1x;
|
newScalerProc = Normal1x;
|
||||||
|
@ -676,6 +700,21 @@ int SurfaceSdlGraphicsManager::getGraphicsMode() const {
|
||||||
return _videoMode.mode;
|
return _videoMode.mode;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const OSystem::GraphicsMode *SurfaceSdlGraphicsManager::getSupportedShaders() const {
|
||||||
|
return s_supportedShaders;
|
||||||
|
}
|
||||||
|
|
||||||
|
int SurfaceSdlGraphicsManager::getShader() {
|
||||||
|
return _currentShader;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool SurfaceSdlGraphicsManager::setShader(int id) {
|
||||||
|
assert(id >= 0 && id < _numShaders);
|
||||||
|
_currentShader = id;
|
||||||
|
updateShader();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
void SurfaceSdlGraphicsManager::initSize(uint w, uint h, const Graphics::PixelFormat *format) {
|
void SurfaceSdlGraphicsManager::initSize(uint w, uint h, const Graphics::PixelFormat *format) {
|
||||||
assert(_transactionMode == kTransactionActive);
|
assert(_transactionMode == kTransactionActive);
|
||||||
|
|
||||||
|
@ -996,10 +1035,18 @@ bool SurfaceSdlGraphicsManager::hotswapGFXMode() {
|
||||||
_overlayscreen = NULL;
|
_overlayscreen = NULL;
|
||||||
|
|
||||||
// Release the HW screen surface
|
// Release the HW screen surface
|
||||||
SDL_FreeSurface(_hwscreen); _hwscreen = NULL;
|
if (_hwscreen) {
|
||||||
|
SDL_FreeSurface(_hwscreen);
|
||||||
SDL_FreeSurface(_tmpscreen); _tmpscreen = NULL;
|
_hwscreen = NULL;
|
||||||
SDL_FreeSurface(_tmpscreen2); _tmpscreen2 = NULL;
|
}
|
||||||
|
if (_tmpscreen) {
|
||||||
|
SDL_FreeSurface(_tmpscreen);
|
||||||
|
_tmpscreen = NULL;
|
||||||
|
}
|
||||||
|
if (_tmpscreen2) {
|
||||||
|
SDL_FreeSurface(_tmpscreen2);
|
||||||
|
_tmpscreen2 = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
// Setup the new GFX mode
|
// Setup the new GFX mode
|
||||||
if (!loadGFXMode()) {
|
if (!loadGFXMode()) {
|
||||||
|
@ -1039,6 +1086,17 @@ void SurfaceSdlGraphicsManager::updateScreen() {
|
||||||
internUpdateScreen();
|
internUpdateScreen();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SurfaceSdlGraphicsManager::updateShader() {
|
||||||
|
// shader init code goes here
|
||||||
|
// currently only used on Vita port
|
||||||
|
// the user-selected shaderID should be obtained via ConfMan.getInt("shader")
|
||||||
|
// and the corresponding shader should then be activated here
|
||||||
|
// this way the user can combine any software scaling (scalers)
|
||||||
|
// with any hardware shading (shaders). The shaders could provide
|
||||||
|
// scanline masks, overlays, but could also serve for
|
||||||
|
// hardware-based up-scaling (sharp-bilinear-simple, etc.)
|
||||||
|
}
|
||||||
|
|
||||||
void SurfaceSdlGraphicsManager::internUpdateScreen() {
|
void SurfaceSdlGraphicsManager::internUpdateScreen() {
|
||||||
SDL_Surface *srcSurf, *origSurf;
|
SDL_Surface *srcSurf, *origSurf;
|
||||||
int height, width;
|
int height, width;
|
||||||
|
@ -2554,6 +2612,7 @@ void SurfaceSdlGraphicsManager::deinitializeRenderer() {
|
||||||
SDL_DestroyRenderer(_renderer);
|
SDL_DestroyRenderer(_renderer);
|
||||||
_renderer = nullptr;
|
_renderer = nullptr;
|
||||||
|
|
||||||
|
if (_window)
|
||||||
_window->destroyWindow();
|
_window->destroyWindow();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -105,6 +105,9 @@ public:
|
||||||
virtual Graphics::PixelFormat getScreenFormat() const { return _screenFormat; }
|
virtual Graphics::PixelFormat getScreenFormat() const { return _screenFormat; }
|
||||||
virtual Common::List<Graphics::PixelFormat> getSupportedFormats() const;
|
virtual Common::List<Graphics::PixelFormat> getSupportedFormats() const;
|
||||||
#endif
|
#endif
|
||||||
|
virtual const OSystem::GraphicsMode *getSupportedShaders() const;
|
||||||
|
virtual int getShader();
|
||||||
|
virtual bool setShader(int id);
|
||||||
virtual void initSize(uint w, uint h, const Graphics::PixelFormat *format = NULL);
|
virtual void initSize(uint w, uint h, const Graphics::PixelFormat *format = NULL);
|
||||||
virtual int getScreenChangeID() const { return _screenChangeCount; }
|
virtual int getScreenChangeID() const { return _screenChangeCount; }
|
||||||
|
|
||||||
|
@ -200,7 +203,7 @@ protected:
|
||||||
void setWindowResolution(int width, int height);
|
void setWindowResolution(int width, int height);
|
||||||
void recreateScreenTexture();
|
void recreateScreenTexture();
|
||||||
|
|
||||||
SDL_Surface *SDL_SetVideoMode(int width, int height, int bpp, Uint32 flags);
|
virtual SDL_Surface *SDL_SetVideoMode(int width, int height, int bpp, Uint32 flags);
|
||||||
void SDL_UpdateRects(SDL_Surface *screen, int numrects, SDL_Rect *rects);
|
void SDL_UpdateRects(SDL_Surface *screen, int numrects, SDL_Rect *rects);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -302,6 +305,9 @@ protected:
|
||||||
|
|
||||||
int _screenChangeCount;
|
int _screenChangeCount;
|
||||||
|
|
||||||
|
int _currentShader;
|
||||||
|
int _numShaders;
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
NUM_DIRTY_RECT = 100,
|
NUM_DIRTY_RECT = 100,
|
||||||
MAX_SCALING = 3
|
MAX_SCALING = 3
|
||||||
|
@ -384,6 +390,7 @@ protected:
|
||||||
virtual void blitCursor();
|
virtual void blitCursor();
|
||||||
|
|
||||||
virtual void internUpdateScreen();
|
virtual void internUpdateScreen();
|
||||||
|
virtual void updateShader();
|
||||||
|
|
||||||
virtual bool loadGFXMode();
|
virtual bool loadGFXMode();
|
||||||
virtual void unloadGFXMode();
|
virtual void unloadGFXMode();
|
||||||
|
|
|
@ -32,7 +32,7 @@
|
||||||
|
|
||||||
#if defined(GP2X)
|
#if defined(GP2X)
|
||||||
#define SAMPLES_PER_SEC 11025
|
#define SAMPLES_PER_SEC 11025
|
||||||
#elif defined(PLAYSTATION3)
|
#elif defined(PLAYSTATION3) || defined(PSP2)
|
||||||
#define SAMPLES_PER_SEC 48000
|
#define SAMPLES_PER_SEC 48000
|
||||||
#else
|
#else
|
||||||
#define SAMPLES_PER_SEC 44100
|
#define SAMPLES_PER_SEC 44100
|
||||||
|
|
|
@ -81,6 +81,18 @@ int ModularBackend::getGraphicsMode() const {
|
||||||
return _graphicsManager->getGraphicsMode();
|
return _graphicsManager->getGraphicsMode();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const OSystem::GraphicsMode *ModularBackend::getSupportedShaders() const {
|
||||||
|
return _graphicsManager->getSupportedShaders();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ModularBackend::setShader(int id) {
|
||||||
|
return _graphicsManager->setShader(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
int ModularBackend::getShader() const {
|
||||||
|
return _graphicsManager->getShader();
|
||||||
|
}
|
||||||
|
|
||||||
void ModularBackend::resetGraphicsScale() {
|
void ModularBackend::resetGraphicsScale() {
|
||||||
_graphicsManager->resetGraphicsScale();
|
_graphicsManager->resetGraphicsScale();
|
||||||
}
|
}
|
||||||
|
|
|
@ -66,6 +66,9 @@ public:
|
||||||
virtual int getDefaultGraphicsMode() const;
|
virtual int getDefaultGraphicsMode() const;
|
||||||
virtual bool setGraphicsMode(int mode);
|
virtual bool setGraphicsMode(int mode);
|
||||||
virtual int getGraphicsMode() const;
|
virtual int getGraphicsMode() const;
|
||||||
|
virtual const GraphicsMode *getSupportedShaders() const;
|
||||||
|
virtual int getShader() const;
|
||||||
|
virtual bool setShader(int id);
|
||||||
virtual void resetGraphicsScale();
|
virtual void resetGraphicsScale();
|
||||||
#ifdef USE_RGB_COLOR
|
#ifdef USE_RGB_COLOR
|
||||||
virtual Graphics::PixelFormat getScreenFormat() const;
|
virtual Graphics::PixelFormat getScreenFormat() const;
|
||||||
|
|
|
@ -290,6 +290,15 @@ MODULE_OBJS += \
|
||||||
timer/psp/timer.o
|
timer/psp/timer.o
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
ifeq ($(BACKEND),psp2)
|
||||||
|
MODULE_OBJS += \
|
||||||
|
fs/posix/posix-fs.o \
|
||||||
|
fs/psp2/psp2-fs-factory.o \
|
||||||
|
fs/psp2/psp2-dirent.o \
|
||||||
|
events/psp2sdl/psp2sdl-events.o \
|
||||||
|
graphics/psp2sdl/psp2sdl-graphics.o
|
||||||
|
endif
|
||||||
|
|
||||||
ifeq ($(BACKEND),samsungtv)
|
ifeq ($(BACKEND),samsungtv)
|
||||||
MODULE_OBJS += \
|
MODULE_OBJS += \
|
||||||
events/samsungtvsdl/samsungtvsdl-events.o \
|
events/samsungtvsdl/samsungtvsdl-events.o \
|
||||||
|
|
|
@ -37,6 +37,13 @@ MODULE_OBJS += \
|
||||||
ps3/ps3.o
|
ps3/ps3.o
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
ifdef PSP2
|
||||||
|
CC=arm-vita-eabi-gcc
|
||||||
|
MODULE_OBJS += \
|
||||||
|
psp2/psp2-main.o \
|
||||||
|
psp2/psp2.o
|
||||||
|
endif
|
||||||
|
|
||||||
# We don't use rules.mk but rather manually update OBJS and MODULE_DIRS.
|
# We don't use rules.mk but rather manually update OBJS and MODULE_DIRS.
|
||||||
MODULE_OBJS := $(addprefix $(MODULE)/, $(MODULE_OBJS))
|
MODULE_OBJS := $(addprefix $(MODULE)/, $(MODULE_OBJS))
|
||||||
OBJS := $(MODULE_OBJS) $(OBJS)
|
OBJS := $(MODULE_OBJS) $(OBJS)
|
||||||
|
|
|
@ -22,7 +22,7 @@
|
||||||
|
|
||||||
#include "common/scummsys.h"
|
#include "common/scummsys.h"
|
||||||
|
|
||||||
#if defined(POSIX) && !defined(MACOSX) && !defined(SAMSUNGTV) && !defined(MAEMO) && !defined(WEBOS) && !defined(LINUXMOTO) && !defined(GPH_DEVICE) && !defined(GP2X) && !defined(DINGUX) && !defined(OPENPANDORA) && !defined(PLAYSTATION3) && !defined(ANDROIDSDL)
|
#if defined(POSIX) && !defined(MACOSX) && !defined(SAMSUNGTV) && !defined(MAEMO) && !defined(WEBOS) && !defined(LINUXMOTO) && !defined(GPH_DEVICE) && !defined(GP2X) && !defined(DINGUX) && !defined(OPENPANDORA) && !defined(PLAYSTATION3) && !defined(PSP2) && !defined(ANDROIDSDL)
|
||||||
|
|
||||||
#include "backends/platform/sdl/posix/posix.h"
|
#include "backends/platform/sdl/posix/posix.h"
|
||||||
#include "backends/plugins/sdl/sdl-provider.h"
|
#include "backends/plugins/sdl/sdl-provider.h"
|
||||||
|
|
66
backends/platform/sdl/psp2/psp2-main.cpp
Normal file
66
backends/platform/sdl/psp2/psp2-main.cpp
Normal file
|
@ -0,0 +1,66 @@
|
||||||
|
/* ScummVM - Graphic Adventure Engine
|
||||||
|
*
|
||||||
|
* ScummVM is the legal property of its developers, whose names
|
||||||
|
* are too numerous to list here. Please refer to the COPYRIGHT
|
||||||
|
* file distributed with this source distribution.
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU General Public License
|
||||||
|
* as published by the Free Software Foundation; either version 2
|
||||||
|
* of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <psp2/kernel/processmgr.h>
|
||||||
|
#include <psp2/power.h>
|
||||||
|
|
||||||
|
#include "common/scummsys.h"
|
||||||
|
#include "backends/platform/sdl/psp2/psp2.h"
|
||||||
|
#include "backends/plugins/sdl/sdl-provider.h"
|
||||||
|
#include "base/main.h"
|
||||||
|
|
||||||
|
int _newlib_heap_size_user = 192 * 1024 * 1024;
|
||||||
|
|
||||||
|
int main(int argc, char *argv[]) {
|
||||||
|
|
||||||
|
#ifdef __PSP2_DEBUG__
|
||||||
|
psp2shell_init(3333, 10);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
scePowerSetArmClockFrequency(444);
|
||||||
|
scePowerSetBusClockFrequency(222);
|
||||||
|
scePowerSetGpuClockFrequency(222);
|
||||||
|
scePowerSetGpuXbarClockFrequency(166);
|
||||||
|
|
||||||
|
// Create our OSystem instance
|
||||||
|
g_system = new OSystem_PSP2();
|
||||||
|
assert(g_system);
|
||||||
|
|
||||||
|
// Pre initialize the backend
|
||||||
|
((OSystem_PSP2 *)g_system)->init();
|
||||||
|
|
||||||
|
#ifdef DYNAMIC_MODULES
|
||||||
|
PluginManager::instance().addPluginProvider(new SDLPluginProvider());
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Invoke the actual ScummVM main entry point:
|
||||||
|
int res = scummvm_main(argc, argv);
|
||||||
|
|
||||||
|
// Free OSystem
|
||||||
|
delete (OSystem_PSP2 *)g_system;
|
||||||
|
|
||||||
|
#ifdef __PSP2_DEBUG__
|
||||||
|
psp2shell_exit();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return res;
|
||||||
|
}
|
143
backends/platform/sdl/psp2/psp2.cpp
Normal file
143
backends/platform/sdl/psp2/psp2.cpp
Normal file
|
@ -0,0 +1,143 @@
|
||||||
|
/* ScummVM - Graphic Adventure Engine
|
||||||
|
*
|
||||||
|
* ScummVM is the legal property of its developers, whose names
|
||||||
|
* are too numerous to list here. Please refer to the COPYRIGHT
|
||||||
|
* file distributed with this source distribution.
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU General Public License
|
||||||
|
* as published by the Free Software Foundation; either version 2
|
||||||
|
* of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define FORBIDDEN_SYMBOL_EXCEPTION_mkdir
|
||||||
|
#define FORBIDDEN_SYMBOL_EXCEPTION_time_h // sys/stat.h includes sys/time.h
|
||||||
|
#define FORBIDDEN_SYMBOL_EXCEPTION_unistd_h
|
||||||
|
|
||||||
|
#include "common/scummsys.h"
|
||||||
|
#include "common/config-manager.h"
|
||||||
|
#include "common/debug-channels.h"
|
||||||
|
#include "backends/platform/sdl/psp2/psp2.h"
|
||||||
|
#include "backends/graphics/psp2sdl/psp2sdl-graphics.h"
|
||||||
|
#include "backends/saves/default/default-saves.h"
|
||||||
|
|
||||||
|
#include "backends/fs/psp2/psp2-fs-factory.h"
|
||||||
|
#include "backends/events/psp2sdl/psp2sdl-events.h"
|
||||||
|
#include "backends/fs/psp2/psp2-dirent.h"
|
||||||
|
#include <sys/stat.h>
|
||||||
|
|
||||||
|
#ifdef __PSP2_DEBUG__
|
||||||
|
#include <psp2shell.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
int access(const char *pathname, int mode) {
|
||||||
|
struct stat sb;
|
||||||
|
|
||||||
|
if (stat(pathname, &sb) == -1) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
OSystem_PSP2::OSystem_PSP2(Common::String baseConfigName)
|
||||||
|
: _baseConfigName(baseConfigName) {
|
||||||
|
}
|
||||||
|
|
||||||
|
void OSystem_PSP2::init() {
|
||||||
|
|
||||||
|
#if __PSP2_DEBUG__
|
||||||
|
gDebugLevel = 3;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Initialze File System Factory
|
||||||
|
sceIoMkdir("ux0:data", 0755);
|
||||||
|
sceIoMkdir("ux0:data/scummvm", 0755);
|
||||||
|
sceIoMkdir("ux0:data/scummvm/saves", 0755);
|
||||||
|
_fsFactory = new PSP2FilesystemFactory();
|
||||||
|
|
||||||
|
// Invoke parent implementation of this method
|
||||||
|
OSystem_SDL::init();
|
||||||
|
}
|
||||||
|
|
||||||
|
void OSystem_PSP2::initBackend() {
|
||||||
|
|
||||||
|
ConfMan.set("joystick_num", 0);
|
||||||
|
ConfMan.set("vkeybdpath", PREFIX "/data");
|
||||||
|
ConfMan.registerDefault("fullscreen", true);
|
||||||
|
ConfMan.registerDefault("aspect_ratio", false);
|
||||||
|
ConfMan.registerDefault("gfx_mode", "2x");
|
||||||
|
ConfMan.registerDefault("filtering", true);
|
||||||
|
ConfMan.registerDefault("kbdmouse_speed", 3);
|
||||||
|
ConfMan.registerDefault("joystick_deadzone", 2);
|
||||||
|
ConfMan.registerDefault("shader", 0);
|
||||||
|
|
||||||
|
if (!ConfMan.hasKey("fullscreen")) {
|
||||||
|
ConfMan.setBool("fullscreen", true);
|
||||||
|
}
|
||||||
|
if (!ConfMan.hasKey("aspect_ratio")) {
|
||||||
|
ConfMan.setBool("aspect_ratio", false);
|
||||||
|
}
|
||||||
|
if (!ConfMan.hasKey("gfx_mode")) {
|
||||||
|
ConfMan.set("gfx_mode", "2x");
|
||||||
|
}
|
||||||
|
if (!ConfMan.hasKey("filtering")) {
|
||||||
|
ConfMan.setBool("filtering", true);
|
||||||
|
}
|
||||||
|
if (!ConfMan.hasKey("kbdmouse_speed")) {
|
||||||
|
ConfMan.setInt("kbdmouse_speed", 3);
|
||||||
|
}
|
||||||
|
if (!ConfMan.hasKey("joystick_deadzone")) {
|
||||||
|
ConfMan.setInt("joystick_deadzone", 2);
|
||||||
|
}
|
||||||
|
if (!ConfMan.hasKey("shader")) {
|
||||||
|
ConfMan.setInt("shader", 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create the savefile manager
|
||||||
|
if (_savefileManager == 0)
|
||||||
|
_savefileManager = new DefaultSaveFileManager("ux0:data/scummvm/saves");
|
||||||
|
|
||||||
|
// Event source
|
||||||
|
if (_eventSource == 0)
|
||||||
|
_eventSource = new PSP2EventSource();
|
||||||
|
|
||||||
|
// Graphics Manager
|
||||||
|
if (_graphicsManager == 0)
|
||||||
|
_graphicsManager = new PSP2SdlGraphicsManager(_eventSource, _window);
|
||||||
|
|
||||||
|
// Invoke parent implementation of this method
|
||||||
|
OSystem_SDL::initBackend();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool OSystem_PSP2::hasFeature(Feature f) {
|
||||||
|
return (f == kFeatureKbdMouseSpeed ||
|
||||||
|
f == kFeatureJoystickDeadzone ||
|
||||||
|
f == kFeatureShader ||
|
||||||
|
OSystem_SDL::hasFeature(f));
|
||||||
|
}
|
||||||
|
|
||||||
|
void OSystem_PSP2::logMessage(LogMessageType::Type type, const char *message) {
|
||||||
|
#if __PSP2_DEBUG__
|
||||||
|
psp2shell_print(message);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
Common::String OSystem_PSP2::getDefaultConfigFileName() {
|
||||||
|
return "ux0:data/scummvm/" + _baseConfigName;
|
||||||
|
}
|
||||||
|
|
||||||
|
Common::WriteStream *OSystem_PSP2::createLogFile() {
|
||||||
|
Common::FSNode file("ux0:data/scummvm/scummvm.log");
|
||||||
|
return file.createWriteStream();
|
||||||
|
}
|
52
backends/platform/sdl/psp2/psp2.h
Normal file
52
backends/platform/sdl/psp2/psp2.h
Normal file
|
@ -0,0 +1,52 @@
|
||||||
|
/* ScummVM - Graphic Adventure Engine
|
||||||
|
*
|
||||||
|
* ScummVM is the legal property of its developers, whose names
|
||||||
|
* are too numerous to list here. Please refer to the COPYRIGHT
|
||||||
|
* file distributed with this source distribution.
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU General Public License
|
||||||
|
* as published by the Free Software Foundation; either version 2
|
||||||
|
* of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef PLATFORM_SDL_PSP2_H
|
||||||
|
#define PLATFORM_SDL_PSP2_H
|
||||||
|
|
||||||
|
#include "backends/platform/sdl/sdl.h"
|
||||||
|
#ifdef __PSP2_DEBUG__
|
||||||
|
#include <psp2shell.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
class OSystem_PSP2 : public OSystem_SDL {
|
||||||
|
public:
|
||||||
|
// Let the subclasses be able to change _baseConfigName in the constructor
|
||||||
|
OSystem_PSP2(Common::String baseConfigName = "scummvm.ini");
|
||||||
|
virtual ~OSystem_PSP2() {}
|
||||||
|
|
||||||
|
virtual void init();
|
||||||
|
virtual void initBackend();
|
||||||
|
virtual bool hasFeature(Feature f);
|
||||||
|
virtual void logMessage(LogMessageType::Type type, const char *message);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
// Base string for creating the default path and filename
|
||||||
|
// for the configuration file
|
||||||
|
Common::String _baseConfigName;
|
||||||
|
|
||||||
|
virtual Common::String getDefaultConfigFileName();
|
||||||
|
|
||||||
|
virtual Common::WriteStream *createLogFile();
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
26
backends/platform/sdl/psp2/psp2.mk
Normal file
26
backends/platform/sdl/psp2/psp2.mk
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
DATE := $(shell date +%y-%m-%d)
|
||||||
|
|
||||||
|
psp2vpk: $(EXECUTABLE)
|
||||||
|
rm -rf psp2pkg
|
||||||
|
rm -f $(EXECUTABLE)-$(DATE).vpk
|
||||||
|
mkdir -p psp2pkg/sce_sys/livearea/contents
|
||||||
|
mkdir -p psp2pkg/data/
|
||||||
|
mkdir -p psp2pkg/doc/
|
||||||
|
vita-elf-create $(EXECUTABLE) $(EXECUTABLE).velf
|
||||||
|
vita-make-fself -s -c $(EXECUTABLE).velf psp2pkg/eboot.bin
|
||||||
|
vita-mksfoex -s TITLE_ID=VSCU00001 "$(EXECUTABLE)" psp2pkg/sce_sys/param.sfo
|
||||||
|
cp $(srcdir)/dists/psp2/icon0.png psp2pkg/sce_sys/
|
||||||
|
cp $(srcdir)/dists/psp2/template.xml psp2pkg/sce_sys/livearea/contents/
|
||||||
|
cp $(srcdir)/dists/psp2/bg.png psp2pkg/sce_sys/livearea/contents/
|
||||||
|
cp $(srcdir)/dists/psp2/startup.png psp2pkg/sce_sys/livearea/contents/
|
||||||
|
cp $(srcdir)/backends/vkeybd/packs/vkeybd_default.zip psp2pkg/data/
|
||||||
|
cp $(srcdir)/backends/vkeybd/packs/vkeybd_small.zip psp2pkg/data/
|
||||||
|
cp $(DIST_FILES_THEMES) psp2pkg/data/
|
||||||
|
ifdef DIST_FILES_ENGINEDATA
|
||||||
|
cp $(DIST_FILES_ENGINEDATA) psp2pkg/data/
|
||||||
|
endif
|
||||||
|
cp $(DIST_FILES_DOCS) psp2pkg/doc/
|
||||||
|
cp $(srcdir)/dists/psp2/readme-psp2.md psp2pkg/doc/
|
||||||
|
cd psp2pkg && zip -r ../$(EXECUTABLE)-$(DATE).vpk . && cd ..
|
||||||
|
|
||||||
|
.PHONY: psp2vpk
|
|
@ -361,7 +361,12 @@ public:
|
||||||
/**
|
/**
|
||||||
* change analog joystick deadzone
|
* change analog joystick deadzone
|
||||||
*/
|
*/
|
||||||
kFeatureJoystickDeadzone
|
kFeatureJoystickDeadzone,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* shaders
|
||||||
|
*/
|
||||||
|
kFeatureShader
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -572,6 +577,34 @@ public:
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieve a list of all hardware shaders supported by this backend.
|
||||||
|
* This can be only hardware shaders.
|
||||||
|
* it is completely up to the backend maintainer to decide what is
|
||||||
|
* appropriate here and what not.
|
||||||
|
* The list is terminated by an all-zero entry.
|
||||||
|
* @return a list of supported shaders
|
||||||
|
*/
|
||||||
|
virtual const GraphicsMode *getSupportedShaders() const {
|
||||||
|
static const OSystem::GraphicsMode no_shader[2] = {{"NONE", "Normal (no shader)", 0}, {0, 0, 0}};
|
||||||
|
return no_shader;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Switch to the specified shader mode. If switching to the new mode
|
||||||
|
* failed, this method returns false.
|
||||||
|
*
|
||||||
|
* @param mode the ID of the new shader mode
|
||||||
|
* @return true if the switch was successful, false otherwise
|
||||||
|
*/
|
||||||
|
virtual bool setShader(int id) { return false; }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Determine which shader is currently active.
|
||||||
|
* @return the ID of the active shader
|
||||||
|
*/
|
||||||
|
virtual int getShader() { return 0; }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set the size and color format of the virtual screen. Typical sizes include:
|
* Set the size and color format of the virtual screen. Typical sizes include:
|
||||||
* - 320x200 (e.g. for most SCUMM games, and Simon)
|
* - 320x200 (e.g. for most SCUMM games, and Simon)
|
||||||
|
|
81
configure
vendored
81
configure
vendored
|
@ -883,7 +883,7 @@ Configuration:
|
||||||
-h, --help display this help and exit
|
-h, --help display this help and exit
|
||||||
--backend=BACKEND backend to build (3ds, android, dc, dingux, ds, gcw0,
|
--backend=BACKEND backend to build (3ds, android, dc, dingux, ds, gcw0,
|
||||||
gph, iphone, ios7, linuxmoto, maemo, n64, null, openpandora,
|
gph, iphone, ios7, linuxmoto, maemo, n64, null, openpandora,
|
||||||
ps2, psp, samsungtv, sdl, tizen, webos, wii, wince) [sdl]
|
ps2, psp, psp2, samsungtv, sdl, tizen, webos, wii, wince) [sdl]
|
||||||
|
|
||||||
Installation directories:
|
Installation directories:
|
||||||
--prefix=PREFIX install architecture-independent files in PREFIX
|
--prefix=PREFIX install architecture-independent files in PREFIX
|
||||||
|
@ -934,6 +934,7 @@ Special configuration feature:
|
||||||
ouya for OUYA
|
ouya for OUYA
|
||||||
ps2 for PlayStation 2
|
ps2 for PlayStation 2
|
||||||
ps3 for PlayStation 3
|
ps3 for PlayStation 3
|
||||||
|
psp2 for PlayStation Vita
|
||||||
psp for PlayStation Portable
|
psp for PlayStation Portable
|
||||||
samsungtv for Samsung TV
|
samsungtv for Samsung TV
|
||||||
tizen for Samsung Tizen
|
tizen for Samsung Tizen
|
||||||
|
@ -1559,6 +1560,22 @@ ps3)
|
||||||
datadir='${datarootdir}'
|
datadir='${datarootdir}'
|
||||||
docdir='${prefix}/doc'
|
docdir='${prefix}/doc'
|
||||||
;;
|
;;
|
||||||
|
psp2)
|
||||||
|
_host_os=psp2
|
||||||
|
_host_cpu=arm
|
||||||
|
_host_alias=arm-vita-eabi
|
||||||
|
|
||||||
|
# The prefix is always the same on PSP2 so we hardcode the default
|
||||||
|
# here. It is still possible to define a custom prefix which is
|
||||||
|
# needed when packaging the app with a user-specific app ID.
|
||||||
|
test "x$prefix" = xNONE && prefix=app0:
|
||||||
|
# PSP2 apps are installed into app-specific directories. The
|
||||||
|
# default directory structure of ScummVM makes no sense here so we
|
||||||
|
# hardcode PSP2 specific directories here.
|
||||||
|
datarootdir='${prefix}/data'
|
||||||
|
datadir='${datarootdir}'
|
||||||
|
docdir='${prefix}/doc'
|
||||||
|
;;
|
||||||
psp)
|
psp)
|
||||||
_host_os=psp
|
_host_os=psp
|
||||||
_host_cpu=mipsallegrexel
|
_host_cpu=mipsallegrexel
|
||||||
|
@ -1625,7 +1642,7 @@ fi
|
||||||
#
|
#
|
||||||
|
|
||||||
case $_host in
|
case $_host in
|
||||||
caanoo | gp2x | gp2xwiz | openpandora | ps2)
|
caanoo | gp2x | gp2xwiz | openpandora | ps2 | psp2)
|
||||||
if test "$_debug_build" = auto; then
|
if test "$_debug_build" = auto; then
|
||||||
# If you want to debug one of these platforms, use '--disable-optimizations --enable-debug'
|
# If you want to debug one of these platforms, use '--disable-optimizations --enable-debug'
|
||||||
_debug_build=no
|
_debug_build=no
|
||||||
|
@ -1719,6 +1736,12 @@ ps3)
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
;;
|
;;
|
||||||
|
psp2)
|
||||||
|
if test -z "$VITASDK"; then
|
||||||
|
echo "Please set VITASDK in your environment. export VITASDK=<path to psp2 toolchain>"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
;;
|
||||||
psp)
|
psp)
|
||||||
if test -z "$PSPDEV"; then
|
if test -z "$PSPDEV"; then
|
||||||
PSPDEV=`psp-config --pspdev-path`
|
PSPDEV=`psp-config --pspdev-path`
|
||||||
|
@ -1947,7 +1970,7 @@ if test "$have_gcc" = yes ; then
|
||||||
case $_host_os in
|
case $_host_os in
|
||||||
# newlib-based system include files suppress non-C89 function
|
# newlib-based system include files suppress non-C89 function
|
||||||
# declarations under __STRICT_ANSI__
|
# declarations under __STRICT_ANSI__
|
||||||
3ds | amigaos* | android | androidsdl | dreamcast | ds | gamecube | mingw* | n64 | psp | ps2 | ps3 | tizen | wii | wince )
|
3ds | amigaos* | android | androidsdl | dreamcast | ds | gamecube | mingw* | n64 | psp | ps2 | ps3 | psp2 | tizen | wii | wince )
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
append_var CXXFLAGS "-ansi"
|
append_var CXXFLAGS "-ansi"
|
||||||
|
@ -2200,6 +2223,9 @@ case $_host_cpu in
|
||||||
;;
|
;;
|
||||||
arm-apple-darwin11)
|
arm-apple-darwin11)
|
||||||
;;
|
;;
|
||||||
|
# psvita does not like the asm code...
|
||||||
|
arm-vita-eabi)
|
||||||
|
;;
|
||||||
|
|
||||||
*)
|
*)
|
||||||
define_in_config_if_yes yes 'USE_ARM_SCALER_ASM'
|
define_in_config_if_yes yes 'USE_ARM_SCALER_ASM'
|
||||||
|
@ -2627,6 +2653,27 @@ case $_host_os in
|
||||||
add_line_to_config_mk 'PLAYSTATION3 = 1'
|
add_line_to_config_mk 'PLAYSTATION3 = 1'
|
||||||
add_line_to_config_h "#define PREFIX \"${prefix}\""
|
add_line_to_config_h "#define PREFIX \"${prefix}\""
|
||||||
;;
|
;;
|
||||||
|
psp2)
|
||||||
|
_freetypepath="$VITASDK/arm-vita-eabi/bin"
|
||||||
|
_freetype2=yes
|
||||||
|
_libcurlpath="$VITASDK/arm-vita-eabi/bin"
|
||||||
|
append_var CXXFLAGS "--sysroot=$VITASDK/arm-vita-eabi"
|
||||||
|
append_var LDFLAGS "--sysroot=$VITASDK/arm-vita-eabi"
|
||||||
|
append_var DEFINES "-DPSP2 -DSYSTEM_NOT_SUPPORTING_D_TYPE"
|
||||||
|
append_var CXXFLAGS "-Wl,-q -I$VITASDK/arm-vita-eabi/include"
|
||||||
|
append_var CXXFLAGS "-march=armv7-a -mtune=cortex-a9 -mfpu=neon -mfloat-abi=hard"
|
||||||
|
append_var LDFLAGS "-Wl,-q -L$VITASDK/arm-vita-eabi/lib"
|
||||||
|
if test "$_debug_build" = no; then
|
||||||
|
_optimization_level=-O1
|
||||||
|
fi
|
||||||
|
if test "$_debug_build" = yes; then
|
||||||
|
_optimization_level=-O0
|
||||||
|
append_var DEFINES "-D__PSP2_DEBUG__"
|
||||||
|
append_var LIBS "-lpsp2shell"
|
||||||
|
fi
|
||||||
|
add_line_to_config_mk 'PSP2 = 1'
|
||||||
|
add_line_to_config_h "#define PREFIX \"${prefix}\""
|
||||||
|
;;
|
||||||
psp)
|
psp)
|
||||||
if test -d "$PSPDEV/psp/lib"; then
|
if test -d "$PSPDEV/psp/lib"; then
|
||||||
append_var LDFLAGS "-L$PSPDEV/psp/lib"
|
append_var LDFLAGS "-L$PSPDEV/psp/lib"
|
||||||
|
@ -3121,6 +3168,16 @@ if test -n "$_host"; then
|
||||||
_eventrec=no
|
_eventrec=no
|
||||||
_port_mk="backends/platform/sdl/ps3/ps3.mk"
|
_port_mk="backends/platform/sdl/ps3/ps3.mk"
|
||||||
;;
|
;;
|
||||||
|
psp2)
|
||||||
|
_backend="psp2"
|
||||||
|
_vkeybd=yes
|
||||||
|
_build_scalers=yes
|
||||||
|
_build_hq_scalers=no
|
||||||
|
_mt32emu=no
|
||||||
|
_timidity=no
|
||||||
|
_eventrec=no
|
||||||
|
_port_mk="backends/platform/sdl/psp2/psp2.mk"
|
||||||
|
;;
|
||||||
psp)
|
psp)
|
||||||
_backend="psp"
|
_backend="psp"
|
||||||
_build_scalers=no
|
_build_scalers=no
|
||||||
|
@ -3294,6 +3351,17 @@ case $_backend in
|
||||||
append_var LIBS "-lpng"
|
append_var LIBS "-lpng"
|
||||||
append_var LIBS "-Wl,-Map,mapfile.txt"
|
append_var LIBS "-Wl,-Map,mapfile.txt"
|
||||||
;;
|
;;
|
||||||
|
psp2)
|
||||||
|
append_var LIBS "-lvitashaders -lSDL2 -lvita2d_fbo -lSceCommonDialog_stub"
|
||||||
|
append_var LIBS "-lSceSysmodule_stub -lSceDisplay_stub -lSceGxm_stub"
|
||||||
|
append_var LIBS "-lSceAudio_stub -lSceCtrl_stub -lScePower_stub"
|
||||||
|
append_var LIBS "-lSceNet_stub -lSceNetCtl_stub -lSceAppMgr_stub -lScePgf_stub"
|
||||||
|
append_var DEFINES "-DSDL_BACKEND"
|
||||||
|
add_line_to_config_mk "SDL_BACKEND = 1"
|
||||||
|
add_line_to_config_mk "USE_SDL2 = 1"
|
||||||
|
append_var MODULES "backends/platform/sdl"
|
||||||
|
append_var INCLUDES "-I$VITASDK/arm-vita-eabi/include/SDL2"
|
||||||
|
;;
|
||||||
samsungtv)
|
samsungtv)
|
||||||
append_var DEFINES "-DSAMSUNGTV"
|
append_var DEFINES "-DSAMSUNGTV"
|
||||||
append_var LDFLAGS "-shared"
|
append_var LDFLAGS "-shared"
|
||||||
|
@ -3404,7 +3472,7 @@ esac
|
||||||
# Enable 16bit support only for backends which support it
|
# Enable 16bit support only for backends which support it
|
||||||
#
|
#
|
||||||
case $_backend in
|
case $_backend in
|
||||||
3ds | android | androidsdl | dingux | dc | gph | iphone | ios7 | maemo | openpandora | psp | samsungtv | sdl | tizen | webos | wii)
|
3ds | android | androidsdl | dingux | dc | gph | iphone | ios7 | maemo | openpandora | psp | psp2 | samsungtv | sdl | tizen | webos | wii)
|
||||||
if test "$_16bit" = auto ; then
|
if test "$_16bit" = auto ; then
|
||||||
_16bit=yes
|
_16bit=yes
|
||||||
else
|
else
|
||||||
|
@ -3480,7 +3548,7 @@ esac
|
||||||
#
|
#
|
||||||
echo_n "Checking if host is POSIX compliant... "
|
echo_n "Checking if host is POSIX compliant... "
|
||||||
case $_host_os in
|
case $_host_os in
|
||||||
amigaos* | cygwin* | dreamcast | ds | gamecube | mingw* | n64 | ps2 | ps3 | psp | wii | wince)
|
amigaos* | cygwin* | dreamcast | ds | gamecube | mingw* | n64 | ps2 | ps3 | psp2 | psp | wii | wince)
|
||||||
_posix=no
|
_posix=no
|
||||||
;;
|
;;
|
||||||
3ds | android | androidsdl | beos* | bsd* | darwin* | freebsd* | gnu* | gph-linux | haiku* | hpux* | iphone | ios7 | irix*| k*bsd*-gnu* | linux* | maemo | mint* | netbsd* | openbsd* | solaris* | sunos* | uclinux* | webos)
|
3ds | android | androidsdl | beos* | bsd* | darwin* | freebsd* | gnu* | gph-linux | haiku* | hpux* | iphone | ios7 | irix*| k*bsd*-gnu* | linux* | maemo | mint* | netbsd* | openbsd* | solaris* | sunos* | uclinux* | webos)
|
||||||
|
@ -4189,6 +4257,9 @@ if test "$_libcurl" != "no"; then
|
||||||
amigaos*)
|
amigaos*)
|
||||||
append_var LIBCURL_LIBS "-lpthread"
|
append_var LIBCURL_LIBS "-lpthread"
|
||||||
;;
|
;;
|
||||||
|
psp2*)
|
||||||
|
append_var LIBCURL_LIBS "-lssl -lcrypto"
|
||||||
|
;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
if test "$_libcurl" = "auto"; then
|
if test "$_libcurl" = "auto"; then
|
||||||
|
|
BIN
dists/psp2/bg.png
Normal file
BIN
dists/psp2/bg.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 74 KiB |
BIN
dists/psp2/icon0.png
Normal file
BIN
dists/psp2/icon0.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 4.7 KiB |
64
dists/psp2/readme-psp2.md
Normal file
64
dists/psp2/readme-psp2.md
Normal file
|
@ -0,0 +1,64 @@
|
||||||
|
Prerequisites
|
||||||
|
=============
|
||||||
|
- A homebrew enabled PlayStation Vita console.
|
||||||
|
- At least one ScummVM supported game. The list of compatible games can be seen here: http://www.scummvm.org/compatibility/
|
||||||
|
The page http://wiki.scummvm.org/index.php/Where_to_get_the_games references some places where those games can be bought. Demonstration versions for most of the supported games are downloadable on http://scummvm.org/demos/
|
||||||
|
|
||||||
|
Installing
|
||||||
|
==========
|
||||||
|
From a computer, download the installable package. Unzip and copy the .vpk file it to the PlayStation Vita and install it.
|
||||||
|
|
||||||
|
Configuring and playing games
|
||||||
|
=============================
|
||||||
|
The user manual describes how to add games to ScummVM and launch them : http://wiki.scummvm.org/index.php/User_Manual
|
||||||
|
|
||||||
|
PlayStation Vita Specifics
|
||||||
|
==========================
|
||||||
|
Saves are wrote in the ux0:/data/scummvm/saves folder.
|
||||||
|
|
||||||
|
Joypad button mapping
|
||||||
|
=====================
|
||||||
|
- Left stick => Mouse
|
||||||
|
- R + Left stick => Slow Mouse
|
||||||
|
- Cross => Left mouse button
|
||||||
|
- Circle => Right mouse button
|
||||||
|
- DPad => Cursor Keys (useful for character motion)
|
||||||
|
- R + DPad => Diagonal Cursor Keys
|
||||||
|
- L Trigger => Game menu (F5)
|
||||||
|
- R Trigger => Shift (used to enable Mass Add in menu)
|
||||||
|
- Square => Period '.' (used to skip dialog lines)
|
||||||
|
- R + Square => Space ' '
|
||||||
|
- Triangle => Escape (used to skip cutscenes)
|
||||||
|
- R + Triangle => Return
|
||||||
|
- Start => ScummVM's global in-game menu
|
||||||
|
- Select => Toggle virtual keyboard
|
||||||
|
- R + Select => AGI predictive input dialog
|
||||||
|
|
||||||
|
Disclaimer
|
||||||
|
==========
|
||||||
|
Unauthorized distribution of an installable package with non freeware games included is a violation of the copyright law and is as such forbidden.
|
||||||
|
|
||||||
|
Building from source
|
||||||
|
====================
|
||||||
|
This port of ScummVM to the PSP2 is based on SDL2. It uses the open source SDK VITASDK.
|
||||||
|
|
||||||
|
The dependencies needed to build it are :
|
||||||
|
|
||||||
|
- The toolchain from https://github.com/vitadev/vdpm
|
||||||
|
- zlib, libpng, libjpeg-turbo, libogg, libvorbis, flac, curl, openssl, freetype, from https://github.com/vitadev/vdpm
|
||||||
|
- libmad from https://github.com/Cpasjuste/libmad-psp2
|
||||||
|
- SDL2 from https://github.com/Cpasjuste/SDL-Vita
|
||||||
|
- ScummVM from https://github.com/Cpasjuste/scummvm
|
||||||
|
- The fbo branch of libvita2d from https://github.com/frangarcj/vita2dlib/tree/fbo/libvita2d
|
||||||
|
copied under new names libvita2d_fbo.a in $VITASDK/arm-vita-eabi-gcc/lib and vita2d_fbo.h in $VITASDK/arm-vita-eabi-gcc/include. The renaming is necessary to prevent conflict with the official vita2d lib that comes with the VitaSDK.
|
||||||
|
- The pre-compiled gtu release of vita-shader-collection from https://github.com/frangarcj/vita-shader-collection/releases, copy all headers to $VITASDK/arm-vita-eabi-gcc/include and the library libvitashaders.a to $VITASDK/arm-vita-eabi-gcc/lib
|
||||||
|
|
||||||
|
Once all the dependencies are correctly setup, an installable package can be obtained from source by issuing the following command :
|
||||||
|
|
||||||
|
./configure --host=psp2 && make psp2vpk
|
||||||
|
|
||||||
|
Thanks
|
||||||
|
======
|
||||||
|
Xavier from consoleX for donating a ps vita device
|
||||||
|
xerpi for initial SDL2 port
|
||||||
|
VITASDK and henkaku developers
|
BIN
dists/psp2/startup.png
Normal file
BIN
dists/psp2/startup.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 27 KiB |
11
dists/psp2/template.xml
Normal file
11
dists/psp2/template.xml
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
|
||||||
|
<livearea style="a1" format-ver="01.00" content-rev="1">
|
||||||
|
<livearea-background>
|
||||||
|
<image>bg.png</image>
|
||||||
|
</livearea-background>
|
||||||
|
|
||||||
|
<gate>
|
||||||
|
<startup-image>startup.png</startup-image>
|
||||||
|
</gate>
|
||||||
|
</livearea>
|
|
@ -159,6 +159,9 @@ void OptionsDialog::init() {
|
||||||
_fullscreenCheckbox = 0;
|
_fullscreenCheckbox = 0;
|
||||||
_filteringCheckbox = 0;
|
_filteringCheckbox = 0;
|
||||||
_aspectCheckbox = 0;
|
_aspectCheckbox = 0;
|
||||||
|
_enableShaderSettings = false;
|
||||||
|
_shaderPopUpDesc = 0;
|
||||||
|
_shaderPopUp = 0;
|
||||||
_enableAudioSettings = false;
|
_enableAudioSettings = false;
|
||||||
_midiPopUp = 0;
|
_midiPopUp = 0;
|
||||||
_midiPopUpDesc = 0;
|
_midiPopUpDesc = 0;
|
||||||
|
@ -315,6 +318,14 @@ void OptionsDialog::build() {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Shader options
|
||||||
|
if (g_system->hasFeature(OSystem::kFeatureShader)) {
|
||||||
|
if (_shaderPopUp) {
|
||||||
|
int value = ConfMan.getInt("shader", _domain);
|
||||||
|
_shaderPopUp->setSelected(value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Audio options
|
// Audio options
|
||||||
if (!loadMusicDeviceSetting(_midiPopUp, "music_driver"))
|
if (!loadMusicDeviceSetting(_midiPopUp, "music_driver"))
|
||||||
_midiPopUp->setSelected(0);
|
_midiPopUp->setSelected(0);
|
||||||
|
@ -549,6 +560,18 @@ void OptionsDialog::apply() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Shader options
|
||||||
|
if (_enableShaderSettings) {
|
||||||
|
if (g_system->hasFeature(OSystem::kFeatureShader)) {
|
||||||
|
if (_shaderPopUp) {
|
||||||
|
if (ConfMan.getInt("shader", _domain) != _shaderPopUp->getSelectedTag()) {
|
||||||
|
ConfMan.setInt("shader", _shaderPopUp->getSelectedTag(), _domain);
|
||||||
|
g_system->setShader(_shaderPopUp->getSelectedTag());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Control options
|
// Control options
|
||||||
if (_enableControlSettings) {
|
if (_enableControlSettings) {
|
||||||
if (g_system->hasFeature(OSystem::kFeatureOnScreenControl)) {
|
if (g_system->hasFeature(OSystem::kFeatureOnScreenControl)) {
|
||||||
|
@ -967,6 +990,23 @@ void OptionsDialog::addControlControls(GuiObject *boss, const Common::String &pr
|
||||||
_enableControlSettings = true;
|
_enableControlSettings = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void OptionsDialog::addShaderControls(GuiObject *boss, const Common::String &prefix) {
|
||||||
|
// Shader selector
|
||||||
|
if (g_system->hasFeature(OSystem::kFeatureShader)) {
|
||||||
|
if (g_system->getOverlayWidth() > 320)
|
||||||
|
_shaderPopUpDesc = new StaticTextWidget(boss, prefix + "grShaderPopUpDesc", _("HW Shader:"), _("Different hardware shaders give different visual effects"));
|
||||||
|
else
|
||||||
|
_shaderPopUpDesc = new StaticTextWidget(boss, prefix + "grShaderPopUpDesc", _c("HW Shader:", "lowres"), _("Different hardware shaders give different visual effects"));
|
||||||
|
_shaderPopUp = new PopUpWidget(boss, prefix + "grShaderPopUp", _("Different shaders give different visual effects"));
|
||||||
|
const OSystem::GraphicsMode *p = g_system->getSupportedShaders();
|
||||||
|
while (p->name) {
|
||||||
|
_shaderPopUp->appendEntry(p->name, p->id);
|
||||||
|
p++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_enableShaderSettings = true;
|
||||||
|
}
|
||||||
|
|
||||||
void OptionsDialog::addGraphicControls(GuiObject *boss, const Common::String &prefix) {
|
void OptionsDialog::addGraphicControls(GuiObject *boss, const Common::String &prefix) {
|
||||||
const OSystem::GraphicsMode *gm = g_system->getSupportedGraphicsModes();
|
const OSystem::GraphicsMode *gm = g_system->getSupportedGraphicsModes();
|
||||||
Common::String context;
|
Common::String context;
|
||||||
|
@ -1421,6 +1461,15 @@ void GlobalOptionsDialog::build() {
|
||||||
_graphicsTabId = tab->addTab(g_system->getOverlayWidth() > 320 ? _("Graphics") : _("GFX"));
|
_graphicsTabId = tab->addTab(g_system->getOverlayWidth() > 320 ? _("Graphics") : _("GFX"));
|
||||||
addGraphicControls(tab, "GlobalOptions_Graphics.");
|
addGraphicControls(tab, "GlobalOptions_Graphics.");
|
||||||
|
|
||||||
|
//
|
||||||
|
// The shader tab (currently visible only for Vita platform), visibility checking by features
|
||||||
|
//
|
||||||
|
|
||||||
|
if (g_system->hasFeature(OSystem::kFeatureShader)) {
|
||||||
|
tab->addTab(_("Shader"));
|
||||||
|
addShaderControls(tab, "GlobalOptions_Shader.");
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// The control tab (currently visible only for AndroidSDL, SDL, and Vita platform, visibility checking by features
|
// The control tab (currently visible only for AndroidSDL, SDL, and Vita platform, visibility checking by features
|
||||||
//
|
//
|
||||||
|
|
|
@ -89,6 +89,7 @@ protected:
|
||||||
|
|
||||||
void addControlControls(GuiObject *boss, const Common::String &prefix);
|
void addControlControls(GuiObject *boss, const Common::String &prefix);
|
||||||
void addGraphicControls(GuiObject *boss, const Common::String &prefix);
|
void addGraphicControls(GuiObject *boss, const Common::String &prefix);
|
||||||
|
void addShaderControls(GuiObject *boss, const Common::String &prefix);
|
||||||
void addAudioControls(GuiObject *boss, const Common::String &prefix);
|
void addAudioControls(GuiObject *boss, const Common::String &prefix);
|
||||||
void addMIDIControls(GuiObject *boss, const Common::String &prefix);
|
void addMIDIControls(GuiObject *boss, const Common::String &prefix);
|
||||||
void addMT32Controls(GuiObject *boss, const Common::String &prefix);
|
void addMT32Controls(GuiObject *boss, const Common::String &prefix);
|
||||||
|
@ -143,6 +144,13 @@ private:
|
||||||
StaticTextWidget *_renderModePopUpDesc;
|
StaticTextWidget *_renderModePopUpDesc;
|
||||||
PopUpWidget *_renderModePopUp;
|
PopUpWidget *_renderModePopUp;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Shader controls
|
||||||
|
//
|
||||||
|
bool _enableShaderSettings;
|
||||||
|
StaticTextWidget *_shaderPopUpDesc;
|
||||||
|
PopUpWidget *_shaderPopUp;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Audio controls
|
// Audio controls
|
||||||
//
|
//
|
||||||
|
|
|
@ -877,6 +877,16 @@ const char *defaultXML1 = "<?xml version = '1.0'?>"
|
||||||
"/>"
|
"/>"
|
||||||
"</layout>"
|
"</layout>"
|
||||||
"</dialog>"
|
"</dialog>"
|
||||||
|
"<dialog name = 'GlobalOptions_Shader' overlays = 'Dialog.GlobalOptions.TabWidget'>"
|
||||||
|
"<layout type = 'horizontal' padding = '0, 0, 0, 0' spacing = '10' center = 'true'>"
|
||||||
|
"<widget name = 'grShaderPopUpDesc' "
|
||||||
|
"type = 'OptionsLabel' "
|
||||||
|
"/>"
|
||||||
|
"<widget name = 'grShaderPopUp' "
|
||||||
|
"type = 'PopUp' "
|
||||||
|
"/>"
|
||||||
|
"</layout>"
|
||||||
|
"</dialog>"
|
||||||
"<dialog name='GlobalOptions_Audio' overlays='Dialog.GlobalOptions.TabWidget'>"
|
"<dialog name='GlobalOptions_Audio' overlays='Dialog.GlobalOptions.TabWidget'>"
|
||||||
"<layout type='vertical' padding='16,16,16,16' spacing='8'>"
|
"<layout type='vertical' padding='16,16,16,16' spacing='8'>"
|
||||||
"<layout type='horizontal' padding='0,0,0,0' spacing='10' center='true'>"
|
"<layout type='horizontal' padding='0,0,0,0' spacing='10' center='true'>"
|
||||||
|
@ -2454,6 +2464,16 @@ const char *defaultXML1 = "<?xml version = '1.0'?>"
|
||||||
"/>"
|
"/>"
|
||||||
"</layout>"
|
"</layout>"
|
||||||
"</dialog>"
|
"</dialog>"
|
||||||
|
"<dialog name = 'GlobalOptions_Shader' overlays = 'Dialog.GlobalOptions.TabWidget'>"
|
||||||
|
"<layout type = 'horizontal' padding = '0, 0, 0, 0' spacing = '10' center = 'true'>"
|
||||||
|
"<widget name = 'grShaderPopUpDesc' "
|
||||||
|
"type = 'OptionsLabel' "
|
||||||
|
"/>"
|
||||||
|
"<widget name = 'grShaderPopUp' "
|
||||||
|
"type = 'PopUp' "
|
||||||
|
"/>"
|
||||||
|
"</layout>"
|
||||||
|
"</dialog>"
|
||||||
"<dialog name='GlobalOptions_Audio' overlays='Dialog.GlobalOptions.TabWidget'>"
|
"<dialog name='GlobalOptions_Audio' overlays='Dialog.GlobalOptions.TabWidget'>"
|
||||||
"<layout type='vertical' padding='16,16,16,16' spacing='8'>"
|
"<layout type='vertical' padding='16,16,16,16' spacing='8'>"
|
||||||
"<layout type='horizontal' padding='0,0,0,0' spacing='6' center='true'>"
|
"<layout type='horizontal' padding='0,0,0,0' spacing='6' center='true'>"
|
||||||
|
|
Binary file not shown.
|
@ -304,6 +304,19 @@
|
||||||
</layout>
|
</layout>
|
||||||
</dialog>
|
</dialog>
|
||||||
|
|
||||||
|
<dialog name = 'GlobalOptions_Shader' overlays = 'Dialog.GlobalOptions.TabWidget'>
|
||||||
|
<layout type = 'vertical' padding = '16, 16, 16, 16' spacing = '8'>
|
||||||
|
<layout type = 'horizontal' padding = '0, 0, 0, 0' spacing = '10' center = 'true'>
|
||||||
|
<widget name = 'grShaderPopUpDesc'
|
||||||
|
type = 'OptionsLabel'
|
||||||
|
/>
|
||||||
|
<widget name = 'grShaderPopUp'
|
||||||
|
type = 'PopUp'
|
||||||
|
/>
|
||||||
|
</layout>
|
||||||
|
</layout>
|
||||||
|
</dialog>
|
||||||
|
|
||||||
<dialog name = 'GlobalOptions_Audio' overlays = 'Dialog.GlobalOptions.TabWidget'>
|
<dialog name = 'GlobalOptions_Audio' overlays = 'Dialog.GlobalOptions.TabWidget'>
|
||||||
<layout type = 'vertical' padding = '16, 16, 16, 16' spacing = '8'>
|
<layout type = 'vertical' padding = '16, 16, 16, 16' spacing = '8'>
|
||||||
<layout type = 'horizontal' padding = '0, 0, 0, 0' spacing = '10' center = 'true'>
|
<layout type = 'horizontal' padding = '0, 0, 0, 0' spacing = '10' center = 'true'>
|
||||||
|
|
|
@ -301,6 +301,19 @@
|
||||||
</layout>
|
</layout>
|
||||||
</dialog>
|
</dialog>
|
||||||
|
|
||||||
|
<dialog name = 'GlobalOptions_Shader' overlays = 'Dialog.GlobalOptions.TabWidget'>
|
||||||
|
<layout type = 'vertical' padding = '16, 16, 16, 16' spacing = '8'>
|
||||||
|
<layout type = 'horizontal' padding = '0, 0, 0, 0' spacing = '10' center = 'true'>
|
||||||
|
<widget name = 'grShaderPopUpDesc'
|
||||||
|
type = 'OptionsLabel'
|
||||||
|
/>
|
||||||
|
<widget name = 'grShaderPopUp'
|
||||||
|
type = 'PopUp'
|
||||||
|
/>
|
||||||
|
</layout>
|
||||||
|
</layout>
|
||||||
|
</dialog>
|
||||||
|
|
||||||
<dialog name = 'GlobalOptions_Audio' overlays = 'Dialog.GlobalOptions.TabWidget'>
|
<dialog name = 'GlobalOptions_Audio' overlays = 'Dialog.GlobalOptions.TabWidget'>
|
||||||
<layout type = 'vertical' padding = '16, 16, 16, 16' spacing = '8'>
|
<layout type = 'vertical' padding = '16, 16, 16, 16' spacing = '8'>
|
||||||
<layout type = 'horizontal' padding = '0, 0, 0, 0' spacing = '6' center = 'true'>
|
<layout type = 'horizontal' padding = '0, 0, 0, 0' spacing = '6' center = 'true'>
|
||||||
|
|
Binary file not shown.
|
@ -318,6 +318,19 @@
|
||||||
</layout>
|
</layout>
|
||||||
</dialog>
|
</dialog>
|
||||||
|
|
||||||
|
<dialog name = 'GlobalOptions_Shader' overlays = 'Dialog.GlobalOptions.TabWidget'>
|
||||||
|
<layout type = 'vertical' padding = '16, 16, 16, 16' spacing = '8'>
|
||||||
|
<layout type = 'horizontal' padding = '0, 0, 0, 0' spacing = '10' center = 'true'>
|
||||||
|
<widget name = 'grShaderPopUpDesc'
|
||||||
|
type = 'OptionsLabel'
|
||||||
|
/>
|
||||||
|
<widget name = 'grShaderPopUp'
|
||||||
|
type = 'PopUp'
|
||||||
|
/>
|
||||||
|
</layout>
|
||||||
|
</layout>
|
||||||
|
</dialog>
|
||||||
|
|
||||||
<dialog name = 'GlobalOptions_Audio' overlays = 'Dialog.GlobalOptions.TabWidget'>
|
<dialog name = 'GlobalOptions_Audio' overlays = 'Dialog.GlobalOptions.TabWidget'>
|
||||||
<layout type = 'vertical' padding = '16, 16, 16, 16' spacing = '8'>
|
<layout type = 'vertical' padding = '16, 16, 16, 16' spacing = '8'>
|
||||||
<layout type = 'horizontal' padding = '0, 0, 0, 0' spacing = '10' center = 'true'>
|
<layout type = 'horizontal' padding = '0, 0, 0, 0' spacing = '10' center = 'true'>
|
||||||
|
|
|
@ -299,6 +299,19 @@
|
||||||
</layout>
|
</layout>
|
||||||
</dialog>
|
</dialog>
|
||||||
|
|
||||||
|
<dialog name = 'GlobalOptions_Shader' overlays = 'Dialog.GlobalOptions.TabWidget'>
|
||||||
|
<layout type = 'vertical' padding = '16, 16, 16, 16' spacing = '8'>
|
||||||
|
<layout type = 'horizontal' padding = '0, 0, 0, 0' spacing = '10' center = 'true'>
|
||||||
|
<widget name = 'grShaderPopUpDesc'
|
||||||
|
type = 'OptionsLabel'
|
||||||
|
/>
|
||||||
|
<widget name = 'grShaderPopUp'
|
||||||
|
type = 'PopUp'
|
||||||
|
/>
|
||||||
|
</layout>
|
||||||
|
</layout>
|
||||||
|
</dialog>
|
||||||
|
|
||||||
<dialog name = 'GlobalOptions_Audio' overlays = 'Dialog.GlobalOptions.TabWidget'>
|
<dialog name = 'GlobalOptions_Audio' overlays = 'Dialog.GlobalOptions.TabWidget'>
|
||||||
<layout type = 'vertical' padding = '16, 16, 16, 16' spacing = '8'>
|
<layout type = 'vertical' padding = '16, 16, 16, 16' spacing = '8'>
|
||||||
<layout type = 'horizontal' padding = '0, 0, 0, 0' spacing = '6' center = 'true'>
|
<layout type = 'horizontal' padding = '0, 0, 0, 0' spacing = '6' center = 'true'>
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue